diff options
Diffstat (limited to 'tests/net-sockaddr.c')
-rw-r--r-- | tests/net-sockaddr.c | 179 |
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 |