Squashed 'third_party/lksctp-tools/' content from commit 200eca7f1
Change-Id: I8f7575513f114b205178cac5c6b3706f3d725cb5
git-subtree-dir: third_party/lksctp-tools
git-subtree-split: 200eca7f1419b1ae53958b51e8551f7e7f6cd467
diff --git a/src/apps/bindx_test.c b/src/apps/bindx_test.c
new file mode 100644
index 0000000..ff3de86
--- /dev/null
+++ b/src/apps/bindx_test.c
@@ -0,0 +1,134 @@
+ /* -*-c-*-
+ **
+ ** sctp-tools: Another bindx test.
+ **
+ ** $Id: bindx_test.c,v 1.1.1.1 2002/08/06 22:31:05 inaky Exp $
+ **
+ ** Distributed under the terms of the GPL v2.0 as described in
+ ** $top_srcdir/COPYING.
+ **
+ ** (C) Copyright IBM Corp. 2003
+ ** (C) 2002 Intel Corporation
+ ** Iñaky Pérez-González <inaky.perez-gonzalez@intel.com>:
+ ** Sridhar Samudrala <sri@us.ibm.com>
+ */
+
+#define _GNU_SOURCE /* GNU extensions */
+
+#include <stdlib.h> /* malloc() */
+#include <arpa/inet.h> /* inet_pton() */
+#include <errno.h>
+#include <sys/socket.h> /* socket() */
+#include <stdio.h> /* fprintf */
+#include <netinet/in.h> /* sockaddr_in */
+#include <unistd.h> /* close() */
+#include <string.h> /* strchr() */
+#include <netinet/sctp.h> /* bindx() */
+
+ /* Global stuff */
+
+#ifndef IPPROTO_SCTP
+#define IPPROTO_SCTP 132
+#endif
+
+ /*! Main function: initialize, setup, run the main loop
+ **
+ **
+ */
+
+int main (int argc, char **argv)
+{
+ void *addr_buf, *buf_ptr;
+ void *addr_buf_size = 0;
+ size_t addrs, cnt;
+ int sd, result, port;
+ int domain = PF_INET6;
+
+ if (argc < 3) {
+ fprintf(stderr,
+ "Usage: bindx_test PORT IPADDR1 [IPADDR2 [...]]\n");
+ return 1;
+ }
+
+ port = atoi(argv[1]);
+ printf("bindx_test: INFO: Port is %d\n", port);
+
+ /* Allocate the maximum space for the specified no. of addresses.
+ * Assume all of them are v6 addresses.
+ */
+ addr_buf = malloc((argc -2) * sizeof(struct sockaddr_in6));
+ if (addr_buf == NULL) {
+ perror("bindx_test: ERROR: addr buf allocation failed");
+ return 1;
+ }
+
+ /* Get the addresses from the cmd line */
+ addrs = 0; /* healthy address iterator [and total counter] */
+ cnt = 2; /* argument iterator */
+ buf_ptr = addr_buf;
+ while (cnt < argc) {
+ printf("bindx_test: INFO: Arg %zu: %s", cnt, argv[cnt]);
+ fflush(stderr);
+ if (strchr(argv[cnt], ':')) {
+ struct sockaddr_in6 *sa6;
+
+ sa6 = (struct sockaddr_in6 *)buf_ptr;
+ printf(" IPv6 address number %zu", addrs);
+ sa6->sin6_family = AF_INET6;
+ sa6->sin6_port = port;
+ if (inet_pton(AF_INET6, argv[cnt], &sa6->sin6_addr)) {
+ addrs++;
+ addr_buf_size += sizeof(struct sockaddr_in6);
+ buf_ptr += sizeof(struct sockaddr_in6);
+ } else
+ printf(" error");
+ } else if (strchr(argv[cnt], '.')) {
+ struct sockaddr_in *sa;
+
+ domain = PF_INET;
+ sa = (struct sockaddr_in *)buf_ptr;
+ printf (" IPv4 address number %zu", addrs);
+ sa->sin_family = AF_INET;
+ sa->sin_port = port;
+ if (inet_pton (AF_INET, argv[cnt], &sa->sin_addr)) {
+ addrs++;
+ addr_buf_size += sizeof(struct sockaddr_in);
+ buf_ptr += sizeof(struct sockaddr_in);
+ } else
+ printf (" error");
+ } else
+ printf (" Unknown");
+ putchar ('\n');
+ cnt++;
+ }
+
+ printf ("bindx_test: INFO: Got %zu addrs\n", addrs);
+
+ /* Create the socket */
+ sd = socket(domain, SOCK_SEQPACKET, IPPROTO_SCTP);
+ if (sd == -1) {
+ perror("bindx_test: ERROR: Cannot open socket");
+ return 1;
+ }
+
+ /* add all */
+ result = sctp_bindx(sd, (struct sockaddr *)addr_buf, addrs,
+ SCTP_BINDX_ADD_ADDR);
+ if (result == -1)
+ perror("bindx_test: ERROR: bindx addition error");
+ else {
+ printf("bindx_test: OK: bindx address addition\n");
+
+ /* remove all but the last */
+ result = sctp_bindx(sd, (struct sockaddr *)addr_buf, addrs-1,
+ SCTP_BINDX_REM_ADDR);
+ if (result == -1)
+ perror("bindx_test: ERROR: bindx address removal");
+ else
+ printf("bindx_test: OK: bindx address removal\n");
+ }
+
+ close(sd);
+ free(addr_buf);
+ return result;
+}