#include #include #include #include "arp.h" #include "util.h" #include "vars.h" enum ha_type { HA_TYPE_UNKNOWN = 0, HA_TYPE_ETHER } ; enum pa_type { PA_TYPE_UNKNOWN = 0, PA_TYPE_IP } ; typedef enum ha_type HA_TYPE; typedef enum pa_type PA_TYPE; static void arpdump(int rev) { unsigned short int ha_fmt; unsigned short int pa_fmt; int ha_len; int pa_len; unsigned short int op; HA_TYPE ha_type; PA_TYPE pa_type; ha_type = HA_TYPE_UNKNOWN; pa_type = PA_TYPE_UNKNOWN; need(8,"ARP header"); printx(pkt,2); ha_fmt = get16(0); printf("hardware address format"); switch (ha_fmt) { case ARPHRD_ETHER: printf(" [Ethernet]"); ha_type = HA_TYPE_ETHER; break; } printf("\n"); consume(2); printx(pkt,2); pa_fmt = get16(0); printf("protocol address format"); switch (ha_fmt) { case ARPHRD_ETHER: switch (pa_fmt); { case ETHERTYPE_IP: printf(" [IP]"); pa_type = PA_TYPE_IP; break; } } printf("\n"); consume(2); printx(pkt,1); ha_len = get8(0); printf("hardware address length"); switch (ha_type) { case HA_TYPE_UNKNOWN: break; case HA_TYPE_ETHER: if (ha_len != 6) { printf(" [wrong for Ethernet]"); ha_type = HA_TYPE_UNKNOWN; } break; } printf("\n"); consume(1); printx(pkt,1); pa_len = get8(0); printf("protocol address length"); switch (pa_type) { case PA_TYPE_UNKNOWN: break; case PA_TYPE_IP: if (pa_len != 4) { printf(" [wrong for IP]"); pa_type = PA_TYPE_UNKNOWN; } break; } printf("\n"); consume(1); printx(pkt,2); op = get16(0); printf("op"); switch (op) { case 1: printf(" [REQUEST%s]",rev?"(?)":""); break; case 2: printf(" [REPLY%s]",rev?"(?)":""); break; case 3: printf(" [RREQUEST%s]",rev?"":"(?)"); break; case 4: printf(" [RREPLY%s]",rev?"":"(?)"); break; case 8: printf(" [IREQUEST]"); break; case 9: printf(" [IREPLY]"); break; } printf("\n"); consume(2); need(ha_len,"sender hardware address"); printx(pkt,ha_len); printf("sender hardware address"); switch (ha_type) { case HA_TYPE_UNKNOWN: break; case HA_TYPE_ETHER: printf(" [%x:%x:%x:%x:%x:%x]",get8(0),get8(1),get8(2),get8(3),get8(4),get8(5)); break; } printf("\n"); consume(ha_len); need(pa_len,"sender protocol address"); printx(pkt,pa_len); printf("sender protocol address"); switch (pa_type) { case PA_TYPE_UNKNOWN: break; case PA_TYPE_IP: printf(" [%u.%u.%u.%u]",get8(0),get8(1),get8(2),get8(3)); break; } printf("\n"); consume(pa_len); need(ha_len,"target hardware address"); printx(pkt,ha_len); printf("target hardware address"); switch (ha_type) { case HA_TYPE_UNKNOWN: break; case HA_TYPE_ETHER: printf(" [%x:%x:%x:%x:%x:%x]",get8(0),get8(1),get8(2),get8(3),get8(4),get8(5)); break; } printf("\n"); consume(ha_len); need(pa_len,"target protocol address"); printx(pkt,pa_len); printf("target protocol address"); switch (pa_type) { case PA_TYPE_UNKNOWN: break; case PA_TYPE_IP: printf(" [%u.%u.%u.%u]",get8(0),get8(1),get8(2),get8(3)); break; } printf("\n"); consume(pa_len); } void dump_arp(void) { arpdump(0); } void dump_rarp(void) { arpdump(1); }