1ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifndef _IPV6_H 2ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define _IPV6_H 3ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 4ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <linux/types.h> 5ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <linux/in6.h> 6ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <asm/byteorder.h> 7ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 8ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* The latest drafts declared increase in minimal mtu up to 1280. */ 9ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 10ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IPV6_MIN_MTU 1280 11ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 12ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* 13ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * Advanced API 14ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * source interface/address selection, source routing, etc... 15ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * *under construction* 16ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 17ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 18ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 19ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct in6_pktinfo { 20ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr ipi6_addr; 21ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson int ipi6_ifindex; 22ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 23ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 24ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ip6_mtuinfo { 25ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct sockaddr_in6 ip6m_addr; 26ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u32 ip6m_mtu; 27ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 28ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 29ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct in6_ifreq { 30ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr ifr6_addr; 31ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u32 ifr6_prefixlen; 32ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson int ifr6_ifindex; 33ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 34ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 35ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IPV6_SRCRT_STRICT 0x01 /* Deprecated; will be removed */ 36ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IPV6_SRCRT_TYPE_0 0 /* Deprecated; will be removed */ 37ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IPV6_SRCRT_TYPE_2 2 /* IPv6 type 2 Routing Header */ 38ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 39ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* 40ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * routing header 41ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 42ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_rt_hdr { 43ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 nexthdr; 44ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 hdrlen; 45ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 type; 46ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 segments_left; 47ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 48ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson /* 49ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * type specific data 50ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * variable length field 51ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 52ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 53ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 54ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 55ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_opt_hdr { 56ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 nexthdr; 57ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 hdrlen; 58ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson /* 59ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * TLV encoded option data follows. 60ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 61ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} __attribute__((packed)); /* required for some archs */ 62ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 63ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define ipv6_destopt_hdr ipv6_opt_hdr 64ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define ipv6_hopopt_hdr ipv6_opt_hdr 65ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 66ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef __KERNEL__ 67ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define ipv6_optlen(p) (((p)->hdrlen+1) << 3) 68ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif 69ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 70ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* 71ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * routing header type 0 (used in cmsghdr struct) 72ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 73ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 74ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct rt0_hdr { 75ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct ipv6_rt_hdr rt_hdr; 76ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u32 reserved; 77ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr addr[0]; 78ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 79ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define rt0_type rt_hdr.type 80ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 81ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 82ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* 83ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * routing header type 2 84ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 85ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 86ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct rt2_hdr { 87ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct ipv6_rt_hdr rt_hdr; 88ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u32 reserved; 89ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr addr; 90ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 91ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define rt2_type rt_hdr.type 92ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 93ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 94ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* 95ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * home address option in destination options header 96ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 97ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 98ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_destopt_hao { 99ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 type; 100ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 length; 101ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr addr; 102ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} __attribute__((packed)); 103ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 104ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* 105ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * IPv6 fixed header 106ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * 107ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * BEWARE, it is incorrect. The first 4 bits of flow_lbl 108ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * are glued to priority now, forming "class". 109ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 110ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 111ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6hdr { 112ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#if defined(__LITTLE_ENDIAN_BITFIELD) 113ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 priority:4, 114ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson version:4; 115ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#elif defined(__BIG_ENDIAN_BITFIELD) 116ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 version:4, 117ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson priority:4; 118ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#else 119ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#error "Please fix <asm/byteorder.h>" 120ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif 121ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 flow_lbl[3]; 122ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 123ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __be16 payload_len; 124ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 nexthdr; 125ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 hop_limit; 126ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 127ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr saddr; 128ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr daddr; 129ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 130ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 131ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef __KERNEL__ 132ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* 133ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * This structure contains configuration options per IPv6 link. 134ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 135ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_devconf { 136ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 forwarding; 137ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 hop_limit; 138ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 mtu6; 139ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 accept_ra; 140ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 accept_redirects; 141ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 autoconf; 142ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 dad_transmits; 143ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 rtr_solicits; 144ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 rtr_solicit_interval; 145ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 rtr_solicit_delay; 146ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 force_mld_version; 147ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef CONFIG_IPV6_PRIVACY 148ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 use_tempaddr; 149ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 temp_valid_lft; 150ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 temp_prefered_lft; 151ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 regen_max_retry; 152ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 max_desync_factor; 153ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif 154ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 max_addresses; 155ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 accept_ra_defrtr; 156ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 accept_ra_pinfo; 157ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef CONFIG_IPV6_ROUTER_PREF 158ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 accept_ra_rtr_pref; 159ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 rtr_probe_interval; 160ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef CONFIG_IPV6_ROUTE_INFO 161ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 accept_ra_rt_info_max_plen; 162ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif 163ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif 164ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 proxy_ndp; 165ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 accept_source_route; 166ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef CONFIG_IPV6_OPTIMISTIC_DAD 167ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 optimistic_dad; 168ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif 169ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef CONFIG_IPV6_MROUTE 170ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 mc_forwarding; 171ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif 172ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 disable_ipv6; 173ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 accept_dad; 174ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 force_tllao; 175ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson void *sysctl; 176ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 177ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 178ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_params { 179ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 disable_ipv6; 180ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s32 autoconf; 181ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 182ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonextern struct ipv6_params ipv6_defaults; 183ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif 184ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 185ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* index values for the variables in ipv6_devconf */ 186ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonenum { 187ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_FORWARDING = 0, 188ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_HOPLIMIT, 189ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_MTU6, 190ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_ACCEPT_RA, 191ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_ACCEPT_REDIRECTS, 192ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_AUTOCONF, 193ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_DAD_TRANSMITS, 194ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_RTR_SOLICITS, 195ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_RTR_SOLICIT_INTERVAL, 196ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_RTR_SOLICIT_DELAY, 197ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_USE_TEMPADDR, 198ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_TEMP_VALID_LFT, 199ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_TEMP_PREFERED_LFT, 200ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_REGEN_MAX_RETRY, 201ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_MAX_DESYNC_FACTOR, 202ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_MAX_ADDRESSES, 203ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_FORCE_MLD_VERSION, 204ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_ACCEPT_RA_DEFRTR, 205ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_ACCEPT_RA_PINFO, 206ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_ACCEPT_RA_RTR_PREF, 207ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_RTR_PROBE_INTERVAL, 208ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_ACCEPT_RA_RT_INFO_MAX_PLEN, 209ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_PROXY_NDP, 210ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_OPTIMISTIC_DAD, 211ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_ACCEPT_SOURCE_ROUTE, 212ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_MC_FORWARDING, 213ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_DISABLE_IPV6, 214ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_ACCEPT_DAD, 215ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_FORCE_TLLAO, 216ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson DEVCONF_MAX 217ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 218ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 219ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef __KERNEL__ 220ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <linux/icmpv6.h> 221ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <linux/tcp.h> 222ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <linux/udp.h> 223ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 224ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#include <net/inet_sock.h> 225ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 226ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct ipv6hdr *ipv6_hdr(const struct sk_buff *skb) 227ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 228ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return (struct ipv6hdr *)skb_network_header(skb); 229ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 230ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 231ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb) 232ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 233ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return (struct ipv6hdr *)skb_transport_header(skb); 234ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 235ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 236ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* 237ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson This structure contains results of exthdrs parsing 238ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson as offsets from skb->nh. 239ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 240ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 241ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct inet6_skb_parm { 242ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson int iif; 243ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 ra; 244ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 hop; 245ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 dst0; 246ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 srcrt; 247ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 dst1; 248ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 lastopt; 249ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 nhoff; 250ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 flags; 251ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) 252ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 dsthao; 253ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif 254ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 255ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IP6SKB_XFRM_TRANSFORMED 1 256ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IP6SKB_FORWARDED 2 257ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IP6SKB_REROUTED 4 258ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 259ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 260ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) 261ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define IP6CBMTU(skb) ((struct ip6_mtuinfo *)((skb)->cb)) 262ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 263ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline int inet6_iif(const struct sk_buff *skb) 264ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 265ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return IP6CB(skb)->iif; 266ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 267ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 268ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct inet6_request_sock { 269ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr loc_addr; 270ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr rmt_addr; 271ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct sk_buff *pktopts; 272ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson int iif; 273ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 274ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 275ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct tcp6_request_sock { 276ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct tcp_request_sock tcp6rsk_tcp; 277ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct inet6_request_sock tcp6rsk_inet6; 278ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 279ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 280ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_mc_socklist; 281ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_ac_socklist; 282ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_fl_socklist; 283ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 284ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/** 285ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * struct ipv6_pinfo - ipv6 private area 286ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * 287ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * In the struct sock hierarchy (tcp6_sock, upd6_sock, etc) 288ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * this _must_ be the last member, so that inet6_sk_generic 289ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * is able to calculate its offset from the base struct sock 290ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * by using the struct proto->slab_obj_size member. -acme 291ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 292ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct ipv6_pinfo { 293ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr saddr; 294ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr rcv_saddr; 295ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr daddr; 296ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_pktinfo sticky_pktinfo; 297ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr *daddr_cache; 298ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#ifdef CONFIG_IPV6_SUBTREES 299ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr *saddr_cache; 300ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif 301ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 302ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __be32 flow_label; 303ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u32 frag_size; 304ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 305ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson /* 306ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * Packed in 16bits. 307ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * Omit one shift by by putting the signed field at MSB. 308ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 309ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#if defined(__BIG_ENDIAN_BITFIELD) 310ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s16 hop_limit:9; 311ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 __unused_1:7; 312ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#else 313ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 __unused_1:7; 314ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s16 hop_limit:9; 315ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif 316ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 317ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#if defined(__BIG_ENDIAN_BITFIELD) 318ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson /* Packed in 16bits. */ 319ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s16 mcast_hops:9; 320ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 __unused_2:6, 321ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson mc_loop:1; 322ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#else 323ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 mc_loop:1, 324ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __unused_2:6; 325ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __s16 mcast_hops:9; 326ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif 327ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson int mcast_oif; 328ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 329ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson /* pktoption flags */ 330ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson union { 331ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct { 332ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 srcrt:1, 333ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson osrcrt:1, 334ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson rxinfo:1, 335ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson rxoinfo:1, 336ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson rxhlim:1, 337ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson rxohlim:1, 338ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson hopopts:1, 339ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson ohopopts:1, 340ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson dstopts:1, 341ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson odstopts:1, 342ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson rxflow:1, 343ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson rxtclass:1, 344ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson rxpmtu:1, 345ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson rxorigdstaddr:1; 346ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson /* 2 bits hole */ 347ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson } bits; 348ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 all; 349ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson } rxopt; 350ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 351ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson /* sockopt flags */ 352ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u16 recverr:1, 353ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson sndflow:1, 354ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson pmtudisc:2, 355ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson ipv6only:1, 356ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson srcprefs:3, /* 001: prefer temporary address 357ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * 010: prefer public address 358ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson * 100: prefer care-of address 359ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson */ 360ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson dontfrag:1; 361ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 min_hopcount; 362ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 tclass; 363ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u8 padding; 364ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 365ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u32 dst_cookie; 366ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 367ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct ipv6_mc_socklist *ipv6_mc_list; 368ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct ipv6_ac_socklist *ipv6_ac_list; 369ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct ipv6_fl_socklist *ipv6_fl_list; 370ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 371ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct ipv6_txoptions *opt; 372ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct sk_buff *pktoptions; 373ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct sk_buff *rxpmtu; 374ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct { 375ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct ipv6_txoptions *opt; 376ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson u8 hop_limit; 377ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson u8 tclass; 378ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson } cork; 379ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 380ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 381ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson/* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */ 382ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct raw6_sock { 383ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson /* inet_sock has to be the first member of raw6_sock */ 384ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct inet_sock inet; 385ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u32 checksum; /* perform checksum */ 386ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u32 offset; /* checksum offset */ 387ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct icmp6_filter filter; 388ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __u32 ip6mr_table; 389ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson /* ipv6_pinfo has to be the last member of raw6_sock, see inet6_sk_generic */ 390ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct ipv6_pinfo inet6; 391ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 392ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 393ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct udp6_sock { 394ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct udp_sock udp; 395ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson /* ipv6_pinfo has to be the last member of udp6_sock, see inet6_sk_generic */ 396ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct ipv6_pinfo inet6; 397ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 398ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 399ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct tcp6_sock { 400ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct tcp_sock tcp; 401ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson /* ipv6_pinfo has to be the last member of tcp6_sock, see inet6_sk_generic */ 402ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct ipv6_pinfo inet6; 403ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 404ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 405ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonextern int inet6_sk_rebuild_header(struct sock *sk); 406ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 407ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 408ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk) 409ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 410ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return inet_sk(__sk)->pinet6; 411ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 412ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 413ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct inet6_request_sock * 414ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson inet6_rsk(const struct request_sock *rsk) 415ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 416ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return (struct inet6_request_sock *)(((u8 *)rsk) + 417ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson inet_rsk(rsk)->inet6_rsk_offset); 418ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 419ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 420ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline u32 inet6_rsk_offset(struct request_sock *rsk) 421ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 422ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return rsk->rsk_ops->obj_size - sizeof(struct inet6_request_sock); 423ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 424ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 425ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct request_sock *inet6_reqsk_alloc(struct request_sock_ops *ops) 426ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 427ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct request_sock *req = reqsk_alloc(ops); 428ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 429ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson if (req != NULL) { 430ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson inet_rsk(req)->inet6_rsk_offset = inet6_rsk_offset(req); 431ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson inet6_rsk(req)->pktopts = NULL; 432ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson } 433ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 434ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return req; 435ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 436ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 437ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct raw6_sock *raw6_sk(const struct sock *sk) 438ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 439ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return (struct raw6_sock *)sk; 440ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 441ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 442ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline void inet_sk_copy_descendant(struct sock *sk_to, 443ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson const struct sock *sk_from) 444ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 445ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson int ancestor_size = sizeof(struct inet_sock); 446ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 447ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson if (sk_from->sk_family == PF_INET6) 448ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson ancestor_size += sizeof(struct ipv6_pinfo); 449ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 450ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson __inet_sk_copy_descendant(sk_to, sk_from, ancestor_size); 451ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 452ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 453ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define __ipv6_only_sock(sk) (inet6_sk(sk)->ipv6only) 454ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define ipv6_only_sock(sk) ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk)) 455ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 456ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct inet6_timewait_sock { 457ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr tw_v6_daddr; 458ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct in6_addr tw_v6_rcv_saddr; 459ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 460ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 461ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstruct tcp6_timewait_sock { 462ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct tcp_timewait_sock tcp6tw_tcp; 463ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson struct inet6_timewait_sock tcp6tw_inet6; 464ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson}; 465ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 466ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline u16 inet6_tw_offset(const struct proto *prot) 467ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 468ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return prot->twsk_prot->twsk_obj_size - 469ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson sizeof(struct inet6_timewait_sock); 470ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 471ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 472ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct inet6_timewait_sock *inet6_twsk(const struct sock *sk) 473ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 474ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return (struct inet6_timewait_sock *)(((u8 *)sk) + 475ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson inet_twsk(sk)->tw_ipv6_offset); 476ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 477ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 478ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct in6_addr *__inet6_rcv_saddr(const struct sock *sk) 479ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 480ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return likely(sk->sk_state != TCP_TIME_WAIT) ? 481ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson &inet6_sk(sk)->rcv_saddr : &inet6_twsk(sk)->tw_v6_rcv_saddr; 482ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 483ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 484ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct in6_addr *inet6_rcv_saddr(const struct sock *sk) 485ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 486ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return sk->sk_family == AF_INET6 ? __inet6_rcv_saddr(sk) : NULL; 487ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 488ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 489ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline int inet_v6_ipv6only(const struct sock *sk) 490ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 491ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return likely(sk->sk_state != TCP_TIME_WAIT) ? 492ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson ipv6_only_sock(sk) : inet_twsk(sk)->tw_ipv6only; 493ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 494ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#else 495ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define __ipv6_only_sock(sk) 0 496ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define ipv6_only_sock(sk) 0 497ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 498ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk) 499ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 500ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return NULL; 501ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 502ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 503ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct inet6_request_sock * 504ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson inet6_rsk(const struct request_sock *rsk) 505ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 506ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return NULL; 507ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 508ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 509ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gundersonstatic inline struct raw6_sock *raw6_sk(const struct sock *sk) 510ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson{ 511ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson return NULL; 512ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson} 513ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 514ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define __inet6_rcv_saddr(__sk) NULL 515ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define inet6_rcv_saddr(__sk) NULL 516ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define tcp_twsk_ipv6only(__sk) 0 517ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define inet_v6_ipv6only(__sk) 0 518ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif /* defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) */ 519ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 520ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define INET6_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif)\ 521ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \ 522ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson ((*((__portpair *)&(inet_sk(__sk)->inet_dport))) == (__ports)) && \ 523ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson ((__sk)->sk_family == AF_INET6) && \ 524ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr)) && \ 525ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \ 526ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) 527ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 528ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#define INET6_TW_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif) \ 529ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net) && \ 530ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson (*((__portpair *)&(inet_twsk(__sk)->tw_dport)) == (__ports)) && \ 531ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson ((__sk)->sk_family == PF_INET6) && \ 532ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson (ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr))) && \ 533ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson (ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_rcv_saddr, (__daddr))) && \ 534ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif)))) 535ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 536ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif /* __KERNEL__ */ 537ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson 538ffc99f7672a4f5db4271c60fc58a056e5d26f5baSteinar H. Gunderson#endif /* _IPV6_H */ 539