Skip to content

Instantly share code, notes, and snippets.

@o11c
Last active June 16, 2016 18:29
Show Gist options
  • Select an option

  • Save o11c/25d404dcfa0b48a8d9fe40e00eeb9ba3 to your computer and use it in GitHub Desktop.

Select an option

Save o11c/25d404dcfa0b48a8d9fe40e00eeb9ba3 to your computer and use it in GitHub Desktop.
socket_structs
*.o
z-output-$(shell uname | tr A-Z a-z).txt: socket_structs
./socket_structs > $@
socket_structs: socket_structs.o
socket_structs.o: socket_structs.c
// Output information about all known socket types.
// TODO expand to more information, such as AF/PF macros and field names.
// TODO expand to build on non-Linux via `#ifdef`
// TODO figure out libc/kernel version requirements
// Note that some types are available in both libc and kernel headers.
// In this case, libc headers are preferred.
#include <sys/socket.h>
#include <linux/socket.h>
#include <linux/if_alg.h>
#include <netash/ash.h>
#include <netatalk/at.h>
#include <linux/atm.h>
#include <netax25/ax25.h>
#include <linux/caif/caif_socket.h>
#include <linux/can.h>
#include <linux/dn.h>
#include <neteconet/ec.h>
#include <netinet/in.h>
#include <netipx/ipx.h>
#include <linux/irda.h>
#include <netiucv/iucv.h>
#include <linux/l2tp.h>
#include <netpacket/packet.h>
#include <net/if.h>
#include <linux/llc.h> // not self-contained
#include <linux/nfc.h>
#include <linux/netlink.h>
#include <net/if_packet.h>
#include <linux/phonet.h>
#include <linux/if_pppox.h>
#include <netrose/rose.h>
#include <linux/tipc.h>
#include <sys/un.h>
#include <linux/vm_sockets.h>
#include <linux/x25.h>
#include <stddef.h>
#include <stdio.h>
#define PRINT(name, pfx, dom, sol) \
printf("%sstruct %s: size %zu align %zu, prefix %s, domain [AP]F_%s (%d, %d), level %s (%d)\n", \
indent, #name, \
sizeof(struct name) + 0 * offsetof(struct name, pfx##family), __alignof__(struct name), \
#pfx, #dom, AF_##dom, PF_##dom, #sol, sol)
int main()
{
const char *indent = "";
printf("WARNING: all numbers may be *local* to the system!");
PRINT(sockaddr, sa_, UNSPEC, SOL_SOCKET);
// Differs by using `unsigned char` for the data (i.e. padding).
// (and semantically in that it is intended as a wire format).
PRINT(osockaddr, sa_, UNSPEC, SOL_SOCKET);
PRINT(sockaddr_storage, ss_, UNSPEC, SOL_SOCKET);
PRINT(__kernel_sockaddr_storage, ss_, UNSPEC, SOL_SOCKET);
indent = " ";
PRINT(sockaddr_alg, salg_, ALG, SOL_SOCKET);
PRINT(sockaddr_ash, sash_, ASH, SOL_SOCKET);
PRINT(sockaddr_at, sat_, APPLETALK, SOL_ATALK);
PRINT(sockaddr_atmpvc, sap_, ATMPVC, SOL_ATM);
PRINT(sockaddr_atmsvc, sas_, ATMSVC, SOL_AAL);
PRINT(sockaddr_ax25, sax25_, AX25, SOL_AX25);
indent = " ";
PRINT(full_sockaddr_ax25, fsa_ax25.sax25_, AX25, SOL_AX25);
indent = " ";
// No prefix.
PRINT(sockaddr_caif, , CAIF, SOL_SOCKET);
PRINT(sockaddr_can, can_, CAN, SOL_CAN_BASE);
#if 0
// No known definition, only opaque declarations.
PRINT(sockaddr_dl, sa_, UNSPEC, SOL_SOCKET);
#endif
PRINT(sockaddr_dn, sdn_, DECnet, SOL_DECNET);
PRINT(sockaddr_ec, sec_, ECONET, SOL_SOCKET);
#if 0
// No known definition, only opaque declarations.
PRINT(sockaddr_eon, sa_, UNSPEC, SOL_SOCKET);
#endif
PRINT(sockaddr_in, sin_, INET, SOL_SOCKET);
indent = " ";
PRINT(sockaddr_l2tpip, l2tp_, UNSPEC, SOL_SOCKET);
indent = " ";
PRINT(sockaddr_in6, sin6_, INET6, SOL_SOCKET);
indent = " ";
PRINT(sockaddr_l2tpip6, l2tp_, UNSPEC, SOL_SOCKET);
indent = " ";
#if 0
// No known definition, only opaque declarations.
PRINT(sockaddr_inarp, sa_, UNSPEC, SOL_SOCKET);
#endif
PRINT(sockaddr_ipx, sipx_, IPX, SOL_IPX);
PRINT(sockaddr_irda, sir_, IRDA, SOL_IRDA);
#if 0
// No known definition, only opaque declarations.
PRINT(sockaddr_iso, sa_, UNSPEC, SOL_SOCKET);
#endif
PRINT(sockaddr_iucv, siucv_, IUCV, SOL_SOCKET);
PRINT(sockaddr_ll, sll_, PACKET, SOL_PACKET);
PRINT(sockaddr_llc, sllc_, LLC, SOL_SOCKET);
PRINT(sockaddr_nfc, sa_, NFC, SOL_SOCKET);
indent = " ";
PRINT(sockaddr_nfc_llcp, sa_, NFC, SOL_SOCKET);
indent = " ";
// Alias [AP]F_ROUTE.
PRINT(sockaddr_nl, nl_, NETLINK, SOL_SOCKET);
#if 0
// No known definition, only opaque declarations.
PRINT(sockaddr_ns, sa_, UNSPEC, SOL_SOCKET);
#endif
// Deprecated, used for SOCK_PACKET rather than AF_PACKET
PRINT(sockaddr_pkt, spkt_, UNSPEC, SOL_PACKET);
PRINT(sockaddr_pn, spn_, PHONET, SOL_SOCKET);
PRINT(sockaddr_pppox, sa_, PPPOX, SOL_SOCKET);
PRINT(sockaddr_pppol2tp, sa_, PPPOX, SOL_SOCKET);
PRINT(sockaddr_pppol2tpin6, sa_, PPPOX, SOL_SOCKET);
PRINT(sockaddr_pppol2tpv3, sa_, PPPOX, SOL_SOCKET);
PRINT(sockaddr_pppol2tpv3in6, sa_, PPPOX, SOL_SOCKET);
PRINT(sockaddr_rose, srose_, ROSE, SOL_ROSE);
indent = " ";
PRINT(full_sockaddr_rose, srose_, ROSE, SOL_ROSE);
indent = " ";
// No prefix.
PRINT(sockaddr_tipc, , TIPC, SOL_TIPC);
// Alias [AP]F_LOCAL.
// Alias [AP]F_FILE.
PRINT(sockaddr_un, sun_, UNIX, SOL_SOCKET);
PRINT(sockaddr_vm, svm_, VSOCK, SOL_SOCKET);
PRINT(sockaddr_x25, sx25_, X25, SOL_X25);
#if 0
// documented by valgrind as Linux 3.9+ specific
PRINT(sockaddr_rc, sa_, UNSPEC, SOL_SOCKET);
#endif
// Additionally, no structs are known for the following families:
// [AP]F_NETROM SOL_NETROM
// [AP]F_BRIDGE
// [AP]F_NETBEUI
// [AP]F_SECURITY
// [AP]F_KEY
// [AP]F_RDS SOL_RDS
// [AP]F_SNA
// [AP]F_WANPIPE
// [AP]F_IB
// [AP]F_MPLS
// [AP]F_BLUETOOTH
// [AP]F_RXRPC
// [AP]F_ISDN
// [AP]F_IEEE802154
// [AP]F_CAIF
//
// SOL_
return 0;
}
WARNING: all numbers may be *local* to the system!struct sockaddr: size 16 align 2, prefix sa_, domain [AP]F_UNSPEC (0, 0), level SOL_SOCKET (1)
struct osockaddr: size 16 align 2, prefix sa_, domain [AP]F_UNSPEC (0, 0), level SOL_SOCKET (1)
struct sockaddr_storage: size 128 align 8, prefix ss_, domain [AP]F_UNSPEC (0, 0), level SOL_SOCKET (1)
struct __kernel_sockaddr_storage: size 128 align 8, prefix ss_, domain [AP]F_UNSPEC (0, 0), level SOL_SOCKET (1)
struct sockaddr_alg: size 88 align 4, prefix salg_, domain [AP]F_ALG (38, 38), level SOL_SOCKET (1)
struct sockaddr_ash: size 32 align 4, prefix sash_, domain [AP]F_ASH (18, 18), level SOL_SOCKET (1)
struct sockaddr_at: size 16 align 2, prefix sat_, domain [AP]F_APPLETALK (5, 5), level SOL_ATALK (258)
struct sockaddr_atmpvc: size 12 align 4, prefix sap_, domain [AP]F_ATMPVC (8, 8), level SOL_ATM (264)
struct sockaddr_atmsvc: size 44 align 4, prefix sas_, domain [AP]F_ATMSVC (20, 20), level SOL_AAL (265)
struct sockaddr_ax25: size 16 align 4, prefix sax25_, domain [AP]F_AX25 (3, 3), level SOL_AX25 (257)
struct full_sockaddr_ax25: size 72 align 4, prefix fsa_ax25.sax25_, domain [AP]F_AX25 (3, 3), level SOL_AX25 (257)
struct sockaddr_caif: size 24 align 4, prefix , domain [AP]F_CAIF (37, 37), level SOL_SOCKET (1)
struct sockaddr_can: size 16 align 4, prefix can_, domain [AP]F_CAN (29, 29), level SOL_CAN_BASE (100)
struct sockaddr_dn: size 26 align 2, prefix sdn_, domain [AP]F_DECnet (12, 12), level SOL_DECNET (261)
struct sockaddr_ec: size 16 align 8, prefix sec_, domain [AP]F_ECONET (19, 19), level SOL_SOCKET (1)
struct sockaddr_in: size 16 align 4, prefix sin_, domain [AP]F_INET (2, 2), level SOL_SOCKET (1)
struct sockaddr_l2tpip: size 16 align 4, prefix l2tp_, domain [AP]F_UNSPEC (0, 0), level SOL_SOCKET (1)
struct sockaddr_in6: size 28 align 4, prefix sin6_, domain [AP]F_INET6 (10, 10), level SOL_SOCKET (1)
struct sockaddr_l2tpip6: size 32 align 4, prefix l2tp_, domain [AP]F_UNSPEC (0, 0), level SOL_SOCKET (1)
struct sockaddr_ipx: size 16 align 4, prefix sipx_, domain [AP]F_IPX (4, 4), level SOL_IPX (256)
struct sockaddr_irda: size 36 align 4, prefix sir_, domain [AP]F_IRDA (23, 23), level SOL_IRDA (266)
struct sockaddr_iucv: size 32 align 4, prefix siucv_, domain [AP]F_IUCV (32, 32), level SOL_SOCKET (1)
struct sockaddr_ll: size 20 align 4, prefix sll_, domain [AP]F_PACKET (17, 17), level SOL_PACKET (263)
struct sockaddr_llc: size 16 align 2, prefix sllc_, domain [AP]F_LLC (26, 26), level SOL_SOCKET (1)
struct sockaddr_nfc: size 16 align 4, prefix sa_, domain [AP]F_NFC (39, 39), level SOL_SOCKET (1)
struct sockaddr_nfc_llcp: size 96 align 8, prefix sa_, domain [AP]F_NFC (39, 39), level SOL_SOCKET (1)
struct sockaddr_nl: size 12 align 4, prefix nl_, domain [AP]F_NETLINK (16, 16), level SOL_SOCKET (1)
struct sockaddr_pkt: size 18 align 2, prefix spkt_, domain [AP]F_UNSPEC (0, 0), level SOL_PACKET (263)
struct sockaddr_pn: size 16 align 1, prefix spn_, domain [AP]F_PHONET (35, 35), level SOL_SOCKET (1)
struct sockaddr_pppox: size 30 align 1, prefix sa_, domain [AP]F_PPPOX (24, 24), level SOL_SOCKET (1)
struct sockaddr_pppol2tp: size 38 align 1, prefix sa_, domain [AP]F_PPPOX (24, 24), level SOL_SOCKET (1)
struct sockaddr_pppol2tpin6: size 50 align 1, prefix sa_, domain [AP]F_PPPOX (24, 24), level SOL_SOCKET (1)
struct sockaddr_pppol2tpv3: size 46 align 1, prefix sa_, domain [AP]F_PPPOX (24, 24), level SOL_SOCKET (1)
struct sockaddr_pppol2tpv3in6: size 58 align 1, prefix sa_, domain [AP]F_PPPOX (24, 24), level SOL_SOCKET (1)
struct sockaddr_rose: size 28 align 4, prefix srose_, domain [AP]F_ROSE (11, 11), level SOL_ROSE (260)
struct full_sockaddr_rose: size 64 align 4, prefix srose_, domain [AP]F_ROSE (11, 11), level SOL_ROSE (260)
struct sockaddr_tipc: size 16 align 4, prefix , domain [AP]F_TIPC (30, 30), level SOL_TIPC (271)
struct sockaddr_un: size 110 align 2, prefix sun_, domain [AP]F_UNIX (1, 1), level SOL_SOCKET (1)
struct sockaddr_vm: size 16 align 4, prefix svm_, domain [AP]F_VSOCK (40, 40), level SOL_SOCKET (1)
struct sockaddr_x25: size 18 align 2, prefix sx25_, domain [AP]F_X25 (9, 9), level SOL_X25 (262)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment