source: libpacketdump/link_23.c @ 0cc91ee

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

Meta-API - Keep ip4 address in network byte order, Cleanup bits and pieces

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