From: Denis Ovsienko Date: Tue, 1 Apr 2014 15:42:33 +0000 (+0400) Subject: NDOize EAP, IEEE CFM, lwres, SIP & Syslog decoders X-Git-Tag: tcpdump-4.6.0~120^2 X-Git-Url: https://git.tcpdump.org/tcpdump/commitdiff_plain/0aef9cda5781e238251b7b252efe11e163250e48 NDOize EAP, IEEE CFM, lwres, SIP & Syslog decoders --- diff --git a/interface.h b/interface.h index 47f03500..451702cc 100644 --- a/interface.h +++ b/interface.h @@ -181,10 +181,6 @@ extern void smb_tcp_print(const u_char *, int); extern char *smb_errstr(int, int); extern const char *nt_errstr(u_int32_t); extern void print_data(const unsigned char *, int); -extern void cfm_print(const u_char *, u_int); -extern void lwres_print(const u_char *, u_int); -extern void sip_print(const u_char *, u_int); -extern void syslog_print(const u_char *, u_int); #ifdef INET6 diff --git a/netdissect.h b/netdissect.h index 1cfc6fd9..03b0b9f0 100644 --- a/netdissect.h +++ b/netdissect.h @@ -502,6 +502,10 @@ extern void nfsreply_print(netdissect_options *, const u_char *, u_int, const u_ extern void nfsreply_print_noaddr(netdissect_options *, const u_char *, u_int, const u_char *); extern void nfsreq_print(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 void sip_print(netdissect_options *, const u_char *, u_int); +extern void syslog_print(netdissect_options *, const u_char *, u_int); +extern void lwres_print(netdissect_options *, const u_char *, u_int); +extern void cfm_print(netdissect_options *, const u_char *, u_int); /* stuff that has not yet been rototiled */ @@ -542,7 +546,6 @@ extern void nbt_udp138_print(netdissect_options *, extern char *smb_errstr(netdissect_options *,int, int); extern const char *nt_errstr(netdissect_options *, u_int32_t); extern void print_data(netdissect_options *,const unsigned char *, int); -extern void lwres_print(netdissect_options *,const u_char *, u_int); #endif extern u_int ipnet_if_print(netdissect_options *,const struct pcap_pkthdr *, const u_char *); diff --git a/print-cfm.c b/print-cfm.c index 2f43d613..6901b898 100644 --- a/print-cfm.c +++ b/print-cfm.c @@ -17,6 +17,7 @@ * Original code by Hannes Gredler (hannes@juniper.net) */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -24,8 +25,6 @@ #include #include -#include -#include #include "interface.h" #include "extract.h" @@ -34,12 +33,6 @@ #include "oui.h" #include "af.h" -/* - * Prototypes - */ -const char * cfm_egress_id_string(register const u_char *); -int cfm_mgmt_addr_print(register const u_char *); - struct cfm_common_header_t { u_int8_t mdlevel_version; u_int8_t opcode; @@ -232,8 +225,9 @@ static const struct tok cfm_tlv_senderid_chassisid_values[] = { }; -int -cfm_mgmt_addr_print(register const u_char *tptr) { +static int +cfm_mgmt_addr_print(netdissect_options *ndo, + register const u_char *tptr) { u_int mgmt_addr_type; u_int hexdump = FALSE; @@ -244,21 +238,21 @@ cfm_mgmt_addr_print(register const u_char *tptr) { * is only once octet */ mgmt_addr_type = *tptr; - printf("\n\t Management Address Type %s (%u)", + ND_PRINT((ndo, "\n\t Management Address Type %s (%u)", tok2str(af_values, "Unknown", mgmt_addr_type), - mgmt_addr_type); + mgmt_addr_type)); /* * Resolve the passed in Address. */ switch(mgmt_addr_type) { case AFNUM_INET: - printf(", %s", ipaddr_string(tptr + 1)); + ND_PRINT((ndo, ", %s", ipaddr_string(tptr + 1))); break; #ifdef INET6 case AFNUM_INET6: - printf(", %s", ip6addr_string(tptr + 1)); + ND_PRINT((ndo, ", %s", ip6addr_string(tptr + 1))); break; #endif @@ -273,7 +267,7 @@ cfm_mgmt_addr_print(register const u_char *tptr) { /* * The egress-ID string is a 16-Bit string plus a MAC address. */ -const char * +static const char * cfm_egress_id_string(register const u_char *tptr) { static char egress_id_buffer[80]; @@ -286,7 +280,8 @@ cfm_egress_id_string(register const u_char *tptr) { } void -cfm_print(register const u_char *pptr, register u_int length) { +cfm_print(netdissect_options *ndo, + register const u_char *pptr, register u_int length) { const struct cfm_common_header_t *cfm_common_header; const struct cfm_tlv_header_t *cfm_tlv_header; @@ -303,31 +298,31 @@ cfm_print(register const u_char *pptr, register u_int length) { tptr=pptr; cfm_common_header = (const struct cfm_common_header_t *)pptr; - TCHECK(*cfm_common_header); + ND_TCHECK(*cfm_common_header); /* * Sanity checking of the header. */ if (CFM_EXTRACT_VERSION(cfm_common_header->mdlevel_version) != CFM_VERSION) { - printf("CFMv%u not supported, length %u", - CFM_EXTRACT_VERSION(cfm_common_header->mdlevel_version), length); + ND_PRINT((ndo, "CFMv%u not supported, length %u", + CFM_EXTRACT_VERSION(cfm_common_header->mdlevel_version), length)); return; } - printf("CFMv%u %s, MD Level %u, length %u", + ND_PRINT((ndo, "CFMv%u %s, MD Level %u, length %u", CFM_EXTRACT_VERSION(cfm_common_header->mdlevel_version), tok2str(cfm_opcode_values, "unknown (%u)", cfm_common_header->opcode), CFM_EXTRACT_MD_LEVEL(cfm_common_header->mdlevel_version), - length); + length)); /* * In non-verbose mode just print the opcode and md-level. */ - if (vflag < 1) { + if (ndo->ndo_vflag < 1) { return; } - printf("\n\tFirst TLV offset %u", cfm_common_header->first_tlv_offset); + ND_PRINT((ndo, "\n\tFirst TLV offset %u", cfm_common_header->first_tlv_offset)); tptr += sizeof(const struct cfm_common_header_t); tlen = length - sizeof(struct cfm_common_header_t); @@ -337,53 +332,53 @@ cfm_print(register const u_char *pptr, register u_int length) { msg_ptr.cfm_ccm = (const struct cfm_ccm_t *)tptr; ccm_interval = CFM_EXTRACT_CCM_INTERVAL(cfm_common_header->flags); - printf(", Flags [CCM Interval %u%s]", + ND_PRINT((ndo, ", Flags [CCM Interval %u%s]", ccm_interval, cfm_common_header->flags & CFM_CCM_RDI_FLAG ? - ", RDI" : ""); + ", RDI" : "")); /* * Resolve the CCM interval field. */ if (ccm_interval) { - printf("\n\t CCM Interval %.3fs" + ND_PRINT((ndo, "\n\t CCM Interval %.3fs" ", min CCM Lifetime %.3fs, max CCM Lifetime %.3fs", ccm_interval_base[ccm_interval], ccm_interval_base[ccm_interval] * CCM_INTERVAL_MIN_MULTIPLIER, - ccm_interval_base[ccm_interval] * CCM_INTERVAL_MAX_MULTIPLIER); + ccm_interval_base[ccm_interval] * CCM_INTERVAL_MAX_MULTIPLIER)); } - printf("\n\t Sequence Number 0x%08x, MA-End-Point-ID 0x%04x", + ND_PRINT((ndo, "\n\t Sequence Number 0x%08x, MA-End-Point-ID 0x%04x", EXTRACT_32BITS(msg_ptr.cfm_ccm->sequence), - EXTRACT_16BITS(msg_ptr.cfm_ccm->ma_epi)); + EXTRACT_16BITS(msg_ptr.cfm_ccm->ma_epi))); /* * Resolve the MD fields. */ - printf("\n\t MD Name Format %s (%u), MD Name length %u", + ND_PRINT((ndo, "\n\t MD Name Format %s (%u), MD Name length %u", tok2str(cfm_md_nameformat_values, "Unknown", msg_ptr.cfm_ccm->md_nameformat), msg_ptr.cfm_ccm->md_nameformat, - msg_ptr.cfm_ccm->md_namelength); + msg_ptr.cfm_ccm->md_namelength)); if (msg_ptr.cfm_ccm->md_nameformat != CFM_CCM_MD_FORMAT_NONE) { - printf("\n\t MD Name: "); + ND_PRINT((ndo, "\n\t MD Name: ")); switch (msg_ptr.cfm_ccm->md_nameformat) { case CFM_CCM_MD_FORMAT_DNS: case CFM_CCM_MD_FORMAT_CHAR: - safeputs(gndo, msg_ptr.cfm_ccm->md_name, msg_ptr.cfm_ccm->md_namelength); + safeputs(ndo, msg_ptr.cfm_ccm->md_name, msg_ptr.cfm_ccm->md_namelength); break; case CFM_CCM_MD_FORMAT_MAC: - printf("\n\t MAC %s", etheraddr_string( - msg_ptr.cfm_ccm->md_name)); + ND_PRINT((ndo, "\n\t MAC %s", etheraddr_string( + msg_ptr.cfm_ccm->md_name))); break; /* FIXME add printers for those MD formats - hexdump for now */ case CFM_CCM_MA_FORMAT_8021: default: - print_unknown_data(gndo,msg_ptr.cfm_ccm->md_name, "\n\t ", + print_unknown_data(ndo, msg_ptr.cfm_ccm->md_name, "\n\t ", msg_ptr.cfm_ccm->md_namelength); } } @@ -396,16 +391,16 @@ cfm_print(register const u_char *pptr, register u_int length) { ma_namelength = msg_ptr.cfm_ccm->md_name + msg_ptr.cfm_ccm->md_namelength + 1; ma_name = msg_ptr.cfm_ccm->md_name + msg_ptr.cfm_ccm->md_namelength + 2; - printf("\n\t MA Name-Format %s (%u), MA name length %u", + ND_PRINT((ndo, "\n\t MA Name-Format %s (%u), MA name length %u", tok2str(cfm_ma_nameformat_values, "Unknown", *ma_nameformat), *ma_nameformat, - *ma_namelength); + *ma_namelength)); - printf("\n\t MA Name: "); + ND_PRINT((ndo, "\n\t MA Name: ")); switch (*ma_nameformat) { case CFM_CCM_MA_FORMAT_CHAR: - safeputs(gndo, ma_name, *ma_namelength); + safeputs(ndo, ma_name, *ma_namelength); break; /* FIXME add printers for those MA formats - hexdump for now */ @@ -414,45 +409,45 @@ cfm_print(register const u_char *pptr, register u_int length) { case CFM_CCM_MA_FORMAT_INT: case CFM_CCM_MA_FORMAT_VPN: default: - print_unknown_data(gndo,ma_name, "\n\t ", *ma_namelength); + print_unknown_data(ndo, ma_name, "\n\t ", *ma_namelength); } break; case CFM_OPCODE_LTM: msg_ptr.cfm_ltm = (const struct cfm_ltm_t *)tptr; - printf(", Flags [%s]", - bittok2str(cfm_ltm_flag_values, "none", cfm_common_header->flags)); + ND_PRINT((ndo, ", Flags [%s]", + bittok2str(cfm_ltm_flag_values, "none", cfm_common_header->flags))); - printf("\n\t Transaction-ID 0x%08x, Egress-ID %s, ttl %u", + ND_PRINT((ndo, "\n\t Transaction-ID 0x%08x, Egress-ID %s, ttl %u", EXTRACT_32BITS(msg_ptr.cfm_ltm->transaction_id), cfm_egress_id_string(msg_ptr.cfm_ltm->egress_id), - msg_ptr.cfm_ltm->ttl); + msg_ptr.cfm_ltm->ttl)); - printf("\n\t Original-MAC %s, Target-MAC %s", + ND_PRINT((ndo, "\n\t Original-MAC %s, Target-MAC %s", etheraddr_string(msg_ptr.cfm_ltm->original_mac), - etheraddr_string(msg_ptr.cfm_ltm->target_mac)); + etheraddr_string(msg_ptr.cfm_ltm->target_mac))); break; case CFM_OPCODE_LTR: msg_ptr.cfm_ltr = (const struct cfm_ltr_t *)tptr; - printf(", Flags [%s]", - bittok2str(cfm_ltr_flag_values, "none", cfm_common_header->flags)); + ND_PRINT((ndo, ", Flags [%s]", + bittok2str(cfm_ltr_flag_values, "none", cfm_common_header->flags))); - printf("\n\t Transaction-ID 0x%08x, Last-Egress-ID %s", + ND_PRINT((ndo, "\n\t Transaction-ID 0x%08x, Last-Egress-ID %s", EXTRACT_32BITS(msg_ptr.cfm_ltr->transaction_id), - cfm_egress_id_string(msg_ptr.cfm_ltr->last_egress_id)); + cfm_egress_id_string(msg_ptr.cfm_ltr->last_egress_id))); - printf("\n\t Next-Egress-ID %s, ttl %u", + ND_PRINT((ndo, "\n\t Next-Egress-ID %s, ttl %u", cfm_egress_id_string(msg_ptr.cfm_ltr->next_egress_id), - msg_ptr.cfm_ltr->ttl); + msg_ptr.cfm_ltr->ttl)); - printf("\n\t Replay-Action %s (%u)", + ND_PRINT((ndo, "\n\t Replay-Action %s (%u)", tok2str(cfm_ltr_replay_action_values, "Unknown", msg_ptr.cfm_ltr->replay_action), - msg_ptr.cfm_ltr->replay_action); + msg_ptr.cfm_ltr->replay_action)); break; /* @@ -463,7 +458,7 @@ cfm_print(register const u_char *pptr, register u_int length) { case CFM_OPCODE_LBM: default: if (tlen > cfm_common_header->first_tlv_offset) { - print_unknown_data(gndo,tptr, "\n\t ", + print_unknown_data(ndo, tptr, "\n\t ", tlen - cfm_common_header->first_tlv_offset); } break; @@ -483,27 +478,27 @@ cfm_print(register const u_char *pptr, register u_int length) { cfm_tlv_header = (const struct cfm_tlv_header_t *)tptr; /* Enough to read the tlv type ? */ - TCHECK2(*tptr, 1); + ND_TCHECK2(*tptr, 1); cfm_tlv_type=cfm_tlv_header->type; if (cfm_tlv_type != CFM_TLV_END) { /* did we capture enough for fully decoding the object header ? */ - TCHECK2(*tptr, sizeof(struct cfm_tlv_header_t)); + ND_TCHECK2(*tptr, sizeof(struct cfm_tlv_header_t)); cfm_tlv_len=EXTRACT_16BITS(&cfm_tlv_header->length); } else { cfm_tlv_len = 0; } - printf("\n\t%s TLV (0x%02x), length %u", + ND_PRINT((ndo, "\n\t%s TLV (0x%02x), length %u", tok2str(cfm_tlv_values, "Unknown", cfm_tlv_type), cfm_tlv_type, - cfm_tlv_len); + cfm_tlv_len)); /* sanity check for not walking off and infinite loop check. */ if ((cfm_tlv_type != CFM_TLV_END) && ((cfm_tlv_len + sizeof(struct cfm_tlv_header_t) > tlen) || (!cfm_tlv_len))) { - print_unknown_data(gndo,tptr,"\n\t ",tlen); + print_unknown_data(ndo, tptr, "\n\t ", tlen); return; } @@ -513,7 +508,7 @@ cfm_print(register const u_char *pptr, register u_int length) { /* did we capture enough for fully decoding the object ? */ if (cfm_tlv_type != CFM_TLV_END) { - TCHECK2(*tptr, cfm_tlv_len); + ND_TCHECK2(*tptr, cfm_tlv_len); } hexdump = FALSE; @@ -523,22 +518,22 @@ cfm_print(register const u_char *pptr, register u_int length) { return; case CFM_TLV_PORT_STATUS: - printf(", Status: %s (%u)", + ND_PRINT((ndo, ", Status: %s (%u)", tok2str(cfm_tlv_port_status_values, "Unknown", *tptr), - *tptr); + *tptr)); break; case CFM_TLV_INTERFACE_STATUS: - printf(", Status: %s (%u)", + ND_PRINT((ndo, ", Status: %s (%u)", tok2str(cfm_tlv_interface_status_values, "Unknown", *tptr), - *tptr); + *tptr)); break; case CFM_TLV_PRIVATE: - printf(", Vendor: %s (%u), Sub-Type %u", + ND_PRINT((ndo, ", Vendor: %s (%u), Sub-Type %u", tok2str(oui_values,"Unknown", EXTRACT_24BITS(tptr)), EXTRACT_24BITS(tptr), - *(tptr+3)); + *(tptr + 3))); hexdump = TRUE; break; @@ -561,20 +556,20 @@ cfm_print(register const u_char *pptr, register u_int length) { if (chassis_id_length) { chassis_id_type = *tptr; - printf("\n\t Chassis-ID Type %s (%u), Chassis-ID length %u", + ND_PRINT((ndo, "\n\t Chassis-ID Type %s (%u), Chassis-ID length %u", tok2str(cfm_tlv_senderid_chassisid_values, "Unknown", chassis_id_type), chassis_id_type, - chassis_id_length); + chassis_id_length)); switch (chassis_id_type) { case CFM_CHASSIS_ID_MAC_ADDRESS: - printf("\n\t MAC %s", etheraddr_string(tptr+1)); + ND_PRINT((ndo, "\n\t MAC %s", etheraddr_string(tptr + 1))); break; case CFM_CHASSIS_ID_NETWORK_ADDRESS: - hexdump |= cfm_mgmt_addr_print(tptr); + hexdump |= cfm_mgmt_addr_print(ndo, tptr); break; case CFM_CHASSIS_ID_INTERFACE_NAME: /* fall through */ @@ -582,7 +577,7 @@ cfm_print(register const u_char *pptr, register u_int length) { case CFM_CHASSIS_ID_LOCAL: case CFM_CHASSIS_ID_CHASSIS_COMPONENT: case CFM_CHASSIS_ID_PORT_COMPONENT: - safeputs(gndo, tptr + 1, chassis_id_length); + safeputs(ndo, tptr + 1, chassis_id_length); break; default: @@ -607,7 +602,7 @@ cfm_print(register const u_char *pptr, register u_int length) { tlen--; if (mgmt_addr_length) { - hexdump |= cfm_mgmt_addr_print(tptr); + hexdump |= cfm_mgmt_addr_print(ndo, tptr); } tptr += mgmt_addr_length; @@ -629,13 +624,13 @@ cfm_print(register const u_char *pptr, register u_int length) { break; } /* do we want to see an additional hexdump ? */ - if (hexdump || vflag > 1) - print_unknown_data(gndo,tlv_ptr, "\n\t ", cfm_tlv_len); + if (hexdump || ndo->ndo_vflag > 1) + print_unknown_data(ndo, tlv_ptr, "\n\t ", cfm_tlv_len); tptr+=cfm_tlv_len; tlen-=cfm_tlv_len; } return; trunc: - printf("\n\t\t packet exceeded snapshot"); + ND_PRINT((ndo, "\n\t\t packet exceeded snapshot")); } diff --git a/print-eap.c b/print-eap.c index fba40e27..5c623dc5 100644 --- a/print-eap.c +++ b/print-eap.c @@ -21,19 +21,16 @@ * */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif #include -#include -#include - #include "netdissect.h" #include "interface.h" #include "extract.h" -#include "ether.h" #define EAP_FRAME_TYPE_PACKET 0 #define EAP_FRAME_TYPE_START 1 @@ -153,7 +150,7 @@ static const struct tok eap_aka_subtype_values[] = { * Print EAP requests / responses */ void -eap_print(netdissect_options *ndo _U_, +eap_print(netdissect_options *ndo, register const u_char *cp, u_int length _U_) { @@ -165,23 +162,23 @@ eap_print(netdissect_options *ndo _U_, tptr = cp; tlen = length; eap = (const struct eap_frame_t *)cp; - TCHECK(*eap); + ND_TCHECK(*eap); /* in non-verbose mode just lets print the basic info */ - if (vflag < 1) { - printf("%s (%u) v%u, len %u", + if (ndo->ndo_vflag < 1) { + ND_PRINT((ndo, "%s (%u) v%u, len %u", tok2str(eap_frame_type_values, "unknown", eap->type), eap->type, eap->version, - EXTRACT_16BITS(eap->length)); + EXTRACT_16BITS(eap->length))); return; } - printf("%s (%u) v%u, len %u", + ND_PRINT((ndo, "%s (%u) v%u, len %u", tok2str(eap_frame_type_values, "unknown", eap->type), eap->type, eap->version, - EXTRACT_16BITS(eap->length)); + EXTRACT_16BITS(eap->length))); tptr += sizeof(const struct eap_frame_t); tlen -= sizeof(const struct eap_frame_t); @@ -190,33 +187,33 @@ eap_print(netdissect_options *ndo _U_, case EAP_FRAME_TYPE_PACKET: type = *(tptr); len = EXTRACT_16BITS(tptr+2); - printf(", %s (%u), id %u, len %u", + ND_PRINT((ndo, ", %s (%u), id %u, len %u", tok2str(eap_code_values, "unknown", type), type, *(tptr+1), - len); + len)); - if (!TTEST2(*tptr, len)) + if (!ND_TTEST2(*tptr, len)) goto trunc; if (type <= 2) { /* For EAP_REQUEST and EAP_RESPONSE only */ subtype = *(tptr+4); - printf("\n\t\t Type %s (%u)", + ND_PRINT((ndo, "\n\t\t Type %s (%u)", tok2str(eap_type_values, "unknown", *(tptr+4)), - *(tptr+4)); + *(tptr + 4))); switch (subtype) { case EAP_TYPE_IDENTITY: if (len - 5 > 0) { - printf(", Identity: "); - safeputs(gndo, tptr + 5, len - 5); + ND_PRINT((ndo, ", Identity: ")); + safeputs(ndo, tptr + 5, len - 5); } break; case EAP_TYPE_NOTIFICATION: if (len - 5 > 0) { - printf(", Notification: "); - safeputs(gndo, tptr + 5, len - 5); + ND_PRINT((ndo, ", Notification: ")); + safeputs(ndo, tptr + 5, len - 5); } break; @@ -229,35 +226,35 @@ eap_print(netdissect_options *ndo _U_, * type one octet per type */ while (count < len) { - printf(" %s (%u),", + ND_PRINT((ndo, " %s (%u),", tok2str(eap_type_values, "unknown", *(tptr+count)), - *(tptr+count)); + *(tptr + count))); count++; } break; case EAP_TYPE_TTLS: - printf(" TTLSv%u", - EAP_TTLS_VERSION(*(tptr+5))); /* fall through */ + ND_PRINT((ndo, " TTLSv%u", + EAP_TTLS_VERSION(*(tptr + 5)))); /* fall through */ case EAP_TYPE_TLS: - printf(" flags [%s] 0x%02x,", + ND_PRINT((ndo, " flags [%s] 0x%02x,", bittok2str(eap_tls_flags_values, "none", *(tptr+5)), - *(tptr+5)); + *(tptr + 5))); if (EAP_TLS_EXTRACT_BIT_L(*(tptr+5))) { - printf(" len %u", EXTRACT_32BITS(tptr+6)); + ND_PRINT((ndo, " len %u", EXTRACT_32BITS(tptr + 6))); } break; case EAP_TYPE_FAST: - printf(" FASTv%u", - EAP_TTLS_VERSION(*(tptr+5))); - printf(" flags [%s] 0x%02x,", + ND_PRINT((ndo, " FASTv%u", + EAP_TTLS_VERSION(*(tptr + 5)))); + ND_PRINT((ndo, " flags [%s] 0x%02x,", bittok2str(eap_tls_flags_values, "none", *(tptr+5)), - *(tptr+5)); + *(tptr + 5))); if (EAP_TLS_EXTRACT_BIT_L(*(tptr+5))) { - printf(" len %u", EXTRACT_32BITS(tptr+6)); + ND_PRINT((ndo, " len %u", EXTRACT_32BITS(tptr + 6))); } /* FIXME - TLV attributes follow */ @@ -265,9 +262,9 @@ eap_print(netdissect_options *ndo _U_, case EAP_TYPE_AKA: case EAP_TYPE_SIM: - printf(" subtype [%s] 0x%02x,", + ND_PRINT((ndo, " subtype [%s] 0x%02x,", tok2str(eap_aka_subtype_values, "unknown", *(tptr+5)), - *(tptr+5)); + *(tptr + 5))); /* FIXME - TLV attributes follow */ break; @@ -291,7 +288,7 @@ eap_print(netdissect_options *ndo _U_, return; trunc: - printf("\n\t[|EAP]"); + ND_PRINT((ndo, "\n\t[|EAP]")); } /* diff --git a/print-ether.c b/print-ether.c index 4702e883..2bae5742 100644 --- a/print-ether.c +++ b/print-ether.c @@ -390,7 +390,7 @@ ethertype_print(netdissect_options *ndo, case ETHERTYPE_CFM: case ETHERTYPE_CFM_OLD: - cfm_print(/*ndo,*/p, length); + cfm_print(ndo, p, length); return (1); case ETHERTYPE_LLDP: diff --git a/print-lwres.c b/print-lwres.c index e4e80c75..d253da9d 100644 --- a/print-lwres.c +++ b/print-lwres.c @@ -27,6 +27,7 @@ * SUCH DAMAGE. */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -182,25 +183,21 @@ static const struct tok opcode[] = { extern const struct tok ns_type2str[]; extern const struct tok ns_class2str[]; -static int lwres_printname(size_t, const char *); -static int lwres_printnamelen(const char *); -static int lwres_printbinlen(const char *); -static int lwres_printaddr(lwres_addr_t *); - static int -lwres_printname(size_t l, const char *p0) +lwres_printname(netdissect_options *ndo, + size_t l, const char *p0) { const char *p; size_t i; p = p0; /* + 1 for terminating \0 */ - if (p + l + 1 > (const char *)snapend) + if (p + l + 1 > (const char *)ndo->ndo_snapend) goto trunc; - printf(" "); + ND_PRINT((ndo, " ")); for (i = 0; i < l; i++) - safeputchar(gndo, *p++); + safeputchar(ndo, *p++); p++; /* skip terminating \0 */ return p - p0; @@ -210,15 +207,16 @@ lwres_printname(size_t l, const char *p0) } static int -lwres_printnamelen(const char *p) +lwres_printnamelen(netdissect_options *ndo, + const char *p) { u_int16_t l; int advance; - if (p + 2 > (const char *)snapend) + if (p + 2 > (const char *)ndo->ndo_snapend) goto trunc; l = EXTRACT_16BITS(p); - advance = lwres_printname(l, p + 2); + advance = lwres_printname(ndo, l, p + 2); if (advance < 0) goto trunc; return 2 + advance; @@ -228,21 +226,22 @@ lwres_printnamelen(const char *p) } static int -lwres_printbinlen(const char *p0) +lwres_printbinlen(netdissect_options *ndo, + const char *p0) { const char *p; u_int16_t l; int i; p = p0; - if (p + 2 > (const char *)snapend) + if (p + 2 > (const char *)ndo->ndo_snapend) goto trunc; l = EXTRACT_16BITS(p); - if (p + 2 + l > (const char *)snapend) + if (p + 2 + l > (const char *)ndo->ndo_snapend) goto trunc; p += 2; for (i = 0; i < l; i++) - printf("%02x", *p++); + ND_PRINT((ndo, "%02x", *p++)); return p - p0; trunc: @@ -250,37 +249,38 @@ lwres_printbinlen(const char *p0) } static int -lwres_printaddr(lwres_addr_t *ap) +lwres_printaddr(netdissect_options *ndo, + lwres_addr_t *ap) { u_int16_t l; const char *p; int i; - TCHECK(ap->length); + ND_TCHECK(ap->length); l = EXTRACT_16BITS(&ap->length); /* XXX ap points to packed struct */ p = (const char *)&ap->length + sizeof(ap->length); - TCHECK2(*p, l); + ND_TCHECK2(*p, l); switch (EXTRACT_32BITS(&ap->family)) { case 1: /* IPv4 */ if (l < 4) return -1; - printf(" %s", ipaddr_string(p)); + ND_PRINT((ndo, " %s", ipaddr_string(p))); p += sizeof(struct in_addr); break; #ifdef INET6 case 2: /* IPv6 */ if (l < 16) return -1; - printf(" %s", ip6addr_string(p)); + ND_PRINT((ndo, " %s", ip6addr_string(p))); p += sizeof(struct in6_addr); break; #endif default: - printf(" %u/", EXTRACT_32BITS(&ap->family)); + ND_PRINT((ndo, " %u/", EXTRACT_32BITS(&ap->family))); for (i = 0; i < l; i++) - printf("%02x", *p++); + ND_PRINT((ndo, "%02x", *p++)); } return p - (const char *)ap; @@ -290,7 +290,8 @@ lwres_printaddr(lwres_addr_t *ap) } void -lwres_print(register const u_char *bp, u_int length) +lwres_print(netdissect_options *ndo, + register const u_char *bp, u_int length) { const struct lwres_lwpacket *np; u_int32_t v; @@ -300,12 +301,12 @@ lwres_print(register const u_char *bp, u_int length) int unsupported = 0; np = (const struct lwres_lwpacket *)bp; - TCHECK(np->authlength); + ND_TCHECK(np->authlength); - printf(" lwres"); + ND_PRINT((ndo, " lwres")); v = EXTRACT_16BITS(&np->version); - if (vflag || v != LWRES_LWPACKETVERSION_0) - printf(" v%u", v); + if (ndo->ndo_vflag || v != LWRES_LWPACKETVERSION_0) + ND_PRINT((ndo, " v%u", v)); if (v != LWRES_LWPACKETVERSION_0) { s = (const char *)np + EXTRACT_32BITS(&np->length); goto tail; @@ -316,25 +317,25 @@ lwres_print(register const u_char *bp, u_int length) /* opcode and pktflags */ v = EXTRACT_32BITS(&np->opcode); s = tok2str(opcode, "#0x%x", v); - printf(" %s%s", s, response ? "" : "?"); + ND_PRINT((ndo, " %s%s", s, response ? "" : "?")); /* pktflags */ v = EXTRACT_16BITS(&np->pktflags); if (v & ~LWRES_LWPACKETFLAG_RESPONSE) - printf("[0x%x]", v); + ND_PRINT((ndo, "[0x%x]", v)); - if (vflag > 1) { - printf(" ("); /*)*/ - printf("serial:0x%x", EXTRACT_32BITS(&np->serial)); - printf(" result:0x%x", EXTRACT_32BITS(&np->result)); - printf(" recvlen:%u", EXTRACT_32BITS(&np->recvlength)); + if (ndo->ndo_vflag > 1) { + ND_PRINT((ndo, " (")); /*)*/ + ND_PRINT((ndo, "serial:0x%x", EXTRACT_32BITS(&np->serial))); + ND_PRINT((ndo, " result:0x%x", EXTRACT_32BITS(&np->result))); + ND_PRINT((ndo, " recvlen:%u", EXTRACT_32BITS(&np->recvlength))); /* BIND910: not used */ - if (vflag > 2) { - printf(" authtype:0x%x", EXTRACT_16BITS(&np->authtype)); - printf(" authlen:%u", EXTRACT_16BITS(&np->authlength)); + if (ndo->ndo_vflag > 2) { + ND_PRINT((ndo, " authtype:0x%x", EXTRACT_16BITS(&np->authtype))); + ND_PRINT((ndo, " authlen:%u", EXTRACT_16BITS(&np->authlength))); } /*(*/ - printf(")"); + ND_PRINT((ndo, ")")); } /* per-opcode content */ @@ -356,51 +357,51 @@ lwres_print(register const u_char *bp, u_int length) break; case LWRES_OPCODE_GETADDRSBYNAME: gabn = (lwres_gabnrequest_t *)(np + 1); - TCHECK(gabn->namelen); + ND_TCHECK(gabn->namelen); /* XXX gabn points to packed struct */ s = (const char *)&gabn->namelen + sizeof(gabn->namelen); l = EXTRACT_16BITS(&gabn->namelen); /* BIND910: not used */ - if (vflag > 2) { - printf(" flags:0x%x", - EXTRACT_32BITS(&gabn->flags)); + if (ndo->ndo_vflag > 2) { + ND_PRINT((ndo, " flags:0x%x", + EXTRACT_32BITS(&gabn->flags))); } v = EXTRACT_32BITS(&gabn->addrtypes); switch (v & (LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6)) { case LWRES_ADDRTYPE_V4: - printf(" IPv4"); + ND_PRINT((ndo, " IPv4")); break; case LWRES_ADDRTYPE_V6: - printf(" IPv6"); + ND_PRINT((ndo, " IPv6")); break; case LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6: - printf(" IPv4/6"); + ND_PRINT((ndo, " IPv4/6")); break; } if (v & ~(LWRES_ADDRTYPE_V4 | LWRES_ADDRTYPE_V6)) - printf("[0x%x]", v); + ND_PRINT((ndo, "[0x%x]", v)); - advance = lwres_printname(l, s); + advance = lwres_printname(ndo, l, s); if (advance < 0) goto trunc; s += advance; break; case LWRES_OPCODE_GETNAMEBYADDR: gnba = (lwres_gnbarequest_t *)(np + 1); - TCHECK(gnba->addr); + ND_TCHECK(gnba->addr); /* BIND910: not used */ - if (vflag > 2) { - printf(" flags:0x%x", - EXTRACT_32BITS(&gnba->flags)); + if (ndo->ndo_vflag > 2) { + ND_PRINT((ndo, " flags:0x%x", + EXTRACT_32BITS(&gnba->flags))); } s = (const char *)&gnba->addr; - advance = lwres_printaddr(&gnba->addr); + advance = lwres_printaddr(ndo, &gnba->addr); if (advance < 0) goto trunc; s += advance; @@ -408,19 +409,19 @@ lwres_print(register const u_char *bp, u_int length) case LWRES_OPCODE_GETRDATABYNAME: /* XXX no trace, not tested */ grbn = (lwres_grbnrequest_t *)(np + 1); - TCHECK(grbn->namelen); + ND_TCHECK(grbn->namelen); /* BIND910: not used */ - if (vflag > 2) { - printf(" flags:0x%x", - EXTRACT_32BITS(&grbn->flags)); + if (ndo->ndo_vflag > 2) { + ND_PRINT((ndo, " flags:0x%x", + EXTRACT_32BITS(&grbn->flags))); } - printf(" %s", tok2str(ns_type2str, "Type%d", - EXTRACT_16BITS(&grbn->rdtype))); + ND_PRINT((ndo, " %s", tok2str(ns_type2str, "Type%d", + EXTRACT_16BITS(&grbn->rdtype)))); if (EXTRACT_16BITS(&grbn->rdclass) != C_IN) { - printf(" %s", tok2str(ns_class2str, "Class%d", - EXTRACT_16BITS(&grbn->rdclass))); + ND_PRINT((ndo, " %s", tok2str(ns_class2str, "Class%d", + EXTRACT_16BITS(&grbn->rdclass)))); } /* XXX grbn points to packed struct */ @@ -428,7 +429,7 @@ lwres_print(register const u_char *bp, u_int length) sizeof(grbn->namelen); l = EXTRACT_16BITS(&grbn->namelen); - advance = lwres_printname(l, s); + advance = lwres_printname(ndo, l, s); if (advance < 0) goto trunc; s += advance; @@ -456,22 +457,22 @@ lwres_print(register const u_char *bp, u_int length) break; case LWRES_OPCODE_GETADDRSBYNAME: gabn = (lwres_gabnresponse_t *)(np + 1); - TCHECK(gabn->realnamelen); + ND_TCHECK(gabn->realnamelen); /* XXX gabn points to packed struct */ s = (const char *)&gabn->realnamelen + sizeof(gabn->realnamelen); l = EXTRACT_16BITS(&gabn->realnamelen); /* BIND910: not used */ - if (vflag > 2) { - printf(" flags:0x%x", - EXTRACT_32BITS(&gabn->flags)); + if (ndo->ndo_vflag > 2) { + ND_PRINT((ndo, " flags:0x%x", + EXTRACT_32BITS(&gabn->flags))); } - printf(" %u/%u", EXTRACT_16BITS(&gabn->naliases), - EXTRACT_16BITS(&gabn->naddrs)); + ND_PRINT((ndo, " %u/%u", EXTRACT_16BITS(&gabn->naliases), + EXTRACT_16BITS(&gabn->naddrs))); - advance = lwres_printname(l, s); + advance = lwres_printname(ndo, l, s); if (advance < 0) goto trunc; s += advance; @@ -479,7 +480,7 @@ lwres_print(register const u_char *bp, u_int length) /* aliases */ na = EXTRACT_16BITS(&gabn->naliases); for (i = 0; i < na; i++) { - advance = lwres_printnamelen(s); + advance = lwres_printnamelen(ndo, s); if (advance < 0) goto trunc; s += advance; @@ -488,7 +489,7 @@ lwres_print(register const u_char *bp, u_int length) /* addrs */ na = EXTRACT_16BITS(&gabn->naddrs); for (i = 0; i < na; i++) { - advance = lwres_printaddr((lwres_addr_t *)s); + advance = lwres_printaddr(ndo, (lwres_addr_t *)s); if (advance < 0) goto trunc; s += advance; @@ -496,21 +497,21 @@ lwres_print(register const u_char *bp, u_int length) break; case LWRES_OPCODE_GETNAMEBYADDR: gnba = (lwres_gnbaresponse_t *)(np + 1); - TCHECK(gnba->realnamelen); + ND_TCHECK(gnba->realnamelen); /* XXX gnba points to packed struct */ s = (const char *)&gnba->realnamelen + sizeof(gnba->realnamelen); l = EXTRACT_16BITS(&gnba->realnamelen); /* BIND910: not used */ - if (vflag > 2) { - printf(" flags:0x%x", - EXTRACT_32BITS(&gnba->flags)); + if (ndo->ndo_vflag > 2) { + ND_PRINT((ndo, " flags:0x%x", + EXTRACT_32BITS(&gnba->flags))); } - printf(" %u", EXTRACT_16BITS(&gnba->naliases)); + ND_PRINT((ndo, " %u", EXTRACT_16BITS(&gnba->naliases))); - advance = lwres_printname(l, s); + advance = lwres_printname(ndo, l, s); if (advance < 0) goto trunc; s += advance; @@ -518,7 +519,7 @@ lwres_print(register const u_char *bp, u_int length) /* aliases */ na = EXTRACT_16BITS(&gnba->naliases); for (i = 0; i < na; i++) { - advance = lwres_printnamelen(s); + advance = lwres_printnamelen(ndo, s); if (advance < 0) goto trunc; s += advance; @@ -527,29 +528,29 @@ lwres_print(register const u_char *bp, u_int length) case LWRES_OPCODE_GETRDATABYNAME: /* XXX no trace, not tested */ grbn = (lwres_grbnresponse_t *)(np + 1); - TCHECK(grbn->nsigs); + ND_TCHECK(grbn->nsigs); /* BIND910: not used */ - if (vflag > 2) { - printf(" flags:0x%x", - EXTRACT_32BITS(&grbn->flags)); + if (ndo->ndo_vflag > 2) { + ND_PRINT((ndo, " flags:0x%x", + EXTRACT_32BITS(&grbn->flags))); } - printf(" %s", tok2str(ns_type2str, "Type%d", - EXTRACT_16BITS(&grbn->rdtype))); + ND_PRINT((ndo, " %s", tok2str(ns_type2str, "Type%d", + EXTRACT_16BITS(&grbn->rdtype)))); if (EXTRACT_16BITS(&grbn->rdclass) != C_IN) { - printf(" %s", tok2str(ns_class2str, "Class%d", - EXTRACT_16BITS(&grbn->rdclass))); + ND_PRINT((ndo, " %s", tok2str(ns_class2str, "Class%d", + EXTRACT_16BITS(&grbn->rdclass)))); } - printf(" TTL "); + ND_PRINT((ndo, " TTL ")); relts_print(EXTRACT_32BITS(&grbn->ttl)); - printf(" %u/%u", EXTRACT_16BITS(&grbn->nrdatas), - EXTRACT_16BITS(&grbn->nsigs)); + ND_PRINT((ndo, " %u/%u", EXTRACT_16BITS(&grbn->nrdatas), + EXTRACT_16BITS(&grbn->nsigs))); /* XXX grbn points to packed struct */ s = (const char *)&grbn->nsigs+ sizeof(grbn->nsigs); - advance = lwres_printnamelen(s); + advance = lwres_printnamelen(ndo, s); if (advance < 0) goto trunc; s += advance; @@ -558,7 +559,7 @@ lwres_print(register const u_char *bp, u_int length) na = EXTRACT_16BITS(&grbn->nrdatas); for (i = 0; i < na; i++) { /* XXX should decode resource data */ - advance = lwres_printbinlen(s); + advance = lwres_printbinlen(ndo, s); if (advance < 0) goto trunc; s += advance; @@ -568,7 +569,7 @@ lwres_print(register const u_char *bp, u_int length) na = EXTRACT_16BITS(&grbn->nsigs); for (i = 0; i < na; i++) { /* XXX how should we print it? */ - advance = lwres_printbinlen(s); + advance = lwres_printbinlen(ndo, s); if (advance < 0) goto trunc; s += advance; @@ -583,14 +584,13 @@ lwres_print(register const u_char *bp, u_int length) tail: /* length mismatch */ if (EXTRACT_32BITS(&np->length) != length) { - printf(" [len: %u != %u]", EXTRACT_32BITS(&np->length), - length); + ND_PRINT((ndo, " [len: %u != %u]", EXTRACT_32BITS(&np->length), + length)); } if (!unsupported && s < (const char *)np + EXTRACT_32BITS(&np->length)) - printf("[extra]"); + ND_PRINT((ndo, "[extra]")); return; trunc: - printf("[|lwres]"); - return; + ND_PRINT((ndo, "[|lwres]")); } diff --git a/print-sip.c b/print-sip.c index 71d1bc34..540cbf42 100644 --- a/print-sip.c +++ b/print-sip.c @@ -13,45 +13,44 @@ * Original code by Hannes Gredler (hannes@juniper.net) */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif #include -#include -#include - #include "interface.h" #include "extract.h" void -sip_print(register const u_char *pptr, register u_int len) +sip_print(netdissect_options *ndo, + register const u_char *pptr, register u_int len) { u_int idx; - printf("SIP, length: %u%s", len, vflag ? "\n\t" : ""); + ND_PRINT((ndo, "SIP, length: %u%s", len, ndo->ndo_vflag ? "\n\t" : "")); /* in non-verbose mode just lets print the protocol and length */ - if (vflag < 1) + if (ndo->ndo_vflag < 1) return; for (idx = 0; idx < len; idx++) { - TCHECK2(*(pptr+idx), 2); + ND_TCHECK2(*(pptr+idx), 2); if (EXTRACT_16BITS(pptr+idx) != 0x0d0a) { /* linefeed ? */ - safeputchar(gndo, *(pptr + idx)); + safeputchar(ndo, *(pptr + idx)); } else { - printf("\n\t"); + ND_PRINT((ndo, "\n\t")); idx+=1; } } /* do we want to see an additionally hexdump ? */ - if (vflag> 1) - print_unknown_data(gndo,pptr,"\n\t",len); + if (ndo->ndo_vflag > 1) + print_unknown_data(ndo, pptr, "\n\t", len); return; trunc: - printf("[|sip]"); + ND_PRINT((ndo, "[|sip]")); } diff --git a/print-syslog.c b/print-syslog.c index d332f67f..87ce1dc7 100644 --- a/print-syslog.c +++ b/print-syslog.c @@ -14,15 +14,13 @@ * FOR A PARTICULAR PURPOSE. */ +#define NETDISSECT_REWORKED #ifdef HAVE_CONFIG_H #include "config.h" #endif #include -#include -#include - #include "interface.h" #include "extract.h" @@ -78,7 +76,8 @@ static const struct tok syslog_facility_values[] = { }; void -syslog_print(register const u_char *pptr, register u_int len) +syslog_print(netdissect_options *ndo, + register const u_char *pptr, register u_int len) { u_int16_t msg_off = 0; u_int16_t pri = 0; @@ -90,57 +89,57 @@ syslog_print(register const u_char *pptr, register u_int len) * severity and facility values */ - TCHECK2(*pptr, 1); + ND_TCHECK2(*pptr, 1); if (*(pptr+msg_off) == '<') { msg_off++; - TCHECK2(*(pptr+msg_off), 1); + ND_TCHECK2(*(pptr + msg_off), 1); while ( *(pptr+msg_off) >= '0' && *(pptr+msg_off) <= '9' && msg_off <= SYSLOG_MAX_DIGITS) { pri = pri * 10 + (*(pptr+msg_off) - '0'); msg_off++; - TCHECK2(*(pptr+msg_off), 1); + ND_TCHECK2(*(pptr + msg_off), 1); } if (*(pptr+msg_off) != '>') { - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return; } msg_off++; } else { - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); return; } facility = (pri & SYSLOG_FACILITY_MASK) >> 3; severity = pri & SYSLOG_SEVERITY_MASK; - if (vflag < 1 ) + if (ndo->ndo_vflag < 1 ) { - printf("SYSLOG %s.%s, length: %u", + ND_PRINT((ndo, "SYSLOG %s.%s, length: %u", tok2str(syslog_facility_values, "unknown (%u)", facility), tok2str(syslog_severity_values, "unknown (%u)", severity), - len); + len)); return; } - printf("SYSLOG, length: %u\n\tFacility %s (%u), Severity %s (%u)\n\tMsg: ", + ND_PRINT((ndo, "SYSLOG, length: %u\n\tFacility %s (%u), Severity %s (%u)\n\tMsg: ", len, tok2str(syslog_facility_values, "unknown (%u)", facility), facility, tok2str(syslog_severity_values, "unknown (%u)", severity), - severity); + severity)); /* print the syslog text in verbose mode */ for (; msg_off < len; msg_off++) { - TCHECK2(*(pptr+msg_off), 1); - safeputchar(gndo, *(pptr + msg_off)); + ND_TCHECK2(*(pptr + msg_off), 1); + safeputchar(ndo, *(pptr + msg_off)); } - if (vflag > 1) - print_unknown_data(gndo,pptr,"\n\t",len); + if (ndo->ndo_vflag > 1) + print_unknown_data(ndo, pptr, "\n\t", len); return; trunc: - printf("%s", tstr); + ND_PRINT((ndo, "%s", tstr)); } diff --git a/print-udp.c b/print-udp.c index e01cd995..9f7d5af9 100644 --- a/print-udp.c +++ b/print-udp.c @@ -641,7 +641,7 @@ udp_print(netdissect_options *ndo, register const u_char *bp, u_int length, else if (dport == HSRP_PORT) hsrp_print(ndo, (const u_char *)(up + 1), length); else if (ISPORT(LWRES_PORT)) - lwres_print((const u_char *)(up + 1), length); + lwres_print(ndo, (const u_char *)(up + 1), length); else if (ISPORT(LDP_PORT)) ldp_print(ndo, (const u_char *)(up + 1), length); else if (ISPORT(OLSR_PORT)) @@ -669,9 +669,9 @@ udp_print(netdissect_options *ndo, register const u_char *bp, u_int length, else if (ISPORT(LWAPP_DATA_PORT)) lwapp_data_print(ndo, (const u_char *)(up + 1), length); else if (ISPORT(SIP_PORT)) - sip_print((const u_char *)(up + 1), length); + sip_print(ndo, (const u_char *)(up + 1), length); else if (ISPORT(SYSLOG_PORT)) - syslog_print((const u_char *)(up + 1), length); + syslog_print(ndo, (const u_char *)(up + 1), length); else if (ISPORT(OTV_PORT)) otv_print(ndo, (const u_char *)(up + 1), length); else if (ISPORT(VXLAN_PORT))