linux-bk/include/linux/ipv6.h
<<
>>
Prefs
   1#ifndef _IPV6_H
   2#define _IPV6_H
   3
   4#include <linux/config.h>
   5#include <linux/in6.h>
   6#include <asm/byteorder.h>
   7
   8/* The latest drafts declared increase in minimal mtu up to 1280. */
   9
  10#define IPV6_MIN_MTU    1280
  11
  12/*
  13 *      Advanced API
  14 *      source interface/address selection, source routing, etc...
  15 *      *under construction*
  16 */
  17
  18
  19struct in6_pktinfo {
  20        struct in6_addr ipi6_addr;
  21        int             ipi6_ifindex;
  22};
  23
  24
  25struct in6_ifreq {
  26        struct in6_addr ifr6_addr;
  27        __u32           ifr6_prefixlen;
  28        int             ifr6_ifindex; 
  29};
  30
  31#define IPV6_SRCRT_STRICT       0x01    /* this hop must be a neighbor  */
  32#define IPV6_SRCRT_TYPE_0       0       /* IPv6 type 0 Routing Header   */
  33
  34/*
  35 *      routing header
  36 */
  37struct ipv6_rt_hdr {
  38        __u8            nexthdr;
  39        __u8            hdrlen;
  40        __u8            type;
  41        __u8            segments_left;
  42
  43        /*
  44         *      type specific data
  45         *      variable length field
  46         */
  47};
  48
  49
  50struct ipv6_opt_hdr {
  51        __u8            nexthdr;
  52        __u8            hdrlen;
  53        /* 
  54         * TLV encoded option data follows.
  55         */
  56};
  57
  58#define ipv6_destopt_hdr ipv6_opt_hdr
  59#define ipv6_hopopt_hdr  ipv6_opt_hdr
  60
  61#ifdef __KERNEL__
  62#define ipv6_optlen(p)  (((p)->hdrlen+1) << 3)
  63#endif
  64
  65/*
  66 *      routing header type 0 (used in cmsghdr struct)
  67 */
  68
  69struct rt0_hdr {
  70        struct ipv6_rt_hdr      rt_hdr;
  71        __u32                   bitmap;         /* strict/loose bit map */
  72        struct in6_addr         addr[0];
  73
  74#define rt0_type                rt_hdr.type
  75};
  76
  77struct ipv6_auth_hdr {
  78        __u8  nexthdr;
  79        __u8  hdrlen;           /* This one is measured in 32 bit units! */
  80        __u16 reserved;
  81        __u32 spi;
  82        __u32 seq_no;           /* Sequence number */
  83        __u8  auth_data[0];     /* Length variable but >=4. Mind the 64 bit alignment! */
  84};
  85
  86struct ipv6_esp_hdr {
  87        __u32 spi;
  88        __u32 seq_no;           /* Sequence number */
  89        __u8  enc_data[0];      /* Length variable but >=8. Mind the 64 bit alignment! */
  90};
  91
  92struct ipv6_comp_hdr {
  93        __u8 nexthdr;
  94        __u8 flags;
  95        __u16 cpi;
  96};
  97
  98/*
  99 *      IPv6 fixed header
 100 *
 101 *      BEWARE, it is incorrect. The first 4 bits of flow_lbl
 102 *      are glued to priority now, forming "class".
 103 */
 104
 105struct ipv6hdr {
 106#if defined(__LITTLE_ENDIAN_BITFIELD)
 107        __u8                    priority:4,
 108                                version:4;
 109#elif defined(__BIG_ENDIAN_BITFIELD)
 110        __u8                    version:4,
 111                                priority:4;
 112#else
 113#error  "Please fix <asm/byteorder.h>"
 114#endif
 115        __u8                    flow_lbl[3];
 116
 117        __u16                   payload_len;
 118        __u8                    nexthdr;
 119        __u8                    hop_limit;
 120
 121        struct  in6_addr        saddr;
 122        struct  in6_addr        daddr;
 123};
 124
 125/*
 126 * This structure contains configuration options per IPv6 link.
 127 */
 128struct ipv6_devconf {
 129        __s32           forwarding;
 130        __s32           hop_limit;
 131        __s32           mtu6;
 132        __s32           accept_ra;
 133        __s32           accept_redirects;
 134        __s32           autoconf;
 135        __s32           dad_transmits;
 136        __s32           rtr_solicits;
 137        __s32           rtr_solicit_interval;
 138        __s32           rtr_solicit_delay;
 139        __s32           force_mld_version;
 140#ifdef CONFIG_IPV6_PRIVACY
 141        __s32           use_tempaddr;
 142        __s32           temp_valid_lft;
 143        __s32           temp_prefered_lft;
 144        __s32           regen_max_retry;
 145        __s32           max_desync_factor;
 146#endif
 147        __s32           max_addresses;
 148        void            *sysctl;
 149};
 150
 151/* index values for the variables in ipv6_devconf */
 152enum {
 153        DEVCONF_FORWARDING = 0,
 154        DEVCONF_HOPLIMIT,
 155        DEVCONF_MTU6,
 156        DEVCONF_ACCEPT_RA,
 157        DEVCONF_ACCEPT_REDIRECTS,
 158        DEVCONF_AUTOCONF,
 159        DEVCONF_DAD_TRANSMITS,
 160        DEVCONF_RTR_SOLICITS,
 161        DEVCONF_RTR_SOLICIT_INTERVAL,
 162        DEVCONF_RTR_SOLICIT_DELAY,
 163        DEVCONF_USE_TEMPADDR,
 164        DEVCONF_TEMP_VALID_LFT,
 165        DEVCONF_TEMP_PREFERED_LFT,
 166        DEVCONF_REGEN_MAX_RETRY,
 167        DEVCONF_MAX_DESYNC_FACTOR,
 168        DEVCONF_MAX_ADDRESSES,
 169        DEVCONF_FORCE_MLD_VERSION,
 170        DEVCONF_MAX
 171};
 172
 173#ifdef __KERNEL__
 174#include <linux/in6.h>          /* struct sockaddr_in6 */
 175#include <linux/icmpv6.h>
 176#include <net/if_inet6.h>       /* struct ipv6_mc_socklist */
 177#include <linux/tcp.h>
 178#include <linux/udp.h>
 179
 180/* 
 181   This structure contains results of exthdrs parsing
 182   as offsets from skb->nh.
 183 */
 184
 185struct inet6_skb_parm
 186{
 187        int                     iif;
 188        __u16                   ra;
 189        __u16                   hop;
 190        __u16                   dst0;
 191        __u16                   srcrt;
 192        __u16                   dst1;
 193};
 194
 195#define IP6CB(skb)      ((struct inet6_skb_parm*)((skb)->cb))
 196
 197struct ipv6_pinfo {
 198        struct in6_addr         saddr;
 199        struct in6_addr         rcv_saddr;
 200        struct in6_addr         daddr;
 201        struct in6_addr         *daddr_cache;
 202
 203        __u32                   flow_label;
 204        __u32                   frag_size;
 205        int                     hop_limit;
 206        int                     mcast_hops;
 207        int                     mcast_oif;
 208
 209        /* pktoption flags */
 210        union {
 211                struct {
 212                        __u8    srcrt:2,
 213                                rxinfo:1,
 214                                rxhlim:1,
 215                                hopopts:1,
 216                                dstopts:1,
 217                                rxflow:1;
 218                } bits;
 219                __u8            all;
 220        } rxopt;
 221
 222        /* sockopt flags */
 223        __u8                    mc_loop:1,
 224                                recverr:1,
 225                                sndflow:1,
 226                                pmtudisc:2,
 227                                ipv6only:1;
 228
 229        struct ipv6_mc_socklist *ipv6_mc_list;
 230        struct ipv6_ac_socklist *ipv6_ac_list;
 231        struct ipv6_fl_socklist *ipv6_fl_list;
 232        __u32                   dst_cookie;
 233
 234        struct ipv6_txoptions   *opt;
 235        struct sk_buff          *pktoptions;
 236        struct {
 237                struct ipv6_txoptions *opt;
 238                struct rt6_info *rt;
 239                int hop_limit;
 240        } cork;
 241};
 242
 243struct raw6_opt {
 244        __u32                   checksum;       /* perform checksum */
 245        __u32                   offset;         /* checksum offset  */
 246
 247        struct icmp6_filter     filter;
 248};
 249
 250/* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */
 251struct raw6_sock {
 252        struct sock       sk;
 253        struct ipv6_pinfo *pinet6;
 254        struct inet_opt   inet;
 255        struct raw6_opt   raw6;
 256        struct ipv6_pinfo inet6;
 257};
 258
 259struct udp6_sock {
 260        struct sock       sk;
 261        struct ipv6_pinfo *pinet6;
 262        struct inet_opt   inet;
 263        struct udp_opt    udp;
 264        struct ipv6_pinfo inet6;
 265};
 266
 267struct tcp6_sock {
 268        struct sock       sk;
 269        struct ipv6_pinfo *pinet6;
 270        struct inet_opt   inet;
 271        struct tcp_opt    tcp;
 272        struct ipv6_pinfo inet6;
 273};
 274
 275static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
 276{
 277        return ((struct raw6_sock *)__sk)->pinet6;
 278}
 279
 280static inline struct raw6_opt * raw6_sk(const struct sock *__sk)
 281{
 282        return &((struct raw6_sock *)__sk)->raw6;
 283}
 284
 285#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
 286#define __ipv6_only_sock(sk)    (inet6_sk(sk)->ipv6only)
 287#define ipv6_only_sock(sk)      ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk))
 288#else
 289#define __ipv6_only_sock(sk)    0
 290#define ipv6_only_sock(sk)      0
 291#endif
 292
 293#endif
 294
 295#endif
 296
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.