X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/cda9bf8c5f842fc7110fbbf2234bcc898f78c0bd..41ef9cfe38f86553ffd8f61b6f87e9c00baf5f07:/netdissect.h diff --git a/netdissect.h b/netdissect.h index 8cf1c08f..66ae4fad 100644 --- a/netdissect.h +++ b/netdissect.h @@ -112,8 +112,6 @@ typedef unsigned char nd_byte; #define roundup2(x, y) (((x)+((y)-1))&(~((y)-1))) #endif -/* nd_snprintf et al */ - #include #include @@ -180,12 +178,18 @@ typedef u_int (*if_printer) IF_PRINTER_ARGS; * * A buffer has a beginnning and end pointer, and a link to the previous * buffer on the stack. + * + * In other cases, we temporarily adjust the snapshot end to reflect a + * packet-length field in the packet data and, when finished dissecting + * that part of the packet, restore the old snapshot end. We keep that + * on the stack with null buffer pointer, meaning there's nothing to + * free. */ -struct netdissect_saved_info { - u_char *ndsi_buffer; /* pointer to allocated buffer data */ - const u_char *ndsi_packetp; /* saved beginning of data */ - const u_char *ndsi_snapend; /* saved end of data */ - struct netdissect_saved_info *ndsi_prev; /* previous buffer on the stack */ +struct netdissect_saved_packet_info { + u_char *ndspi_buffer; /* pointer to allocated buffer data */ + const u_char *ndspi_packetp; /* saved beginning of data */ + const u_char *ndspi_snapend; /* saved end of data */ + struct netdissect_saved_packet_info *ndspi_prev; /* previous buffer on the stack */ }; struct netdissect_options { @@ -228,8 +232,8 @@ struct netdissect_options { const u_char *ndo_packetp; const u_char *ndo_snapend; - /* stack of saved buffer information */ - struct netdissect_saved_info *ndo_buffer_stack; + /* stack of saved packet boundary and buffer information */ + struct netdissect_saved_packet_info *ndo_packet_info_stack; /* pointer to the if_printer function */ if_printer ndo_if_printer; @@ -255,8 +259,10 @@ struct netdissect_options { extern int nd_push_buffer(netdissect_options *, u_char *, const u_char *, const u_char *); -extern void nd_pop_buffer(netdissect_options *); -extern void nd_pop_all_buffers(netdissect_options *); +extern int nd_push_snapend(netdissect_options *, const u_char *); +extern void nd_change_snapend(netdissect_options *, const u_char *); +extern void nd_pop_packet_info(netdissect_options *); +extern void nd_pop_all_packet_info(netdissect_options *); #define PT_VAT 1 /* Visual Audio Tool */ #define PT_WB 2 /* distributed White Board */ @@ -356,6 +362,17 @@ extern void nd_pop_all_buffers(netdissect_options *); /* Bail out if "*(p)" was not captured */ #define ND_TCHECK_SIZE(p) ND_TCHECK_LEN(p, sizeof(*(p))) +/* + * Number of bytes between two pointers. + */ +#define ND_BYTES_BETWEEN(p1, p2) ((u_int)(((const uint8_t *)(p1)) - (const uint8_t *)(p2))) + +/* + * Number of bytes remaining in the captured data, starting at the + * byte pointed to by the argument. + */ +#define ND_BYTES_AVAILABLE_AFTER(p) ND_BYTES_BETWEEN(ndo->ndo_snapend, (p)) + #define ND_PRINT(...) (ndo->ndo_printf)(ndo, __VA_ARGS__) #define ND_DEFAULTPRINT(ap, length) (*ndo->ndo_default_print)(ndo, ap, length) @@ -469,6 +486,8 @@ extern u_int brcm_tag_if_print IF_PRINTER_ARGS; extern u_int brcm_tag_prepend_if_print IF_PRINTER_ARGS; extern u_int chdlc_if_print IF_PRINTER_ARGS; extern u_int cip_if_print IF_PRINTER_ARGS; +extern u_int dsa_if_print IF_PRINTER_ARGS; +extern u_int edsa_if_print IF_PRINTER_ARGS; extern u_int enc_if_print IF_PRINTER_ARGS; extern u_int ether_if_print IF_PRINTER_ARGS; extern u_int fddi_if_print IF_PRINTER_ARGS; @@ -479,6 +498,7 @@ extern u_int ieee802_11_radio_if_print IF_PRINTER_ARGS; extern u_int ieee802_15_4_if_print IF_PRINTER_ARGS; extern u_int ieee802_15_4_tap_if_print IF_PRINTER_ARGS; extern u_int ipfc_if_print IF_PRINTER_ARGS; +extern u_int ipoib_if_print IF_PRINTER_ARGS; extern u_int ipnet_if_print IF_PRINTER_ARGS; extern u_int juniper_atm1_if_print IF_PRINTER_ARGS; extern u_int juniper_atm2_if_print IF_PRINTER_ARGS; @@ -544,6 +564,7 @@ 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); +extern int arista_ethertype_print(netdissect_options *,const u_char *, u_int); extern void arp_print(netdissect_options *, const u_char *, u_int, u_int); extern void ascii_print(netdissect_options *, const u_char *, u_int); extern void atalk_print(netdissect_options *, const u_char *, u_int); @@ -564,7 +585,7 @@ extern void cnfp_print(netdissect_options *, const u_char *); extern void dccp_print(netdissect_options *, const u_char *, const u_char *, u_int); extern void decnet_print(netdissect_options *, const u_char *, u_int, u_int); extern void dhcp6_print(netdissect_options *, const u_char *, u_int); -extern int dstopt_print(netdissect_options *, const u_char *); +extern int dstopt_process(netdissect_options *, const u_char *); extern void dtp_print(netdissect_options *, const u_char *, u_int); extern void dvmrp_print(netdissect_options *, const u_char *, u_int); extern void eap_print(netdissect_options *, const u_char *, u_int); @@ -572,7 +593,7 @@ extern void egp_print(netdissect_options *, const u_char *, u_int); extern void eigrp_print(netdissect_options *, const u_char *, u_int); extern void esp_print(netdissect_options *, const u_char *, u_int, const u_char *, u_int, 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 u_int ether_hdr_len_print(netdissect_options *, const u_char *, u_int, u_int, void (*)(netdissect_options *, const u_char *), const u_char *, u_int); +extern u_int ether_print_switch_tag(netdissect_options *, const u_char *, u_int, u_int, void (*)(netdissect_options *, const u_char *), u_int); 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); @@ -582,7 +603,7 @@ extern void ftp_print(netdissect_options *, const u_char *, u_int); extern void geneve_print(netdissect_options *, const u_char *, u_int); extern void geonet_print(netdissect_options *, const u_char *, u_int, const struct lladdr_info *); extern void gre_print(netdissect_options *, const u_char *, u_int); -extern int hbhopt_print(netdissect_options *, const u_char *); +extern int hbhopt_process(netdissect_options *, const u_char *, int *, uint32_t *); extern void hex_and_ascii_print(netdissect_options *, const char *, const u_char *, u_int); extern void hex_print(netdissect_options *, const char *ident, const u_char *cp, u_int); extern void hex_print_with_offset(netdissect_options *, const char *ident, const u_char *cp, u_int, u_int); @@ -619,7 +640,6 @@ extern void lwapp_control_print(netdissect_options *, const u_char *, u_int, int 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 *, 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 *); @@ -668,6 +688,7 @@ extern void rtsp_print(netdissect_options *, const u_char *, u_int); 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 ssh_print(netdissect_options *, const u_char *, u_int); extern void sip_print(netdissect_options *, const u_char *, u_int); extern void slow_print(netdissect_options *, const u_char *, u_int); extern void smb_data_print(netdissect_options *, const u_char *, u_int); @@ -711,16 +732,17 @@ extern uint16_t in_cksum(const struct cksum_vec *, int); extern uint16_t in_cksum_shouldbe(uint16_t, uint16_t); /* IP protocol demuxing routines */ -extern void ip_print_demux(netdissect_options *, const u_char *, u_int, u_int, int, u_int, u_int, const u_char *); +extern void ip_print_demux(netdissect_options *, const u_char *, u_int, u_int, int, u_int, uint8_t, const u_char *); -extern uint16_t nextproto4_cksum(netdissect_options *, const struct ip *, const uint8_t *, u_int, u_int, u_int); +extern uint16_t nextproto4_cksum(netdissect_options *, const struct ip *, const uint8_t *, u_int, u_int, uint8_t); /* in print-ip6.c */ -extern uint16_t nextproto6_cksum(netdissect_options *, const struct ip6_hdr *, const uint8_t *, u_int, u_int, u_int); +extern uint16_t nextproto6_cksum(netdissect_options *, const struct ip6_hdr *, const uint8_t *, u_int, u_int, uint8_t); /* Utilities */ extern void nd_print_trunc(netdissect_options *); extern void nd_print_protocol(netdissect_options *); +extern void nd_print_protocol_caps(netdissect_options *); extern void nd_print_invalid(netdissect_options *); extern int mask2plen(uint32_t); @@ -729,8 +751,8 @@ extern int mask62plen(const u_char *); extern const char *dnname_string(netdissect_options *, u_short); extern const char *dnnum_string(netdissect_options *, u_short); -extern int decode_prefix4(netdissect_options *, const u_char *, u_int, char *, u_int); -extern int decode_prefix6(netdissect_options *, const u_char *, u_int, char *, u_int); +extern int decode_prefix4(netdissect_options *, const u_char *, u_int, char *, size_t); +extern int decode_prefix6(netdissect_options *, const u_char *, u_int, char *, size_t); extern void esp_print_decodesecret(netdissect_options *); extern int esp_print_decrypt_buffer_by_ikev2(netdissect_options *, int,