2 #include <sys/socket.h>
4 #include <netinet/in.h>
12 #include "params.h" // do_specific_proto
13 #include "utils.h" // ARRAY_SIZE
15 struct sa_func_entry
{
17 void (*func
)(struct sockaddr
**addr
, socklen_t
*addrlen
);
20 static const struct sa_func_entry sa_funcs
[] = {
21 //TODO { .pf = PF_UNSPEC, .func = &unspec_gen_sockaddr },
22 { .pf
= PF_UNIX
, .func
= &unix_gen_sockaddr
},
23 { .pf
= PF_INET
, .func
= &ipv4_gen_sockaddr
},
24 { .pf
= PF_AX25
, .func
= &ax25_gen_sockaddr
},
25 { .pf
= PF_IPX
, .func
= &ipx_gen_sockaddr
},
26 { .pf
= PF_APPLETALK
, .func
= &atalk_gen_sockaddr
},
27 //TODO { .pf = PF_NETROM, .func = &netrom_gen_sockaddr },
28 //TODO { .pf = PF_BRIDGE, .func = &bridge_gen_sockaddr },
29 { .pf
= PF_ATMPVC
, .func
= &atmpvc_gen_sockaddr
},
30 { .pf
= PF_X25
, .func
= &x25_gen_sockaddr
},
31 { .pf
= PF_INET6
, .func
= &ipv6_gen_sockaddr
},
32 { .pf
= PF_ROSE
, .func
= &rose_gen_sockaddr
},
33 { .pf
= PF_DECnet
, .func
= &decnet_gen_sockaddr
},
34 { .pf
= PF_NETBEUI
, .func
= &llc_gen_sockaddr
},
35 //TODO { .pf = PF_SECURITY, .func = &security_gen_sockaddr },
36 //TODO { .pf = PF_KEY, .func = &key_gen_sockaddr },
37 { .pf
= PF_NETLINK
, .func
= &netlink_gen_sockaddr
},
38 { .pf
= PF_PACKET
, .func
= &packet_gen_sockaddr
},
39 //TODO { .pf = PF_ASH, .func = &ash_gen_sockaddr },
40 { .pf
= PF_ECONET
, .func
= &econet_gen_sockaddr
},
41 { .pf
= PF_ATMSVC
, .func
= &atmsvc_gen_sockaddr
},
42 { .pf
= PF_RDS
, .func
= &rds_gen_sockaddr
},
43 //TODO { .pf = PF_SNA, .func = &sna_gen_sockaddr },
44 { .pf
= PF_IRDA
, .func
= &irda_gen_sockaddr
},
45 { .pf
= PF_PPPOX
, .func
= &pppox_gen_sockaddr
},
46 //TODO { .pf = PF_WANPIPE, .func = &wanpipe_gen_sockaddr },
47 { .pf
= PF_LLC
, .func
= &llc_gen_sockaddr
},
48 { .pf
= PF_CAN
, .func
= &can_gen_sockaddr
},
49 { .pf
= PF_TIPC
, .func
= &tipc_gen_sockaddr
},
50 //TODO { .pf = PF_BLUETOOTH, .func = &bluetooth_gen_sockaddr },
51 //TODO { .pf = PF_IUCV, .func = &iucv_gen_sockaddr },
52 //TODO { .pf = PF_RXRPC, .func = &rxrpc_gen_sockaddr },
53 //TODO { .pf = PF_ISDN, .func = &isdn_gen_sockaddr },
54 { .pf
= PF_PHONET
, .func
= &phonet_gen_sockaddr
},
55 //TODO { .pf = PF_IEEE802154, .func = &ieee802154_gen_sockaddr },
57 { .pf
= PF_CAIF
, .func
= &caif_gen_sockaddr
},
60 { .pf
= PF_ALG
, .func
= &alg_gen_sockaddr
},
62 { .pf
= PF_NFC
, .func
= &nfc_gen_sockaddr
},
63 //TODO { .pf = PF_VSOCK, .func = &vsock_gen_sockaddr },
66 void generate_sockaddr(struct sockaddr
**addr
, socklen_t
*addrlen
, int pf
)
70 /* If we want sockets of a specific type, we'll want sockaddrs that match. */
71 if (do_specific_proto
== TRUE
)
74 /* If we got no hint passed down, pick a random proto. */
76 pf
= rand() % TRINITY_PF_MAX
;
78 for (i
= 0; i
< ARRAY_SIZE(sa_funcs
); i
++) {
79 if (sa_funcs
[i
].pf
== (unsigned int) pf
) {
80 sa_funcs
[i
].func(addr
, addrlen
);
85 /* Make something up for unknown protocols. */
86 *addr
= (struct sockaddr
*) page_rand
;
87 *addrlen
= rand() % 100;