X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/1af20c3adc4dfef93de41d4fcd02f0aeb6bbfd4e..refs/heads/master:/print-arp.c diff --git a/print-arp.c b/print-arp.c index 5e744587..950c3b24 100644 --- a/print-arp.c +++ b/print-arp.c @@ -21,14 +21,11 @@ /* \summary: Address Resolution Protocol (ARP) printer */ -#ifdef HAVE_CONFIG_H #include -#endif #include "netdissect-stdinc.h" -#include - +#define ND_LONGJMP_FROM_TCHECK #include "netdissect.h" #include "addrtoname.h" #include "ethertype.h" @@ -54,6 +51,7 @@ struct arp_pkthdr { #define ARPHRD_ATM2225 19 /* ATM (RFC 2225) */ #define ARPHRD_STRIP 23 /* Ricochet Starmode Radio hardware format */ #define ARPHRD_IEEE1394 24 /* IEEE 1394 (FireWire) hardware format */ +#define ARPHRD_INFINIBAND 32 /* InfiniBand RFC 4391 */ nd_uint16_t ar_pro; /* format of protocol address */ nd_uint8_t ar_hln; /* length of hardware address */ nd_uint8_t ar_pln; /* length of protocol address */ @@ -64,7 +62,7 @@ struct arp_pkthdr { #define ARPOP_REVREPLY 4 /* response giving protocol address */ #define ARPOP_INVREQUEST 8 /* request to identify peer */ #define ARPOP_INVREPLY 9 /* response identifying peer */ -#define ARPOP_NAK 10 /* NAK - only valif for ATM ARP */ +#define ARPOP_NAK 10 /* NAK - only valid for ATM ARP */ /* * The remaining fields are variable in size, @@ -77,18 +75,18 @@ struct arp_pkthdr { nd_byte ar_tpa[]; /* target protocol address */ #endif #define ar_sha(ap) (((const u_char *)((ap)+1))+ 0) -#define ar_spa(ap) (((const u_char *)((ap)+1))+ EXTRACT_U_1((ap)->ar_hln)) -#define ar_tha(ap) (((const u_char *)((ap)+1))+ EXTRACT_U_1((ap)->ar_hln)+EXTRACT_U_1((ap)->ar_pln)) -#define ar_tpa(ap) (((const u_char *)((ap)+1))+2*EXTRACT_U_1((ap)->ar_hln)+EXTRACT_U_1((ap)->ar_pln)) +#define ar_spa(ap) (((const u_char *)((ap)+1))+ GET_U_1((ap)->ar_hln)) +#define ar_tha(ap) (((const u_char *)((ap)+1))+ GET_U_1((ap)->ar_hln)+GET_U_1((ap)->ar_pln)) +#define ar_tpa(ap) (((const u_char *)((ap)+1))+2*GET_U_1((ap)->ar_hln)+GET_U_1((ap)->ar_pln)) }; #define ARP_HDRLEN 8 -#define HRD(ap) EXTRACT_BE_U_2((ap)->ar_hrd) -#define HRD_LEN(ap) EXTRACT_U_1((ap)->ar_hln) -#define PROTO_LEN(ap) EXTRACT_U_1((ap)->ar_pln) -#define OP(ap) EXTRACT_BE_U_2((ap)->ar_op) -#define PRO(ap) EXTRACT_BE_U_2((ap)->ar_pro) +#define HRD(ap) GET_BE_U_2((ap)->ar_hrd) +#define HRD_LEN(ap) GET_U_1((ap)->ar_hln) +#define PROTO_LEN(ap) GET_U_1((ap)->ar_pln) +#define OP(ap) GET_BE_U_2((ap)->ar_op) +#define PRO(ap) GET_BE_U_2((ap)->ar_pro) #define SHA(ap) (ar_sha(ap)) #define SPA(ap) (ar_spa(ap)) #define THA(ap) (ar_tha(ap)) @@ -114,6 +112,7 @@ static const struct tok arphrd_values[] = { { ARPHRD_STRIP, "Strip" }, { ARPHRD_IEEE1394, "IEEE 1394" }, { ARPHRD_ATM2225, "ATM" }, + { ARPHRD_INFINIBAND, "InfiniBand" }, { 0, NULL } }; @@ -151,15 +150,15 @@ struct atmarp_pkthdr { nd_byte aar_tpa[]; /* target protocol address */ #endif -#define ATMHRD(ap) EXTRACT_BE_U_2((ap)->aar_hrd) -#define ATMSHRD_LEN(ap) (EXTRACT_U_1((ap)->aar_shtl) & ATMARP_LEN_MASK) -#define ATMSSLN(ap) (EXTRACT_U_1((ap)->aar_sstl) & ATMARP_LEN_MASK) -#define ATMSPROTO_LEN(ap) EXTRACT_U_1((ap)->aar_spln) -#define ATMOP(ap) EXTRACT_BE_U_2((ap)->aar_op) -#define ATMPRO(ap) EXTRACT_BE_U_2((ap)->aar_pro) -#define ATMTHRD_LEN(ap) (EXTRACT_U_1((ap)->aar_thtl) & ATMARP_LEN_MASK) -#define ATMTSLN(ap) (EXTRACT_U_1((ap)->aar_tstl) & ATMARP_LEN_MASK) -#define ATMTPROTO_LEN(ap) EXTRACT_U_1((ap)->aar_tpln) +#define ATMHRD(ap) GET_BE_U_2((ap)->aar_hrd) +#define ATMSHRD_LEN(ap) (GET_U_1((ap)->aar_shtl) & ATMARP_LEN_MASK) +#define ATMSSLN(ap) (GET_U_1((ap)->aar_sstl) & ATMARP_LEN_MASK) +#define ATMSPROTO_LEN(ap) GET_U_1((ap)->aar_spln) +#define ATMOP(ap) GET_BE_U_2((ap)->aar_op) +#define ATMPRO(ap) GET_BE_U_2((ap)->aar_pro) +#define ATMTHRD_LEN(ap) (GET_U_1((ap)->aar_thtl) & ATMARP_LEN_MASK) +#define ATMTSLN(ap) (GET_U_1((ap)->aar_tstl) & ATMARP_LEN_MASK) +#define ATMTPROTO_LEN(ap) GET_U_1((ap)->aar_tpln) #define aar_sha(ap) ((const u_char *)((ap)+1)) #define aar_ssa(ap) (aar_sha(ap) + ATMSHRD_LEN(ap)) #define aar_spa(ap) (aar_ssa(ap) + ATMSSLN(ap)) @@ -178,8 +177,8 @@ struct atmarp_pkthdr { static int isnonzero(netdissect_options *ndo, const u_char *a, size_t len) { - while (len > 0) { - if (EXTRACT_U_1(a) != 0) + while (len != 0) { + if (GET_U_1(a) != 0) return (1); a++; len--; @@ -196,7 +195,7 @@ tpaddr_print_ip(netdissect_options *ndo, else if (PROTO_LEN(ap) != 4) ND_PRINT(""); else - ND_PRINT("%s", ipaddr_string(ndo, TPA(ap))); + ND_PRINT("%s", GET_IPADDR_STRING(TPA(ap))); } static void @@ -208,7 +207,7 @@ spaddr_print_ip(netdissect_options *ndo, else if (PROTO_LEN(ap) != 4) ND_PRINT(""); else - ND_PRINT("%s", ipaddr_string(ndo, SPA(ap))); + ND_PRINT("%s", GET_IPADDR_STRING(SPA(ap))); } static void @@ -219,10 +218,10 @@ atmarp_addr_print(netdissect_options *ndo, if (ha_len == 0) ND_PRINT(""); else { - ND_PRINT("%s", linkaddr_string(ndo, ha, LINKADDR_ATM, ha_len)); + ND_PRINT("%s", GET_LINKADDR_STRING(ha, LINKADDR_ATM, ha_len)); if (srca_len != 0) ND_PRINT(",%s", - linkaddr_string(ndo, srca, LINKADDR_ATM, srca_len)); + GET_LINKADDR_STRING(srca, LINKADDR_ATM, srca_len)); } } @@ -235,7 +234,7 @@ atmarp_tpaddr_print(netdissect_options *ndo, else if (ATMTPROTO_LEN(ap) != 4) ND_PRINT(""); else - ND_PRINT("%s", ipaddr_string(ndo, ATMTPA(ap))); + ND_PRINT("%s", GET_IPADDR_STRING(ATMTPA(ap))); } static void @@ -247,7 +246,7 @@ atmarp_spaddr_print(netdissect_options *ndo, else if (ATMSPROTO_LEN(ap) != 4) ND_PRINT(""); else - ND_PRINT("%s", ipaddr_string(ndo, ATMSPA(ap))); + ND_PRINT("%s", GET_IPADDR_STRING(ATMSPA(ap))); } static void @@ -264,11 +263,7 @@ atmarp_print(netdissect_options *ndo, pro = ATMPRO(ap); op = ATMOP(ap); - if (!ND_TTEST_LEN(aar_tpa(ap), ATMTPROTO_LEN(ap))) { - nd_print_trunc(ndo); - ND_DEFAULTPRINT((const u_char *)ap, length); - return; - } + ND_TCHECK_LEN(ATMTPA(ap), ATMTPROTO_LEN(ap)); if (!ndo->ndo_eflag) { ND_PRINT("ARP, "); @@ -284,7 +279,7 @@ atmarp_print(netdissect_options *ndo, ATMSPROTO_LEN(ap), ATMTPROTO_LEN(ap)); - /* don't know know about the address formats */ + /* don't know about the address formats */ if (!ndo->ndo_vflag) { goto out; } @@ -345,10 +340,6 @@ atmarp_print(netdissect_options *ndo, out: ND_PRINT(", length %u", length); - return; - -trunc: - nd_print_trunc(ndo); } void @@ -370,7 +361,7 @@ arp_print(netdissect_options *ndo, /* if its ATM then call the ATM ARP printer for Frame-relay ARP most of the fields are similar to Ethernet so overload the Ethernet Printer - and set the linkaddr type for linkaddr_string(ndo, ) accordingly */ + and set the linkaddr type for GET_LINKADDR_STRING() accordingly */ switch(hrd) { case ARPHRD_ATM2225: @@ -380,15 +371,11 @@ arp_print(netdissect_options *ndo, linkaddr = LINKADDR_FRELAY; break; default: - linkaddr = LINKADDR_ETHER; + linkaddr = LINKADDR_MAC48; break; } - if (!ND_TTEST_LEN(TPA(ap), PROTO_LEN(ap))) { - nd_print_trunc(ndo); - ND_DEFAULTPRINT((const u_char *)ap, length); - return; - } + ND_TCHECK_LEN(TPA(ap), PROTO_LEN(ap)); if (!ndo->ndo_eflag) { ND_PRINT("ARP, "); @@ -405,7 +392,7 @@ arp_print(netdissect_options *ndo, tok2str(ethertype_values, "Unknown Protocol (0x%04x)", pro), PROTO_LEN(ap)); - /* don't know know about the address formats */ + /* don't know about the address formats */ if (!ndo->ndo_vflag) { goto out; } @@ -423,7 +410,7 @@ arp_print(netdissect_options *ndo, tpaddr_print_ip(ndo, ap, pro); if (isnonzero(ndo, (const u_char *)THA(ap), HRD_LEN(ap))) ND_PRINT(" (%s)", - linkaddr_string(ndo, THA(ap), linkaddr, HRD_LEN(ap))); + GET_LINKADDR_STRING(THA(ap), linkaddr, HRD_LEN(ap))); ND_PRINT(" tell "); spaddr_print_ip(ndo, ap, pro); break; @@ -431,30 +418,46 @@ arp_print(netdissect_options *ndo, case ARPOP_REPLY: spaddr_print_ip(ndo, ap, pro); ND_PRINT(" is-at %s", - linkaddr_string(ndo, SHA(ap), linkaddr, HRD_LEN(ap))); + GET_LINKADDR_STRING(SHA(ap), linkaddr, HRD_LEN(ap))); break; case ARPOP_REVREQUEST: - ND_PRINT("who-is %s tell %s", - linkaddr_string(ndo, THA(ap), linkaddr, HRD_LEN(ap)), - linkaddr_string(ndo, SHA(ap), linkaddr, HRD_LEN(ap))); + /* + * XXX - GET_LINKADDR_STRING() may return a pointer to + * a static buffer, so we only have one call to it per + * ND_PRINT() call. + * + * This should be done in a cleaner fashion. + */ + ND_PRINT("who-is %s", + GET_LINKADDR_STRING(THA(ap), linkaddr, HRD_LEN(ap))); + ND_PRINT(" tell %s", + GET_LINKADDR_STRING(SHA(ap), linkaddr, HRD_LEN(ap))); break; case ARPOP_REVREPLY: ND_PRINT("%s at ", - linkaddr_string(ndo, THA(ap), linkaddr, HRD_LEN(ap))); + GET_LINKADDR_STRING(THA(ap), linkaddr, HRD_LEN(ap))); tpaddr_print_ip(ndo, ap, pro); break; case ARPOP_INVREQUEST: - ND_PRINT("who-is %s tell %s", - linkaddr_string(ndo, THA(ap), linkaddr, HRD_LEN(ap)), - linkaddr_string(ndo, SHA(ap), linkaddr, HRD_LEN(ap))); + /* + * XXX - GET_LINKADDR_STRING() may return a pointer to + * a static buffer, so we only have one call to it per + * ND_PRINT() call. + * + * This should be done in a cleaner fashion. + */ + ND_PRINT("who-is %s", + GET_LINKADDR_STRING(THA(ap), linkaddr, HRD_LEN(ap))); + ND_PRINT(" tell %s", + GET_LINKADDR_STRING(SHA(ap), linkaddr, HRD_LEN(ap))); break; case ARPOP_INVREPLY: ND_PRINT("%s at ", - linkaddr_string(ndo, SHA(ap), linkaddr, HRD_LEN(ap))); + GET_LINKADDR_STRING(SHA(ap), linkaddr, HRD_LEN(ap))); spaddr_print_ip(ndo, ap, pro); break; @@ -465,8 +468,4 @@ arp_print(netdissect_options *ndo, out: ND_PRINT(", length %u", length); - - return; -trunc: - nd_print_trunc(ndo); }