source: libpacketdump/eth_2054.cc @ 11c4044

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 11c4044 was 4e65f42, checked in by Shane Alcock <salcock@…>, 16 years ago

Fixed segmentation faults when trace_destroy is called on a trace that wasn't successfully created
libdl is now checked for and only linked against if available (BSD's don't have a libdl)
Fixed the libpacketdump .so's to use libtrace's generic protocol headers as well as trace_ether_ntoa
Added missing check for strlcpy
Added a couple of #defines to various tools that needed them under FreeBSD
Removed some needless #includes from the libpacketdump .so's

  • 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        if (hrd==NULL)
32                return "Truncated (Truncated)";
33        switch(arp->ar_hrd) {
34                case ARPHRD_ETHER:
35                        strcpy(buffer,trace_ether_ntoa((uint8_t *)&hrd, 
36                                                ether_buf));
37                        break;
38                default:
39                        int i;
40                        for (i=0;i<arp->ar_hln;i++) {
41                                snprintf(buffer,sizeof(buffer),"%s %02x",
42                                                buffer,(unsigned char)hrd[i]);
43                        }
44        }
45        if (pro==NULL) {
46                strncat(buffer," (Truncated)",sizeof(buffer));
47                return buffer;
48        }
49        switch(arp->ar_pro) {
50                case 0x0800:
51                        snprintf(buffer,sizeof(buffer),"%s (%s)",
52                                        buffer,inet_ntoa(*(struct in_addr*)&pro));
53                        break;
54                default:
55                        int i;
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
67extern "C"
68void decode(int link_type,char *packet,int len)
69{
70        struct arphdr *arp = (struct arphdr*)packet;
71        char *source_hrd = NULL;
72        char *source_pro = NULL;
73        char *dest_hrd = NULL;
74        char *dest_pro = NULL;
75        if (len<8)
76                return;
77        if (sizeof(*arp)<=(unsigned int)len) 
78                source_hrd=packet+sizeof(arp);
79        if (source_hrd && source_hrd-packet+arp->ar_hln<=len)
80                source_pro =source_hrd+arp->ar_hln;
81        if (source_pro  && source_pro-packet+arp->ar_pln<=len)
82                dest_hrd  =source_pro +arp->ar_pln;
83        if (dest_hrd   && dest_hrd-packet+arp->ar_pln<=len)
84                dest_pro   =dest_hrd  +arp->ar_hln;
85        switch(arp->ar_op) {
86                case ARPOP_REQUEST:
87                        printf(" ARP: Who-has %s",
88                                        format(arp,source_hrd,source_pro));
89                        printf(" please tell %s",
90                                        format(arp,dest_hrd,dest_pro));
91                        break;
92                default:
93                        printf(" ARP: Unknown opcode (%i) from %s",
94                                        arp->ar_op,
95                                        format(arp,source_hrd,source_pro));
96                        printf(" to %s",
97                                        format(arp,dest_hrd,dest_pro));
98                        break;
99        }
100        return;
101}
Note: See TracBrowser for help on using the repository browser.