source: libpacketdump/link_21.c @ 39567d9

develop
Last change on this file since 39567d9 was 39567d9, checked in by Jacob Van Walraven <jcv9@…>, 21 months ago

libpacketdump ERF print metadata based on its datatype

  • Property mode set to 100644
File size: 3.2 KB
Line 
1/* ERF META PACKET */
2#include "libtrace.h"
3#include "libpacketdump.h"
4#include "format_erf.h"
5
6#include <arpa/inet.h>
7#include <netinet/ether.h>
8
9DLLEXPORT void decode(int link_type UNUSED, const char *packet UNUSED, unsigned len UNUSED) {
10}
11
12static void print_section(libtrace_meta_t *meta) {
13        int i;
14        for (i=0; i<meta->num; i++) {
15
16                if (meta->items[i].datatype == TRACE_META_STRING) {
17                        printf("   Name: %s ID: %u Value: %s\n",
18                                meta->items[i].option_name,
19                                meta->items[i].option,
20                                (char *)meta->items[i].data);
21                } else if (meta->items[i].datatype == TRACE_META_UINT8) {
22                        printf("   Name: %s ID: %u Value: %u\n",
23                                meta->items[i].option_name,
24                                meta->items[i].option,
25                                *(uint8_t *)meta->items[i].data);
26                } else if (meta->items[i].datatype == TRACE_META_UINT32) {
27                        printf("   Name: %s ID: %u Value: %u\n",
28                                meta->items[i].option_name,
29                                meta->items[i].option,
30                                *(uint32_t *)meta->items[i].data);
31                } else if (meta->items[i].datatype == TRACE_META_UINT64) {
32                        printf("   Name: %s ID: %u Value: %lu\n",
33                                meta->items[i].option_name,
34                                meta->items[i].option,
35                                *(uint64_t *)meta->items[i].data);
36                } else if (meta->items[i].datatype == TRACE_META_IPV4) {
37                        struct in_addr ip;
38                        ip.s_addr = *(uint32_t *)meta->items[i].data;
39                        printf("   Name: %s ID: %u Value: %s\n",
40                                meta->items[i].option_name,
41                                meta->items[i].option,
42                                inet_ntoa(ip));
43                } else if (meta->items[i].datatype == TRACE_META_IPV6) {
44                        printf("   Name: %s ID: %u Value: %s\n",
45                                meta->items[i].option_name,
46                                meta->items[i].option,
47                                (char *)meta->items[i].data);
48                } else if (meta->items[i].datatype == TRACE_META_MAC) {
49                        printf("   Name: %s ID: %u Value: %s\n",
50                                meta->items[i].option_name,
51                                meta->items[i].option,
52                                ether_ntoa((struct ether_addr *)(char *)meta->items[i].data));
53                } else {
54                        printf("   Option ID: %u Option Value: ", meta->items[i].option);
55                        int k;
56                        unsigned char *curr = (unsigned char *)meta->items[i].data;
57                        for (k=0; k<meta->items[i].len; k++) {
58                                printf("%02x ", curr[k]);
59                        }
60                        printf("\n");
61                }
62        }
63}
64
65DLLEXPORT void decode_meta(int link_type UNUSED, const char *packet UNUSED, unsigned len UNUSED,
66        libtrace_packet_t *p) {
67
68        printf(" ERF Provenance Packet\n");
69
70        /* Try to find each section from the meta packet */
71        libtrace_meta_t *sec_cap = trace_get_section(p, ERF_PROV_SECTION_CAPTURE);
72        libtrace_meta_t *sec_host = trace_get_section(p, ERF_PROV_SECTION_HOST);
73        libtrace_meta_t *sec_module = trace_get_section(p, ERF_PROV_SECTION_MODULE);
74        libtrace_meta_t *sec_interface = trace_get_section(p, ERF_PROV_SECTION_INTERFACE);
75
76        if (sec_cap != NULL) {
77                printf("  Capture Section\n");
78                print_section(sec_cap);
79                trace_destroy_meta(sec_cap);
80        }
81
82        if (sec_host != NULL) {
83                printf("  Host Section\n");
84                print_section(sec_host);
85                trace_destroy_meta(sec_host);
86        }
87
88        if (sec_module != NULL) {
89                printf("  Module Section\n");
90                print_section(sec_module);
91                trace_destroy_meta(sec_module);
92        }
93
94        if (sec_interface != NULL) {
95                printf("  Interface Section\n");
96                print_section(sec_interface);
97                trace_destroy_meta(sec_interface);
98        }
99
100}
Note: See TracBrowser for help on using the repository browser.