LCOV - code coverage report
Current view: top level - include/net - ipv6.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 3 0.0 %
Date: 2023-04-06 08:38:28 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0-or-later */
       2             : /*
       3             :  *      Linux INET6 implementation
       4             :  *
       5             :  *      Authors:
       6             :  *      Pedro Roque             <roque@di.fc.ul.pt>
       7             :  */
       8             : 
       9             : #ifndef _NET_IPV6_H
      10             : #define _NET_IPV6_H
      11             : 
      12             : #include <linux/ipv6.h>
      13             : #include <linux/hardirq.h>
      14             : #include <linux/jhash.h>
      15             : #include <linux/refcount.h>
      16             : #include <linux/jump_label_ratelimit.h>
      17             : #include <net/if_inet6.h>
      18             : #include <net/flow.h>
      19             : #include <net/flow_dissector.h>
      20             : #include <net/inet_dscp.h>
      21             : #include <net/snmp.h>
      22             : #include <net/netns/hash.h>
      23             : 
      24             : struct ip_tunnel_info;
      25             : 
      26             : #define SIN6_LEN_RFC2133        24
      27             : 
      28             : #define IPV6_MAXPLEN            65535
      29             : 
      30             : /*
      31             :  *      NextHeader field of IPv6 header
      32             :  */
      33             : 
      34             : #define NEXTHDR_HOP             0       /* Hop-by-hop option header. */
      35             : #define NEXTHDR_IPV4            4       /* IPv4 in IPv6 */
      36             : #define NEXTHDR_TCP             6       /* TCP segment. */
      37             : #define NEXTHDR_UDP             17      /* UDP message. */
      38             : #define NEXTHDR_IPV6            41      /* IPv6 in IPv6 */
      39             : #define NEXTHDR_ROUTING         43      /* Routing header. */
      40             : #define NEXTHDR_FRAGMENT        44      /* Fragmentation/reassembly header. */
      41             : #define NEXTHDR_GRE             47      /* GRE header. */
      42             : #define NEXTHDR_ESP             50      /* Encapsulating security payload. */
      43             : #define NEXTHDR_AUTH            51      /* Authentication header. */
      44             : #define NEXTHDR_ICMP            58      /* ICMP for IPv6. */
      45             : #define NEXTHDR_NONE            59      /* No next header */
      46             : #define NEXTHDR_DEST            60      /* Destination options header. */
      47             : #define NEXTHDR_SCTP            132     /* SCTP message. */
      48             : #define NEXTHDR_MOBILITY        135     /* Mobility header. */
      49             : 
      50             : #define NEXTHDR_MAX             255
      51             : 
      52             : #define IPV6_DEFAULT_HOPLIMIT   64
      53             : #define IPV6_DEFAULT_MCASTHOPS  1
      54             : 
      55             : /* Limits on Hop-by-Hop and Destination options.
      56             :  *
      57             :  * Per RFC8200 there is no limit on the maximum number or lengths of options in
      58             :  * Hop-by-Hop or Destination options other then the packet must fit in an MTU.
      59             :  * We allow configurable limits in order to mitigate potential denial of
      60             :  * service attacks.
      61             :  *
      62             :  * There are three limits that may be set:
      63             :  *   - Limit the number of options in a Hop-by-Hop or Destination options
      64             :  *     extension header
      65             :  *   - Limit the byte length of a Hop-by-Hop or Destination options extension
      66             :  *     header
      67             :  *   - Disallow unknown options
      68             :  *
      69             :  * The limits are expressed in corresponding sysctls:
      70             :  *
      71             :  * ipv6.sysctl.max_dst_opts_cnt
      72             :  * ipv6.sysctl.max_hbh_opts_cnt
      73             :  * ipv6.sysctl.max_dst_opts_len
      74             :  * ipv6.sysctl.max_hbh_opts_len
      75             :  *
      76             :  * max_*_opts_cnt is the number of TLVs that are allowed for Destination
      77             :  * options or Hop-by-Hop options. If the number is less than zero then unknown
      78             :  * TLVs are disallowed and the number of known options that are allowed is the
      79             :  * absolute value. Setting the value to INT_MAX indicates no limit.
      80             :  *
      81             :  * max_*_opts_len is the length limit in bytes of a Destination or
      82             :  * Hop-by-Hop options extension header. Setting the value to INT_MAX
      83             :  * indicates no length limit.
      84             :  *
      85             :  * If a limit is exceeded when processing an extension header the packet is
      86             :  * silently discarded.
      87             :  */
      88             : 
      89             : /* Default limits for Hop-by-Hop and Destination options */
      90             : #define IP6_DEFAULT_MAX_DST_OPTS_CNT     8
      91             : #define IP6_DEFAULT_MAX_HBH_OPTS_CNT     8
      92             : #define IP6_DEFAULT_MAX_DST_OPTS_LEN     INT_MAX /* No limit */
      93             : #define IP6_DEFAULT_MAX_HBH_OPTS_LEN     INT_MAX /* No limit */
      94             : 
      95             : /*
      96             :  *      Addr type
      97             :  *      
      98             :  *      type    -       unicast | multicast
      99             :  *      scope   -       local   | site      | global
     100             :  *      v4      -       compat
     101             :  *      v4mapped
     102             :  *      any
     103             :  *      loopback
     104             :  */
     105             : 
     106             : #define IPV6_ADDR_ANY           0x0000U
     107             : 
     108             : #define IPV6_ADDR_UNICAST       0x0001U
     109             : #define IPV6_ADDR_MULTICAST     0x0002U
     110             : 
     111             : #define IPV6_ADDR_LOOPBACK      0x0010U
     112             : #define IPV6_ADDR_LINKLOCAL     0x0020U
     113             : #define IPV6_ADDR_SITELOCAL     0x0040U
     114             : 
     115             : #define IPV6_ADDR_COMPATv4      0x0080U
     116             : 
     117             : #define IPV6_ADDR_SCOPE_MASK    0x00f0U
     118             : 
     119             : #define IPV6_ADDR_MAPPED        0x1000U
     120             : 
     121             : /*
     122             :  *      Addr scopes
     123             :  */
     124             : #define IPV6_ADDR_MC_SCOPE(a)   \
     125             :         ((a)->s6_addr[1] & 0x0f) /* nonstandard */
     126             : #define __IPV6_ADDR_SCOPE_INVALID       -1
     127             : #define IPV6_ADDR_SCOPE_NODELOCAL       0x01
     128             : #define IPV6_ADDR_SCOPE_LINKLOCAL       0x02
     129             : #define IPV6_ADDR_SCOPE_SITELOCAL       0x05
     130             : #define IPV6_ADDR_SCOPE_ORGLOCAL        0x08
     131             : #define IPV6_ADDR_SCOPE_GLOBAL          0x0e
     132             : 
     133             : /*
     134             :  *      Addr flags
     135             :  */
     136             : #define IPV6_ADDR_MC_FLAG_TRANSIENT(a)  \
     137             :         ((a)->s6_addr[1] & 0x10)
     138             : #define IPV6_ADDR_MC_FLAG_PREFIX(a)     \
     139             :         ((a)->s6_addr[1] & 0x20)
     140             : #define IPV6_ADDR_MC_FLAG_RENDEZVOUS(a) \
     141             :         ((a)->s6_addr[1] & 0x40)
     142             : 
     143             : /*
     144             :  *      fragmentation header
     145             :  */
     146             : 
     147             : struct frag_hdr {
     148             :         __u8    nexthdr;
     149             :         __u8    reserved;
     150             :         __be16  frag_off;
     151             :         __be32  identification;
     152             : };
     153             : 
     154             : /*
     155             :  * Jumbo payload option, as described in RFC 2675 2.
     156             :  */
     157             : struct hop_jumbo_hdr {
     158             :         u8      nexthdr;
     159             :         u8      hdrlen;
     160             :         u8      tlv_type;       /* IPV6_TLV_JUMBO, 0xC2 */
     161             :         u8      tlv_len;        /* 4 */
     162             :         __be32  jumbo_payload_len;
     163             : };
     164             : 
     165             : #define IP6_MF          0x0001
     166             : #define IP6_OFFSET      0xFFF8
     167             : 
     168             : struct ip6_fraglist_iter {
     169             :         struct ipv6hdr  *tmp_hdr;
     170             :         struct sk_buff  *frag;
     171             :         int             offset;
     172             :         unsigned int    hlen;
     173             :         __be32          frag_id;
     174             :         u8              nexthdr;
     175             : };
     176             : 
     177             : int ip6_fraglist_init(struct sk_buff *skb, unsigned int hlen, u8 *prevhdr,
     178             :                       u8 nexthdr, __be32 frag_id,
     179             :                       struct ip6_fraglist_iter *iter);
     180             : void ip6_fraglist_prepare(struct sk_buff *skb, struct ip6_fraglist_iter *iter);
     181             : 
     182             : static inline struct sk_buff *ip6_fraglist_next(struct ip6_fraglist_iter *iter)
     183             : {
     184             :         struct sk_buff *skb = iter->frag;
     185             : 
     186             :         iter->frag = skb->next;
     187             :         skb_mark_not_on_list(skb);
     188             : 
     189             :         return skb;
     190             : }
     191             : 
     192             : struct ip6_frag_state {
     193             :         u8              *prevhdr;
     194             :         unsigned int    hlen;
     195             :         unsigned int    mtu;
     196             :         unsigned int    left;
     197             :         int             offset;
     198             :         int             ptr;
     199             :         int             hroom;
     200             :         int             troom;
     201             :         __be32          frag_id;
     202             :         u8              nexthdr;
     203             : };
     204             : 
     205             : void ip6_frag_init(struct sk_buff *skb, unsigned int hlen, unsigned int mtu,
     206             :                    unsigned short needed_tailroom, int hdr_room, u8 *prevhdr,
     207             :                    u8 nexthdr, __be32 frag_id, struct ip6_frag_state *state);
     208             : struct sk_buff *ip6_frag_next(struct sk_buff *skb,
     209             :                               struct ip6_frag_state *state);
     210             : 
     211             : #define IP6_REPLY_MARK(net, mark) \
     212             :         ((net)->ipv6.sysctl.fwmark_reflect ? (mark) : 0)
     213             : 
     214             : #include <net/sock.h>
     215             : 
     216             : /* sysctls */
     217             : extern int sysctl_mld_max_msf;
     218             : extern int sysctl_mld_qrv;
     219             : 
     220             : #define _DEVINC(net, statname, mod, idev, field)                        \
     221             : ({                                                                      \
     222             :         struct inet6_dev *_idev = (idev);                               \
     223             :         if (likely(_idev != NULL))                                      \
     224             :                 mod##SNMP_INC_STATS64((_idev)->stats.statname, (field));\
     225             :         mod##SNMP_INC_STATS64((net)->mib.statname##_statistics, (field));\
     226             : })
     227             : 
     228             : /* per device counters are atomic_long_t */
     229             : #define _DEVINCATOMIC(net, statname, mod, idev, field)                  \
     230             : ({                                                                      \
     231             :         struct inet6_dev *_idev = (idev);                               \
     232             :         if (likely(_idev != NULL))                                      \
     233             :                 SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
     234             :         mod##SNMP_INC_STATS((net)->mib.statname##_statistics, (field));\
     235             : })
     236             : 
     237             : /* per device and per net counters are atomic_long_t */
     238             : #define _DEVINC_ATOMIC_ATOMIC(net, statname, idev, field)               \
     239             : ({                                                                      \
     240             :         struct inet6_dev *_idev = (idev);                               \
     241             :         if (likely(_idev != NULL))                                      \
     242             :                 SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
     243             :         SNMP_INC_STATS_ATOMIC_LONG((net)->mib.statname##_statistics, (field));\
     244             : })
     245             : 
     246             : #define _DEVADD(net, statname, mod, idev, field, val)                   \
     247             : ({                                                                      \
     248             :         struct inet6_dev *_idev = (idev);                               \
     249             :         if (likely(_idev != NULL))                                      \
     250             :                 mod##SNMP_ADD_STATS((_idev)->stats.statname, (field), (val)); \
     251             :         mod##SNMP_ADD_STATS((net)->mib.statname##_statistics, (field), (val));\
     252             : })
     253             : 
     254             : #define _DEVUPD(net, statname, mod, idev, field, val)                   \
     255             : ({                                                                      \
     256             :         struct inet6_dev *_idev = (idev);                               \
     257             :         if (likely(_idev != NULL))                                      \
     258             :                 mod##SNMP_UPD_PO_STATS((_idev)->stats.statname, field, (val)); \
     259             :         mod##SNMP_UPD_PO_STATS((net)->mib.statname##_statistics, field, (val));\
     260             : })
     261             : 
     262             : /* MIBs */
     263             : 
     264             : #define IP6_INC_STATS(net, idev,field)          \
     265             :                 _DEVINC(net, ipv6, , idev, field)
     266             : #define __IP6_INC_STATS(net, idev,field)        \
     267             :                 _DEVINC(net, ipv6, __, idev, field)
     268             : #define IP6_ADD_STATS(net, idev,field,val)      \
     269             :                 _DEVADD(net, ipv6, , idev, field, val)
     270             : #define __IP6_ADD_STATS(net, idev,field,val)    \
     271             :                 _DEVADD(net, ipv6, __, idev, field, val)
     272             : #define IP6_UPD_PO_STATS(net, idev,field,val)   \
     273             :                 _DEVUPD(net, ipv6, , idev, field, val)
     274             : #define __IP6_UPD_PO_STATS(net, idev,field,val)   \
     275             :                 _DEVUPD(net, ipv6, __, idev, field, val)
     276             : #define ICMP6_INC_STATS(net, idev, field)       \
     277             :                 _DEVINCATOMIC(net, icmpv6, , idev, field)
     278             : #define __ICMP6_INC_STATS(net, idev, field)     \
     279             :                 _DEVINCATOMIC(net, icmpv6, __, idev, field)
     280             : 
     281             : #define ICMP6MSGOUT_INC_STATS(net, idev, field)         \
     282             :         _DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field +256)
     283             : #define ICMP6MSGIN_INC_STATS(net, idev, field)  \
     284             :         _DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field)
     285             : 
     286             : struct ip6_ra_chain {
     287             :         struct ip6_ra_chain     *next;
     288             :         struct sock             *sk;
     289             :         int                     sel;
     290             :         void                    (*destructor)(struct sock *);
     291             : };
     292             : 
     293             : extern struct ip6_ra_chain      *ip6_ra_chain;
     294             : extern rwlock_t ip6_ra_lock;
     295             : 
     296             : /*
     297             :    This structure is prepared by protocol, when parsing
     298             :    ancillary data and passed to IPv6.
     299             :  */
     300             : 
     301             : struct ipv6_txoptions {
     302             :         refcount_t              refcnt;
     303             :         /* Length of this structure */
     304             :         int                     tot_len;
     305             : 
     306             :         /* length of extension headers   */
     307             : 
     308             :         __u16                   opt_flen;       /* after fragment hdr */
     309             :         __u16                   opt_nflen;      /* before fragment hdr */
     310             : 
     311             :         struct ipv6_opt_hdr     *hopopt;
     312             :         struct ipv6_opt_hdr     *dst0opt;
     313             :         struct ipv6_rt_hdr      *srcrt; /* Routing Header */
     314             :         struct ipv6_opt_hdr     *dst1opt;
     315             :         struct rcu_head         rcu;
     316             :         /* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */
     317             : };
     318             : 
     319             : /* flowlabel_reflect sysctl values */
     320             : enum flowlabel_reflect {
     321             :         FLOWLABEL_REFLECT_ESTABLISHED           = 1,
     322             :         FLOWLABEL_REFLECT_TCP_RESET             = 2,
     323             :         FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES   = 4,
     324             : };
     325             : 
     326             : struct ip6_flowlabel {
     327             :         struct ip6_flowlabel __rcu *next;
     328             :         __be32                  label;
     329             :         atomic_t                users;
     330             :         struct in6_addr         dst;
     331             :         struct ipv6_txoptions   *opt;
     332             :         unsigned long           linger;
     333             :         struct rcu_head         rcu;
     334             :         u8                      share;
     335             :         union {
     336             :                 struct pid *pid;
     337             :                 kuid_t uid;
     338             :         } owner;
     339             :         unsigned long           lastuse;
     340             :         unsigned long           expires;
     341             :         struct net              *fl_net;
     342             : };
     343             : 
     344             : #define IPV6_FLOWINFO_MASK              cpu_to_be32(0x0FFFFFFF)
     345             : #define IPV6_FLOWLABEL_MASK             cpu_to_be32(0x000FFFFF)
     346             : #define IPV6_FLOWLABEL_STATELESS_FLAG   cpu_to_be32(0x00080000)
     347             : 
     348             : #define IPV6_TCLASS_MASK (IPV6_FLOWINFO_MASK & ~IPV6_FLOWLABEL_MASK)
     349             : #define IPV6_TCLASS_SHIFT       20
     350             : 
     351             : struct ipv6_fl_socklist {
     352             :         struct ipv6_fl_socklist __rcu   *next;
     353             :         struct ip6_flowlabel            *fl;
     354             :         struct rcu_head                 rcu;
     355             : };
     356             : 
     357             : struct ipcm6_cookie {
     358             :         struct sockcm_cookie sockc;
     359             :         __s16 hlimit;
     360             :         __s16 tclass;
     361             :         __u16 gso_size;
     362             :         __s8  dontfrag;
     363             :         struct ipv6_txoptions *opt;
     364             : };
     365             : 
     366             : static inline void ipcm6_init(struct ipcm6_cookie *ipc6)
     367             : {
     368             :         *ipc6 = (struct ipcm6_cookie) {
     369             :                 .hlimit = -1,
     370             :                 .tclass = -1,
     371             :                 .dontfrag = -1,
     372             :         };
     373             : }
     374             : 
     375             : static inline void ipcm6_init_sk(struct ipcm6_cookie *ipc6,
     376             :                                  const struct ipv6_pinfo *np)
     377             : {
     378             :         *ipc6 = (struct ipcm6_cookie) {
     379             :                 .hlimit = -1,
     380             :                 .tclass = np->tclass,
     381             :                 .dontfrag = np->dontfrag,
     382             :         };
     383             : }
     384             : 
     385             : static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np)
     386             : {
     387             :         struct ipv6_txoptions *opt;
     388             : 
     389             :         rcu_read_lock();
     390             :         opt = rcu_dereference(np->opt);
     391             :         if (opt) {
     392             :                 if (!refcount_inc_not_zero(&opt->refcnt))
     393             :                         opt = NULL;
     394             :                 else
     395             :                         opt = rcu_pointer_handoff(opt);
     396             :         }
     397             :         rcu_read_unlock();
     398             :         return opt;
     399             : }
     400             : 
     401             : static inline void txopt_put(struct ipv6_txoptions *opt)
     402             : {
     403             :         if (opt && refcount_dec_and_test(&opt->refcnt))
     404             :                 kfree_rcu(opt, rcu);
     405             : }
     406             : 
     407             : #if IS_ENABLED(CONFIG_IPV6)
     408             : struct ip6_flowlabel *__fl6_sock_lookup(struct sock *sk, __be32 label);
     409             : 
     410             : extern struct static_key_false_deferred ipv6_flowlabel_exclusive;
     411             : static inline struct ip6_flowlabel *fl6_sock_lookup(struct sock *sk,
     412             :                                                     __be32 label)
     413             : {
     414             :         if (static_branch_unlikely(&ipv6_flowlabel_exclusive.key) &&
     415             :             READ_ONCE(sock_net(sk)->ipv6.flowlabel_has_excl))
     416             :                 return __fl6_sock_lookup(sk, label) ? : ERR_PTR(-ENOENT);
     417             : 
     418             :         return NULL;
     419             : }
     420             : #endif
     421             : 
     422             : struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions *opt_space,
     423             :                                          struct ip6_flowlabel *fl,
     424             :                                          struct ipv6_txoptions *fopt);
     425             : void fl6_free_socklist(struct sock *sk);
     426             : int ipv6_flowlabel_opt(struct sock *sk, sockptr_t optval, int optlen);
     427             : int ipv6_flowlabel_opt_get(struct sock *sk, struct in6_flowlabel_req *freq,
     428             :                            int flags);
     429             : int ip6_flowlabel_init(void);
     430             : void ip6_flowlabel_cleanup(void);
     431             : bool ip6_autoflowlabel(struct net *net, const struct ipv6_pinfo *np);
     432             : 
     433             : static inline void fl6_sock_release(struct ip6_flowlabel *fl)
     434             : {
     435             :         if (fl)
     436             :                 atomic_dec(&fl->users);
     437             : }
     438             : 
     439             : enum skb_drop_reason icmpv6_notify(struct sk_buff *skb, u8 type,
     440             :                                    u8 code, __be32 info);
     441             : 
     442             : void icmpv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
     443             :                                 struct icmp6hdr *thdr, int len);
     444             : 
     445             : int ip6_ra_control(struct sock *sk, int sel);
     446             : 
     447             : int ipv6_parse_hopopts(struct sk_buff *skb);
     448             : 
     449             : struct ipv6_txoptions *ipv6_dup_options(struct sock *sk,
     450             :                                         struct ipv6_txoptions *opt);
     451             : struct ipv6_txoptions *ipv6_renew_options(struct sock *sk,
     452             :                                           struct ipv6_txoptions *opt,
     453             :                                           int newtype,
     454             :                                           struct ipv6_opt_hdr *newopt);
     455             : struct ipv6_txoptions *__ipv6_fixup_options(struct ipv6_txoptions *opt_space,
     456             :                                             struct ipv6_txoptions *opt);
     457             : 
     458             : static inline struct ipv6_txoptions *
     459             : ipv6_fixup_options(struct ipv6_txoptions *opt_space, struct ipv6_txoptions *opt)
     460             : {
     461             :         if (!opt)
     462             :                 return NULL;
     463             :         return __ipv6_fixup_options(opt_space, opt);
     464             : }
     465             : 
     466             : bool ipv6_opt_accepted(const struct sock *sk, const struct sk_buff *skb,
     467             :                        const struct inet6_skb_parm *opt);
     468             : struct ipv6_txoptions *ipv6_update_options(struct sock *sk,
     469             :                                            struct ipv6_txoptions *opt);
     470             : 
     471             : /* This helper is specialized for BIG TCP needs.
     472             :  * It assumes the hop_jumbo_hdr will immediately follow the IPV6 header.
     473             :  * It assumes headers are already in skb->head.
     474             :  * Returns 0, or IPPROTO_TCP if a BIG TCP packet is there.
     475             :  */
     476             : static inline int ipv6_has_hopopt_jumbo(const struct sk_buff *skb)
     477             : {
     478             :         const struct hop_jumbo_hdr *jhdr;
     479             :         const struct ipv6hdr *nhdr;
     480             : 
     481             :         if (likely(skb->len <= GRO_LEGACY_MAX_SIZE))
     482             :                 return 0;
     483             : 
     484             :         if (skb->protocol != htons(ETH_P_IPV6))
     485             :                 return 0;
     486             : 
     487             :         if (skb_network_offset(skb) +
     488             :             sizeof(struct ipv6hdr) +
     489             :             sizeof(struct hop_jumbo_hdr) > skb_headlen(skb))
     490             :                 return 0;
     491             : 
     492             :         nhdr = ipv6_hdr(skb);
     493             : 
     494             :         if (nhdr->nexthdr != NEXTHDR_HOP)
     495             :                 return 0;
     496             : 
     497             :         jhdr = (const struct hop_jumbo_hdr *) (nhdr + 1);
     498             :         if (jhdr->tlv_type != IPV6_TLV_JUMBO || jhdr->hdrlen != 0 ||
     499             :             jhdr->nexthdr != IPPROTO_TCP)
     500             :                 return 0;
     501             :         return jhdr->nexthdr;
     502             : }
     503             : 
     504             : /* Return 0 if HBH header is successfully removed
     505             :  * Or if HBH removal is unnecessary (packet is not big TCP)
     506             :  * Return error to indicate dropping the packet
     507             :  */
     508             : static inline int ipv6_hopopt_jumbo_remove(struct sk_buff *skb)
     509             : {
     510             :         const int hophdr_len = sizeof(struct hop_jumbo_hdr);
     511             :         int nexthdr = ipv6_has_hopopt_jumbo(skb);
     512             :         struct ipv6hdr *h6;
     513             : 
     514             :         if (!nexthdr)
     515             :                 return 0;
     516             : 
     517             :         if (skb_cow_head(skb, 0))
     518             :                 return -1;
     519             : 
     520             :         /* Remove the HBH header.
     521             :          * Layout: [Ethernet header][IPv6 header][HBH][L4 Header]
     522             :          */
     523             :         memmove(skb_mac_header(skb) + hophdr_len, skb_mac_header(skb),
     524             :                 skb_network_header(skb) - skb_mac_header(skb) +
     525             :                 sizeof(struct ipv6hdr));
     526             : 
     527             :         __skb_pull(skb, hophdr_len);
     528             :         skb->network_header += hophdr_len;
     529             :         skb->mac_header += hophdr_len;
     530             : 
     531             :         h6 = ipv6_hdr(skb);
     532             :         h6->nexthdr = nexthdr;
     533             : 
     534             :         return 0;
     535             : }
     536             : 
     537             : static inline bool ipv6_accept_ra(struct inet6_dev *idev)
     538             : {
     539             :         /* If forwarding is enabled, RA are not accepted unless the special
     540             :          * hybrid mode (accept_ra=2) is enabled.
     541             :          */
     542             :         return idev->cnf.forwarding ? idev->cnf.accept_ra == 2 :
     543             :             idev->cnf.accept_ra;
     544             : }
     545             : 
     546             : #define IPV6_FRAG_HIGH_THRESH   (4 * 1024*1024) /* 4194304 */
     547             : #define IPV6_FRAG_LOW_THRESH    (3 * 1024*1024) /* 3145728 */
     548             : #define IPV6_FRAG_TIMEOUT       (60 * HZ)       /* 60 seconds */
     549             : 
     550             : int __ipv6_addr_type(const struct in6_addr *addr);
     551             : static inline int ipv6_addr_type(const struct in6_addr *addr)
     552             : {
     553             :         return __ipv6_addr_type(addr) & 0xffff;
     554             : }
     555             : 
     556             : static inline int ipv6_addr_scope(const struct in6_addr *addr)
     557             : {
     558             :         return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK;
     559             : }
     560             : 
     561             : static inline int __ipv6_addr_src_scope(int type)
     562             : {
     563             :         return (type == IPV6_ADDR_ANY) ? __IPV6_ADDR_SCOPE_INVALID : (type >> 16);
     564             : }
     565             : 
     566             : static inline int ipv6_addr_src_scope(const struct in6_addr *addr)
     567             : {
     568             :         return __ipv6_addr_src_scope(__ipv6_addr_type(addr));
     569             : }
     570             : 
     571             : static inline bool __ipv6_addr_needs_scope_id(int type)
     572             : {
     573             :         return type & IPV6_ADDR_LINKLOCAL ||
     574             :                (type & IPV6_ADDR_MULTICAST &&
     575             :                 (type & (IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL)));
     576             : }
     577             : 
     578             : static inline __u32 ipv6_iface_scope_id(const struct in6_addr *addr, int iface)
     579             : {
     580             :         return __ipv6_addr_needs_scope_id(__ipv6_addr_type(addr)) ? iface : 0;
     581             : }
     582             : 
     583             : static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2)
     584             : {
     585             :         return memcmp(a1, a2, sizeof(struct in6_addr));
     586             : }
     587             : 
     588             : static inline bool
     589             : ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m,
     590             :                      const struct in6_addr *a2)
     591             : {
     592             : #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
     593             :         const unsigned long *ul1 = (const unsigned long *)a1;
     594             :         const unsigned long *ulm = (const unsigned long *)m;
     595             :         const unsigned long *ul2 = (const unsigned long *)a2;
     596             : 
     597             :         return !!(((ul1[0] ^ ul2[0]) & ulm[0]) |
     598             :                   ((ul1[1] ^ ul2[1]) & ulm[1]));
     599             : #else
     600             :         return !!(((a1->s6_addr32[0] ^ a2->s6_addr32[0]) & m->s6_addr32[0]) |
     601             :                   ((a1->s6_addr32[1] ^ a2->s6_addr32[1]) & m->s6_addr32[1]) |
     602             :                   ((a1->s6_addr32[2] ^ a2->s6_addr32[2]) & m->s6_addr32[2]) |
     603             :                   ((a1->s6_addr32[3] ^ a2->s6_addr32[3]) & m->s6_addr32[3]));
     604             : #endif
     605             : }
     606             : 
     607             : static inline void ipv6_addr_prefix(struct in6_addr *pfx,
     608             :                                     const struct in6_addr *addr,
     609             :                                     int plen)
     610             : {
     611             :         /* caller must guarantee 0 <= plen <= 128 */
     612             :         int o = plen >> 3,
     613             :             b = plen & 0x7;
     614             : 
     615             :         memset(pfx->s6_addr, 0, sizeof(pfx->s6_addr));
     616             :         memcpy(pfx->s6_addr, addr, o);
     617             :         if (b != 0)
     618             :                 pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b);
     619             : }
     620             : 
     621             : static inline void ipv6_addr_prefix_copy(struct in6_addr *addr,
     622             :                                          const struct in6_addr *pfx,
     623             :                                          int plen)
     624             : {
     625             :         /* caller must guarantee 0 <= plen <= 128 */
     626             :         int o = plen >> 3,
     627             :             b = plen & 0x7;
     628             : 
     629             :         memcpy(addr->s6_addr, pfx, o);
     630             :         if (b != 0) {
     631             :                 addr->s6_addr[o] &= ~(0xff00 >> b);
     632             :                 addr->s6_addr[o] |= (pfx->s6_addr[o] & (0xff00 >> b));
     633             :         }
     634             : }
     635             : 
     636             : static inline void __ipv6_addr_set_half(__be32 *addr,
     637             :                                         __be32 wh, __be32 wl)
     638             : {
     639             : #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
     640             : #if defined(__BIG_ENDIAN)
     641             :         if (__builtin_constant_p(wh) && __builtin_constant_p(wl)) {
     642             :                 *(__force u64 *)addr = ((__force u64)(wh) << 32 | (__force u64)(wl));
     643             :                 return;
     644             :         }
     645             : #elif defined(__LITTLE_ENDIAN)
     646             :         if (__builtin_constant_p(wl) && __builtin_constant_p(wh)) {
     647             :                 *(__force u64 *)addr = ((__force u64)(wl) << 32 | (__force u64)(wh));
     648             :                 return;
     649             :         }
     650             : #endif
     651             : #endif
     652             :         addr[0] = wh;
     653             :         addr[1] = wl;
     654             : }
     655             : 
     656             : static inline void ipv6_addr_set(struct in6_addr *addr,
     657             :                                      __be32 w1, __be32 w2,
     658             :                                      __be32 w3, __be32 w4)
     659             : {
     660             :         __ipv6_addr_set_half(&addr->s6_addr32[0], w1, w2);
     661             :         __ipv6_addr_set_half(&addr->s6_addr32[2], w3, w4);
     662             : }
     663             : 
     664             : static inline bool ipv6_addr_equal(const struct in6_addr *a1,
     665             :                                    const struct in6_addr *a2)
     666             : {
     667             : #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
     668             :         const unsigned long *ul1 = (const unsigned long *)a1;
     669             :         const unsigned long *ul2 = (const unsigned long *)a2;
     670             : 
     671             :         return ((ul1[0] ^ ul2[0]) | (ul1[1] ^ ul2[1])) == 0UL;
     672             : #else
     673             :         return ((a1->s6_addr32[0] ^ a2->s6_addr32[0]) |
     674             :                 (a1->s6_addr32[1] ^ a2->s6_addr32[1]) |
     675             :                 (a1->s6_addr32[2] ^ a2->s6_addr32[2]) |
     676             :                 (a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0;
     677             : #endif
     678             : }
     679             : 
     680             : #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
     681             : static inline bool __ipv6_prefix_equal64_half(const __be64 *a1,
     682             :                                               const __be64 *a2,
     683             :                                               unsigned int len)
     684             : {
     685             :         if (len && ((*a1 ^ *a2) & cpu_to_be64((~0UL) << (64 - len))))
     686             :                 return false;
     687             :         return true;
     688             : }
     689             : 
     690             : static inline bool ipv6_prefix_equal(const struct in6_addr *addr1,
     691             :                                      const struct in6_addr *addr2,
     692             :                                      unsigned int prefixlen)
     693             : {
     694             :         const __be64 *a1 = (const __be64 *)addr1;
     695             :         const __be64 *a2 = (const __be64 *)addr2;
     696             : 
     697             :         if (prefixlen >= 64) {
     698             :                 if (a1[0] ^ a2[0])
     699             :                         return false;
     700             :                 return __ipv6_prefix_equal64_half(a1 + 1, a2 + 1, prefixlen - 64);
     701             :         }
     702             :         return __ipv6_prefix_equal64_half(a1, a2, prefixlen);
     703             : }
     704             : #else
     705             : static inline bool ipv6_prefix_equal(const struct in6_addr *addr1,
     706             :                                      const struct in6_addr *addr2,
     707             :                                      unsigned int prefixlen)
     708             : {
     709             :         const __be32 *a1 = addr1->s6_addr32;
     710             :         const __be32 *a2 = addr2->s6_addr32;
     711             :         unsigned int pdw, pbi;
     712             : 
     713             :         /* check complete u32 in prefix */
     714             :         pdw = prefixlen >> 5;
     715             :         if (pdw && memcmp(a1, a2, pdw << 2))
     716             :                 return false;
     717             : 
     718             :         /* check incomplete u32 in prefix */
     719             :         pbi = prefixlen & 0x1f;
     720             :         if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi))))
     721             :                 return false;
     722             : 
     723             :         return true;
     724             : }
     725             : #endif
     726             : 
     727             : static inline bool ipv6_addr_any(const struct in6_addr *a)
     728             : {
     729             : #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
     730             :         const unsigned long *ul = (const unsigned long *)a;
     731             : 
     732             :         return (ul[0] | ul[1]) == 0UL;
     733             : #else
     734             :         return (a->s6_addr32[0] | a->s6_addr32[1] |
     735             :                 a->s6_addr32[2] | a->s6_addr32[3]) == 0;
     736             : #endif
     737             : }
     738             : 
     739             : static inline u32 ipv6_addr_hash(const struct in6_addr *a)
     740             : {
     741             : #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
     742             :         const unsigned long *ul = (const unsigned long *)a;
     743             :         unsigned long x = ul[0] ^ ul[1];
     744             : 
     745             :         return (u32)(x ^ (x >> 32));
     746             : #else
     747             :         return (__force u32)(a->s6_addr32[0] ^ a->s6_addr32[1] ^
     748             :                              a->s6_addr32[2] ^ a->s6_addr32[3]);
     749             : #endif
     750             : }
     751             : 
     752             : /* more secured version of ipv6_addr_hash() */
     753             : static inline u32 __ipv6_addr_jhash(const struct in6_addr *a, const u32 initval)
     754             : {
     755             :         u32 v = (__force u32)a->s6_addr32[0] ^ (__force u32)a->s6_addr32[1];
     756             : 
     757             :         return jhash_3words(v,
     758             :                             (__force u32)a->s6_addr32[2],
     759             :                             (__force u32)a->s6_addr32[3],
     760             :                             initval);
     761             : }
     762             : 
     763             : static inline bool ipv6_addr_loopback(const struct in6_addr *a)
     764             : {
     765             : #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
     766             :         const __be64 *be = (const __be64 *)a;
     767             : 
     768             :         return (be[0] | (be[1] ^ cpu_to_be64(1))) == 0UL;
     769             : #else
     770             :         return (a->s6_addr32[0] | a->s6_addr32[1] |
     771             :                 a->s6_addr32[2] | (a->s6_addr32[3] ^ cpu_to_be32(1))) == 0;
     772             : #endif
     773             : }
     774             : 
     775             : /*
     776             :  * Note that we must __force cast these to unsigned long to make sparse happy,
     777             :  * since all of the endian-annotated types are fixed size regardless of arch.
     778             :  */
     779             : static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
     780             : {
     781             :         return (
     782             : #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
     783             :                 *(unsigned long *)a |
     784             : #else
     785           0 :                 (__force unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) |
     786             : #endif
     787           0 :                 (__force unsigned long)(a->s6_addr32[2] ^
     788           0 :                                         cpu_to_be32(0x0000ffff))) == 0UL;
     789             : }
     790             : 
     791             : static inline bool ipv6_addr_v4mapped_loopback(const struct in6_addr *a)
     792             : {
     793             :         return ipv6_addr_v4mapped(a) && ipv4_is_loopback(a->s6_addr32[3]);
     794             : }
     795             : 
     796             : static inline u32 ipv6_portaddr_hash(const struct net *net,
     797             :                                      const struct in6_addr *addr6,
     798             :                                      unsigned int port)
     799             : {
     800             :         unsigned int hash, mix = net_hash_mix(net);
     801             : 
     802             :         if (ipv6_addr_any(addr6))
     803             :                 hash = jhash_1word(0, mix);
     804             :         else if (ipv6_addr_v4mapped(addr6))
     805             :                 hash = jhash_1word((__force u32)addr6->s6_addr32[3], mix);
     806             :         else
     807             :                 hash = jhash2((__force u32 *)addr6->s6_addr32, 4, mix);
     808             : 
     809             :         return hash ^ port;
     810             : }
     811             : 
     812             : /*
     813             :  * Check for a RFC 4843 ORCHID address
     814             :  * (Overlay Routable Cryptographic Hash Identifiers)
     815             :  */
     816             : static inline bool ipv6_addr_orchid(const struct in6_addr *a)
     817             : {
     818             :         return (a->s6_addr32[0] & htonl(0xfffffff0)) == htonl(0x20010010);
     819             : }
     820             : 
     821             : static inline bool ipv6_addr_is_multicast(const struct in6_addr *addr)
     822             : {
     823             :         return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000);
     824             : }
     825             : 
     826             : static inline void ipv6_addr_set_v4mapped(const __be32 addr,
     827             :                                           struct in6_addr *v4mapped)
     828             : {
     829             :         ipv6_addr_set(v4mapped,
     830             :                         0, 0,
     831             :                         htonl(0x0000FFFF),
     832             :                         addr);
     833             : }
     834             : 
     835             : /*
     836             :  * find the first different bit between two addresses
     837             :  * length of address must be a multiple of 32bits
     838             :  */
     839             : static inline int __ipv6_addr_diff32(const void *token1, const void *token2, int addrlen)
     840             : {
     841             :         const __be32 *a1 = token1, *a2 = token2;
     842             :         int i;
     843             : 
     844             :         addrlen >>= 2;
     845             : 
     846             :         for (i = 0; i < addrlen; i++) {
     847             :                 __be32 xb = a1[i] ^ a2[i];
     848             :                 if (xb)
     849             :                         return i * 32 + 31 - __fls(ntohl(xb));
     850             :         }
     851             : 
     852             :         /*
     853             :          *      we should *never* get to this point since that
     854             :          *      would mean the addrs are equal
     855             :          *
     856             :          *      However, we do get to it 8) And exacly, when
     857             :          *      addresses are equal 8)
     858             :          *
     859             :          *      ip route add 1111::/128 via ...
     860             :          *      ip route add 1111::/64 via ...
     861             :          *      and we are here.
     862             :          *
     863             :          *      Ideally, this function should stop comparison
     864             :          *      at prefix length. It does not, but it is still OK,
     865             :          *      if returned value is greater than prefix length.
     866             :          *                                      --ANK (980803)
     867             :          */
     868             :         return addrlen << 5;
     869             : }
     870             : 
     871             : #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
     872             : static inline int __ipv6_addr_diff64(const void *token1, const void *token2, int addrlen)
     873             : {
     874             :         const __be64 *a1 = token1, *a2 = token2;
     875             :         int i;
     876             : 
     877             :         addrlen >>= 3;
     878             : 
     879             :         for (i = 0; i < addrlen; i++) {
     880             :                 __be64 xb = a1[i] ^ a2[i];
     881             :                 if (xb)
     882             :                         return i * 64 + 63 - __fls(be64_to_cpu(xb));
     883             :         }
     884             : 
     885             :         return addrlen << 6;
     886             : }
     887             : #endif
     888             : 
     889             : static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen)
     890             : {
     891             : #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
     892             :         if (__builtin_constant_p(addrlen) && !(addrlen & 7))
     893             :                 return __ipv6_addr_diff64(token1, token2, addrlen);
     894             : #endif
     895             :         return __ipv6_addr_diff32(token1, token2, addrlen);
     896             : }
     897             : 
     898             : static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2)
     899             : {
     900             :         return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr));
     901             : }
     902             : 
     903             : __be32 ipv6_select_ident(struct net *net,
     904             :                          const struct in6_addr *daddr,
     905             :                          const struct in6_addr *saddr);
     906             : __be32 ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb);
     907             : 
     908             : int ip6_dst_hoplimit(struct dst_entry *dst);
     909             : 
     910             : static inline int ip6_sk_dst_hoplimit(struct ipv6_pinfo *np, struct flowi6 *fl6,
     911             :                                       struct dst_entry *dst)
     912             : {
     913             :         int hlimit;
     914             : 
     915             :         if (ipv6_addr_is_multicast(&fl6->daddr))
     916             :                 hlimit = np->mcast_hops;
     917             :         else
     918             :                 hlimit = np->hop_limit;
     919             :         if (hlimit < 0)
     920             :                 hlimit = ip6_dst_hoplimit(dst);
     921             :         return hlimit;
     922             : }
     923             : 
     924             : /* copy IPv6 saddr & daddr to flow_keys, possibly using 64bit load/store
     925             :  * Equivalent to :      flow->v6addrs.src = iph->saddr;
     926             :  *                      flow->v6addrs.dst = iph->daddr;
     927             :  */
     928             : static inline void iph_to_flow_copy_v6addrs(struct flow_keys *flow,
     929             :                                             const struct ipv6hdr *iph)
     930             : {
     931             :         BUILD_BUG_ON(offsetof(typeof(flow->addrs), v6addrs.dst) !=
     932             :                      offsetof(typeof(flow->addrs), v6addrs.src) +
     933             :                      sizeof(flow->addrs.v6addrs.src));
     934             :         memcpy(&flow->addrs.v6addrs, &iph->addrs, sizeof(flow->addrs.v6addrs));
     935             :         flow->control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
     936             : }
     937             : 
     938             : #if IS_ENABLED(CONFIG_IPV6)
     939             : 
     940             : static inline bool ipv6_can_nonlocal_bind(struct net *net,
     941             :                                           struct inet_sock *inet)
     942             : {
     943             :         return net->ipv6.sysctl.ip_nonlocal_bind ||
     944             :                 inet->freebind || inet->transparent;
     945             : }
     946             : 
     947             : /* Sysctl settings for net ipv6.auto_flowlabels */
     948             : #define IP6_AUTO_FLOW_LABEL_OFF         0
     949             : #define IP6_AUTO_FLOW_LABEL_OPTOUT      1
     950             : #define IP6_AUTO_FLOW_LABEL_OPTIN       2
     951             : #define IP6_AUTO_FLOW_LABEL_FORCED      3
     952             : 
     953             : #define IP6_AUTO_FLOW_LABEL_MAX         IP6_AUTO_FLOW_LABEL_FORCED
     954             : 
     955             : #define IP6_DEFAULT_AUTO_FLOW_LABELS    IP6_AUTO_FLOW_LABEL_OPTOUT
     956             : 
     957             : static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
     958             :                                         __be32 flowlabel, bool autolabel,
     959             :                                         struct flowi6 *fl6)
     960             : {
     961             :         u32 hash;
     962             : 
     963             :         /* @flowlabel may include more than a flow label, eg, the traffic class.
     964             :          * Here we want only the flow label value.
     965             :          */
     966             :         flowlabel &= IPV6_FLOWLABEL_MASK;
     967             : 
     968             :         if (flowlabel ||
     969             :             net->ipv6.sysctl.auto_flowlabels == IP6_AUTO_FLOW_LABEL_OFF ||
     970             :             (!autolabel &&
     971             :              net->ipv6.sysctl.auto_flowlabels != IP6_AUTO_FLOW_LABEL_FORCED))
     972             :                 return flowlabel;
     973             : 
     974             :         hash = skb_get_hash_flowi6(skb, fl6);
     975             : 
     976             :         /* Since this is being sent on the wire obfuscate hash a bit
     977             :          * to minimize possbility that any useful information to an
     978             :          * attacker is leaked. Only lower 20 bits are relevant.
     979             :          */
     980             :         hash = rol32(hash, 16);
     981             : 
     982             :         flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK;
     983             : 
     984             :         if (net->ipv6.sysctl.flowlabel_state_ranges)
     985             :                 flowlabel |= IPV6_FLOWLABEL_STATELESS_FLAG;
     986             : 
     987             :         return flowlabel;
     988             : }
     989             : 
     990             : static inline int ip6_default_np_autolabel(struct net *net)
     991             : {
     992             :         switch (net->ipv6.sysctl.auto_flowlabels) {
     993             :         case IP6_AUTO_FLOW_LABEL_OFF:
     994             :         case IP6_AUTO_FLOW_LABEL_OPTIN:
     995             :         default:
     996             :                 return 0;
     997             :         case IP6_AUTO_FLOW_LABEL_OPTOUT:
     998             :         case IP6_AUTO_FLOW_LABEL_FORCED:
     999             :                 return 1;
    1000             :         }
    1001             : }
    1002             : #else
    1003             : static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
    1004             :                                         __be32 flowlabel, bool autolabel,
    1005             :                                         struct flowi6 *fl6)
    1006             : {
    1007             :         return flowlabel;
    1008             : }
    1009             : static inline int ip6_default_np_autolabel(struct net *net)
    1010             : {
    1011             :         return 0;
    1012             : }
    1013             : #endif
    1014             : 
    1015             : #if IS_ENABLED(CONFIG_IPV6)
    1016             : static inline int ip6_multipath_hash_policy(const struct net *net)
    1017             : {
    1018             :         return net->ipv6.sysctl.multipath_hash_policy;
    1019             : }
    1020             : static inline u32 ip6_multipath_hash_fields(const struct net *net)
    1021             : {
    1022             :         return net->ipv6.sysctl.multipath_hash_fields;
    1023             : }
    1024             : #else
    1025             : static inline int ip6_multipath_hash_policy(const struct net *net)
    1026             : {
    1027             :         return 0;
    1028             : }
    1029             : static inline u32 ip6_multipath_hash_fields(const struct net *net)
    1030             : {
    1031             :         return 0;
    1032             : }
    1033             : #endif
    1034             : 
    1035             : /*
    1036             :  *      Header manipulation
    1037             :  */
    1038             : static inline void ip6_flow_hdr(struct ipv6hdr *hdr, unsigned int tclass,
    1039             :                                 __be32 flowlabel)
    1040             : {
    1041             :         *(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | flowlabel;
    1042             : }
    1043             : 
    1044             : static inline __be32 ip6_flowinfo(const struct ipv6hdr *hdr)
    1045             : {
    1046             :         return *(__be32 *)hdr & IPV6_FLOWINFO_MASK;
    1047             : }
    1048             : 
    1049             : static inline __be32 ip6_flowlabel(const struct ipv6hdr *hdr)
    1050             : {
    1051             :         return *(__be32 *)hdr & IPV6_FLOWLABEL_MASK;
    1052             : }
    1053             : 
    1054             : static inline u8 ip6_tclass(__be32 flowinfo)
    1055             : {
    1056             :         return ntohl(flowinfo & IPV6_TCLASS_MASK) >> IPV6_TCLASS_SHIFT;
    1057             : }
    1058             : 
    1059             : static inline dscp_t ip6_dscp(__be32 flowinfo)
    1060             : {
    1061             :         return inet_dsfield_to_dscp(ip6_tclass(flowinfo));
    1062             : }
    1063             : 
    1064             : static inline __be32 ip6_make_flowinfo(unsigned int tclass, __be32 flowlabel)
    1065             : {
    1066             :         return htonl(tclass << IPV6_TCLASS_SHIFT) | flowlabel;
    1067             : }
    1068             : 
    1069             : static inline __be32 flowi6_get_flowlabel(const struct flowi6 *fl6)
    1070             : {
    1071             :         return fl6->flowlabel & IPV6_FLOWLABEL_MASK;
    1072             : }
    1073             : 
    1074             : /*
    1075             :  *      Prototypes exported by ipv6
    1076             :  */
    1077             : 
    1078             : /*
    1079             :  *      rcv function (called from netdevice level)
    1080             :  */
    1081             : 
    1082             : int ipv6_rcv(struct sk_buff *skb, struct net_device *dev,
    1083             :              struct packet_type *pt, struct net_device *orig_dev);
    1084             : void ipv6_list_rcv(struct list_head *head, struct packet_type *pt,
    1085             :                    struct net_device *orig_dev);
    1086             : 
    1087             : int ip6_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb);
    1088             : 
    1089             : /*
    1090             :  *      upper-layer output functions
    1091             :  */
    1092             : int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
    1093             :              __u32 mark, struct ipv6_txoptions *opt, int tclass, u32 priority);
    1094             : 
    1095             : int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr);
    1096             : 
    1097             : int ip6_append_data(struct sock *sk,
    1098             :                     int getfrag(void *from, char *to, int offset, int len,
    1099             :                                 int odd, struct sk_buff *skb),
    1100             :                     void *from, size_t length, int transhdrlen,
    1101             :                     struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
    1102             :                     struct rt6_info *rt, unsigned int flags);
    1103             : 
    1104             : int ip6_push_pending_frames(struct sock *sk);
    1105             : 
    1106             : void ip6_flush_pending_frames(struct sock *sk);
    1107             : 
    1108             : int ip6_send_skb(struct sk_buff *skb);
    1109             : 
    1110             : struct sk_buff *__ip6_make_skb(struct sock *sk, struct sk_buff_head *queue,
    1111             :                                struct inet_cork_full *cork,
    1112             :                                struct inet6_cork *v6_cork);
    1113             : struct sk_buff *ip6_make_skb(struct sock *sk,
    1114             :                              int getfrag(void *from, char *to, int offset,
    1115             :                                          int len, int odd, struct sk_buff *skb),
    1116             :                              void *from, size_t length, int transhdrlen,
    1117             :                              struct ipcm6_cookie *ipc6,
    1118             :                              struct rt6_info *rt, unsigned int flags,
    1119             :                              struct inet_cork_full *cork);
    1120             : 
    1121             : static inline struct sk_buff *ip6_finish_skb(struct sock *sk)
    1122             : {
    1123             :         return __ip6_make_skb(sk, &sk->sk_write_queue, &inet_sk(sk)->cork,
    1124             :                               &inet6_sk(sk)->cork);
    1125             : }
    1126             : 
    1127             : int ip6_dst_lookup(struct net *net, struct sock *sk, struct dst_entry **dst,
    1128             :                    struct flowi6 *fl6);
    1129             : struct dst_entry *ip6_dst_lookup_flow(struct net *net, const struct sock *sk, struct flowi6 *fl6,
    1130             :                                       const struct in6_addr *final_dst);
    1131             : struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
    1132             :                                          const struct in6_addr *final_dst,
    1133             :                                          bool connected);
    1134             : struct dst_entry *ip6_dst_lookup_tunnel(struct sk_buff *skb,
    1135             :                                         struct net_device *dev,
    1136             :                                         struct net *net, struct socket *sock,
    1137             :                                         struct in6_addr *saddr,
    1138             :                                         const struct ip_tunnel_info *info,
    1139             :                                         u8 protocol, bool use_cache);
    1140             : struct dst_entry *ip6_blackhole_route(struct net *net,
    1141             :                                       struct dst_entry *orig_dst);
    1142             : 
    1143             : /*
    1144             :  *      skb processing functions
    1145             :  */
    1146             : 
    1147             : int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb);
    1148             : int ip6_forward(struct sk_buff *skb);
    1149             : int ip6_input(struct sk_buff *skb);
    1150             : int ip6_mc_input(struct sk_buff *skb);
    1151             : void ip6_protocol_deliver_rcu(struct net *net, struct sk_buff *skb, int nexthdr,
    1152             :                               bool have_final);
    1153             : 
    1154             : int __ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
    1155             : int ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
    1156             : 
    1157             : /*
    1158             :  *      Extension header (options) processing
    1159             :  */
    1160             : 
    1161             : void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
    1162             :                           u8 *proto, struct in6_addr **daddr_p,
    1163             :                           struct in6_addr *saddr);
    1164             : void ipv6_push_frag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
    1165             :                          u8 *proto);
    1166             : 
    1167             : int ipv6_skip_exthdr(const struct sk_buff *, int start, u8 *nexthdrp,
    1168             :                      __be16 *frag_offp);
    1169             : 
    1170             : bool ipv6_ext_hdr(u8 nexthdr);
    1171             : 
    1172             : enum {
    1173             :         IP6_FH_F_FRAG           = (1 << 0),
    1174             :         IP6_FH_F_AUTH           = (1 << 1),
    1175             :         IP6_FH_F_SKIP_RH        = (1 << 2),
    1176             : };
    1177             : 
    1178             : /* find specified header and get offset to it */
    1179             : int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, int target,
    1180             :                   unsigned short *fragoff, int *fragflg);
    1181             : 
    1182             : int ipv6_find_tlv(const struct sk_buff *skb, int offset, int type);
    1183             : 
    1184             : struct in6_addr *fl6_update_dst(struct flowi6 *fl6,
    1185             :                                 const struct ipv6_txoptions *opt,
    1186             :                                 struct in6_addr *orig);
    1187             : 
    1188             : /*
    1189             :  *      socket options (ipv6_sockglue.c)
    1190             :  */
    1191             : DECLARE_STATIC_KEY_FALSE(ip6_min_hopcount);
    1192             : 
    1193             : int do_ipv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
    1194             :                        unsigned int optlen);
    1195             : int ipv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
    1196             :                     unsigned int optlen);
    1197             : int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
    1198             :                        sockptr_t optval, sockptr_t optlen);
    1199             : int ipv6_getsockopt(struct sock *sk, int level, int optname,
    1200             :                     char __user *optval, int __user *optlen);
    1201             : 
    1202             : int __ip6_datagram_connect(struct sock *sk, struct sockaddr *addr,
    1203             :                            int addr_len);
    1204             : int ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len);
    1205             : int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *addr,
    1206             :                                  int addr_len);
    1207             : int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr);
    1208             : void ip6_datagram_release_cb(struct sock *sk);
    1209             : 
    1210             : int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len,
    1211             :                     int *addr_len);
    1212             : int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len,
    1213             :                      int *addr_len);
    1214             : void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port,
    1215             :                      u32 info, u8 *payload);
    1216             : void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info);
    1217             : void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu);
    1218             : 
    1219             : void inet6_cleanup_sock(struct sock *sk);
    1220             : void inet6_sock_destruct(struct sock *sk);
    1221             : int inet6_release(struct socket *sock);
    1222             : int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
    1223             : int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
    1224             :                   int peer);
    1225             : int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
    1226             : int inet6_compat_ioctl(struct socket *sock, unsigned int cmd,
    1227             :                 unsigned long arg);
    1228             : 
    1229             : int inet6_hash_connect(struct inet_timewait_death_row *death_row,
    1230             :                               struct sock *sk);
    1231             : int inet6_sendmsg(struct socket *sock, struct msghdr *msg, size_t size);
    1232             : int inet6_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
    1233             :                   int flags);
    1234             : 
    1235             : /*
    1236             :  * reassembly.c
    1237             :  */
    1238             : extern const struct proto_ops inet6_stream_ops;
    1239             : extern const struct proto_ops inet6_dgram_ops;
    1240             : extern const struct proto_ops inet6_sockraw_ops;
    1241             : 
    1242             : struct group_source_req;
    1243             : struct group_filter;
    1244             : 
    1245             : int ip6_mc_source(int add, int omode, struct sock *sk,
    1246             :                   struct group_source_req *pgsr);
    1247             : int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf,
    1248             :                   struct sockaddr_storage *list);
    1249             : int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
    1250             :                   sockptr_t optval, size_t ss_offset);
    1251             : 
    1252             : #ifdef CONFIG_PROC_FS
    1253             : int ac6_proc_init(struct net *net);
    1254             : void ac6_proc_exit(struct net *net);
    1255             : int raw6_proc_init(void);
    1256             : void raw6_proc_exit(void);
    1257             : int tcp6_proc_init(struct net *net);
    1258             : void tcp6_proc_exit(struct net *net);
    1259             : int udp6_proc_init(struct net *net);
    1260             : void udp6_proc_exit(struct net *net);
    1261             : int udplite6_proc_init(void);
    1262             : void udplite6_proc_exit(void);
    1263             : int ipv6_misc_proc_init(void);
    1264             : void ipv6_misc_proc_exit(void);
    1265             : int snmp6_register_dev(struct inet6_dev *idev);
    1266             : int snmp6_unregister_dev(struct inet6_dev *idev);
    1267             : 
    1268             : #else
    1269             : static inline int ac6_proc_init(struct net *net) { return 0; }
    1270             : static inline void ac6_proc_exit(struct net *net) { }
    1271             : static inline int snmp6_register_dev(struct inet6_dev *idev) { return 0; }
    1272             : static inline int snmp6_unregister_dev(struct inet6_dev *idev) { return 0; }
    1273             : #endif
    1274             : 
    1275             : #ifdef CONFIG_SYSCTL
    1276             : struct ctl_table *ipv6_icmp_sysctl_init(struct net *net);
    1277             : struct ctl_table *ipv6_route_sysctl_init(struct net *net);
    1278             : int ipv6_sysctl_register(void);
    1279             : void ipv6_sysctl_unregister(void);
    1280             : #endif
    1281             : 
    1282             : int ipv6_sock_mc_join(struct sock *sk, int ifindex,
    1283             :                       const struct in6_addr *addr);
    1284             : int ipv6_sock_mc_join_ssm(struct sock *sk, int ifindex,
    1285             :                           const struct in6_addr *addr, unsigned int mode);
    1286             : int ipv6_sock_mc_drop(struct sock *sk, int ifindex,
    1287             :                       const struct in6_addr *addr);
    1288             : 
    1289             : static inline int ip6_sock_set_v6only(struct sock *sk)
    1290             : {
    1291             :         if (inet_sk(sk)->inet_num)
    1292             :                 return -EINVAL;
    1293             :         lock_sock(sk);
    1294             :         sk->sk_ipv6only = true;
    1295             :         release_sock(sk);
    1296             :         return 0;
    1297             : }
    1298             : 
    1299             : static inline void ip6_sock_set_recverr(struct sock *sk)
    1300             : {
    1301             :         lock_sock(sk);
    1302             :         inet6_sk(sk)->recverr = true;
    1303             :         release_sock(sk);
    1304             : }
    1305             : 
    1306             : static inline int __ip6_sock_set_addr_preferences(struct sock *sk, int val)
    1307             : {
    1308             :         unsigned int pref = 0;
    1309             :         unsigned int prefmask = ~0;
    1310             : 
    1311             :         /* check PUBLIC/TMP/PUBTMP_DEFAULT conflicts */
    1312             :         switch (val & (IPV6_PREFER_SRC_PUBLIC |
    1313             :                        IPV6_PREFER_SRC_TMP |
    1314             :                        IPV6_PREFER_SRC_PUBTMP_DEFAULT)) {
    1315             :         case IPV6_PREFER_SRC_PUBLIC:
    1316             :                 pref |= IPV6_PREFER_SRC_PUBLIC;
    1317             :                 prefmask &= ~(IPV6_PREFER_SRC_PUBLIC |
    1318             :                               IPV6_PREFER_SRC_TMP);
    1319             :                 break;
    1320             :         case IPV6_PREFER_SRC_TMP:
    1321             :                 pref |= IPV6_PREFER_SRC_TMP;
    1322             :                 prefmask &= ~(IPV6_PREFER_SRC_PUBLIC |
    1323             :                               IPV6_PREFER_SRC_TMP);
    1324             :                 break;
    1325             :         case IPV6_PREFER_SRC_PUBTMP_DEFAULT:
    1326             :                 prefmask &= ~(IPV6_PREFER_SRC_PUBLIC |
    1327             :                               IPV6_PREFER_SRC_TMP);
    1328             :                 break;
    1329             :         case 0:
    1330             :                 break;
    1331             :         default:
    1332             :                 return -EINVAL;
    1333             :         }
    1334             : 
    1335             :         /* check HOME/COA conflicts */
    1336             :         switch (val & (IPV6_PREFER_SRC_HOME | IPV6_PREFER_SRC_COA)) {
    1337             :         case IPV6_PREFER_SRC_HOME:
    1338             :                 prefmask &= ~IPV6_PREFER_SRC_COA;
    1339             :                 break;
    1340             :         case IPV6_PREFER_SRC_COA:
    1341             :                 pref |= IPV6_PREFER_SRC_COA;
    1342             :                 break;
    1343             :         case 0:
    1344             :                 break;
    1345             :         default:
    1346             :                 return -EINVAL;
    1347             :         }
    1348             : 
    1349             :         /* check CGA/NONCGA conflicts */
    1350             :         switch (val & (IPV6_PREFER_SRC_CGA|IPV6_PREFER_SRC_NONCGA)) {
    1351             :         case IPV6_PREFER_SRC_CGA:
    1352             :         case IPV6_PREFER_SRC_NONCGA:
    1353             :         case 0:
    1354             :                 break;
    1355             :         default:
    1356             :                 return -EINVAL;
    1357             :         }
    1358             : 
    1359             :         inet6_sk(sk)->srcprefs = (inet6_sk(sk)->srcprefs & prefmask) | pref;
    1360             :         return 0;
    1361             : }
    1362             : 
    1363             : static inline int ip6_sock_set_addr_preferences(struct sock *sk, bool val)
    1364             : {
    1365             :         int ret;
    1366             : 
    1367             :         lock_sock(sk);
    1368             :         ret = __ip6_sock_set_addr_preferences(sk, val);
    1369             :         release_sock(sk);
    1370             :         return ret;
    1371             : }
    1372             : 
    1373             : static inline void ip6_sock_set_recvpktinfo(struct sock *sk)
    1374             : {
    1375             :         lock_sock(sk);
    1376             :         inet6_sk(sk)->rxopt.bits.rxinfo = true;
    1377             :         release_sock(sk);
    1378             : }
    1379             : 
    1380             : #endif /* _NET_IPV6_H */

Generated by: LCOV version 1.14