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

Generated by: LCOV version 1.14