X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/6ec714988caac3bf9fedc766ae51a2248896ec80..cc2d4cbd8ca150504127f375d8b51b194958d95b:/ip6.h diff --git a/ip6.h b/ip6.h index 35f12e42..b5058a48 100644 --- a/ip6.h +++ b/ip6.h @@ -83,9 +83,9 @@ struct ip6_hdr { } ip6_un1; nd_uint8_t ip6_un2_vfc; /* 4 bits version, top 4 bits class */ } ip6_ctlun; - struct in6_addr ip6_src; /* source address */ - struct in6_addr ip6_dst; /* destination address */ -} UNALIGNED; + nd_ipv6 ip6_src; /* source address */ + nd_ipv6 ip6_dst; /* destination address */ +}; #define ip6_vfc ip6_ctlun.ip6_un2_vfc #define IP6_VERSION(ip6_hdr) ((EXTRACT_U_1((ip6_hdr)->ip6_vfc) & 0xf0) >> 4) @@ -111,21 +111,21 @@ struct ip6_hdr { struct ip6_ext { nd_uint8_t ip6e_nxt; nd_uint8_t ip6e_len; -} UNALIGNED; +}; /* Hop-by-Hop options header */ struct ip6_hbh { nd_uint8_t ip6h_nxt; /* next header */ nd_uint8_t ip6h_len; /* length in units of 8 octets */ /* followed by options */ -} UNALIGNED; +}; /* Destination options header */ struct ip6_dest { nd_uint8_t ip6d_nxt; /* next header */ nd_uint8_t ip6d_len; /* length in units of 8 octets */ /* followed by options */ -} UNALIGNED; +}; /* http://www.iana.org/assignments/ipv6-parameters/ipv6-parameters.xhtml */ @@ -170,10 +170,11 @@ struct ip6_rthdr { nd_uint8_t ip6r_type; /* routing type */ nd_uint8_t ip6r_segleft; /* segments left */ /* followed by routing type specific data */ -} UNALIGNED; +}; #define IPV6_RTHDR_TYPE_0 0 #define IPV6_RTHDR_TYPE_2 2 +#define IPV6_RTHDR_TYPE_4 4 /* Type 0 Routing header */ /* Also used for Type 2 */ @@ -183,7 +184,22 @@ struct ip6_rthdr0 { nd_uint8_t ip6r0_type; /* always zero */ nd_uint8_t ip6r0_segleft; /* segments left */ nd_uint32_t ip6r0_reserved; /* reserved field */ - struct in6_addr ip6r0_addr[1]; /* up to 23 addresses */ + nd_ipv6 ip6r0_addr[1]; /* up to 23 addresses */ +}; + +/** + * Type 4 Routing header + * known as Segment Routing Header 'SRH' + */ +struct ip6_srh { + nd_uint8_t srh_nxt; /* next header */ + nd_uint8_t srh_len; /* length in units of 8 octets */ + nd_uint8_t srh_type; /* Routing Type 4 */ + nd_uint8_t srh_segleft; /* segments left */ + nd_uint8_t srh_last_ent; /* Last Entry*/ + nd_uint8_t srh_flags; /* Flags */ + nd_uint16_t srh_tag; /* Tag */ + nd_ipv6 srh_segments[1]; /* SRH segments list*/ }; /* Fragment header */ @@ -192,7 +208,7 @@ struct ip6_frag { nd_uint8_t ip6f_reserved; /* reserved field */ nd_uint16_t ip6f_offlg; /* offset, reserved, and flag */ nd_uint32_t ip6f_ident; /* identification */ -} UNALIGNED; +}; #define IP6F_OFF_MASK 0xfff8 /* mask out offset from ip6f_offlg */ #define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */