aboutsummaryrefslogtreecommitdiff
path: root/tests/net-sockaddr.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/net-sockaddr.c')
-rw-r--r--tests/net-sockaddr.c179
1 files changed, 179 insertions, 0 deletions
diff --git a/tests/net-sockaddr.c b/tests/net-sockaddr.c
index 22cbb265d..d2dfabe94 100644
--- a/tests/net-sockaddr.c
+++ b/tests/net-sockaddr.c
@@ -38,9 +38,11 @@
#include <arpa/inet.h>
#include <netinet/in.h>
#include "netlink.h"
+#include <linux/ax25.h>
#include <linux/if_arp.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
+#include <linux/x25.h>
#include <linux/ipx.h>
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H
# include <bluetooth/bluetooth.h>
@@ -289,6 +291,181 @@ check_ipx(void)
c_ipx.sipx_type, len, ret);
}
+/* for a bit more compact AX.25 address definitions */
+#define AX25_ADDR(c_, s_) \
+ { { (c_)[0] << 1, (c_)[1] << 1, (c_)[2] << 1, \
+ (c_)[3] << 1, (c_)[4] << 1, (c_)[5] << 1, (s_) << 1 } } \
+ /* End of AX25_ADDR definition */
+
+static void
+check_ax25(void)
+{
+ const struct full_sockaddr_ax25 ax25 = {
+ .fsa_ax25 = {
+ .sax25_family = AF_AX25,
+ .sax25_call = AX25_ADDR("VALID ", 13),
+ .sax25_ndigis = 8,
+ },
+ .fsa_digipeater = {
+ AX25_ADDR("SPA CE", 0),
+ AX25_ADDR("SSID ", 16),
+ AX25_ADDR(" ", 0),
+ AX25_ADDR("NULL\0", 3),
+ AX25_ADDR("A-B-C", 4),
+ AX25_ADDR(",}]\"\\'", 5),
+ AX25_ADDR("DASH-0", 6),
+ AX25_ADDR("\n\tABCD", 7),
+ },
+ };
+ const ax25_address aux_addrs[] = {
+ AX25_ADDR("VALID2", 7),
+ AX25_ADDR("OK ", 15),
+ AX25_ADDR("FINE ", 2),
+ AX25_ADDR("smalls", 9),
+ };
+
+ enum { AX25_ALIGN = ALIGNOF(struct full_sockaddr_ax25), };
+ size_t size = sizeof(ax25);
+ size_t surplus = ROUNDUP(sizeof(ax25_address), AX25_ALIGN);
+ void *sax_void = midtail_alloc(size, surplus);
+ struct full_sockaddr_ax25 *sax = sax_void;
+ long rc;
+
+ fill_memory(sax, size);
+ sax->fsa_ax25.sax25_family = AF_AX25;
+ rc = connect(-1, sax_void, sizeof(struct sockaddr_ax25) - 1);
+ printf("connect(-1, {sa_family=AF_AX25, sa_data=\"\\202\\203\\204\\205"
+ "\\206\\207\\210\\211\\212\\213\\214\\215\\216\"}, %zu) = %s\n",
+ sizeof(struct sockaddr_ax25) - 1, sprintrc(rc));
+
+ memcpy(sax, &ax25, sizeof(ax25));
+ rc = connect(-1, sax_void, sizeof(struct sockaddr_ax25));
+ printf("connect(-1, {sa_family=AF_AX25, fsa_ax25={sax25_call=VALID-13"
+ ", sax25_ndigis=8}, fsa_digipeater=[/* ??? */]}, %zu) = %s\n",
+ sizeof(struct sockaddr_ax25), sprintrc(rc));
+
+ sax->fsa_ax25.sax25_ndigis = 0;
+ rc = connect(-1, sax_void, sizeof(struct sockaddr_ax25));
+ printf("connect(-1, {sa_family=AF_AX25, sax25_call=VALID-13"
+ ", sax25_ndigis=0}, %zu) = %s\n",
+ sizeof(struct sockaddr_ax25), sprintrc(rc));
+
+ sax->fsa_ax25.sax25_ndigis = 8;
+ size = sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 3 + 1;
+ rc = connect(-1, sax_void, size);
+ printf("connect(-1, {sa_family=AF_AX25, fsa_ax25={sax25_call=VALID-13"
+ ", sax25_ndigis=8}, fsa_digipeater"
+ "=[{ax25_call=\"\\xa6\\xa0\\x82\\x40\\x86\\x8a\\x00\""
+ "} /* SPA CE-0 */"
+ ", {ax25_call=\"\\xa6\\xa6\\x92\\x88\\x40\\x40\\x20\""
+ "} /* SSID-0 */"
+ ", *"
+ ", /* ??? */], ...}, %zu) = %s\n",
+ size, sprintrc(rc));
+
+ sax->fsa_digipeater[2].ax25_call[6] = 0x4;
+ size = sizeof(struct sockaddr_ax25) + sizeof(ax25_address) * 4;
+ rc = connect(-1, sax_void, size);
+ printf("connect(-1, {sa_family=AF_AX25, fsa_ax25={sax25_call=VALID-13"
+ ", sax25_ndigis=8}, fsa_digipeater"
+ "=[{ax25_call=\"\\xa6\\xa0\\x82\\x40\\x86\\x8a\\x00\""
+ "} /* SPA CE-0 */"
+ ", {ax25_call=\"\\xa6\\xa6\\x92\\x88\\x40\\x40\\x20\""
+ "} /* SSID-0 */"
+ ", {ax25_call=\"\\x40\\x40\\x40\\x40\\x40\\x40\\x04\"} /* -2 */"
+ ", {ax25_call=\"\\x9c\\xaa\\x98\\x98\\x00\\x00\\x06\"}"
+ ", /* ??? */]}, %zu) = %s\n",
+ size, sprintrc(rc));
+
+ memcpy(sax->fsa_digipeater, aux_addrs, sizeof(aux_addrs));
+ sax->fsa_digipeater[2].ax25_call[6] = 0xa5;
+ sax->fsa_digipeater[4].ax25_call[5] = 0x40;
+ for (size_t i = 0; i < 3; i++) {
+ size = sizeof(ax25) + sizeof(ax25_address) * (i / 2);
+ rc = connect(-1, sax_void, size);
+ printf("connect(-1, {sa_family=AF_AX25"
+ ", fsa_ax25={sax25_call=VALID-13, sax25_ndigis=%d}"
+ ", fsa_digipeater=[VALID2-7, OK-15, %s /* FINE-2 */"
+ ", {ax25_call=\"\\xe6\\xda\\xc2\\xd8\\xd8\\xe6\\x12\""
+ "} /* smalls-9 */"
+ ", {ax25_call=\"\\x%s\\x%s\\x84\\x5a\\x86\\x40\\x08\""
+ "} /* %sB-C-4 */"
+ ", {ax25_call=\"\\x58\\xfa\\xba\\x44\\x%s\\x%s\\x0a\""
+ "}%s"
+ ", {ax25_call=\"\\x88\\x82\\xa6\\x90\\x5a\\x%s\\x0c\""
+ "}%s"
+ "%s]%s}, %zu) = %s\n"
+ , sax->fsa_ax25.sax25_ndigis
+ , i
+ ? "{ax25_call=\"\\x8c\\x92\\x9c\\x8a\\x40\\x41\\x04\"}"
+ : "{ax25_call=\"\\x8c\\x92\\x9c\\x8a\\x40\\x40\\xa5\"}"
+ , i ? "40" : "82"
+ , i ? "40" : "5a"
+ , i ? " " : "A-"
+ , i ? "54" : "b8"
+ , i ? "5e" : "4e"
+ , i ? "" : " /* ,}]\"\\'-5 */"
+ , i ? "fe" : "60"
+ , i ? "" : " /* DASH-0-6 */"
+ , i == 1
+ ? ""
+ : ", {ax25_call=\"\\x14\\x12\\x82\\x84\\x86\\x88\\x0e\"}"
+ , i > 1 ? ", ..." : ""
+ , size, sprintrc(rc));
+
+ if (i == 1) {
+ sax_void = (char *) sax_void - surplus;
+ memmove(sax_void, sax, sizeof(ax25));
+ sax = sax_void;
+ }
+
+ sax->fsa_ax25.sax25_ndigis = 7 + 2 * i;
+
+ sax->fsa_digipeater[2].ax25_call[5] = 0x41;
+ sax->fsa_digipeater[2].ax25_call[6] = 0x4;
+
+ sax->fsa_digipeater[4].ax25_call[0] = 0x40;
+ sax->fsa_digipeater[4].ax25_call[1] = 0x40;
+
+ sax->fsa_digipeater[5].ax25_call[4] = '*' << 1;
+ sax->fsa_digipeater[5].ax25_call[5] = '/' << 1;
+
+ sax->fsa_digipeater[6].ax25_call[5] = 0xfe;
+ }
+}
+
+static void
+check_x25(void)
+{
+ static const struct sockaddr_x25 c_x25 = {
+ .sx25_family = AF_X25,
+ .sx25_addr = { "0123456789abcdef" },
+ };
+ void *x25_void = tail_memdup(&c_x25, sizeof(c_x25) + 1);
+ struct sockaddr_x25 *x25 = x25_void;
+ long rc;
+
+ rc = connect(-1, x25, sizeof(c_x25) - 1);
+ printf("connect(-1, {sa_family=AF_X25"
+ ", sa_data=\"0123456789abcde\"}, %zu) = %s\n",
+ sizeof(c_x25) - 1, sprintrc(rc));
+
+ for (size_t i = 0; i < 2; i++) {
+ rc = connect(-1, x25, sizeof(c_x25) + i);
+ printf("connect(-1, {sa_family=AF_X25"
+ ", sx25_addr={x25_addr=\"0123456789abcde\"...}"
+ "}, %zu) = %s\n",
+ sizeof(c_x25) + i, sprintrc(rc));
+ }
+
+ x25->sx25_addr.x25_addr[10] = '\0';
+ rc = connect(-1, x25, sizeof(c_x25));
+ printf("connect(-1, {sa_family=AF_X25"
+ ", sx25_addr={x25_addr=\"0123456789\"}"
+ "}, %zu) = %s\n",
+ sizeof(c_x25), sprintrc(rc));
+}
+
static void
check_nl(void)
{
@@ -554,6 +731,8 @@ main(void)
check_in();
check_in6();
check_ipx();
+ check_ax25();
+ check_x25();
check_nl();
check_ll();
#ifdef HAVE_BLUETOOTH_BLUETOOTH_H