source: examples/tracedump/tracedump-lib.cc @ 505c421

4.0.1-hotfixescachetimestampsdevelopdpdk-ndagetsilivegetfragoffhelplibtrace4ndag_formatpfringrc-4.0.1rc-4.0.2rc-4.0.3rc-4.0.4ringdecrementfixringperformanceringtimestampfixes
Last change on this file since 505c421 was 505c421, checked in by Perry Lorier <perry@…>, 18 years ago

Make easier to install on other machines

  • Property mode set to 100644
File size: 1.4 KB
Line 
1#include <netinet/ether.h>
2#include <netinet/in.h>
3#include <stdio.h>
4#include <stdint.h>
5#include <dlfcn.h>
6#include <map>
7#include <string>
8#include <ctype.h>
9#include "tracedump.h"
10
11#ifndef DIRNAME
12#define DIRNAME "./"
13#endif
14
15typedef void (*decode_t)(uint16_t type,char *packet,int len);
16
17static std::map<std::string,std::map<uint16_t,decode_t> > decoders;
18
19static void generic_decode(uint16_t type,char *packet, int len) {
20        int i;
21        printf(" Unknown Protocol: %i",type);
22        for(i=0;i<len; /* Nothing */ ) {
23                int j;
24                printf("\n ");
25                for(j=0;j<8;j++) {
26                        if (i+j<len)
27                                printf(" %02x",(unsigned char)packet[i+j]);
28                        else
29                                printf("   ");
30                }
31                printf("    ");
32                for(j=0;j<8;j++) {
33                        if (i+j<len)
34                                if (isprint((unsigned char)packet[i+j]))
35                                        printf("%c",(unsigned char)packet[i+j]);
36                                else
37                                        printf(".");
38                        else
39                                printf("   ");
40                }
41                if (i+8>len)
42                        break;
43                else
44                        i+=8;
45        }
46        printf("\n");
47}
48
49void decode_next(char *packet,int len,char *proto_name,int type)
50{
51        std::string sname(proto_name);
52        if (decoders[sname].find(type)==decoders[sname].end()) {
53                void *hdl;
54                char name[1024];
55                snprintf(name,sizeof(name),DIRNAME "%s_%i.so",sname.c_str(),type);
56                hdl = dlopen(name,RTLD_LAZY);
57                if (!hdl) 
58                        decoders[sname][type]=generic_decode;
59                else {
60                        void *s=dlsym(hdl,"decode");
61                        if (!s) {
62                                decoders[sname][type]=generic_decode;
63                        }
64                        else
65                                decoders[sname][type]=(decode_t)s;
66                }
67        }
68        decoders[sname][type](type,packet,len);
69}
70
Note: See TracBrowser for help on using the repository browser.