source: libpacketdump/eth_2054.c @ fade02b

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