linux/include/linux/ipv6.h
<<
>>
Prefs
   1#ifndef _IPV6_H
   2#define _IPV6_H
   3
   4#include <uapi/linux/ipv6.h>
   5
   6#define ipv6_optlen(p)  (((p)->hdrlen+1) << 3)
   7/*
   8 * This structure contains configuration options per IPv6 link.
   9 */
  10struct ipv6_devconf {
  11        __s32           forwarding;
  12        __s32           hop_limit;
  13        __s32           mtu6;
  14        __s32           accept_ra;
  15        __s32           accept_redirects;
  16        __s32           autoconf;
  17        __s32           dad_transmits;
  18        __s32           rtr_solicits;
  19        __s32           rtr_solicit_interval;
  20        __s32           rtr_solicit_delay;
  21        __s32           force_mld_version;
  22#ifdef CONFIG_IPV6_PRIVACY
  23        __s32           use_tempaddr;
  24        __s32           temp_valid_lft;
  25        __s32           temp_prefered_lft;
  26        __s32           regen_max_retry;
  27        __s32           max_desync_factor;
  28#endif
  29        __s32           max_addresses;
  30        __s32           accept_ra_defrtr;
  31        __s32           accept_ra_pinfo;
  32#ifdef CONFIG_IPV6_ROUTER_PREF
  33        __s32           accept_ra_rtr_pref;
  34        __s32           rtr_probe_interval;
  35#ifdef CONFIG_IPV6_ROUTE_INFO
  36        __s32           accept_ra_rt_info_max_plen;
  37#endif
  38#endif
  39        __s32           proxy_ndp;
  40        __s32           accept_source_route;
  41#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
  42        __s32           optimistic_dad;
  43#endif
  44#ifdef CONFIG_IPV6_MROUTE
  45        __s32           mc_forwarding;
  46#endif
  47        __s32           disable_ipv6;
  48        __s32           accept_dad;
  49        __s32           force_tllao;
  50        void            *sysctl;
  51};
  52
  53struct ipv6_params {
  54        __s32 disable_ipv6;
  55        __s32 autoconf;
  56};
  57extern struct ipv6_params ipv6_defaults;
  58#include <linux/icmpv6.h>
  59#include <linux/tcp.h>
  60#include <linux/udp.h>
  61
  62#include <net/inet_sock.h>
  63
  64static inline struct ipv6hdr *ipv6_hdr(const struct sk_buff *skb)
  65{
  66        return (struct ipv6hdr *)skb_network_header(skb);
  67}
  68
  69static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb)
  70{
  71        return (struct ipv6hdr *)skb_transport_header(skb);
  72}
  73
  74static inline __u8 ipv6_tclass(const struct ipv6hdr *iph)
  75{
  76        return (ntohl(*(__be32 *)iph) >> 20) & 0xff;
  77}
  78
  79/* 
  80   This structure contains results of exthdrs parsing
  81   as offsets from skb->nh.
  82 */
  83
  84struct inet6_skb_parm {
  85        int                     iif;
  86        __u16                   ra;
  87        __u16                   hop;
  88        __u16                   dst0;
  89        __u16                   srcrt;
  90        __u16                   dst1;
  91        __u16                   lastopt;
  92        __u16                   nhoff;
  93        __u16                   flags;
  94#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
  95        __u16                   dsthao;
  96#endif
  97        __u16                   frag_max_size;
  98
  99#define IP6SKB_XFRM_TRANSFORMED 1
 100#define IP6SKB_FORWARDED        2
 101#define IP6SKB_REROUTED         4
 102};
 103
 104#define IP6CB(skb)      ((struct inet6_skb_parm*)((skb)->cb))
 105#define IP6CBMTU(skb)   ((struct ip6_mtuinfo *)((skb)->cb))
 106
 107static inline int inet6_iif(const struct sk_buff *skb)
 108{
 109        return IP6CB(skb)->iif;
 110}
 111
 112struct inet6_request_sock {
 113        struct in6_addr         loc_addr;
 114        struct in6_addr         rmt_addr;
 115        struct sk_buff          *pktopts;
 116        int                     iif;
 117};
 118
 119struct tcp6_request_sock {
 120        struct tcp_request_sock   tcp6rsk_tcp;
 121        struct inet6_request_sock tcp6rsk_inet6;
 122};
 123
 124struct ipv6_mc_socklist;
 125struct ipv6_ac_socklist;
 126struct ipv6_fl_socklist;
 127
 128/**
 129 * struct ipv6_pinfo - ipv6 private area
 130 *
 131 * In the struct sock hierarchy (tcp6_sock, upd6_sock, etc)
 132 * this _must_ be the last member, so that inet6_sk_generic
 133 * is able to calculate its offset from the base struct sock
 134 * by using the struct proto->slab_obj_size member. -acme
 135 */
 136struct ipv6_pinfo {
 137        struct in6_addr         saddr;
 138        struct in6_addr         rcv_saddr;
 139        struct in6_addr         daddr;
 140        struct in6_pktinfo      sticky_pktinfo;
 141        const struct in6_addr           *daddr_cache;
 142#ifdef CONFIG_IPV6_SUBTREES
 143        const struct in6_addr           *saddr_cache;
 144#endif
 145
 146        __be32                  flow_label;
 147        __u32                   frag_size;
 148
 149        /*
 150         * Packed in 16bits.
 151         * Omit one shift by by putting the signed field at MSB.
 152         */
 153#if defined(__BIG_ENDIAN_BITFIELD)
 154        __s16                   hop_limit:9;
 155        __u16                   __unused_1:7;
 156#else
 157        __u16                   __unused_1:7;
 158        __s16                   hop_limit:9;
 159#endif
 160
 161#if defined(__BIG_ENDIAN_BITFIELD)
 162        /* Packed in 16bits. */
 163        __s16                   mcast_hops:9;
 164        __u16                   __unused_2:6,
 165                                mc_loop:1;
 166#else
 167        __u16                   mc_loop:1,
 168                                __unused_2:6;
 169        __s16                   mcast_hops:9;
 170#endif
 171        int                     ucast_oif;
 172        int                     mcast_oif;
 173
 174        /* pktoption flags */
 175        union {
 176                struct {
 177                        __u16   srcrt:1,
 178                                osrcrt:1,
 179                                rxinfo:1,
 180                                rxoinfo:1,
 181                                rxhlim:1,
 182                                rxohlim:1,
 183                                hopopts:1,
 184                                ohopopts:1,
 185                                dstopts:1,
 186                                odstopts:1,
 187                                rxflow:1,
 188                                rxtclass:1,
 189                                rxpmtu:1,
 190                                rxorigdstaddr:1;
 191                                /* 2 bits hole */
 192                } bits;
 193                __u16           all;
 194        } rxopt;
 195
 196        /* sockopt flags */
 197        __u16                   recverr:1,
 198                                sndflow:1,
 199                                pmtudisc:2,
 200                                ipv6only:1,
 201                                srcprefs:3,     /* 001: prefer temporary address
 202                                                 * 010: prefer public address
 203                                                 * 100: prefer care-of address
 204                                                 */
 205                                dontfrag:1;
 206        __u8                    min_hopcount;
 207        __u8                    tclass;
 208        __u8                    rcv_tclass;
 209
 210        __u32                   dst_cookie;
 211        __u32                   rx_dst_cookie;
 212
 213        struct ipv6_mc_socklist __rcu *ipv6_mc_list;
 214        struct ipv6_ac_socklist *ipv6_ac_list;
 215        struct ipv6_fl_socklist *ipv6_fl_list;
 216
 217        struct ipv6_txoptions   *opt;
 218        struct sk_buff          *pktoptions;
 219        struct sk_buff          *rxpmtu;
 220        struct {
 221                struct ipv6_txoptions *opt;
 222                u8 hop_limit;
 223                u8 tclass;
 224        } cork;
 225};
 226
 227/* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */
 228struct raw6_sock {
 229        /* inet_sock has to be the first member of raw6_sock */
 230        struct inet_sock        inet;
 231        __u32                   checksum;       /* perform checksum */
 232        __u32                   offset;         /* checksum offset  */
 233        struct icmp6_filter     filter;
 234        __u32                   ip6mr_table;
 235        /* ipv6_pinfo has to be the last member of raw6_sock, see inet6_sk_generic */
 236        struct ipv6_pinfo       inet6;
 237};
 238
 239struct udp6_sock {
 240        struct udp_sock   udp;
 241        /* ipv6_pinfo has to be the last member of udp6_sock, see inet6_sk_generic */
 242        struct ipv6_pinfo inet6;
 243};
 244
 245struct tcp6_sock {
 246        struct tcp_sock   tcp;
 247        /* ipv6_pinfo has to be the last member of tcp6_sock, see inet6_sk_generic */
 248        struct ipv6_pinfo inet6;
 249};
 250
 251extern int inet6_sk_rebuild_header(struct sock *sk);
 252
 253struct inet6_timewait_sock {
 254        struct in6_addr tw_v6_daddr;
 255        struct in6_addr tw_v6_rcv_saddr;
 256};
 257
 258struct tcp6_timewait_sock {
 259        struct tcp_timewait_sock   tcp6tw_tcp;
 260        struct inet6_timewait_sock tcp6tw_inet6;
 261};
 262
 263static inline struct inet6_timewait_sock *inet6_twsk(const struct sock *sk)
 264{
 265        return (struct inet6_timewait_sock *)(((u8 *)sk) +
 266                                              inet_twsk(sk)->tw_ipv6_offset);
 267}
 268
 269#if IS_ENABLED(CONFIG_IPV6)
 270static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
 271{
 272        return inet_sk(__sk)->pinet6;
 273}
 274
 275static inline struct inet6_request_sock *
 276                        inet6_rsk(const struct request_sock *rsk)
 277{
 278        return (struct inet6_request_sock *)(((u8 *)rsk) +
 279                                             inet_rsk(rsk)->inet6_rsk_offset);
 280}
 281
 282static inline u32 inet6_rsk_offset(struct request_sock *rsk)
 283{
 284        return rsk->rsk_ops->obj_size - sizeof(struct inet6_request_sock);
 285}
 286
 287static inline struct request_sock *inet6_reqsk_alloc(struct request_sock_ops *ops)
 288{
 289        struct request_sock *req = reqsk_alloc(ops);
 290
 291        if (req != NULL) {
 292                inet_rsk(req)->inet6_rsk_offset = inet6_rsk_offset(req);
 293                inet6_rsk(req)->pktopts = NULL;
 294        }
 295
 296        return req;
 297}
 298
 299static inline struct raw6_sock *raw6_sk(const struct sock *sk)
 300{
 301        return (struct raw6_sock *)sk;
 302}
 303
 304static inline void inet_sk_copy_descendant(struct sock *sk_to,
 305                                           const struct sock *sk_from)
 306{
 307        int ancestor_size = sizeof(struct inet_sock);
 308
 309        if (sk_from->sk_family == PF_INET6)
 310                ancestor_size += sizeof(struct ipv6_pinfo);
 311
 312        __inet_sk_copy_descendant(sk_to, sk_from, ancestor_size);
 313}
 314
 315#define __ipv6_only_sock(sk)    (inet6_sk(sk)->ipv6only)
 316#define ipv6_only_sock(sk)      ((sk)->sk_family == PF_INET6 && __ipv6_only_sock(sk))
 317
 318static inline u16 inet6_tw_offset(const struct proto *prot)
 319{
 320        return prot->twsk_prot->twsk_obj_size -
 321                        sizeof(struct inet6_timewait_sock);
 322}
 323
 324static inline struct in6_addr *__inet6_rcv_saddr(const struct sock *sk)
 325{
 326        return likely(sk->sk_state != TCP_TIME_WAIT) ?
 327                &inet6_sk(sk)->rcv_saddr : &inet6_twsk(sk)->tw_v6_rcv_saddr;
 328}
 329
 330static inline struct in6_addr *inet6_rcv_saddr(const struct sock *sk)
 331{
 332        return sk->sk_family == AF_INET6 ? __inet6_rcv_saddr(sk) : NULL;
 333}
 334
 335static inline int inet_v6_ipv6only(const struct sock *sk)
 336{
 337        return likely(sk->sk_state != TCP_TIME_WAIT) ?
 338                ipv6_only_sock(sk) : inet_twsk(sk)->tw_ipv6only;
 339}
 340#else
 341#define __ipv6_only_sock(sk)    0
 342#define ipv6_only_sock(sk)      0
 343
 344static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk)
 345{
 346        return NULL;
 347}
 348
 349static inline struct inet6_request_sock *
 350                        inet6_rsk(const struct request_sock *rsk)
 351{
 352        return NULL;
 353}
 354
 355static inline struct raw6_sock *raw6_sk(const struct sock *sk)
 356{
 357        return NULL;
 358}
 359
 360#define __inet6_rcv_saddr(__sk) NULL
 361#define inet6_rcv_saddr(__sk)   NULL
 362#define tcp_twsk_ipv6only(__sk)         0
 363#define inet_v6_ipv6only(__sk)          0
 364#endif /* IS_ENABLED(CONFIG_IPV6) */
 365
 366#define INET6_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif)\
 367        (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)   && \
 368         ((*((__portpair *)&(inet_sk(__sk)->inet_dport))) == (__ports)) && \
 369         ((__sk)->sk_family             == AF_INET6)            && \
 370         ipv6_addr_equal(&inet6_sk(__sk)->daddr, (__saddr))     && \
 371         ipv6_addr_equal(&inet6_sk(__sk)->rcv_saddr, (__daddr)) && \
 372         (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
 373
 374#define INET6_TW_MATCH(__sk, __net, __hash, __saddr, __daddr, __ports, __dif) \
 375        (((__sk)->sk_hash == (__hash)) && sock_net((__sk)) == (__net)   && \
 376         (*((__portpair *)&(inet_twsk(__sk)->tw_dport)) == (__ports))   && \
 377         ((__sk)->sk_family            == PF_INET6)                     && \
 378         (ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_daddr, (__saddr)))   && \
 379         (ipv6_addr_equal(&inet6_twsk(__sk)->tw_v6_rcv_saddr, (__daddr))) && \
 380         (!((__sk)->sk_bound_dev_if) || ((__sk)->sk_bound_dev_if == (__dif))))
 381
 382#endif /* _IPV6_H */
 383
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.