X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fipv6.h;h=17bc586430cd8e4cd21f74e5b83cf95f53e351dd;hb=refs%2Fheads%2F1.1;hp=46cf62df6a9de2b3cbc9d92fc2e94ef866d830ca;hpb=417981462a2dde7800768eb58cf8f4e5238d4ad7;p=tinc diff --git a/src/ipv6.h b/src/ipv6.h index 46cf62df..e9c4d265 100644 --- a/src/ipv6.h +++ b/src/ipv6.h @@ -1,7 +1,10 @@ +#ifndef TINC_IPV6_H +#define TINC_IPV6_H + /* ipv6.h -- missing IPv6 related definitions Copyright (C) 2005 Ivo Timmermans - 2006-2012 Guus Sliepen + 2006-2016 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,8 +21,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __TINC_IPV6_H__ -#define __TINC_IPV6_H__ +#include "system.h" #ifndef AF_INET6 #define AF_INET6 10 @@ -29,38 +31,15 @@ #define IPPROTO_ICMPV6 58 #endif -#ifndef HAVE_STRUCT_IN6_ADDR -struct in6_addr { - union { - uint8_t u6_addr8[16]; - uint16_t u6_addr16[8]; - uint32_t u6_addr32[4]; - } in6_u; -} __attribute__ ((__gcc_struct__, __packed__)); -#define s6_addr in6_u.u6_addr8 -#define s6_addr16 in6_u.u6_addr16 -#define s6_addr32 in6_u.u6_addr32 -#endif - -#ifndef HAVE_STRUCT_SOCKADDR_IN6 -struct sockaddr_in6 { - uint16_t sin6_family; - uint16_t sin6_port; - uint32_t sin6_flowinfo; - struct in6_addr sin6_addr; - uint32_t sin6_scope_id; -} __attribute__ ((__gcc_struct__, __packed__)); -#endif - #ifndef IN6_IS_ADDR_V4MAPPED #define IN6_IS_ADDR_V4MAPPED(a) \ ((((__const uint32_t *) (a))[0] == 0) \ - && (((__const uint32_t *) (a))[1] == 0) \ - && (((__const uint32_t *) (a))[2] == htonl (0xffff))) + && (((__const uint32_t *) (a))[1] == 0) \ + && (((__const uint32_t *) (a))[2] == htonl (0xffff))) #endif #ifndef HAVE_STRUCT_IP6_HDR -struct ip6_hdr { +PACKED(struct ip6_hdr { union { struct ip6_hdrctl { uint32_t ip6_un1_flow; @@ -72,7 +51,7 @@ struct ip6_hdr { } ip6_ctlun; struct in6_addr ip6_src; struct in6_addr ip6_dst; -} __attribute__ ((__gcc_struct__, __packed__)); +}); #define ip6_vfc ip6_ctlun.ip6_un2_vfc #define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow #define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen @@ -81,8 +60,10 @@ struct ip6_hdr { #define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim #endif +STATIC_ASSERT(sizeof(struct ip6_hdr) == 40, "ip6_hdr has incorrect size"); + #ifndef HAVE_STRUCT_ICMP6_HDR -struct icmp6_hdr { +PACKED(struct icmp6_hdr { uint8_t icmp6_type; uint8_t icmp6_code; uint16_t icmp6_cksum; @@ -91,7 +72,7 @@ struct icmp6_hdr { uint16_t icmp6_un_data16[2]; uint8_t icmp6_un_data8[4]; } icmp6_dataun; -} __attribute__ ((__gcc_struct__, __packed__)); +}); #define ICMP6_DST_UNREACH_NOROUTE 0 #define ICMP6_DST_UNREACH 1 #define ICMP6_PACKET_TOO_BIG 2 @@ -107,11 +88,13 @@ struct icmp6_hdr { #define icmp6_mtu icmp6_data32[0] #endif +STATIC_ASSERT(sizeof(struct icmp6_hdr) == 8, "icmp6_hdr has incorrect size"); + #ifndef HAVE_STRUCT_ND_NEIGHBOR_SOLICIT -struct nd_neighbor_solicit { +PACKED(struct nd_neighbor_solicit { struct icmp6_hdr nd_ns_hdr; struct in6_addr nd_ns_target; -} __attribute__ ((__gcc_struct__, __packed__)); +}); #define ND_OPT_SOURCE_LINKADDR 1 #define ND_OPT_TARGET_LINKADDR 2 #define nd_ns_type nd_ns_hdr.icmp6_type @@ -120,11 +103,15 @@ struct nd_neighbor_solicit { #define nd_ns_reserved nd_ns_hdr.icmp6_data32[0] #endif +STATIC_ASSERT(sizeof(struct nd_neighbor_solicit) == 24, "nd_neighbor_solicit has incorrect size"); + #ifndef HAVE_STRUCT_ND_OPT_HDR -struct nd_opt_hdr { +PACKED(struct nd_opt_hdr { uint8_t nd_opt_type; uint8_t nd_opt_len; -} __attribute__ ((__gcc_struct__, __packed__)); +}); #endif -#endif /* __TINC_IPV6_H__ */ +STATIC_ASSERT(sizeof(struct nd_opt_hdr) == 2, "nd_opt_hdr has incorrect size"); + +#endif