dissector_80211: start of 80211 collection
[netsniff-ng.git] / src / proto_ip_authentication_hdr.h
blob9cfd75a02538ebe6757a04c0b839fa66f4488682
1 /*
2 * netsniff-ng - the packet sniffing beast
3 * Copyright 2012 Markus Amend <markus@netsniff-ng.org>
4 * Subject to the GPL, version 2.
6 * IP Authentication Header described in RFC4302
7 */
9 #ifndef PROTO_IP_AUTHENTICATION_HDR_H
10 #define PROTO_IP_AUTHENTICATION_HDR_H
12 #include <stdio.h>
13 #include <stdint.h>
14 #include <netinet/in.h> /* for ntohs() */
16 #include "proto_struct.h"
17 #include "dissector_eth.h"
18 #include "built_in.h"
20 struct auth_hdr {
21 uint8_t h_next_header;
22 uint8_t h_payload_len;
23 uint16_t h_reserved;
24 uint32_t h_spi;
25 uint32_t h_snf;
26 } __packed;
28 static inline void auth_hdr(struct pkt_buff *pkt)
30 uint16_t hdr_len;
31 struct auth_hdr *auth_ops;
33 auth_ops = (struct auth_hdr *) pkt_pull(pkt, sizeof(*auth_ops));
34 hdr_len = (auth_ops->h_payload_len * 4) + 8;
35 if (auth_ops == NULL)
36 return;
38 tprintf(" [ Authentication Header ");
39 tprintf("NextHdr (%u), ", auth_ops->h_next_header);
40 if (hdr_len > pkt_len(pkt)) {
41 tprintf("HdrLen (%u, %s), ", hdr_len,
42 colorize_start_full(black, red),
43 "invalid" colorize_end());
44 return;
46 tprintf("HdrLen (%u), ", hdr_len);
47 tprintf("Reserved (0x%x), ", ntohs(auth_ops->h_reserved));
48 /* TODO
49 * Upgrade for Extended (64-bit) Sequence Number
50 * http://tools.ietf.org/html/rfc4302#section-2.5.1
52 tprintf("SPI (0x%x), ", ntohl(auth_ops->h_spi));
53 tprintf("SNF (0x%x), ", ntohl(auth_ops->h_snf));
54 tprintf("ICV 0x");
55 for (size_t i = sizeof(struct auth_hdr); i < hdr_len; i++)
56 tprintf("%02x", *pkt_pull(pkt, 1));
57 tprintf(" ]\n");
59 pkt_set_proto(pkt, &eth_lay3, auth_ops->h_next_header);
62 static inline void auth_hdr_less(struct pkt_buff *pkt)
64 uint16_t hdr_len;
65 struct auth_hdr *auth_ops;
67 auth_ops = (struct auth_hdr *) pkt_pull(pkt, sizeof(*auth_ops));
68 hdr_len = (auth_ops->h_payload_len * 4) + 8;
69 if (auth_ops == NULL || hdr_len > pkt_len(pkt))
70 return;
72 tprintf(" AH");
74 pkt_pull(pkt, hdr_len - sizeof(*auth_ops));
75 pkt_set_proto(pkt, &eth_lay3, auth_ops->h_next_header);
78 struct protocol ip_auth_hdr_ops = {
79 .key = 0x33,
80 .print_full = auth_hdr,
81 .print_less = auth_hdr_less,
84 #endif /* PROTO_IP_AUTHENTICATION_HDR_H */