source: libpacketdump/libpacketdump.cc @ 41b53c2

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

2.0.25

Fixes for builds under openbsd:

  • pcap uses a struct bpf_filter, not struct timeval. fixed format_pcap to solve this
  • #includes in libpacketdump - libpacketdump still not working properly
  • rijndael.c and .h conflicted with a system function called 'encrypt' - renamed encrypt and decrypt to r_* within rijndael*
  • UINT64_MAX not defined under freebsd
  • Property mode set to 100644
File size: 2.3 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#ifdef HAVE_NETINET_ETHER
12#  include <netinet/ether.h>
13#endif
14
15
16#ifdef HAVE_INTTYPES_H
17#  include <inttypes.h>
18#else
19#  error "Can't find inttypes.h"
20#endif
21
22#ifdef HAVE_LIMITS_H
23#  include <limits.h>
24#endif
25
26#ifdef HAVE_SYS_LIMITS_H
27#  include <sys/limits.h>
28#endif
29
30#ifdef HAVE_SYS_TYPES_H
31#  include <sys/types.h>
32#endif
33#include <net/if.h>
34#include <netinet/in.h>
35#include <stdio.h>
36
37#include <net/if_arp.h>
38#ifdef HAVE_NETINET_IF_ETHER_H
39#  include <netinet/if_ether.h>
40#endif
41#include <dlfcn.h>
42#include <map>
43#include <string>
44#include <ctype.h>
45#include "libpacketdump.h"
46
47typedef void (*decode_t)(uint16_t type,char *packet,int len);
48
49static std::map<std::string,std::map<uint16_t,decode_t> > decoders;
50
51#define WIDTH 16
52
53#ifndef DIRNAME
54#define DIRNAME "./"
55#warning "No DIRNAME set!"
56#endif
57
58void trace_dump_packet(struct libtrace_packet_t *packet)
59{
60        time_t sec = (time_t)trace_get_seconds(packet);
61        char *link=(char *)trace_get_link(packet);
62
63        printf("%s",ctime(&sec));
64        decode_next(link,packet->size-(link-packet->buffer),"link",trace_get_link_type(packet));
65}
66
67static void generic_decode(uint16_t type,char *packet, int len) {
68        int i;
69        printf(" Unknown Protocol: %i",type);
70        for(i=0;i<len; /* Nothing */ ) {
71                int j;
72                printf("\n ");
73                for(j=0;j<WIDTH;j++) {
74                        if (i+j<len)
75                                printf(" %02x",(unsigned char)packet[i+j]);
76                        else
77                                printf("   ");
78                }
79                printf("    ");
80                for(j=0;j<WIDTH;j++) {
81                        if (i+j<len)
82                                if (isprint((unsigned char)packet[i+j]))
83                                        printf("%c",(unsigned char)packet[i+j]);
84                                else
85                                        printf(".");
86                        else
87                                printf("   ");
88                }
89                if (i+WIDTH>len)
90                        break;
91                else
92                        i+=WIDTH;
93        }
94        printf("\n");
95}
96
97void decode_next(char *packet,int len,char *proto_name,int type)
98{
99        std::string sname(proto_name);
100        if (decoders[sname].find(type)==decoders[sname].end()) {
101                void *hdl;
102                char name[1024];
103                snprintf(name,sizeof(name),"%s/%s_%i.so",DIRNAME,sname.c_str(),type);
104                hdl = dlopen(name,RTLD_LAZY);
105                if (!hdl) 
106                        decoders[sname][type]=generic_decode;
107                else {
108                        void *s=dlsym(hdl,"decode");
109                        if (!s) {
110                                decoders[sname][type]=generic_decode;
111                        }
112                        else
113                                decoders[sname][type]=(decode_t)s;
114                }
115        }
116        decoders[sname][type](type,packet,len);
117}
118
119
Note: See TracBrowser for help on using the repository browser.