tagging vde-2 version 2.3.2
[vde.git] / 2.3.2 / src / vde_switch / plugins / dump.c
blob6132158ddaaff2142db6748fd8db14a86d23b20f
1 #define _GNU_SOURCE
3 #include <stdio.h>
4 #include <stdlib.h>
6 #include <config.h>
7 #include <vde.h>
8 #include <vdecommon.h>
10 #include <vdeplugin.h>
13 static int testevent(struct dbgcl *tag,void *arg,va_list v);
14 static int dump(char *arg);
16 struct plugin vde_plugin_data={
17 .name="dump",
18 .help="dump packets",
21 static struct comlist cl[]={
22 {"dump","============","DUMP Packets",NULL,NOARG},
23 {"dump/active","0/1","start dumping data",dump,STRARG},
26 #define D_DUMP 0100
27 static struct dbgcl dl[]= {
28 {"dump/packetin","dump incoming packet",D_DUMP|D_IN},
29 {"dump/packetout","dump outgoing packet",D_DUMP|D_OUT},
32 static int dump(char *arg)
34 int active=atoi(arg);
35 int rv;
36 if (active)
37 rv=eventadd(testevent,"packet",dl);
38 else
39 rv=eventdel(testevent,"packet",dl);
40 return 0;
43 static int testevent(struct dbgcl *event,void *arg,va_list v)
45 struct dbgcl *this=arg;
46 switch (event->tag) {
47 case D_PACKET|D_OUT:
48 this++;
49 case D_PACKET|D_IN:
51 int port=va_arg(v,int);
52 unsigned char *buf=va_arg(v,unsigned char *);
53 int len=va_arg(v,int);
54 char *pktdump;
55 size_t dumplen;
56 FILE *out=open_memstream(&pktdump,&dumplen);
57 if (out) {
58 int i;
59 fprintf(out,"Pkt: Port %04d len=%04d ",
60 port,
61 len);
62 for (i=0;i<len;i++)
63 fprintf(out,"%02x ",buf[i]);
64 fclose(out);
65 DBGOUT(this, "%s",pktdump);
66 free(pktdump);
70 return 0;
73 static void
74 __attribute__ ((constructor))
75 init (void)
77 ADDCL(cl);
78 ADDDBGCL(dl);
81 static void
82 __attribute__ ((destructor))
83 fini (void)
85 DELCL(cl);
86 DELDBGCL(dl);