static void sll_print_full(struct pkt_buff *pkt) { struct sockaddr_ll *sll = pkt->sll; char addr_str[40] = {}; tprintf(" [ Linux \"cooked\""); tprintf(" Pkt Type %d (%s)", sll->sll_pkttype, pkt_type2str(sll->sll_pkttype)); tprintf(", If Type %d (%s)", sll->sll_hatype, device_type2str(sll->sll_hatype)); tprintf(", Addr Len %d", sll->sll_halen); tprintf(", Src (%s)", device_addr2str(sll->sll_addr, sll->sll_halen, sll->sll_hatype, addr_str, sizeof(addr_str))); tprintf(", Proto 0x%x", ntohs(sll->sll_protocol)); tprintf(" ]\n"); switch (pcap_devtype_to_linktype(sll->sll_hatype)) { case LINKTYPE_EN10MB: case ___constant_swab32(LINKTYPE_EN10MB): pkt_set_dissector(pkt, ð_lay2, ntohs(sll->sll_protocol)); break; case LINKTYPE_NETLINK: case ___constant_swab32(LINKTYPE_NETLINK): pkt->dissector = &nlmsg_ops; break; default: tprintf(" [ Unknown protocol ]\n"); } }
static void auth_hdr_less(struct pkt_buff *pkt) { ssize_t hdr_len; struct auth_hdr *auth_ops; auth_ops = (struct auth_hdr *) pkt_pull(pkt, sizeof(*auth_ops)); if (auth_ops == NULL) return; hdr_len = (auth_ops->h_payload_len * 4) + 8; if (hdr_len > pkt_len(pkt) || hdr_len < 0) return; tprintf(" AH"); pkt_pull(pkt, hdr_len - sizeof(*auth_ops)); pkt_set_dissector(pkt, ð_lay3, auth_ops->h_next_header); }
static void auth_hdr(struct pkt_buff *pkt) { size_t i, hdr_len; struct auth_hdr *auth_ops; auth_ops = (struct auth_hdr *) pkt_pull(pkt, sizeof(*auth_ops)); if (auth_ops == NULL) return; hdr_len = (auth_ops->h_payload_len * 4) + 8; tprintf(" [ Authentication Header "); tprintf("NextHdr (%u), ", auth_ops->h_next_header); if (hdr_len > pkt_len(pkt)) { tprintf("HdrLen (%u, %zd Bytes %s), ", auth_ops->h_payload_len, hdr_len, colorize_start_full(black, red) "invalid" colorize_end()); return; } tprintf("HdrLen (%u, %zd Bytes), ",auth_ops->h_payload_len, hdr_len); tprintf("Reserved (0x%x), ", ntohs(auth_ops->h_reserved)); /* TODO * Upgrade for Extended (64-bit) Sequence Number * http://tools.ietf.org/html/rfc4302#section-2.5.1 */ tprintf("SPI (0x%x), ", ntohl(auth_ops->h_spi)); tprintf("SNF (0x%x), ", ntohl(auth_ops->h_snf)); tprintf("ICV 0x"); for (i = sizeof(struct auth_hdr); i < hdr_len; i++) { uint8_t *data = pkt_pull(pkt, 1); if (data == NULL) { tprintf("%sinvalid%s", colorize_start_full(black, red), colorize_end()); break; } tprintf("%02x", *data); } tprintf(" ]\n"); pkt_set_dissector(pkt, ð_lay3, auth_ops->h_next_header); }