source: libpacketdump/link_23.c @ d0f25d4

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

Add ERF and PCAPNG decoders to libpacketdump

  • Property mode set to 100644
File size: 7.8 KB
Line 
1/** PCAPNG META PACKET */
2#include "libtrace.h"
3#include "libtrace_int.h"
4#include "libpacketdump.h"
5#include "format_pcapng.h"
6#include "byteswap.c"
7
8#include <stdio.h>
9#include <stdlib.h>
10#include <string.h>
11
12#define INET4_ADDRSTRLEN 16
13#define INET6_ADDRSTRLEN 46
14
15DLLEXPORT void decode(int link_type UNUSED,const char *packet UNUSED,unsigned len UNUSED) {
16};
17
18static void print_section_type(libtrace_meta_t *r) {
19        int i;
20        printf(" PCAPNG Section Header Block\n");
21
22        if (r == NULL) { return; }
23
24        for (i=0; i<r->num; i++) {
25                switch(r->items[i].option) {
26                        case(PCAPNG_META_SHB_HARDWARE):
27                                printf("  shb_hardware: %s\n",
28                                        (char *)r->items[i].data);
29                                break;
30                        case(PCAPNG_META_SHB_OS):
31                                printf("  shb_os: %s\n",
32                                        (char *)r->items[i].data);
33                                break;
34                        case(PCAPNG_META_SHB_USERAPPL):
35                                printf("  shb_userappl: %s\n",
36                                        (char *)r->items[i].data);
37                                break;
38                }
39        }
40}
41static void print_interface_type(libtrace_meta_t *r, libtrace_packet_t *packet) {
42        int i;
43        char *ip4, *ip6, *ptr UNUSED;
44        printf(" PCAPNG Interface Description Block\n");
45
46        if (r == NULL) { return; }
47
48        for (i=0; i<r->num; i++) {
49                switch(r->items[i].option) {
50                        case(PCAPNG_META_IF_NAME):
51                                printf("  if_name: %s\n",
52                                        (char *)r->items[i].data);
53                                break;
54                        case(PCAPNG_META_IF_DESCR):
55                                printf("  if_description: %s\n",
56                                        (char *)r->items[i].data);
57                                break;
58                        case(PCAPNG_META_IF_IP4):
59                                ip4 = calloc(1, INET4_ADDRSTRLEN);
60                                ptr = trace_get_interface_ipv4_string(packet, ip4,
61                                        INET4_ADDRSTRLEN, 0);
62                                printf("  if_IPv4addr: %s", ip4);
63                                free(ip4);
64                                break;
65                        case(PCAPNG_META_IF_IP6):
66                                ip6 = calloc(1, INET6_ADDRSTRLEN);
67                                ptr = trace_get_interface_ipv6_string(packet, ip6,
68                                        INET6_ADDRSTRLEN, 0);
69                                printf("  if_IPv6addr: %s\n", ip6);
70                                free(ip6);
71                                break;
72                        case(PCAPNG_META_IF_MAC):
73                                printf("  if_MACaddr: %s\n",
74                                        (char *)r->items[i].data);
75                                break;
76                        case(PCAPNG_META_IF_EUI):
77                                printf("  if_EUIaddr: %s\n",
78                                        (char *)r->items[i].data);
79                                break;
80                        case(PCAPNG_META_IF_SPEED):
81                                printf("  if_speed: %lu\n",
82                                        *(uint64_t *)r->items[i].data);
83                                break;
84                        case(PCAPNG_META_IF_TSRESOL):
85                                printf("  if_tsresol: %u\n",
86                                        *(uint8_t *)r->items[i].data);
87                                break;
88                        case(PCAPNG_META_IF_TZONE):
89                                /* Waiting for specification to specify */
90                                break;
91                        case(PCAPNG_META_IF_FILTER):
92                                printf("  if_filter: %u",
93                                        *(uint8_t *)r->items[i].data);
94                                printf(" %s\n",
95                                        (char *)r->items[i].data+sizeof(uint8_t));
96                                break;
97                        case(PCAPNG_META_IF_OS):
98                                printf("  if_os: %s\n",
99                                        (char *)r->items[i].data);
100                                break;
101                        case(PCAPNG_META_IF_FCSLEN):
102                                printf("  if_fcslen: %u\n",
103                                        *(uint8_t *)r->items[i].data);
104                                break;
105                        case(PCAPNG_META_IF_TSOFFSET):
106                                printf("  if_tsoffset: %lu\n",
107                                        *(uint64_t *)r->items[i].data);
108                                break;
109                        case(PCAPNG_META_IF_HARDWARE):
110                                printf("  if_hardware: %s\n",
111                                        (char *)r->items[i].data);
112                                break;
113                        default:
114                                break;
115                }
116        }
117}
118
119static void print_name_resolution_type(libtrace_meta_t *r) {
120        int i;
121        printf(" PCAPNG Name Resolution\n");
122
123        if (r == NULL) { return; }
124
125        for (i=0; i<r->num; i++) {
126                switch(r->items[i].option) {
127                        //case(PCAPNG_META_NRB_RECORD_END):
128                        //      /* This should never occur,
129                        //       * the meta api should not return it */
130                        //      break;
131                        //case(PCAPNG_META_NRB_RECORD_IP4):
132                        //      printf("  nrb_record_ipv4: %u dns_name: %s\n",
133                        //              *(uint32_t *)r->items[i].data,
134                        //              (char *)r->items[i].data+sizeof(uint32_t));
135                        //      break;
136                        //case(PCAPNG_META_NRB_RECORD_IP6):
137                        //      /* todo - need to find an example */
138                        //      break;
139                        case(PCAPNG_META_NS_DNSNAME):
140                                printf("  ns_dnsname: %s\n",
141                                        (char *)r->items[i].data);
142                                break;
143                        case(PCAPNG_META_NS_DNS_IP4_ADDR):
144                                printf("  ns_dnsIP4addr: %u.%u.%u.%u\n",
145                                        *(uint8_t *)r->items[i].data,
146                                        *(uint8_t *)r->items[i].data+8,
147                                        *(uint8_t *)r->items[i].data+16,
148                                        *(uint8_t *)r->items[i].data+24);
149                                break;
150                        case(PCAPNG_META_NS_DNS_IP6_ADDR):
151                                /* todo - need to find an example */
152                                break;
153                        default:
154                                break;
155                }
156        }
157}
158
159static void print_interface_statistics_type(libtrace_meta_t *r) {
160        int i;
161        printf(" PCAPNG Interface Statistics\n");
162
163        if (r == NULL) { return; }
164
165        for (i=0; i<r->num; i++) {
166                switch(r->items[i].option) {
167                        case(PCAPNG_META_ISB_STARTTIME):
168                                /* Need to split into 4 octets */
169                                printf("  isb_starttime: %lu\n",
170                                        *(uint64_t *)r->items[i].data);
171                                break;
172                        case(PCAPNG_META_ISB_ENDTIME):
173                                printf("  isb_endtime: %lu\n",
174                                        *(uint64_t *)r->items[i].data);
175                                break;
176                        case(PCAPNG_META_ISB_IFRECV):
177                                printf("  isb_ifrecv: %lu\n",
178                                        *(uint64_t *)r->items[i].data);
179                                break;
180                        case(PCAPNG_META_ISB_IFDROP):
181                                printf("  isb_ifdrop: %lu\n",
182                                        *(uint64_t *)r->items[i].data);
183                                break;
184                        case(PCAPNG_META_ISB_FILTERACCEPT):
185                                printf("  isb_filteraccept: %lu\n",
186                                        *(uint64_t *)r->items[i].data);
187                                break;
188                        case(PCAPNG_META_ISB_OSDROP):
189                                printf("  isb_osdrop: %lu\n",
190                                        *(uint64_t *)r->items[i].data);
191                                break;
192                        case(PCAPNG_META_ISB_USRDELIV):
193                                printf("  isb_usrdeliv: %lu\n",
194                                        *(uint64_t *)r->items[i].data);
195                                break;
196                        default:
197                                break;
198                }
199        }
200}
201
202static void print_custom_type(libtrace_meta_t *r) {
203        int i, k;
204        printf(" PCAPNG Custom Block\n");
205
206        if (r == NULL) { return; }
207
208        /* print the custom data */
209        for (i=0; i<r->num; i++) {
210                printf("  Private Enterprise Number (PEN): %u\n",
211                        *(uint32_t *)r->items[i].data);
212                printf("   Data: ");
213                char *ptr = r->items[i].data+sizeof(uint32_t);
214                uint16_t length = r->items[i].len-sizeof(uint32_t);
215                for (k=0; k<length; k++) {
216                        printf("%02x ", ptr[k]);
217                }
218        }
219}
220
221static void print_secrets_type(libtrace_meta_t *r UNUSED) {
222        /* todo */
223}
224
225DLLEXPORT void decode_meta(int link_type UNUSED,const char *packet UNUSED,unsigned len UNUSED,
226        libtrace_packet_t *p) {
227
228        struct pcapng_peeker *pkthdr;
229        uint32_t section;
230
231        /* get the section header ID */
232        pkthdr = (struct pcapng_peeker *)p->header;
233        if (DATA(p->trace)->byteswapped) {
234                section = byteswap32(pkthdr->blocktype);
235        } else {
236                section = pkthdr->blocktype;
237        }
238
239        /* Get the entire section of whatever type of meta packet this is from the meta api */
240        libtrace_meta_t *r = trace_get_section(p, section);
241
242        switch(section) {
243                case PCAPNG_SECTION_TYPE:
244                        print_section_type(r);
245                        break;
246                case PCAPNG_INTERFACE_TYPE:
247                        print_interface_type(r, p);
248                        break;
249                case PCAPNG_OLD_PACKET_TYPE:
250                        /* We will never make it here */
251                        break;
252                case PCAPNG_SIMPLE_PACKET_TYPE:
253                        /* We will never make it here */
254                        break;
255                case PCAPNG_NAME_RESOLUTION_TYPE:
256                        print_name_resolution_type(r);
257                        break;
258                case PCAPNG_INTERFACE_STATS_TYPE:
259                        print_interface_statistics_type(r);
260                        break;
261                case PCAPNG_ENHANCED_PACKET_TYPE:
262                        /* We will never make it here */
263                        break;
264                case PCAPNG_CUSTOM_TYPE:
265                        print_custom_type(r);
266                        break;
267                case PCAPNG_CUSTOM_NONCOPY_TYPE:
268                        print_custom_type(r);
269                        break;
270                case PCAPNG_DECRYPTION_SECRETS_TYPE:
271                        /* specification does not define options for this
272                         * however we can still print the secrets data */
273                        print_secrets_type(r);
274                        break;
275                default:
276                        printf("Unknown Type/Block\n");
277
278        }
279
280        /* destroy the meta result */
281        trace_destroy_meta(r);
282
283}
Note: See TracBrowser for help on using the repository browser.