source: libpacketdump/link_22.c @ 81881e6

cachetimestampsdevelopetsiliverc-4.0.4ringdecrementfixringperformance
Last change on this file since 81881e6 was 81881e6, checked in by Shane Alcock <salcock@…>, 3 years ago

Add ETSI IRI decoding to libpacketdump

  • Property mode set to 100644
File size: 2.6 KB
Line 
1#include "libtrace.h"
2#include "libpacketdump.h"
3
4#include <libwandder_etsili.h>
5
6DLLEXPORT void decode(int link_type UNUSED, const char *packet, unsigned len) {
7
8        char linespace[4096];
9        char namesp[1024];
10        int i;
11        uint8_t *cchdr = NULL;
12        uint8_t *iricontents = NULL;
13        uint8_t ident;
14        uint32_t rem = len;
15        wandder_etsispec_t *dec;
16        wandder_decoder_t *basedec = NULL;
17
18        dec = wandder_create_etsili_decoder();
19        wandder_attach_etsili_buffer(dec, (uint8_t *)packet, len, false);
20
21        basedec = wandder_get_etsili_base_decoder(dec);
22        while (wandder_etsili_get_next_fieldstr(dec, linespace, 4096)) {
23                printf(" ETSILI: ");
24                for (i = 0; i < wandder_get_level(basedec); i++) {
25                        printf("  ");
26                }
27                printf("%s\n", linespace);
28        }
29
30        cchdr = wandder_etsili_get_cc_contents(dec, &rem, namesp, 1024);
31
32        if (cchdr) {
33                printf(" ETSILI: ");
34                for (i = 0; i < wandder_get_level(basedec); i++) {
35                        printf("  ");
36                }
37                printf("%s: ...\n", namesp);
38                wandder_free_etsili_decoder(dec);
39                /* XXX What if there is an IPv7?? */
40                decode_next((const char *)cchdr, rem, "eth",
41                                ((*cchdr) & 0xf0) == 0x40 ? TRACE_ETHERTYPE_IP :
42                                TRACE_ETHERTYPE_IPV6);
43                return;
44        }
45
46        iricontents = wandder_etsili_get_iri_contents(dec, &rem, &ident,
47                        namesp, 1024);
48        if (iricontents) {
49                printf(" ETSILI: ");
50                /* hard-coded indentation, but easier than introducing
51                 * yet another parameter to get_iri_contents()
52                 */
53                for (i = 0; i < 7; i++) {
54                        printf("  ");
55                }
56                printf("%s: ...\n", namesp);
57                wandder_free_etsili_decoder(dec);
58                if (ident == WANDDER_IRI_CONTENT_IP) {
59                        decode_next((const char *)iricontents, rem, "eth",
60                                        ((*iricontents) & 0xf0) == 0x40 ?
61                                        TRACE_ETHERTYPE_IP :
62                                        TRACE_ETHERTYPE_IPV6);
63                } else if (ident == WANDDER_IRI_CONTENT_SIP) {
64                        decode_next((const char *)iricontents, rem, "udp",
65                                        5060);
66                }
67        }
68
69        return;
70}
Note: See TracBrowser for help on using the repository browser.