source: libpacketdump/eth_2054.c @ 67825b2

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 67825b2 was 0a22046, checked in by Perry Lorier <perry@…>, 15 years ago

New automake infrastructure
Moved a lot of C++ libpacketdump parsers to C (they weren't using any C++ features and it makes automake happier)

  • Property mode set to 100644
File size: 2.4 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#define DISPLAY_EXP(x,fmt,exp) \
17        if ((unsigned int)len>=((char*)&ip->x-(char*)ip+sizeof(ip->x))) \
18                printf(fmt,exp); \
19        else \
20                return;
21
22#define DISPLAY(x,fmt) DISPLAY_EXP(x,fmt,ip->x)
23
24#define DISPLAYS(x,fmt) DISPLAY_EXP(x,fmt,htons(ip->x))
25#define DISPLAYIP(x,fmt) DISPLAY_EXP(x,fmt,inet_ntoa(*(struct in_addr*)&ip->x))
26
27static char *format(struct arphdr *arp, char *hrd, char *pro)
28{
29        static char buffer[1024];
30        char ether_buf[18] = {0, };
31        int i;
32
33        if (hrd==NULL)
34                return "Truncated (Truncated)";
35        switch(arp->ar_hrd) {
36                case ARPHRD_ETHER:
37                        strcpy(buffer,trace_ether_ntoa((uint8_t *)&hrd, 
38                                                ether_buf));
39                        break;
40                default:
41                        for (i=0;i<arp->ar_hln;i++) {
42                                snprintf(buffer,sizeof(buffer),"%s %02x",
43                                                buffer,(unsigned char)hrd[i]);
44                        }
45        }
46        if (pro==NULL) {
47                strncat(buffer," (Truncated)",sizeof(buffer));
48                return buffer;
49        }
50        switch(arp->ar_pro) {
51                case 0x0800:
52                        snprintf(buffer,sizeof(buffer),"%s (%s)",
53                                        buffer,inet_ntoa(*(struct in_addr*)&pro));
54                        break;
55                default:
56                        strncat(buffer," (",sizeof(buffer));
57                        for (i=0;i<arp->ar_pln;i++) {
58                                snprintf(buffer,sizeof(buffer),"%s %02x",
59                                                buffer,(unsigned char)pro[i]);
60                        }
61                        strncat(buffer,")",sizeof(buffer));
62                        break;
63        }
64        return buffer;
65}
66
67void decode(int link_type,char *packet,int len)
68{
69        struct arphdr *arp = (struct arphdr*)packet;
70        char *source_hrd = NULL;
71        char *source_pro = NULL;
72        char *dest_hrd = NULL;
73        char *dest_pro = NULL;
74        if (len<8)
75                return;
76        if (sizeof(*arp)<=(unsigned int)len) 
77                source_hrd=packet+sizeof(arp);
78        if (source_hrd && source_hrd-packet+arp->ar_hln<=len)
79                source_pro =source_hrd+arp->ar_hln;
80        if (source_pro  && source_pro-packet+arp->ar_pln<=len)
81                dest_hrd  =source_pro +arp->ar_pln;
82        if (dest_hrd   && dest_hrd-packet+arp->ar_pln<=len)
83                dest_pro   =dest_hrd  +arp->ar_hln;
84        switch(arp->ar_op) {
85                case ARPOP_REQUEST:
86                        printf(" ARP: Who-has %s",
87                                        format(arp,source_hrd,source_pro));
88                        printf(" please tell %s",
89                                        format(arp,dest_hrd,dest_pro));
90                        break;
91                default:
92                        printf(" ARP: Unknown opcode (%i) from %s",
93                                        arp->ar_op,
94                                        format(arp,source_hrd,source_pro));
95                        printf(" to %s",
96                                        format(arp,dest_hrd,dest_pro));
97                        break;
98        }
99        return;
100}
Note: See TracBrowser for help on using the repository browser.