source: libpacketdump/link_23.c @ 0486a72

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

libpacketdump print pcapng mac and eui addr addresses correctly

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