X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/62af1ac58c6afa5d616f278c94a42e6dba6f0626..1a04b92e365f5ed01ca38619b41bcc4fc9cbd63c:/netdissect.h diff --git a/netdissect.h b/netdissect.h index 422bf078..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,24 +54,49 @@ 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_32BITS() 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?" + * and then handing the result to system APIs that expect network-order + * IPv4 addresses, such as inet_ntop(), on their little-endian PCs, getting + * the wrong behavior, and concluding "oh, it must be in *little*-endian + * order" and "fixing" it to use EXTRACT_LE_U_4(). Yes, people do this; + * that's why Wireshark has tvb_get_ipv4(), to extract an IPv4 address from + * a packet data buffer; it was introduced in reaction to somebody who + * *had* done that.) */ typedef struct { unsigned char bytes[4]; } 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 */ @@ -181,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 *, @@ -296,16 +325,23 @@ 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)) -#define ND_PRINT(STUFF) (*ndo->ndo_printf)STUFF +#define ND_PRINT(STUFF) (ndo->ndo_printf)STUFF #define ND_DEFAULTPRINT(ap, length) (*ndo->ndo_default_print)(ndo, ap, length) extern void ts_print(netdissect_options *, const struct timeval *); @@ -466,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); @@ -484,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); @@ -496,12 +532,12 @@ extern void dvmrp_print(netdissect_options *, const u_char *, u_int); extern void eap_print(netdissect_options *, const u_char *, u_int); extern void egp_print(netdissect_options *, const u_char *, u_int); extern void eigrp_print(netdissect_options *, const u_char *, u_int); -extern int esp_print(netdissect_options *, const u_char *, const int, const u_char *, int *, int *); +extern int esp_print(netdissect_options *, const u_char *, const int, const u_char *, u_int *, u_int *); extern u_int ether_print(netdissect_options *, const u_char *, u_int, u_int, void (*)(netdissect_options *, const u_char *), const u_char *); 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); @@ -523,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 *); @@ -545,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); @@ -558,9 +594,9 @@ extern void nbt_udp137_print(netdissect_options *, const u_char *, int); extern void nbt_udp138_print(netdissect_options *, const u_char *, int); 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_print_noaddr(netdissect_options *, const u_char *, u_int, const u_char *); -extern void nfsreq_print_noaddr(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 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 *, 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); @@ -575,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); @@ -590,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 *, int, int, 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); @@ -611,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); @@ -620,7 +656,7 @@ extern void vxlan_print(netdissect_options *, const u_char *, u_int); extern void wb_print(netdissect_options *, const void *, u_int); extern void zephyr_print(netdissect_options *, const u_char *, int); extern void zmtp1_print(netdissect_options *, const u_char *, u_int); -extern void zmtp1_print_datagram(netdissect_options *, const u_char *, const u_int); +extern void zmtp1_datagram_print(netdissect_options *, const u_char *, const u_int); /* checksum routines */ extern void init_checksum(void);