source: libpacketdump/libpacketdump.cc @ 114b8d6

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 114b8d6 was 3b8a5ef, checked in by Daniel Lawson <dlawson@…>, 16 years ago

I hate shane

  • Property mode set to 100644
File size: 2.4 KB
Line 
1#include <libtrace.h>
2#include <err.h>
3#include <time.h>
4#include "libpacketdump.h"
5#include "config.h"
6#include <stdio.h>
7#include <netdb.h>
8#include <stdlib.h>
9#include <getopt.h>
10
11#include <sys/socket.h>
12
13#ifdef HAVE_NETINET_ETHER
14#  include <netinet/ether.h>
15#endif
16
17
18#ifdef HAVE_INTTYPES_H
19#  include <inttypes.h>
20#else
21#  error "Can't find inttypes.h"
22#endif
23
24#ifdef HAVE_LIMITS_H
25#  include <limits.h>
26#endif
27
28#ifdef HAVE_SYS_LIMITS_H
29#  include <sys/limits.h>
30#endif
31
32#ifdef HAVE_SYS_TYPES_H
33#  include <sys/types.h>
34#endif
35#include <net/if.h>
36#include <netinet/in.h>
37#include <stdio.h>
38
39#include <net/if_arp.h>
40#ifdef HAVE_NETINET_IF_ETHER_H
41#  include <netinet/if_ether.h>
42#endif
43#include <dlfcn.h>
44#include <map>
45#include <string>
46#include <ctype.h>
47#include "libpacketdump.h"
48
49typedef void (*decode_t)(uint16_t type,char *packet,int len);
50
51static std::map<std::string,std::map<uint16_t,decode_t> > decoders;
52
53#define WIDTH 16
54
55#ifndef DIRNAME
56#define DIRNAME "./"
57#warning "No DIRNAME set!"
58#endif
59
60void trace_dump_packet(struct libtrace_packet_t *packet)
61{
62        time_t sec = (time_t)trace_get_seconds(packet);
63        char *link=(char *)trace_get_link(packet);
64
65        printf("%s",ctime(&sec));
66        decode_next(link,packet->size-trace_get_framing_length(packet),
67                        "link",
68                        trace_get_link_type(packet));
69}
70
71static void generic_decode(uint16_t type,char *packet, int len) {
72        int i;
73        printf(" Unknown Protocol: %i",type);
74        for(i=0;i<len; /* Nothing */ ) {
75                int j;
76                printf("\n ");
77                for(j=0;j<WIDTH;j++) {
78                        if (i+j<len)
79                                printf(" %02x",(unsigned char)packet[i+j]);
80                        else
81                                printf("   ");
82                }
83                printf("    ");
84                for(j=0;j<WIDTH;j++) {
85                        if (i+j<len)
86                                if (isprint((unsigned char)packet[i+j]))
87                                        printf("%c",(unsigned char)packet[i+j]);
88                                else
89                                        printf(".");
90                        else
91                                printf("   ");
92                }
93                if (i+WIDTH>len)
94                        break;
95                else
96                        i+=WIDTH;
97        }
98        printf("\n");
99}
100
101void decode_next(char *packet,int len,char *proto_name,int type)
102{
103        std::string sname(proto_name);
104        if (decoders[sname].find(type)==decoders[sname].end()) {
105                void *hdl;
106                char name[1024];
107                snprintf(name,sizeof(name),"%s/%s_%i.so",DIRNAME,sname.c_str(),type);
108                hdl = dlopen(name,RTLD_LAZY);
109                if (!hdl) 
110                        decoders[sname][type]=generic_decode;
111                else {
112                        void *s=dlsym(hdl,"decode");
113                        if (!s) {
114                                decoders[sname][type]=generic_decode;
115                        }
116                        else
117                                decoders[sname][type]=(decode_t)s;
118                }
119        }
120        decoders[sname][type](type,packet,len);
121}
122
123
Note: See TracBrowser for help on using the repository browser.