From 79540b6e2bbcf22d3dd10e25c236c83a27d88721 Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Wed, 30 Jan 2013 11:15:20 +0100 Subject: [PATCH] dissectors: arp: Display descriptive string for address type fields Signed-off-by: Tobias Klauser --- proto_arp.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/proto_arp.c b/proto_arp.c index 408a98d0..3e19986c 100644 --- a/proto_arp.c +++ b/proto_arp.c @@ -26,6 +26,15 @@ struct arphdr { uint8_t ar_tip[4]; /* target IP address */ } __packed; +#define ARPHRD_ETHER 1 +#define ARPHRD_IEEE802 6 +#define ARPHRD_ARCNET 7 +#define ARPHRD_ATM 16 +#define ARPHRD_ATM2 19 +#define ARPHRD_SERIAL 20 +#define ARPHRD_ATM3 21 +#define ARPHRD_IEEE1394 24 + #define ARPOP_REQUEST 1 /* ARP request */ #define ARPOP_REPLY 2 /* ARP reply */ #define ARPOP_RREQUEST 3 /* RARP request */ @@ -36,12 +45,44 @@ struct arphdr { static void arp(struct pkt_buff *pkt) { - char *opcode = NULL; + char *hrd; + char *pro; + char *opcode; struct arphdr *arp = (struct arphdr *) pkt_pull(pkt, sizeof(*arp)); if (arp == NULL) return; + switch (ntohs(arp->ar_hrd)) { + case ARPHRD_ETHER: + hrd = "Ethernet"; + break; + case ARPHRD_IEEE802: + hrd = "IEEE 802"; + break; + case ARPHRD_ARCNET: + hrd = "ARCNET"; + break; + case ARPHRD_ATM: + case ARPHRD_ATM2: + case ARPHRD_ATM3: + hrd = "ATM"; + break; + case ARPHRD_SERIAL: + hrd = "Serial Line"; + break; + case ARPHRD_IEEE1394: + hrd = "IEEE 1394.1995"; + break; + default: + hrd = "Unknown"; + break; + } + + pro = lookup_ether_type(ntohs(arp->ar_pro)); + if (pro == NULL) + pro = "Unknown"; + switch (ntohs(arp->ar_op)) { case ARPOP_REQUEST: opcode = "ARP request"; @@ -70,8 +111,8 @@ static void arp(struct pkt_buff *pkt) }; tprintf(" [ ARP "); - tprintf("Format HA (%u), ", ntohs(arp->ar_hrd)); - tprintf("Format Proto (%u), ", ntohs(arp->ar_pro)); + tprintf("Format HA (%u => %s), ", ntohs(arp->ar_hrd), hrd); + tprintf("Format Proto (0x%.4x => %s), ", ntohs(arp->ar_pro), pro); tprintf("HA Len (%u), ", arp->ar_hln); tprintf("Proto Len (%u), ", arp->ar_pln); tprintf("Opcode (%u => %s)", ntohs(arp->ar_op), opcode); -- 2.11.4.GIT