X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/da20bc56d6100b5275d6f85c4a25bac1dab4e57e..1a04b92e365f5ed01ca38619b41bcc4fc9cbd63c:/netdissect.h diff --git a/netdissect.h b/netdissect.h index 2782796e..70c821d9 100644 --- a/netdissect.h +++ b/netdissect.h @@ -41,7 +41,11 @@ * use the EXTRACT_ macros to extract them (which you should be doing * *anyway*, so as not to assume a particular byte order or alignment * in your code). + * + * We even want EXTRACT_U_1 used for 8-bit integral values, so we + * define nd_uint8_t and nd_int8_t as arrays as well. */ +typedef unsigned char nd_uint8_t[1]; typedef unsigned char nd_uint16_t[2]; typedef unsigned char nd_uint24_t[3]; typedef unsigned char nd_uint32_t[4]; @@ -50,13 +54,17 @@ typedef unsigned char nd_uint48_t[6]; typedef unsigned char nd_uint56_t[7]; typedef unsigned char nd_uint64_t[8]; +typedef signed char nd_int8_t[1]; + /* - * Use this for IPv4 addresses. It's defined as an array of octets, so - * that it's not aligned on its "natural" boundary, and it's defined as - * a structure in the hopes that this makes it harder to naively use - * EXTRACT_BE_U_4() to extract the value - in many cases you just want - * to use UNALIGNED_MEMCPY() to copy its value, so that it remains in - * network byte order. + * Use this for IPv4 addresses and netmasks. + * + * It's defined as an array of octets, so that it's not guaranteed to + * be aligned on its "natural" boundary (in some packet formats, it + * *isn't* so aligned), and it's defined as a structure in the hopes + * that this makes it harder to naively use EXTRACT_BE_U_4() to extract + * the value - in many cases you just want to use UNALIGNED_MEMCPY() to + * copy its value, so that it remains in network byte order. * * (Among other things, we don't want somebody thinking "IPv4 addresses, * they're in network byte order, so we want EXTRACT_BE_U_4(), right?" @@ -73,11 +81,22 @@ typedef struct { } nd_ipv4; /* - * Data types corresponding to single-byte integral values, for - * completeness. + * Use this for IPv6 addresses and netmasks. + */ +typedef struct { + unsigned char bytes[16]; +} nd_ipv6; + +/* + * Use this for MAC addresses. */ -typedef unsigned char nd_uint8_t; -typedef signed char nd_int8_t; +#define MAC_ADDR_LEN 6 /* length of MAC addresses */ +typedef unsigned char nd_mac_addr[MAC_ADDR_LEN]; + +/* + * Use this for blobs of bytes; make them arrays of nd_byte. + */ +typedef unsigned char nd_byte; /* snprintf et al */ @@ -191,7 +210,7 @@ struct netdissect_options { /* pointer to void function to output stuff */ void (*ndo_default_print)(netdissect_options *, - register const u_char *bp, register u_int length); + const u_char *bp, u_int length); /* pointer to function to do regular output */ int (*ndo_printf)(netdissect_options *, @@ -306,12 +325,19 @@ struct netdissect_options { ((uintptr_t)ndo->ndo_snapend - (l) <= (uintptr_t)ndo->ndo_snapend && \ (uintptr_t)&(var) <= (uintptr_t)ndo->ndo_snapend - (l))) +#define ND_TTEST_LEN(p, l) \ + (IS_NOT_NEGATIVE(l) && \ + ((uintptr_t)ndo->ndo_snapend - (l) <= (uintptr_t)ndo->ndo_snapend && \ + (uintptr_t)(p) <= (uintptr_t)ndo->ndo_snapend - (l))) + /* True if "var" was captured */ #define ND_TTEST(var) ND_TTEST2(var, sizeof(var)) /* Bail if "l" bytes of "var" were not captured */ #define ND_TCHECK2(var, l) if (!ND_TTEST2(var, l)) goto trunc +#define ND_TCHECK_LEN(p, l) if (!ND_TTEST_LEN(p, l)) goto trunc + /* Bail if "var" was not captured */ #define ND_TCHECK(var) ND_TCHECK2(var, sizeof(var)) @@ -476,7 +502,7 @@ struct lladdr_info { /* The printer routines. */ extern void aarp_print(netdissect_options *, const u_char *, u_int); -extern int ah_print(netdissect_options *, register const u_char *); +extern int ah_print(netdissect_options *, const u_char *); extern void ahcp_print(netdissect_options *, const u_char *, const u_int); extern void aodv_print(netdissect_options *, const u_char *, u_int, int); extern void aoe_print(netdissect_options *, const u_char *, const u_int); @@ -494,7 +520,7 @@ extern void calm_fast_print(netdissect_options *, const u_char *, u_int, const s extern void carp_print(netdissect_options *, const u_char *, u_int, int); extern void cdp_print(netdissect_options *, const u_char *, u_int, u_int); extern void cfm_print(netdissect_options *, const u_char *, u_int); -extern u_int chdlc_print(netdissect_options *, register const u_char *, u_int); +extern u_int chdlc_print(netdissect_options *, const u_char *, u_int); extern void cisco_autorp_print(netdissect_options *, const u_char *, u_int); extern void cnfp_print(netdissect_options *, const u_char *); extern void dccp_print(netdissect_options *, const u_char *, const u_char *, u_int); @@ -511,7 +537,7 @@ extern u_int ether_print(netdissect_options *, const u_char *, u_int, u_int, voi extern int ethertype_print(netdissect_options *, u_short, const u_char *, u_int, u_int, const struct lladdr_info *, const struct lladdr_info *); extern u_int fddi_print(netdissect_options *, const u_char *, u_int, u_int); extern void forces_print(netdissect_options *, const u_char *, u_int); -extern u_int fr_print(netdissect_options *, register const u_char *, u_int); +extern u_int fr_print(netdissect_options *, const u_char *, u_int); extern int frag6_print(netdissect_options *, const u_char *, const u_char *); extern void ftp_print(netdissect_options *, const u_char *, u_int); extern void geneve_print(netdissect_options *, const u_char *, u_int); @@ -533,7 +559,7 @@ extern void ip6_print(netdissect_options *, const u_char *, u_int); extern void ipN_print(netdissect_options *, const u_char *, u_int); extern void ip_print(netdissect_options *, const u_char *, u_int); extern void ip_print_inner(netdissect_options *, const u_char *, u_int, u_int nh, const u_char *); -extern void ipcomp_print(netdissect_options *, register const u_char *); +extern void ipcomp_print(netdissect_options *, const u_char *); extern void ipx_netbios_print(netdissect_options *, const u_char *, u_int); extern void ipx_print(netdissect_options *, const u_char *, u_int); extern void isakmp_print(netdissect_options *, const u_char *, u_int, const u_char *); @@ -555,7 +581,7 @@ extern void lwapp_data_print(netdissect_options *, const u_char *, u_int); extern void lwres_print(netdissect_options *, const u_char *, u_int); extern void m3ua_print(netdissect_options *, const u_char *, const u_int); extern void medsa_print(netdissect_options *, const u_char *, u_int, u_int, const struct lladdr_info *, const struct lladdr_info *); -extern u_int mfr_print(netdissect_options *, register const u_char *, u_int); +extern u_int mfr_print(netdissect_options *, const u_char *, u_int); extern void mobile_print(netdissect_options *, const u_char *, u_int); extern int mobility_print(netdissect_options *, const u_char *, const u_char *); extern void mpcp_print(netdissect_options *, const u_char *, u_int); @@ -570,7 +596,7 @@ extern void netbeui_print(netdissect_options *, u_short, const u_char *, int); extern void nfsreply_print(netdissect_options *, const u_char *, u_int, const u_char *); extern void nfsreply_noaddr_print(netdissect_options *, const u_char *, u_int, const u_char *); extern void nfsreq_noaddr_print(netdissect_options *, const u_char *, u_int, const u_char *); -extern const u_char * ns_nprint (netdissect_options *, register const u_char *, register const u_char *); +extern const u_char * ns_nprint (netdissect_options *, const u_char *, const u_char *); extern void domain_print(netdissect_options *, const u_char *, u_int, int); extern void nsh_print(netdissect_options *ndo, const u_char *bp, u_int len); extern void ntp_print(netdissect_options *, const u_char *, u_int); @@ -585,7 +611,7 @@ extern void otv_print(netdissect_options *, const u_char *, u_int); extern void pgm_print(netdissect_options *, const u_char *, u_int, const u_char *); extern void pim_print(netdissect_options *, const u_char *, u_int, const u_char *); extern void pimv1_print(netdissect_options *, const u_char *, u_int); -extern u_int ppp_print(netdissect_options *, register const u_char *, u_int); +extern u_int ppp_print(netdissect_options *, const u_char *, u_int); extern u_int pppoe_print(netdissect_options *, const u_char *, u_int); extern void pptp_print(netdissect_options *, const u_char *); extern int print_unknown_data(netdissect_options *, const u_char *, const char *, int); @@ -600,7 +626,7 @@ extern void rrcp_print(netdissect_options *, const u_char *, u_int, const struct extern void rsvp_print(netdissect_options *, const u_char *, u_int); extern int rt6_print(netdissect_options *, const u_char *, const u_char *); extern void rtsp_print(netdissect_options *, const u_char *, u_int); -extern void rx_print(netdissect_options *, register const u_char *, u_int, u_int, u_int, const u_char *); +extern void rx_print(netdissect_options *, const u_char *, u_int, u_int, u_int, const u_char *); extern void sctp_print(netdissect_options *, const u_char *, const u_char *, u_int); extern void sflow_print(netdissect_options *, const u_char *, u_int); extern void sip_print(netdissect_options *, const u_char *, u_int); @@ -621,8 +647,8 @@ extern void tipc_print(netdissect_options *, const u_char *, u_int, u_int); extern u_int token_print(netdissect_options *, const u_char *, u_int, u_int); extern void udld_print(netdissect_options *, const u_char *, u_int); extern void udp_print(netdissect_options *, const u_char *, u_int, const u_char *, int); -extern int vjc_print(netdissect_options *, register const char *, u_short); -extern void vqp_print(netdissect_options *, register const u_char *, register u_int); +extern int vjc_print(netdissect_options *, const u_char *, u_short); +extern void vqp_print(netdissect_options *, const u_char *, u_int); extern void vrrp_print(netdissect_options *, const u_char *, u_int, const u_char *, int); extern void vtp_print(netdissect_options *, const u_char *, u_int); extern void vxlan_gpe_print(netdissect_options *ndo, const u_char *bp, u_int len);