0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _NET_IPV6_H
0010 #define _NET_IPV6_H
0011
0012 #include <linux/ipv6.h>
0013 #include <linux/hardirq.h>
0014 #include <linux/jhash.h>
0015 #include <linux/refcount.h>
0016 #include <linux/jump_label_ratelimit.h>
0017 #include <net/if_inet6.h>
0018 #include <net/flow.h>
0019 #include <net/flow_dissector.h>
0020 #include <net/inet_dscp.h>
0021 #include <net/snmp.h>
0022 #include <net/netns/hash.h>
0023
0024 struct ip_tunnel_info;
0025
0026 #define SIN6_LEN_RFC2133 24
0027
0028 #define IPV6_MAXPLEN 65535
0029
0030
0031
0032
0033
0034 #define NEXTHDR_HOP 0
0035 #define NEXTHDR_IPV4 4
0036 #define NEXTHDR_TCP 6
0037 #define NEXTHDR_UDP 17
0038 #define NEXTHDR_IPV6 41
0039 #define NEXTHDR_ROUTING 43
0040 #define NEXTHDR_FRAGMENT 44
0041 #define NEXTHDR_GRE 47
0042 #define NEXTHDR_ESP 50
0043 #define NEXTHDR_AUTH 51
0044 #define NEXTHDR_ICMP 58
0045 #define NEXTHDR_NONE 59
0046 #define NEXTHDR_DEST 60
0047 #define NEXTHDR_SCTP 132
0048 #define NEXTHDR_MOBILITY 135
0049
0050 #define NEXTHDR_MAX 255
0051
0052 #define IPV6_DEFAULT_HOPLIMIT 64
0053 #define IPV6_DEFAULT_MCASTHOPS 1
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090 #define IP6_DEFAULT_MAX_DST_OPTS_CNT 8
0091 #define IP6_DEFAULT_MAX_HBH_OPTS_CNT 8
0092 #define IP6_DEFAULT_MAX_DST_OPTS_LEN INT_MAX
0093 #define IP6_DEFAULT_MAX_HBH_OPTS_LEN INT_MAX
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106 #define IPV6_ADDR_ANY 0x0000U
0107
0108 #define IPV6_ADDR_UNICAST 0x0001U
0109 #define IPV6_ADDR_MULTICAST 0x0002U
0110
0111 #define IPV6_ADDR_LOOPBACK 0x0010U
0112 #define IPV6_ADDR_LINKLOCAL 0x0020U
0113 #define IPV6_ADDR_SITELOCAL 0x0040U
0114
0115 #define IPV6_ADDR_COMPATv4 0x0080U
0116
0117 #define IPV6_ADDR_SCOPE_MASK 0x00f0U
0118
0119 #define IPV6_ADDR_MAPPED 0x1000U
0120
0121
0122
0123
0124 #define IPV6_ADDR_MC_SCOPE(a) \
0125 ((a)->s6_addr[1] & 0x0f)
0126 #define __IPV6_ADDR_SCOPE_INVALID -1
0127 #define IPV6_ADDR_SCOPE_NODELOCAL 0x01
0128 #define IPV6_ADDR_SCOPE_LINKLOCAL 0x02
0129 #define IPV6_ADDR_SCOPE_SITELOCAL 0x05
0130 #define IPV6_ADDR_SCOPE_ORGLOCAL 0x08
0131 #define IPV6_ADDR_SCOPE_GLOBAL 0x0e
0132
0133
0134
0135
0136 #define IPV6_ADDR_MC_FLAG_TRANSIENT(a) \
0137 ((a)->s6_addr[1] & 0x10)
0138 #define IPV6_ADDR_MC_FLAG_PREFIX(a) \
0139 ((a)->s6_addr[1] & 0x20)
0140 #define IPV6_ADDR_MC_FLAG_RENDEZVOUS(a) \
0141 ((a)->s6_addr[1] & 0x40)
0142
0143
0144
0145
0146
0147 struct frag_hdr {
0148 __u8 nexthdr;
0149 __u8 reserved;
0150 __be16 frag_off;
0151 __be32 identification;
0152 };
0153
0154
0155
0156
0157 struct hop_jumbo_hdr {
0158 u8 nexthdr;
0159 u8 hdrlen;
0160 u8 tlv_type;
0161 u8 tlv_len;
0162 __be32 jumbo_payload_len;
0163 };
0164
0165 #define IP6_MF 0x0001
0166 #define IP6_OFFSET 0xFFF8
0167
0168 struct ip6_fraglist_iter {
0169 struct ipv6hdr *tmp_hdr;
0170 struct sk_buff *frag;
0171 int offset;
0172 unsigned int hlen;
0173 __be32 frag_id;
0174 u8 nexthdr;
0175 };
0176
0177 int ip6_fraglist_init(struct sk_buff *skb, unsigned int hlen, u8 *prevhdr,
0178 u8 nexthdr, __be32 frag_id,
0179 struct ip6_fraglist_iter *iter);
0180 void ip6_fraglist_prepare(struct sk_buff *skb, struct ip6_fraglist_iter *iter);
0181
0182 static inline struct sk_buff *ip6_fraglist_next(struct ip6_fraglist_iter *iter)
0183 {
0184 struct sk_buff *skb = iter->frag;
0185
0186 iter->frag = skb->next;
0187 skb_mark_not_on_list(skb);
0188
0189 return skb;
0190 }
0191
0192 struct ip6_frag_state {
0193 u8 *prevhdr;
0194 unsigned int hlen;
0195 unsigned int mtu;
0196 unsigned int left;
0197 int offset;
0198 int ptr;
0199 int hroom;
0200 int troom;
0201 __be32 frag_id;
0202 u8 nexthdr;
0203 };
0204
0205 void ip6_frag_init(struct sk_buff *skb, unsigned int hlen, unsigned int mtu,
0206 unsigned short needed_tailroom, int hdr_room, u8 *prevhdr,
0207 u8 nexthdr, __be32 frag_id, struct ip6_frag_state *state);
0208 struct sk_buff *ip6_frag_next(struct sk_buff *skb,
0209 struct ip6_frag_state *state);
0210
0211 #define IP6_REPLY_MARK(net, mark) \
0212 ((net)->ipv6.sysctl.fwmark_reflect ? (mark) : 0)
0213
0214 #include <net/sock.h>
0215
0216
0217 extern int sysctl_mld_max_msf;
0218 extern int sysctl_mld_qrv;
0219
0220 #define _DEVINC(net, statname, mod, idev, field) \
0221 ({ \
0222 struct inet6_dev *_idev = (idev); \
0223 if (likely(_idev != NULL)) \
0224 mod##SNMP_INC_STATS64((_idev)->stats.statname, (field));\
0225 mod##SNMP_INC_STATS64((net)->mib.statname##_statistics, (field));\
0226 })
0227
0228
0229 #define _DEVINCATOMIC(net, statname, mod, idev, field) \
0230 ({ \
0231 struct inet6_dev *_idev = (idev); \
0232 if (likely(_idev != NULL)) \
0233 SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
0234 mod##SNMP_INC_STATS((net)->mib.statname##_statistics, (field));\
0235 })
0236
0237
0238 #define _DEVINC_ATOMIC_ATOMIC(net, statname, idev, field) \
0239 ({ \
0240 struct inet6_dev *_idev = (idev); \
0241 if (likely(_idev != NULL)) \
0242 SNMP_INC_STATS_ATOMIC_LONG((_idev)->stats.statname##dev, (field)); \
0243 SNMP_INC_STATS_ATOMIC_LONG((net)->mib.statname##_statistics, (field));\
0244 })
0245
0246 #define _DEVADD(net, statname, mod, idev, field, val) \
0247 ({ \
0248 struct inet6_dev *_idev = (idev); \
0249 if (likely(_idev != NULL)) \
0250 mod##SNMP_ADD_STATS((_idev)->stats.statname, (field), (val)); \
0251 mod##SNMP_ADD_STATS((net)->mib.statname##_statistics, (field), (val));\
0252 })
0253
0254 #define _DEVUPD(net, statname, mod, idev, field, val) \
0255 ({ \
0256 struct inet6_dev *_idev = (idev); \
0257 if (likely(_idev != NULL)) \
0258 mod##SNMP_UPD_PO_STATS((_idev)->stats.statname, field, (val)); \
0259 mod##SNMP_UPD_PO_STATS((net)->mib.statname##_statistics, field, (val));\
0260 })
0261
0262
0263
0264 #define IP6_INC_STATS(net, idev,field) \
0265 _DEVINC(net, ipv6, , idev, field)
0266 #define __IP6_INC_STATS(net, idev,field) \
0267 _DEVINC(net, ipv6, __, idev, field)
0268 #define IP6_ADD_STATS(net, idev,field,val) \
0269 _DEVADD(net, ipv6, , idev, field, val)
0270 #define __IP6_ADD_STATS(net, idev,field,val) \
0271 _DEVADD(net, ipv6, __, idev, field, val)
0272 #define IP6_UPD_PO_STATS(net, idev,field,val) \
0273 _DEVUPD(net, ipv6, , idev, field, val)
0274 #define __IP6_UPD_PO_STATS(net, idev,field,val) \
0275 _DEVUPD(net, ipv6, __, idev, field, val)
0276 #define ICMP6_INC_STATS(net, idev, field) \
0277 _DEVINCATOMIC(net, icmpv6, , idev, field)
0278 #define __ICMP6_INC_STATS(net, idev, field) \
0279 _DEVINCATOMIC(net, icmpv6, __, idev, field)
0280
0281 #define ICMP6MSGOUT_INC_STATS(net, idev, field) \
0282 _DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field +256)
0283 #define ICMP6MSGIN_INC_STATS(net, idev, field) \
0284 _DEVINC_ATOMIC_ATOMIC(net, icmpv6msg, idev, field)
0285
0286 struct ip6_ra_chain {
0287 struct ip6_ra_chain *next;
0288 struct sock *sk;
0289 int sel;
0290 void (*destructor)(struct sock *);
0291 };
0292
0293 extern struct ip6_ra_chain *ip6_ra_chain;
0294 extern rwlock_t ip6_ra_lock;
0295
0296
0297
0298
0299
0300
0301 struct ipv6_txoptions {
0302 refcount_t refcnt;
0303
0304 int tot_len;
0305
0306
0307
0308 __u16 opt_flen;
0309 __u16 opt_nflen;
0310
0311 struct ipv6_opt_hdr *hopopt;
0312 struct ipv6_opt_hdr *dst0opt;
0313 struct ipv6_rt_hdr *srcrt;
0314 struct ipv6_opt_hdr *dst1opt;
0315 struct rcu_head rcu;
0316
0317 };
0318
0319
0320 enum flowlabel_reflect {
0321 FLOWLABEL_REFLECT_ESTABLISHED = 1,
0322 FLOWLABEL_REFLECT_TCP_RESET = 2,
0323 FLOWLABEL_REFLECT_ICMPV6_ECHO_REPLIES = 4,
0324 };
0325
0326 struct ip6_flowlabel {
0327 struct ip6_flowlabel __rcu *next;
0328 __be32 label;
0329 atomic_t users;
0330 struct in6_addr dst;
0331 struct ipv6_txoptions *opt;
0332 unsigned long linger;
0333 struct rcu_head rcu;
0334 u8 share;
0335 union {
0336 struct pid *pid;
0337 kuid_t uid;
0338 } owner;
0339 unsigned long lastuse;
0340 unsigned long expires;
0341 struct net *fl_net;
0342 };
0343
0344 #define IPV6_FLOWINFO_MASK cpu_to_be32(0x0FFFFFFF)
0345 #define IPV6_FLOWLABEL_MASK cpu_to_be32(0x000FFFFF)
0346 #define IPV6_FLOWLABEL_STATELESS_FLAG cpu_to_be32(0x00080000)
0347
0348 #define IPV6_TCLASS_MASK (IPV6_FLOWINFO_MASK & ~IPV6_FLOWLABEL_MASK)
0349 #define IPV6_TCLASS_SHIFT 20
0350
0351 struct ipv6_fl_socklist {
0352 struct ipv6_fl_socklist __rcu *next;
0353 struct ip6_flowlabel *fl;
0354 struct rcu_head rcu;
0355 };
0356
0357 struct ipcm6_cookie {
0358 struct sockcm_cookie sockc;
0359 __s16 hlimit;
0360 __s16 tclass;
0361 __u16 gso_size;
0362 __s8 dontfrag;
0363 struct ipv6_txoptions *opt;
0364 };
0365
0366 static inline void ipcm6_init(struct ipcm6_cookie *ipc6)
0367 {
0368 *ipc6 = (struct ipcm6_cookie) {
0369 .hlimit = -1,
0370 .tclass = -1,
0371 .dontfrag = -1,
0372 };
0373 }
0374
0375 static inline void ipcm6_init_sk(struct ipcm6_cookie *ipc6,
0376 const struct ipv6_pinfo *np)
0377 {
0378 *ipc6 = (struct ipcm6_cookie) {
0379 .hlimit = -1,
0380 .tclass = np->tclass,
0381 .dontfrag = np->dontfrag,
0382 };
0383 }
0384
0385 static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np)
0386 {
0387 struct ipv6_txoptions *opt;
0388
0389 rcu_read_lock();
0390 opt = rcu_dereference(np->opt);
0391 if (opt) {
0392 if (!refcount_inc_not_zero(&opt->refcnt))
0393 opt = NULL;
0394 else
0395 opt = rcu_pointer_handoff(opt);
0396 }
0397 rcu_read_unlock();
0398 return opt;
0399 }
0400
0401 static inline void txopt_put(struct ipv6_txoptions *opt)
0402 {
0403 if (opt && refcount_dec_and_test(&opt->refcnt))
0404 kfree_rcu(opt, rcu);
0405 }
0406
0407 #if IS_ENABLED(CONFIG_IPV6)
0408 struct ip6_flowlabel *__fl6_sock_lookup(struct sock *sk, __be32 label);
0409
0410 extern struct static_key_false_deferred ipv6_flowlabel_exclusive;
0411 static inline struct ip6_flowlabel *fl6_sock_lookup(struct sock *sk,
0412 __be32 label)
0413 {
0414 if (static_branch_unlikely(&ipv6_flowlabel_exclusive.key) &&
0415 READ_ONCE(sock_net(sk)->ipv6.flowlabel_has_excl))
0416 return __fl6_sock_lookup(sk, label) ? : ERR_PTR(-ENOENT);
0417
0418 return NULL;
0419 }
0420 #endif
0421
0422 struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions *opt_space,
0423 struct ip6_flowlabel *fl,
0424 struct ipv6_txoptions *fopt);
0425 void fl6_free_socklist(struct sock *sk);
0426 int ipv6_flowlabel_opt(struct sock *sk, sockptr_t optval, int optlen);
0427 int ipv6_flowlabel_opt_get(struct sock *sk, struct in6_flowlabel_req *freq,
0428 int flags);
0429 int ip6_flowlabel_init(void);
0430 void ip6_flowlabel_cleanup(void);
0431 bool ip6_autoflowlabel(struct net *net, const struct ipv6_pinfo *np);
0432
0433 static inline void fl6_sock_release(struct ip6_flowlabel *fl)
0434 {
0435 if (fl)
0436 atomic_dec(&fl->users);
0437 }
0438
0439 void icmpv6_notify(struct sk_buff *skb, u8 type, u8 code, __be32 info);
0440
0441 void icmpv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6,
0442 struct icmp6hdr *thdr, int len);
0443
0444 int ip6_ra_control(struct sock *sk, int sel);
0445
0446 int ipv6_parse_hopopts(struct sk_buff *skb);
0447
0448 struct ipv6_txoptions *ipv6_dup_options(struct sock *sk,
0449 struct ipv6_txoptions *opt);
0450 struct ipv6_txoptions *ipv6_renew_options(struct sock *sk,
0451 struct ipv6_txoptions *opt,
0452 int newtype,
0453 struct ipv6_opt_hdr *newopt);
0454 struct ipv6_txoptions *__ipv6_fixup_options(struct ipv6_txoptions *opt_space,
0455 struct ipv6_txoptions *opt);
0456
0457 static inline struct ipv6_txoptions *
0458 ipv6_fixup_options(struct ipv6_txoptions *opt_space, struct ipv6_txoptions *opt)
0459 {
0460 if (!opt)
0461 return NULL;
0462 return __ipv6_fixup_options(opt_space, opt);
0463 }
0464
0465 bool ipv6_opt_accepted(const struct sock *sk, const struct sk_buff *skb,
0466 const struct inet6_skb_parm *opt);
0467 struct ipv6_txoptions *ipv6_update_options(struct sock *sk,
0468 struct ipv6_txoptions *opt);
0469
0470
0471
0472
0473
0474
0475 static inline int ipv6_has_hopopt_jumbo(const struct sk_buff *skb)
0476 {
0477 const struct hop_jumbo_hdr *jhdr;
0478 const struct ipv6hdr *nhdr;
0479
0480 if (likely(skb->len <= GRO_LEGACY_MAX_SIZE))
0481 return 0;
0482
0483 if (skb->protocol != htons(ETH_P_IPV6))
0484 return 0;
0485
0486 if (skb_network_offset(skb) +
0487 sizeof(struct ipv6hdr) +
0488 sizeof(struct hop_jumbo_hdr) > skb_headlen(skb))
0489 return 0;
0490
0491 nhdr = ipv6_hdr(skb);
0492
0493 if (nhdr->nexthdr != NEXTHDR_HOP)
0494 return 0;
0495
0496 jhdr = (const struct hop_jumbo_hdr *) (nhdr + 1);
0497 if (jhdr->tlv_type != IPV6_TLV_JUMBO || jhdr->hdrlen != 0 ||
0498 jhdr->nexthdr != IPPROTO_TCP)
0499 return 0;
0500 return jhdr->nexthdr;
0501 }
0502
0503 static inline bool ipv6_accept_ra(struct inet6_dev *idev)
0504 {
0505
0506
0507
0508 return idev->cnf.forwarding ? idev->cnf.accept_ra == 2 :
0509 idev->cnf.accept_ra;
0510 }
0511
0512 #define IPV6_FRAG_HIGH_THRESH (4 * 1024*1024)
0513 #define IPV6_FRAG_LOW_THRESH (3 * 1024*1024)
0514 #define IPV6_FRAG_TIMEOUT (60 * HZ)
0515
0516 int __ipv6_addr_type(const struct in6_addr *addr);
0517 static inline int ipv6_addr_type(const struct in6_addr *addr)
0518 {
0519 return __ipv6_addr_type(addr) & 0xffff;
0520 }
0521
0522 static inline int ipv6_addr_scope(const struct in6_addr *addr)
0523 {
0524 return __ipv6_addr_type(addr) & IPV6_ADDR_SCOPE_MASK;
0525 }
0526
0527 static inline int __ipv6_addr_src_scope(int type)
0528 {
0529 return (type == IPV6_ADDR_ANY) ? __IPV6_ADDR_SCOPE_INVALID : (type >> 16);
0530 }
0531
0532 static inline int ipv6_addr_src_scope(const struct in6_addr *addr)
0533 {
0534 return __ipv6_addr_src_scope(__ipv6_addr_type(addr));
0535 }
0536
0537 static inline bool __ipv6_addr_needs_scope_id(int type)
0538 {
0539 return type & IPV6_ADDR_LINKLOCAL ||
0540 (type & IPV6_ADDR_MULTICAST &&
0541 (type & (IPV6_ADDR_LOOPBACK|IPV6_ADDR_LINKLOCAL)));
0542 }
0543
0544 static inline __u32 ipv6_iface_scope_id(const struct in6_addr *addr, int iface)
0545 {
0546 return __ipv6_addr_needs_scope_id(__ipv6_addr_type(addr)) ? iface : 0;
0547 }
0548
0549 static inline int ipv6_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2)
0550 {
0551 return memcmp(a1, a2, sizeof(struct in6_addr));
0552 }
0553
0554 static inline bool
0555 ipv6_masked_addr_cmp(const struct in6_addr *a1, const struct in6_addr *m,
0556 const struct in6_addr *a2)
0557 {
0558 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
0559 const unsigned long *ul1 = (const unsigned long *)a1;
0560 const unsigned long *ulm = (const unsigned long *)m;
0561 const unsigned long *ul2 = (const unsigned long *)a2;
0562
0563 return !!(((ul1[0] ^ ul2[0]) & ulm[0]) |
0564 ((ul1[1] ^ ul2[1]) & ulm[1]));
0565 #else
0566 return !!(((a1->s6_addr32[0] ^ a2->s6_addr32[0]) & m->s6_addr32[0]) |
0567 ((a1->s6_addr32[1] ^ a2->s6_addr32[1]) & m->s6_addr32[1]) |
0568 ((a1->s6_addr32[2] ^ a2->s6_addr32[2]) & m->s6_addr32[2]) |
0569 ((a1->s6_addr32[3] ^ a2->s6_addr32[3]) & m->s6_addr32[3]));
0570 #endif
0571 }
0572
0573 static inline void ipv6_addr_prefix(struct in6_addr *pfx,
0574 const struct in6_addr *addr,
0575 int plen)
0576 {
0577
0578 int o = plen >> 3,
0579 b = plen & 0x7;
0580
0581 memset(pfx->s6_addr, 0, sizeof(pfx->s6_addr));
0582 memcpy(pfx->s6_addr, addr, o);
0583 if (b != 0)
0584 pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b);
0585 }
0586
0587 static inline void ipv6_addr_prefix_copy(struct in6_addr *addr,
0588 const struct in6_addr *pfx,
0589 int plen)
0590 {
0591
0592 int o = plen >> 3,
0593 b = plen & 0x7;
0594
0595 memcpy(addr->s6_addr, pfx, o);
0596 if (b != 0) {
0597 addr->s6_addr[o] &= ~(0xff00 >> b);
0598 addr->s6_addr[o] |= (pfx->s6_addr[o] & (0xff00 >> b));
0599 }
0600 }
0601
0602 static inline void __ipv6_addr_set_half(__be32 *addr,
0603 __be32 wh, __be32 wl)
0604 {
0605 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
0606 #if defined(__BIG_ENDIAN)
0607 if (__builtin_constant_p(wh) && __builtin_constant_p(wl)) {
0608 *(__force u64 *)addr = ((__force u64)(wh) << 32 | (__force u64)(wl));
0609 return;
0610 }
0611 #elif defined(__LITTLE_ENDIAN)
0612 if (__builtin_constant_p(wl) && __builtin_constant_p(wh)) {
0613 *(__force u64 *)addr = ((__force u64)(wl) << 32 | (__force u64)(wh));
0614 return;
0615 }
0616 #endif
0617 #endif
0618 addr[0] = wh;
0619 addr[1] = wl;
0620 }
0621
0622 static inline void ipv6_addr_set(struct in6_addr *addr,
0623 __be32 w1, __be32 w2,
0624 __be32 w3, __be32 w4)
0625 {
0626 __ipv6_addr_set_half(&addr->s6_addr32[0], w1, w2);
0627 __ipv6_addr_set_half(&addr->s6_addr32[2], w3, w4);
0628 }
0629
0630 static inline bool ipv6_addr_equal(const struct in6_addr *a1,
0631 const struct in6_addr *a2)
0632 {
0633 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
0634 const unsigned long *ul1 = (const unsigned long *)a1;
0635 const unsigned long *ul2 = (const unsigned long *)a2;
0636
0637 return ((ul1[0] ^ ul2[0]) | (ul1[1] ^ ul2[1])) == 0UL;
0638 #else
0639 return ((a1->s6_addr32[0] ^ a2->s6_addr32[0]) |
0640 (a1->s6_addr32[1] ^ a2->s6_addr32[1]) |
0641 (a1->s6_addr32[2] ^ a2->s6_addr32[2]) |
0642 (a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0;
0643 #endif
0644 }
0645
0646 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
0647 static inline bool __ipv6_prefix_equal64_half(const __be64 *a1,
0648 const __be64 *a2,
0649 unsigned int len)
0650 {
0651 if (len && ((*a1 ^ *a2) & cpu_to_be64((~0UL) << (64 - len))))
0652 return false;
0653 return true;
0654 }
0655
0656 static inline bool ipv6_prefix_equal(const struct in6_addr *addr1,
0657 const struct in6_addr *addr2,
0658 unsigned int prefixlen)
0659 {
0660 const __be64 *a1 = (const __be64 *)addr1;
0661 const __be64 *a2 = (const __be64 *)addr2;
0662
0663 if (prefixlen >= 64) {
0664 if (a1[0] ^ a2[0])
0665 return false;
0666 return __ipv6_prefix_equal64_half(a1 + 1, a2 + 1, prefixlen - 64);
0667 }
0668 return __ipv6_prefix_equal64_half(a1, a2, prefixlen);
0669 }
0670 #else
0671 static inline bool ipv6_prefix_equal(const struct in6_addr *addr1,
0672 const struct in6_addr *addr2,
0673 unsigned int prefixlen)
0674 {
0675 const __be32 *a1 = addr1->s6_addr32;
0676 const __be32 *a2 = addr2->s6_addr32;
0677 unsigned int pdw, pbi;
0678
0679
0680 pdw = prefixlen >> 5;
0681 if (pdw && memcmp(a1, a2, pdw << 2))
0682 return false;
0683
0684
0685 pbi = prefixlen & 0x1f;
0686 if (pbi && ((a1[pdw] ^ a2[pdw]) & htonl((0xffffffff) << (32 - pbi))))
0687 return false;
0688
0689 return true;
0690 }
0691 #endif
0692
0693 static inline bool ipv6_addr_any(const struct in6_addr *a)
0694 {
0695 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
0696 const unsigned long *ul = (const unsigned long *)a;
0697
0698 return (ul[0] | ul[1]) == 0UL;
0699 #else
0700 return (a->s6_addr32[0] | a->s6_addr32[1] |
0701 a->s6_addr32[2] | a->s6_addr32[3]) == 0;
0702 #endif
0703 }
0704
0705 static inline u32 ipv6_addr_hash(const struct in6_addr *a)
0706 {
0707 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
0708 const unsigned long *ul = (const unsigned long *)a;
0709 unsigned long x = ul[0] ^ ul[1];
0710
0711 return (u32)(x ^ (x >> 32));
0712 #else
0713 return (__force u32)(a->s6_addr32[0] ^ a->s6_addr32[1] ^
0714 a->s6_addr32[2] ^ a->s6_addr32[3]);
0715 #endif
0716 }
0717
0718
0719 static inline u32 __ipv6_addr_jhash(const struct in6_addr *a, const u32 initval)
0720 {
0721 u32 v = (__force u32)a->s6_addr32[0] ^ (__force u32)a->s6_addr32[1];
0722
0723 return jhash_3words(v,
0724 (__force u32)a->s6_addr32[2],
0725 (__force u32)a->s6_addr32[3],
0726 initval);
0727 }
0728
0729 static inline bool ipv6_addr_loopback(const struct in6_addr *a)
0730 {
0731 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
0732 const __be64 *be = (const __be64 *)a;
0733
0734 return (be[0] | (be[1] ^ cpu_to_be64(1))) == 0UL;
0735 #else
0736 return (a->s6_addr32[0] | a->s6_addr32[1] |
0737 a->s6_addr32[2] | (a->s6_addr32[3] ^ cpu_to_be32(1))) == 0;
0738 #endif
0739 }
0740
0741
0742
0743
0744
0745 static inline bool ipv6_addr_v4mapped(const struct in6_addr *a)
0746 {
0747 return (
0748 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
0749 *(unsigned long *)a |
0750 #else
0751 (__force unsigned long)(a->s6_addr32[0] | a->s6_addr32[1]) |
0752 #endif
0753 (__force unsigned long)(a->s6_addr32[2] ^
0754 cpu_to_be32(0x0000ffff))) == 0UL;
0755 }
0756
0757 static inline bool ipv6_addr_v4mapped_loopback(const struct in6_addr *a)
0758 {
0759 return ipv6_addr_v4mapped(a) && ipv4_is_loopback(a->s6_addr32[3]);
0760 }
0761
0762 static inline u32 ipv6_portaddr_hash(const struct net *net,
0763 const struct in6_addr *addr6,
0764 unsigned int port)
0765 {
0766 unsigned int hash, mix = net_hash_mix(net);
0767
0768 if (ipv6_addr_any(addr6))
0769 hash = jhash_1word(0, mix);
0770 else if (ipv6_addr_v4mapped(addr6))
0771 hash = jhash_1word((__force u32)addr6->s6_addr32[3], mix);
0772 else
0773 hash = jhash2((__force u32 *)addr6->s6_addr32, 4, mix);
0774
0775 return hash ^ port;
0776 }
0777
0778
0779
0780
0781
0782 static inline bool ipv6_addr_orchid(const struct in6_addr *a)
0783 {
0784 return (a->s6_addr32[0] & htonl(0xfffffff0)) == htonl(0x20010010);
0785 }
0786
0787 static inline bool ipv6_addr_is_multicast(const struct in6_addr *addr)
0788 {
0789 return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000);
0790 }
0791
0792 static inline void ipv6_addr_set_v4mapped(const __be32 addr,
0793 struct in6_addr *v4mapped)
0794 {
0795 ipv6_addr_set(v4mapped,
0796 0, 0,
0797 htonl(0x0000FFFF),
0798 addr);
0799 }
0800
0801
0802
0803
0804
0805 static inline int __ipv6_addr_diff32(const void *token1, const void *token2, int addrlen)
0806 {
0807 const __be32 *a1 = token1, *a2 = token2;
0808 int i;
0809
0810 addrlen >>= 2;
0811
0812 for (i = 0; i < addrlen; i++) {
0813 __be32 xb = a1[i] ^ a2[i];
0814 if (xb)
0815 return i * 32 + 31 - __fls(ntohl(xb));
0816 }
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834 return addrlen << 5;
0835 }
0836
0837 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
0838 static inline int __ipv6_addr_diff64(const void *token1, const void *token2, int addrlen)
0839 {
0840 const __be64 *a1 = token1, *a2 = token2;
0841 int i;
0842
0843 addrlen >>= 3;
0844
0845 for (i = 0; i < addrlen; i++) {
0846 __be64 xb = a1[i] ^ a2[i];
0847 if (xb)
0848 return i * 64 + 63 - __fls(be64_to_cpu(xb));
0849 }
0850
0851 return addrlen << 6;
0852 }
0853 #endif
0854
0855 static inline int __ipv6_addr_diff(const void *token1, const void *token2, int addrlen)
0856 {
0857 #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64
0858 if (__builtin_constant_p(addrlen) && !(addrlen & 7))
0859 return __ipv6_addr_diff64(token1, token2, addrlen);
0860 #endif
0861 return __ipv6_addr_diff32(token1, token2, addrlen);
0862 }
0863
0864 static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addr *a2)
0865 {
0866 return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr));
0867 }
0868
0869 __be32 ipv6_select_ident(struct net *net,
0870 const struct in6_addr *daddr,
0871 const struct in6_addr *saddr);
0872 __be32 ipv6_proxy_select_ident(struct net *net, struct sk_buff *skb);
0873
0874 int ip6_dst_hoplimit(struct dst_entry *dst);
0875
0876 static inline int ip6_sk_dst_hoplimit(struct ipv6_pinfo *np, struct flowi6 *fl6,
0877 struct dst_entry *dst)
0878 {
0879 int hlimit;
0880
0881 if (ipv6_addr_is_multicast(&fl6->daddr))
0882 hlimit = np->mcast_hops;
0883 else
0884 hlimit = np->hop_limit;
0885 if (hlimit < 0)
0886 hlimit = ip6_dst_hoplimit(dst);
0887 return hlimit;
0888 }
0889
0890
0891
0892
0893
0894 static inline void iph_to_flow_copy_v6addrs(struct flow_keys *flow,
0895 const struct ipv6hdr *iph)
0896 {
0897 BUILD_BUG_ON(offsetof(typeof(flow->addrs), v6addrs.dst) !=
0898 offsetof(typeof(flow->addrs), v6addrs.src) +
0899 sizeof(flow->addrs.v6addrs.src));
0900 memcpy(&flow->addrs.v6addrs, &iph->saddr, sizeof(flow->addrs.v6addrs));
0901 flow->control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
0902 }
0903
0904 #if IS_ENABLED(CONFIG_IPV6)
0905
0906 static inline bool ipv6_can_nonlocal_bind(struct net *net,
0907 struct inet_sock *inet)
0908 {
0909 return net->ipv6.sysctl.ip_nonlocal_bind ||
0910 inet->freebind || inet->transparent;
0911 }
0912
0913
0914 #define IP6_AUTO_FLOW_LABEL_OFF 0
0915 #define IP6_AUTO_FLOW_LABEL_OPTOUT 1
0916 #define IP6_AUTO_FLOW_LABEL_OPTIN 2
0917 #define IP6_AUTO_FLOW_LABEL_FORCED 3
0918
0919 #define IP6_AUTO_FLOW_LABEL_MAX IP6_AUTO_FLOW_LABEL_FORCED
0920
0921 #define IP6_DEFAULT_AUTO_FLOW_LABELS IP6_AUTO_FLOW_LABEL_OPTOUT
0922
0923 static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
0924 __be32 flowlabel, bool autolabel,
0925 struct flowi6 *fl6)
0926 {
0927 u32 hash;
0928
0929
0930
0931
0932 flowlabel &= IPV6_FLOWLABEL_MASK;
0933
0934 if (flowlabel ||
0935 net->ipv6.sysctl.auto_flowlabels == IP6_AUTO_FLOW_LABEL_OFF ||
0936 (!autolabel &&
0937 net->ipv6.sysctl.auto_flowlabels != IP6_AUTO_FLOW_LABEL_FORCED))
0938 return flowlabel;
0939
0940 hash = skb_get_hash_flowi6(skb, fl6);
0941
0942
0943
0944
0945
0946 hash = rol32(hash, 16);
0947
0948 flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK;
0949
0950 if (net->ipv6.sysctl.flowlabel_state_ranges)
0951 flowlabel |= IPV6_FLOWLABEL_STATELESS_FLAG;
0952
0953 return flowlabel;
0954 }
0955
0956 static inline int ip6_default_np_autolabel(struct net *net)
0957 {
0958 switch (net->ipv6.sysctl.auto_flowlabels) {
0959 case IP6_AUTO_FLOW_LABEL_OFF:
0960 case IP6_AUTO_FLOW_LABEL_OPTIN:
0961 default:
0962 return 0;
0963 case IP6_AUTO_FLOW_LABEL_OPTOUT:
0964 case IP6_AUTO_FLOW_LABEL_FORCED:
0965 return 1;
0966 }
0967 }
0968 #else
0969 static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb,
0970 __be32 flowlabel, bool autolabel,
0971 struct flowi6 *fl6)
0972 {
0973 return flowlabel;
0974 }
0975 static inline int ip6_default_np_autolabel(struct net *net)
0976 {
0977 return 0;
0978 }
0979 #endif
0980
0981 #if IS_ENABLED(CONFIG_IPV6)
0982 static inline int ip6_multipath_hash_policy(const struct net *net)
0983 {
0984 return net->ipv6.sysctl.multipath_hash_policy;
0985 }
0986 static inline u32 ip6_multipath_hash_fields(const struct net *net)
0987 {
0988 return net->ipv6.sysctl.multipath_hash_fields;
0989 }
0990 #else
0991 static inline int ip6_multipath_hash_policy(const struct net *net)
0992 {
0993 return 0;
0994 }
0995 static inline u32 ip6_multipath_hash_fields(const struct net *net)
0996 {
0997 return 0;
0998 }
0999 #endif
1000
1001
1002
1003
1004 static inline void ip6_flow_hdr(struct ipv6hdr *hdr, unsigned int tclass,
1005 __be32 flowlabel)
1006 {
1007 *(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | flowlabel;
1008 }
1009
1010 static inline __be32 ip6_flowinfo(const struct ipv6hdr *hdr)
1011 {
1012 return *(__be32 *)hdr & IPV6_FLOWINFO_MASK;
1013 }
1014
1015 static inline __be32 ip6_flowlabel(const struct ipv6hdr *hdr)
1016 {
1017 return *(__be32 *)hdr & IPV6_FLOWLABEL_MASK;
1018 }
1019
1020 static inline u8 ip6_tclass(__be32 flowinfo)
1021 {
1022 return ntohl(flowinfo & IPV6_TCLASS_MASK) >> IPV6_TCLASS_SHIFT;
1023 }
1024
1025 static inline dscp_t ip6_dscp(__be32 flowinfo)
1026 {
1027 return inet_dsfield_to_dscp(ip6_tclass(flowinfo));
1028 }
1029
1030 static inline __be32 ip6_make_flowinfo(unsigned int tclass, __be32 flowlabel)
1031 {
1032 return htonl(tclass << IPV6_TCLASS_SHIFT) | flowlabel;
1033 }
1034
1035 static inline __be32 flowi6_get_flowlabel(const struct flowi6 *fl6)
1036 {
1037 return fl6->flowlabel & IPV6_FLOWLABEL_MASK;
1038 }
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048 int ipv6_rcv(struct sk_buff *skb, struct net_device *dev,
1049 struct packet_type *pt, struct net_device *orig_dev);
1050 void ipv6_list_rcv(struct list_head *head, struct packet_type *pt,
1051 struct net_device *orig_dev);
1052
1053 int ip6_rcv_finish(struct net *net, struct sock *sk, struct sk_buff *skb);
1054
1055
1056
1057
1058 int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
1059 __u32 mark, struct ipv6_txoptions *opt, int tclass, u32 priority);
1060
1061 int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr);
1062
1063 int ip6_append_data(struct sock *sk,
1064 int getfrag(void *from, char *to, int offset, int len,
1065 int odd, struct sk_buff *skb),
1066 void *from, size_t length, int transhdrlen,
1067 struct ipcm6_cookie *ipc6, struct flowi6 *fl6,
1068 struct rt6_info *rt, unsigned int flags);
1069
1070 int ip6_push_pending_frames(struct sock *sk);
1071
1072 void ip6_flush_pending_frames(struct sock *sk);
1073
1074 int ip6_send_skb(struct sk_buff *skb);
1075
1076 struct sk_buff *__ip6_make_skb(struct sock *sk, struct sk_buff_head *queue,
1077 struct inet_cork_full *cork,
1078 struct inet6_cork *v6_cork);
1079 struct sk_buff *ip6_make_skb(struct sock *sk,
1080 int getfrag(void *from, char *to, int offset,
1081 int len, int odd, struct sk_buff *skb),
1082 void *from, size_t length, int transhdrlen,
1083 struct ipcm6_cookie *ipc6,
1084 struct rt6_info *rt, unsigned int flags,
1085 struct inet_cork_full *cork);
1086
1087 static inline struct sk_buff *ip6_finish_skb(struct sock *sk)
1088 {
1089 return __ip6_make_skb(sk, &sk->sk_write_queue, &inet_sk(sk)->cork,
1090 &inet6_sk(sk)->cork);
1091 }
1092
1093 int ip6_dst_lookup(struct net *net, struct sock *sk, struct dst_entry **dst,
1094 struct flowi6 *fl6);
1095 struct dst_entry *ip6_dst_lookup_flow(struct net *net, const struct sock *sk, struct flowi6 *fl6,
1096 const struct in6_addr *final_dst);
1097 struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
1098 const struct in6_addr *final_dst,
1099 bool connected);
1100 struct dst_entry *ip6_dst_lookup_tunnel(struct sk_buff *skb,
1101 struct net_device *dev,
1102 struct net *net, struct socket *sock,
1103 struct in6_addr *saddr,
1104 const struct ip_tunnel_info *info,
1105 u8 protocol, bool use_cache);
1106 struct dst_entry *ip6_blackhole_route(struct net *net,
1107 struct dst_entry *orig_dst);
1108
1109
1110
1111
1112
1113 int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb);
1114 int ip6_forward(struct sk_buff *skb);
1115 int ip6_input(struct sk_buff *skb);
1116 int ip6_mc_input(struct sk_buff *skb);
1117 void ip6_protocol_deliver_rcu(struct net *net, struct sk_buff *skb, int nexthdr,
1118 bool have_final);
1119
1120 int __ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
1121 int ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb);
1122
1123
1124
1125
1126
1127 void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
1128 u8 *proto, struct in6_addr **daddr_p,
1129 struct in6_addr *saddr);
1130 void ipv6_push_frag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt,
1131 u8 *proto);
1132
1133 int ipv6_skip_exthdr(const struct sk_buff *, int start, u8 *nexthdrp,
1134 __be16 *frag_offp);
1135
1136 bool ipv6_ext_hdr(u8 nexthdr);
1137
1138 enum {
1139 IP6_FH_F_FRAG = (1 << 0),
1140 IP6_FH_F_AUTH = (1 << 1),
1141 IP6_FH_F_SKIP_RH = (1 << 2),
1142 };
1143
1144
1145 int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, int target,
1146 unsigned short *fragoff, int *fragflg);
1147
1148 int ipv6_find_tlv(const struct sk_buff *skb, int offset, int type);
1149
1150 struct in6_addr *fl6_update_dst(struct flowi6 *fl6,
1151 const struct ipv6_txoptions *opt,
1152 struct in6_addr *orig);
1153
1154
1155
1156
1157 DECLARE_STATIC_KEY_FALSE(ip6_min_hopcount);
1158
1159 int ipv6_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
1160 unsigned int optlen);
1161 int ipv6_getsockopt(struct sock *sk, int level, int optname,
1162 char __user *optval, int __user *optlen);
1163
1164 int __ip6_datagram_connect(struct sock *sk, struct sockaddr *addr,
1165 int addr_len);
1166 int ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len);
1167 int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *addr,
1168 int addr_len);
1169 int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr);
1170 void ip6_datagram_release_cb(struct sock *sk);
1171
1172 int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len,
1173 int *addr_len);
1174 int ipv6_recv_rxpmtu(struct sock *sk, struct msghdr *msg, int len,
1175 int *addr_len);
1176 void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, __be16 port,
1177 u32 info, u8 *payload);
1178 void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info);
1179 void ipv6_local_rxpmtu(struct sock *sk, struct flowi6 *fl6, u32 mtu);
1180
1181 int inet6_release(struct socket *sock);
1182 int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
1183 int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
1184 int peer);
1185 int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
1186 int inet6_compat_ioctl(struct socket *sock, unsigned int cmd,
1187 unsigned long arg);
1188
1189 int inet6_hash_connect(struct inet_timewait_death_row *death_row,
1190 struct sock *sk);
1191 int inet6_sendmsg(struct socket *sock, struct msghdr *msg, size_t size);
1192 int inet6_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
1193 int flags);
1194
1195
1196
1197
1198 extern const struct proto_ops inet6_stream_ops;
1199 extern const struct proto_ops inet6_dgram_ops;
1200 extern const struct proto_ops inet6_sockraw_ops;
1201
1202 struct group_source_req;
1203 struct group_filter;
1204
1205 int ip6_mc_source(int add, int omode, struct sock *sk,
1206 struct group_source_req *pgsr);
1207 int ip6_mc_msfilter(struct sock *sk, struct group_filter *gsf,
1208 struct sockaddr_storage *list);
1209 int ip6_mc_msfget(struct sock *sk, struct group_filter *gsf,
1210 struct sockaddr_storage __user *p);
1211
1212 #ifdef CONFIG_PROC_FS
1213 int ac6_proc_init(struct net *net);
1214 void ac6_proc_exit(struct net *net);
1215 int raw6_proc_init(void);
1216 void raw6_proc_exit(void);
1217 int tcp6_proc_init(struct net *net);
1218 void tcp6_proc_exit(struct net *net);
1219 int udp6_proc_init(struct net *net);
1220 void udp6_proc_exit(struct net *net);
1221 int udplite6_proc_init(void);
1222 void udplite6_proc_exit(void);
1223 int ipv6_misc_proc_init(void);
1224 void ipv6_misc_proc_exit(void);
1225 int snmp6_register_dev(struct inet6_dev *idev);
1226 int snmp6_unregister_dev(struct inet6_dev *idev);
1227
1228 #else
1229 static inline int ac6_proc_init(struct net *net) { return 0; }
1230 static inline void ac6_proc_exit(struct net *net) { }
1231 static inline int snmp6_register_dev(struct inet6_dev *idev) { return 0; }
1232 static inline int snmp6_unregister_dev(struct inet6_dev *idev) { return 0; }
1233 #endif
1234
1235 #ifdef CONFIG_SYSCTL
1236 struct ctl_table *ipv6_icmp_sysctl_init(struct net *net);
1237 struct ctl_table *ipv6_route_sysctl_init(struct net *net);
1238 int ipv6_sysctl_register(void);
1239 void ipv6_sysctl_unregister(void);
1240 #endif
1241
1242 int ipv6_sock_mc_join(struct sock *sk, int ifindex,
1243 const struct in6_addr *addr);
1244 int ipv6_sock_mc_join_ssm(struct sock *sk, int ifindex,
1245 const struct in6_addr *addr, unsigned int mode);
1246 int ipv6_sock_mc_drop(struct sock *sk, int ifindex,
1247 const struct in6_addr *addr);
1248
1249 static inline int ip6_sock_set_v6only(struct sock *sk)
1250 {
1251 if (inet_sk(sk)->inet_num)
1252 return -EINVAL;
1253 lock_sock(sk);
1254 sk->sk_ipv6only = true;
1255 release_sock(sk);
1256 return 0;
1257 }
1258
1259 static inline void ip6_sock_set_recverr(struct sock *sk)
1260 {
1261 lock_sock(sk);
1262 inet6_sk(sk)->recverr = true;
1263 release_sock(sk);
1264 }
1265
1266 static inline int __ip6_sock_set_addr_preferences(struct sock *sk, int val)
1267 {
1268 unsigned int pref = 0;
1269 unsigned int prefmask = ~0;
1270
1271
1272 switch (val & (IPV6_PREFER_SRC_PUBLIC |
1273 IPV6_PREFER_SRC_TMP |
1274 IPV6_PREFER_SRC_PUBTMP_DEFAULT)) {
1275 case IPV6_PREFER_SRC_PUBLIC:
1276 pref |= IPV6_PREFER_SRC_PUBLIC;
1277 prefmask &= ~(IPV6_PREFER_SRC_PUBLIC |
1278 IPV6_PREFER_SRC_TMP);
1279 break;
1280 case IPV6_PREFER_SRC_TMP:
1281 pref |= IPV6_PREFER_SRC_TMP;
1282 prefmask &= ~(IPV6_PREFER_SRC_PUBLIC |
1283 IPV6_PREFER_SRC_TMP);
1284 break;
1285 case IPV6_PREFER_SRC_PUBTMP_DEFAULT:
1286 prefmask &= ~(IPV6_PREFER_SRC_PUBLIC |
1287 IPV6_PREFER_SRC_TMP);
1288 break;
1289 case 0:
1290 break;
1291 default:
1292 return -EINVAL;
1293 }
1294
1295
1296 switch (val & (IPV6_PREFER_SRC_HOME | IPV6_PREFER_SRC_COA)) {
1297 case IPV6_PREFER_SRC_HOME:
1298 prefmask &= ~IPV6_PREFER_SRC_COA;
1299 break;
1300 case IPV6_PREFER_SRC_COA:
1301 pref |= IPV6_PREFER_SRC_COA;
1302 break;
1303 case 0:
1304 break;
1305 default:
1306 return -EINVAL;
1307 }
1308
1309
1310 switch (val & (IPV6_PREFER_SRC_CGA|IPV6_PREFER_SRC_NONCGA)) {
1311 case IPV6_PREFER_SRC_CGA:
1312 case IPV6_PREFER_SRC_NONCGA:
1313 case 0:
1314 break;
1315 default:
1316 return -EINVAL;
1317 }
1318
1319 inet6_sk(sk)->srcprefs = (inet6_sk(sk)->srcprefs & prefmask) | pref;
1320 return 0;
1321 }
1322
1323 static inline int ip6_sock_set_addr_preferences(struct sock *sk, bool val)
1324 {
1325 int ret;
1326
1327 lock_sock(sk);
1328 ret = __ip6_sock_set_addr_preferences(sk, val);
1329 release_sock(sk);
1330 return ret;
1331 }
1332
1333 static inline void ip6_sock_set_recvpktinfo(struct sock *sk)
1334 {
1335 lock_sock(sk);
1336 inet6_sk(sk)->rxopt.bits.rxinfo = true;
1337 release_sock(sk);
1338 }
1339
1340 #endif