source: libpacketdump/link_22.c @ 5cdb37d

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

Fix bug in libpacketdump where we were using a bad 'level'

This would cause the iPPackets field to be massively indented,
way more than it should be.

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