source: libpacketdump/eth_2054.c @ fab1d42

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since fab1d42 was fab1d42, checked in by Scott Raynel <smr26@…>, 15 years ago

libpacketdump ARP decoder was displaying the
wrong fields for ARP reply packets.

  • Property mode set to 100644
File size: 2.9 KB
Line 
1/* ARP */
2#include <stdio.h>
3#include <inttypes.h>
4#include <dlfcn.h>
5#include "libpacketdump.h"
6#include <sys/socket.h>
7#ifndef WIN32
8        #include <netinet/in_systm.h>
9#endif
10#include <netinet/in.h>
11#include <netinet/ip.h>
12#include <net/if_arp.h>
13#include <arpa/inet.h>
14#include <string.h>
15
16/*
17 * Converts an ARP hardware address to a printable string.
18 * Takes an ARP header structure and a pointer to the start
19 * of the hardware address in the structure that we should
20 * attempt to decode.
21 */
22char *format_hrd(struct arphdr *arp, char *hrd) {
23        static char buffer[1024] = {0,};
24        uint8_t *addr = (uint8_t *)hrd;
25        int i;
26
27        if (!hrd) {
28                strncpy(buffer, "(Truncated)", sizeof(buffer));
29                return buffer;
30        }
31
32        switch(ntohs(arp->ar_hrd)) {
33                case ARPHRD_ETHER:
34                        trace_ether_ntoa(hrd, buffer);
35                        break;
36                default:
37                        for (i=0;i<arp->ar_hln;i++) {
38                                snprintf(buffer,sizeof(buffer),"%s %02x",
39                                                buffer,(unsigned char)hrd[i]);
40                        }
41                        break;
42        }
43       
44        return buffer;
45}
46
47/*
48 * Converts an ARP protocol address to a printable string.
49 * Takes an ARP header structure and a pointer to the start
50 * of the protocol address in the structure that we should
51 * attempt to decode.
52 */
53char *format_pro(struct arphdr *arp, char *pro) {
54        static char buffer[1024] = {0,};
55        int i;
56       
57        if (!pro) {
58                strncpy(buffer, "(Truncated)", sizeof(buffer));
59                return buffer;
60        }
61
62        switch(ntohs(arp->ar_pro)) {
63                case 0x0800:
64                        snprintf(buffer,sizeof(buffer),"%s",
65                                        inet_ntoa(*(struct in_addr*)pro));
66                        break;
67                default:
68                        strncat(buffer," (",sizeof(buffer));
69                        for (i=0;i<arp->ar_pln;i++) {
70                                snprintf(buffer,sizeof(buffer),"%s %02x",
71                                                buffer,(unsigned char)pro[i]);
72                        }
73                        strncat(buffer,")",sizeof(buffer));
74                        break;
75        }
76        return buffer;
77       
78}
79       
80void decode(int link_type,char *packet,int len)
81{
82        struct arphdr *arp = (struct arphdr*)packet;
83        char *source_hrd = NULL;
84        char *source_pro = NULL;
85        char *dest_hrd = NULL;
86        char *dest_pro = NULL;
87
88        if (len < sizeof(struct arphdr)) {
89                printf(" ARP: (Truncated)\n");
90                return;
91        }
92
93        if (len >= sizeof(struct arphdr) + arp->ar_hln) 
94                source_hrd = packet + sizeof(struct arphdr);
95        if (len >= sizeof(struct arphdr) + arp->ar_hln + arp->ar_pln)
96                source_pro = source_hrd + arp->ar_hln;
97        if (len >= sizeof(struct arphdr) + arp->ar_hln * 2 + arp->ar_pln)
98                dest_hrd = source_pro + arp->ar_pln;
99        if (len >= sizeof(struct arphdr) + arp->ar_hln * 2 + arp->ar_pln * 2)
100                dest_pro = dest_hrd + arp->ar_hln;
101
102        switch(ntohs(arp->ar_op)) {
103                case ARPOP_REQUEST:
104                        printf(" ARP: who-has %s", format_pro(arp, dest_pro));
105                        printf(" tell %s (%s)\n", format_pro(arp, source_pro),
106                                        format_hrd(arp, source_hrd));
107                        break;
108                case ARPOP_REPLY:
109                        printf(" ARP: reply %s", format_pro(arp, source_pro));
110                        printf(" is-at %s\n", format_hrd(arp, source_hrd));
111                        break;
112                default:
113                        printf(" ARP: Unknown opcode (%i) from %s to %s\n",
114                                        ntohs(arp->ar_op),
115                                        format_pro(arp, source_pro),
116                                        format_pro(arp, dest_pro));
117
118                        break;
119        }
120        return;
121}
Note: See TracBrowser for help on using the repository browser.