123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- #include <netdissect-stdinc.h>
- #include "netdissect.h"
- #include "extract.h"
- #define ENC_HDRLEN 12
- #define M_CONF 0x0400
- #define M_AUTH 0x0800
- struct enchdr {
- uint32_t af;
- uint32_t spi;
- uint32_t flags;
- };
- #define ENC_PRINT_TYPE(wh, xf, nam) \
- if ((wh) & (xf)) { \
- ND_PRINT((ndo, "%s%s", nam, (wh) == (xf) ? "): " : ",")); \
- (wh) &= ~(xf); \
- }
- u_int
- enc_if_print(netdissect_options *ndo,
- const struct pcap_pkthdr *h, register const u_char *p)
- {
- register u_int length = h->len;
- register u_int caplen = h->caplen;
- int flags;
- const struct enchdr *hdr;
- if (caplen < ENC_HDRLEN) {
- ND_PRINT((ndo, "[|enc]"));
- goto out;
- }
- hdr = (const struct enchdr *)p;
- flags = hdr->flags;
- if (flags == 0)
- ND_PRINT((ndo, "(unprotected): "));
- else
- ND_PRINT((ndo, "("));
- ENC_PRINT_TYPE(flags, M_AUTH, "authentic");
- ENC_PRINT_TYPE(flags, M_CONF, "confidential");
-
- ND_PRINT((ndo, "SPI 0x%08x: ", EXTRACT_32BITS(&hdr->spi)));
- length -= ENC_HDRLEN;
- caplen -= ENC_HDRLEN;
- p += ENC_HDRLEN;
- switch (hdr->af) {
- case AF_INET:
- ip_print(ndo, p, length);
- break;
- #ifdef AF_INET6
- case AF_INET6:
- ip6_print(ndo, p, length);
- break;
- #endif
- }
- out:
- return (ENC_HDRLEN);
- }
|