Something went wrong. Try again.
Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389/* SPDX-License-Identifier: GPL-2.0 */#ifndef _IPV6_H#define _IPV6_H
#include <uapi/linux/ipv6.h>#include <linux/cache.h>
#define ipv6_optlen(p) (((p)->hdrlen+1) << 3)#define ipv6_authlen(p) (((p)->hdrlen+2) << 2)/* * This structure contains configuration options per IPv6 link. */struct ipv6_devconf { /* RX & TX fastpath fields. */ __cacheline_group_begin(ipv6_devconf_read_txrx); __s32 disable_ipv6; __s32 hop_limit; __s32 mtu6; __s32 forwarding; __s32 force_forwarding; __s32 disable_policy; __s32 proxy_ndp; __cacheline_group_end(ipv6_devconf_read_txrx);
__s32 accept_ra; __s32 accept_redirects; __s32 autoconf; __s32 dad_transmits; __s32 rtr_solicits; __s32 rtr_solicit_interval; __s32 rtr_solicit_max_interval; __s32 rtr_solicit_delay; __s32 force_mld_version; __s32 mldv1_unsolicited_report_interval; __s32 mldv2_unsolicited_report_interval; __s32 use_tempaddr; __s32 temp_valid_lft; __s32 temp_prefered_lft; __s32 regen_min_advance; __s32 regen_max_retry; __s32 max_desync_factor; __s32 max_addresses; __s32 accept_ra_defrtr; __u32 ra_defrtr_metric; __s32 accept_ra_min_hop_limit; __s32 accept_ra_min_lft; __s32 accept_ra_pinfo; __s32 ignore_routes_with_linkdown;#ifdef CONFIG_IPV6_ROUTER_PREF __s32 accept_ra_rtr_pref; __s32 rtr_probe_interval;#ifdef CONFIG_IPV6_ROUTE_INFO __s32 accept_ra_rt_info_min_plen; __s32 accept_ra_rt_info_max_plen;#endif#endif __s32 accept_source_route; __s32 accept_ra_from_local;#ifdef CONFIG_IPV6_OPTIMISTIC_DAD __s32 optimistic_dad; __s32 use_optimistic;#endif#ifdef CONFIG_IPV6_MROUTE atomic_t mc_forwarding;#endif __s32 drop_unicast_in_l2_multicast; __s32 accept_dad; __s32 force_tllao; __s32 ndisc_notify; __s32 suppress_frag_ndisc; __s32 accept_ra_mtu; __s32 drop_unsolicited_na; __s32 accept_untracked_na; struct ipv6_stable_secret { bool initialized; struct in6_addr secret; } stable_secret; __s32 use_oif_addrs_only; __s32 keep_addr_on_down; __s32 seg6_enabled;#ifdef CONFIG_IPV6_SEG6_HMAC __s32 seg6_require_hmac;#endif __u32 enhanced_dad; __u32 addr_gen_mode; __s32 ndisc_tclass; __s32 rpl_seg_enabled; __u32 ioam6_id; __u32 ioam6_id_wide; __u8 ioam6_enabled; __u8 ndisc_evict_nocarrier; __u8 ra_honor_pio_life; __u8 ra_honor_pio_pflag;
struct ctl_table_header *sysctl_header;};
struct ipv6_params { __s32 disable_ipv6; __s32 autoconf;};extern struct ipv6_params ipv6_defaults;#include <linux/tcp.h>#include <linux/udp.h>
#include <net/inet_sock.h>
static inline struct ipv6hdr *ipv6_hdr(const struct sk_buff *skb){ return (struct ipv6hdr *)skb_network_header(skb);}
static inline struct ipv6hdr *inner_ipv6_hdr(const struct sk_buff *skb){ return (struct ipv6hdr *)skb_inner_network_header(skb);}
static inline struct ipv6hdr *ipipv6_hdr(const struct sk_buff *skb){ return (struct ipv6hdr *)skb_transport_header(skb);}
static inline unsigned int ipv6_transport_len(const struct sk_buff *skb){ return ntohs(ipv6_hdr(skb)->payload_len) + sizeof(struct ipv6hdr) - skb_network_header_len(skb);}
static inline unsigned intipv6_payload_len(const struct sk_buff *skb, const struct ipv6hdr *ip6){ u32 len = ntohs(ip6->payload_len);
return (len || !skb_is_gso(skb) || !skb_is_gso_tcp(skb)) ? len : skb->len - skb_network_offset(skb) - sizeof(struct ipv6hdr);}
static inline unsigned int skb_ipv6_payload_len(const struct sk_buff *skb){ return ipv6_payload_len(skb, ipv6_hdr(skb));}
#define IPV6_MAXPLEN 65535
static inline void ipv6_set_payload_len(struct ipv6hdr *ip6, unsigned int len){ ip6->payload_len = len <= IPV6_MAXPLEN ? htons(len) : 0;}
/* This structure contains results of exthdrs parsing as offsets from skb->nh. */
struct inet6_skb_parm { int iif; __be16 ra; __u16 dst0; __u16 srcrt; __u16 dst1; __u16 lastopt; __u16 nhoff; __u16 flags;#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) __u16 dsthao;#endif __u16 frag_max_size; __u16 srhoff;
#define IP6SKB_XFRM_TRANSFORMED 1#define IP6SKB_FORWARDED 2#define IP6SKB_REROUTED 4#define IP6SKB_ROUTERALERT 8#define IP6SKB_FRAGMENTED 16#define IP6SKB_HOPBYHOP 32#define IP6SKB_L3SLAVE 64#define IP6SKB_JUMBOGRAM 128#define IP6SKB_SEG6 256#define IP6SKB_MULTIPATH 1024#define IP6SKB_MCROUTE 2048};
#if defined(CONFIG_NET_L3_MASTER_DEV)static inline bool ipv6_l3mdev_skb(__u16 flags){ return flags & IP6SKB_L3SLAVE;}#elsestatic inline bool ipv6_l3mdev_skb(__u16 flags){ return false;}#endif
#define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb))#define IP6CBMTU(skb) ((struct ip6_mtuinfo *)((skb)->cb))
static inline int inet6_iif(const struct sk_buff *skb){ bool l3_slave = ipv6_l3mdev_skb(IP6CB(skb)->flags);
return l3_slave ? skb->skb_iif : IP6CB(skb)->iif;}
static inline bool inet6_is_jumbogram(const struct sk_buff *skb){ return !!(IP6CB(skb)->flags & IP6SKB_JUMBOGRAM);}
/* can not be used in TCP layer after tcp_v6_fill_cb */static inline int inet6_sdif(const struct sk_buff *skb){#if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV) if (skb && ipv6_l3mdev_skb(IP6CB(skb)->flags)) return IP6CB(skb)->iif;#endif return 0;}
struct tcp6_request_sock { struct tcp_request_sock tcp6rsk_tcp;};
struct ipv6_mc_socklist;struct ipv6_ac_socklist;struct ipv6_fl_socklist;
/* struct ipv6_pinfo - ipv6 private area */struct ipv6_pinfo { /* Used in tx path (inet6_csk_route_socket(), ip6_xmit()) */ struct in6_addr saddr; union { struct in6_addr daddr; struct in6_addr final; }; __be32 flow_label; u32 dst_cookie; struct ipv6_txoptions __rcu *opt; s16 hop_limit; u8 pmtudisc; u8 tclass;#ifdef CONFIG_IPV6_SUBTREES bool saddr_cache;#endif bool daddr_cache;
u8 mcast_hops; u32 frag_size;
int ucast_oif; int mcast_oif;
/* pktoption flags */ union { struct { u16 srcrt:1, osrcrt:1, rxinfo:1, rxoinfo:1, rxhlim:1, rxohlim:1, hopopts:1, ohopopts:1, dstopts:1, odstopts:1, rxflow:1, rxtclass:1, rxpmtu:1, rxorigdstaddr:1, recvfragsize:1; /* 1 bits hole */ } bits; u16 all; } rxopt;
/* sockopt flags */ u8 srcprefs; /* 001: prefer temporary address * 010: prefer public address * 100: prefer care-of address */ u8 min_hopcount; __be32 rcv_flowinfo; struct in6_pktinfo sticky_pktinfo;
struct sk_buff *pktoptions; struct sk_buff *rxpmtu;
struct ipv6_mc_socklist __rcu *ipv6_mc_list; struct ipv6_ac_socklist *ipv6_ac_list;};
/* We currently use available bits from inet_sk(sk)->inet_flags, * this could change in the future. */#define inet6_test_bit(nr, sk) \ test_bit(INET_FLAGS_##nr, &inet_sk(sk)->inet_flags)#define inet6_set_bit(nr, sk) \ set_bit(INET_FLAGS_##nr, &inet_sk(sk)->inet_flags)#define inet6_clear_bit(nr, sk) \ clear_bit(INET_FLAGS_##nr, &inet_sk(sk)->inet_flags)#define inet6_assign_bit(nr, sk, val) \ assign_bit(INET_FLAGS_##nr, &inet_sk(sk)->inet_flags, val)
/* WARNING: don't change the layout of the members in {raw,udp,tcp}6_sock! */struct raw6_sock { /* inet_sock has to be the first member of raw6_sock */ struct inet_sock inet; __u32 checksum; /* perform checksum */ __u32 offset; /* checksum offset */ struct icmp6_filter filter; __u32 ip6mr_table; struct numa_drop_counters drop_counters; struct ipv6_pinfo inet6;};
struct udp6_sock { struct udp_sock udp;
struct ipv6_pinfo inet6;};
struct tcp6_sock { struct tcp_sock tcp;
struct ipv6_pinfo inet6;};
extern int inet6_sk_rebuild_header(struct sock *sk);
struct tcp6_timewait_sock { struct tcp_timewait_sock tcp6tw_tcp;};
#if IS_ENABLED(CONFIG_IPV6)extern int disable_ipv6_mod;
static inline bool ipv6_mod_enabled(void){ return disable_ipv6_mod == 0;}
static inline struct ipv6_pinfo *inet6_sk(const struct sock *__sk){ return sk_fullsock(__sk) ? inet_sk(__sk)->pinet6 : NULL;}
#define raw6_sk(ptr) container_of_const(ptr, struct raw6_sock, inet.sk)
#define ipv6_only_sock(sk) (sk->sk_ipv6only)#define ipv6_sk_rxinfo(sk) ((sk)->sk_family == PF_INET6 && \ inet6_sk(sk)->rxopt.bits.rxinfo)
static inline const struct in6_addr *inet6_rcv_saddr(const struct sock *sk){ if (sk->sk_family == AF_INET6) return &sk->sk_v6_rcv_saddr; return NULL;}
static inline int inet_v6_ipv6only(const struct sock *sk){ /* ipv6only field is at same position for timewait and other sockets */ return ipv6_only_sock(sk);}#else#define ipv6_only_sock(sk) 0#define ipv6_sk_rxinfo(sk) 0
static inline bool ipv6_mod_enabled(void){ return false;}
static inline struct ipv6_pinfo * inet6_sk(const struct sock *__sk){ return NULL;}
static inline struct raw6_sock *raw6_sk(const struct sock *sk){ return NULL;}
#define inet6_rcv_saddr(__sk) NULL#define inet_v6_ipv6only(__sk) 0#endif /* IS_ENABLED(CONFIG_IPV6) */#endif /* _IPV6_H */