cregit-Linux how code gets into the kernel

Release 4.15 include/net/addrconf.h

Directory: include/net
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ADDRCONF_H

#define _ADDRCONF_H


#define MAX_RTR_SOLICITATIONS		-1		
/* unlimited */

#define RTR_SOLICITATION_INTERVAL	(4*HZ)

#define RTR_SOLICITATION_MAX_INTERVAL	(3600*HZ)	
/* 1 hour */


#define MIN_VALID_LIFETIME		(2*3600)	
/* 2 hours */


#define TEMP_VALID_LIFETIME		(7*86400)

#define TEMP_PREFERRED_LIFETIME		(86400)

#define REGEN_MAX_RETRY			(3)

#define MAX_DESYNC_FACTOR		(600)


#define ADDR_CHECK_FREQUENCY		(120*HZ)


#define IPV6_MAX_ADDRESSES		16


#define ADDRCONF_TIMER_FUZZ_MINUS	(HZ > 50 ? HZ / 50 : 1)

#define ADDRCONF_TIMER_FUZZ		(HZ / 4)

#define ADDRCONF_TIMER_FUZZ_MAX		(HZ)


#define ADDRCONF_NOTIFY_PRIORITY	0

#include <linux/in.h>
#include <linux/in6.h>


struct prefix_info {
	
__u8			type;
	
__u8			length;
	
__u8			prefix_len;

#if defined(__BIG_ENDIAN_BITFIELD)
	
__u8			onlink : 1,
			 	
autoconf : 1,
				
reserved : 6;
#elif defined(__LITTLE_ENDIAN_BITFIELD)
	
__u8			reserved : 6,
				
autoconf : 1,
				
onlink : 1;
#else
#error "Please fix <asm/byteorder.h>"
#endif
	
__be32			valid;
	
__be32			prefered;
	
__be32			reserved2;

	
struct in6_addr		prefix;
};

#include <linux/netdevice.h>
#include <net/if_inet6.h>
#include <net/ipv6.h>


struct in6_validator_info {
	
struct in6_addr		i6vi_addr;
	
struct inet6_dev	*i6vi_dev;
	
struct netlink_ext_ack	*extack;
};

int addrconf_init(void);
void addrconf_cleanup(void);

int addrconf_add_ifaddr(struct net *net, void __user *arg);
int addrconf_del_ifaddr(struct net *net, void __user *arg);
int addrconf_set_dstaddr(struct net *net, void __user *arg);

int ipv6_chk_addr(struct net *net, const struct in6_addr *addr,
		  const struct net_device *dev, int strict);
int ipv6_chk_addr_and_flags(struct net *net, const struct in6_addr *addr,
			    const struct net_device *dev, int strict,
			    u32 banned_flags);

#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
int ipv6_chk_home_addr(struct net *net, const struct in6_addr *addr);
#endif

bool ipv6_chk_custom_prefix(const struct in6_addr *addr,
				   const unsigned int prefix_len,
				   struct net_device *dev);

int ipv6_chk_prefix(const struct in6_addr *addr, struct net_device *dev);

struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net,
				     const struct in6_addr *addr,
				     struct net_device *dev, int strict);

int ipv6_dev_get_saddr(struct net *net, const struct net_device *dev,
		       const struct in6_addr *daddr, unsigned int srcprefs,
		       struct in6_addr *saddr);
int __ipv6_get_lladdr(struct inet6_dev *idev, struct in6_addr *addr,
		      u32 banned_flags);
int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr,
		    u32 banned_flags);
bool inet_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2,
			  bool match_wildcard);
void addrconf_join_solict(struct net_device *dev, const struct in6_addr *addr);
void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr);

void addrconf_add_linklocal(struct inet6_dev *idev,
			    const struct in6_addr *addr, u32 flags);

int addrconf_prefix_rcv_add_addr(struct net *net, struct net_device *dev,
				 const struct prefix_info *pinfo,
				 struct inet6_dev *in6_dev,
				 const struct in6_addr *addr, int addr_type,
				 u32 addr_flags, bool sllao, bool tokenized,
				 __u32 valid_lft, u32 prefered_lft);


static inline void addrconf_addr_eui48_base(u8 *eui, const char *const addr) { memcpy(eui, addr, 3); eui[3] = 0xFF; eui[4] = 0xFE; memcpy(eui + 5, addr + 3, 3); }

Contributors

PersonTokensPropCommitsCommitProp
Yuval Shaia53100.00%1100.00%
Total53100.00%1100.00%


static inline void addrconf_addr_eui48(u8 *eui, const char *const addr) { addrconf_addr_eui48_base(eui, addr); eui[0] ^= 2; }

Contributors

PersonTokensPropCommitsCommitProp
Yuval Shaia31100.00%1100.00%
Total31100.00%1100.00%


static inline int addrconf_ifid_eui48(u8 *eui, struct net_device *dev) { if (dev->addr_len != ETH_ALEN) return -1; /* * The zSeries OSA network cards can be shared among various * OS instances, but the OSA cards have only one MAC address. * This leads to duplicate address conflicts in conjunction * with IPv6 if more than one instance uses the same card. * * The driver for these cards can deliver a unique 16-bit * identifier for each instance sharing the same card. It is * placed instead of 0xFFFE in the interface identifier. The * "u" bit of the interface identifier is not inverted in this * case. Hence the resulting interface identifier has local * scope according to RFC2373. */ addrconf_addr_eui48_base(eui, dev->dev_addr); if (dev->dev_id) { eui[3] = (dev->dev_id >> 8) & 0xFF; eui[4] = dev->dev_id & 0xFF; } else { eui[0] ^= 2; } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Matan Barak8397.65%150.00%
Yuval Shaia22.35%150.00%
Total85100.00%2100.00%


static inline unsigned long addrconf_timeout_fixup(u32 timeout, unsigned int unit) { if (timeout == 0xffffffff) return ~0UL; /* * Avoid arithmetic overflow. * Assuming unit is constant and non-zero, this "if" statement * will go away on 64bit archs. */ if (0xfffffffe > LONG_MAX / unit && timeout > LONG_MAX / unit) return LONG_MAX / unit; return timeout; }

Contributors

PersonTokensPropCommitsCommitProp
Hideaki Yoshifuji / 吉藤英明4797.92%150.00%
Eric Dumazet12.08%150.00%
Total48100.00%2100.00%


static inline int addrconf_finite_timeout(unsigned long timeout) { return ~timeout; }

Contributors

PersonTokensPropCommitsCommitProp
Hideaki Yoshifuji / 吉藤英明15100.00%1100.00%
Total15100.00%1100.00%

/* * IPv6 Address Label subsystem (addrlabel.c) */ int ipv6_addr_label_init(void); void ipv6_addr_label_cleanup(void); void ipv6_addr_label_rtnl_register(void); u32 ipv6_addr_label(struct net *net, const struct in6_addr *addr, int type, int ifindex); /* * multicast prototypes (mcast.c) */ int ipv6_sock_mc_join(struct sock *sk, int ifindex, const struct in6_addr *addr); int ipv6_sock_mc_drop(struct sock *sk, int ifindex, const struct in6_addr *addr); void __ipv6_sock_mc_close(struct sock *sk); void ipv6_sock_mc_close(struct sock *sk); bool inet6_mc_check(struct sock *sk, const struct in6_addr *mc_addr, const struct in6_addr *src_addr); int ipv6_dev_mc_inc(struct net_device *dev, const struct in6_addr *addr); int __ipv6_dev_mc_dec(struct inet6_dev *idev, const struct in6_addr *addr); int ipv6_dev_mc_dec(struct net_device *dev, const struct in6_addr *addr); void ipv6_mc_up(struct inet6_dev *idev); void ipv6_mc_down(struct inet6_dev *idev); void ipv6_mc_unmap(struct inet6_dev *idev); void ipv6_mc_remap(struct inet6_dev *idev); void ipv6_mc_init_dev(struct inet6_dev *idev); void ipv6_mc_destroy_dev(struct inet6_dev *idev); int ipv6_mc_check_mld(struct sk_buff *skb, struct sk_buff **skb_trimmed); void addrconf_dad_failure(struct sk_buff *skb, struct inet6_ifaddr *ifp); bool ipv6_chk_mcast_addr(struct net_device *dev, const struct in6_addr *group, const struct in6_addr *src_addr); void ipv6_mc_dad_complete(struct inet6_dev *idev); /* A stub used by vxlan module. This is ugly, ideally these * symbols should be built into the core kernel. */ struct ipv6_stub { int (*ipv6_sock_mc_join)(struct sock *sk, int ifindex, const struct in6_addr *addr); int (*ipv6_sock_mc_drop)(struct sock *sk, int ifindex, const struct in6_addr *addr); int (*ipv6_dst_lookup)(struct net *net, struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6); void (*udpv6_encap_enable)(void); void (*ndisc_send_na)(struct net_device *dev, const struct in6_addr *daddr, const struct in6_addr *solicited_addr, bool router, bool solicited, bool override, bool inc_opt); struct neigh_table *nd_tbl; }; extern const struct ipv6_stub *ipv6_stub __read_mostly; /* * identify MLD packets for MLD filter exceptions */
static inline bool ipv6_is_mld(struct sk_buff *skb, int nexthdr, int offset) { struct icmp6hdr *hdr; if (nexthdr != IPPROTO_ICMPV6 || !pskb_network_may_pull(skb, offset + sizeof(struct icmp6hdr))) return false; hdr = (struct icmp6hdr *)(skb_network_header(skb) + offset); switch (hdr->icmp6_type) { case ICMPV6_MGM_QUERY: case ICMPV6_MGM_REPORT: case ICMPV6_MGM_REDUCTION: case ICMPV6_MLD2_REPORT: return true; default: break; } return false; }

Contributors

PersonTokensPropCommitsCommitProp
Hideaki Yoshifuji / 吉藤英明7987.78%133.33%
David L Stevens1011.11%133.33%
Eric Dumazet11.11%133.33%
Total90100.00%3100.00%

void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao); /* * anycast prototypes (anycast.c) */ int ipv6_sock_ac_join(struct sock *sk, int ifindex, const struct in6_addr *addr); int ipv6_sock_ac_drop(struct sock *sk, int ifindex, const struct in6_addr *addr); void ipv6_sock_ac_close(struct sock *sk); int __ipv6_dev_ac_inc(struct inet6_dev *idev, const struct in6_addr *addr); int __ipv6_dev_ac_dec(struct inet6_dev *idev, const struct in6_addr *addr); void ipv6_ac_destroy_dev(struct inet6_dev *idev); bool ipv6_chk_acast_addr(struct net *net, struct net_device *dev, const struct in6_addr *addr); bool ipv6_chk_acast_addr_src(struct net *net, struct net_device *dev, const struct in6_addr *addr); /* Device notifier */ int register_inet6addr_notifier(struct notifier_block *nb); int unregister_inet6addr_notifier(struct notifier_block *nb); int inet6addr_notifier_call_chain(unsigned long val, void *v); int register_inet6addr_validator_notifier(struct notifier_block *nb); int unregister_inet6addr_validator_notifier(struct notifier_block *nb); int inet6addr_validator_notifier_call_chain(unsigned long val, void *v); void inet6_netconf_notify_devconf(struct net *net, int event, int type, int ifindex, struct ipv6_devconf *devconf); /** * __in6_dev_get - get inet6_dev pointer from netdevice * @dev: network device * * Caller must hold rcu_read_lock or RTNL, because this function * does not take a reference on the inet6_dev. */
static inline struct inet6_dev *__in6_dev_get(const struct net_device *dev) { return rcu_dereference_rtnl(dev->ip6_ptr); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)1982.61%250.00%
Eric Dumazet28.70%125.00%
Hideaki Yoshifuji / 吉藤英明28.70%125.00%
Total23100.00%4100.00%

/** * in6_dev_get - get inet6_dev pointer from netdevice * @dev: network device * * This version can be used in any context, and takes a reference * on the inet6_dev. Callers must use in6_dev_put() later to * release this reference. */
static inline struct inet6_dev *in6_dev_get(const struct net_device *dev) { struct inet6_dev *idev; rcu_read_lock(); idev = rcu_dereference(dev->ip6_ptr); if (idev) refcount_inc(&idev->refcnt); rcu_read_unlock(); return idev; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3978.00%240.00%
Hideaki Yoshifuji / 吉藤英明612.00%120.00%
Eric Dumazet48.00%120.00%
Elena Reshetova12.00%120.00%
Total50100.00%5100.00%


static inline struct neigh_parms *__in6_dev_nd_parms_get_rcu(const struct net_device *dev) { struct inet6_dev *idev = __in6_dev_get(dev); return idev ? idev->nd_parms : NULL; }

Contributors

PersonTokensPropCommitsCommitProp
Jiri Pirko34100.00%1100.00%
Total34100.00%1100.00%

void in6_dev_finish_destroy(struct inet6_dev *idev);
static inline void in6_dev_put(struct inet6_dev *idev) { if (refcount_dec_and_test(&idev->refcnt)) in6_dev_finish_destroy(idev); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)2696.30%375.00%
Elena Reshetova13.70%125.00%
Total27100.00%4100.00%


static inline void in6_dev_put_clear(struct inet6_dev **pidev) { struct inet6_dev *idev = *pidev; if (idev) { in6_dev_put(idev); *pidev = NULL; } }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet37100.00%1100.00%
Total37100.00%1100.00%


static inline void __in6_dev_put(struct inet6_dev *idev) { refcount_dec(&idev->refcnt); }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet1575.00%133.33%
Linus Torvalds (pre-git)420.00%133.33%
Elena Reshetova15.00%133.33%
Total20100.00%3100.00%


static inline void in6_dev_hold(struct inet6_dev *idev) { refcount_inc(&idev->refcnt); }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet1575.00%133.33%
Linus Torvalds (pre-git)420.00%133.33%
Elena Reshetova15.00%133.33%
Total20100.00%3100.00%

void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp);
static inline void in6_ifa_put(struct inet6_ifaddr *ifp) { if (refcount_dec_and_test(&ifp->refcnt)) inet6_ifa_finish_destroy(ifp); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)2696.30%266.67%
Elena Reshetova13.70%133.33%
Total27100.00%3100.00%


static inline void __in6_ifa_put(struct inet6_ifaddr *ifp) { refcount_dec(&ifp->refcnt); }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet1575.00%125.00%
Linus Torvalds (pre-git)315.00%125.00%
Hideaki Yoshifuji / 吉藤英明15.00%125.00%
Elena Reshetova15.00%125.00%
Total20100.00%4100.00%


static inline void in6_ifa_hold(struct inet6_ifaddr *ifp) { refcount_inc(&ifp->refcnt); }

Contributors

PersonTokensPropCommitsCommitProp
Eric Dumazet1575.00%125.00%
Linus Torvalds (pre-git)315.00%125.00%
Elena Reshetova15.00%125.00%
Hideaki Yoshifuji / 吉藤英明15.00%125.00%
Total20100.00%4100.00%

/* * compute link-local solicited-node multicast address */
static inline void addrconf_addr_solict_mult(const struct in6_addr *addr, struct in6_addr *solicited) { ipv6_addr_set(solicited, htonl(0xFF020000), 0, htonl(0x1), htonl(0xFF000000) | addr->s6_addr32[3]); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)4289.36%350.00%
Hideaki Yoshifuji / 吉藤英明48.51%233.33%
Linus Torvalds12.13%116.67%
Total47100.00%6100.00%


static inline bool ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr) { #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 __be64 *p = (__be64 *)addr; return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | (p[1] ^ cpu_to_be64(1))) == 0UL; #else return ((addr->s6_addr32[0] ^ htonl(0xff020000)) | addr->s6_addr32[1] | addr->s6_addr32[2] | (addr->s6_addr32[3] ^ htonl(0x00000001))) == 0; #endif }

Contributors

PersonTokensPropCommitsCommitProp
Hideaki Yoshifuji / 吉藤英明11198.23%480.00%
Björn Mork21.77%120.00%
Total113100.00%5100.00%


static inline bool ipv6_addr_is_ll_all_routers(const struct in6_addr *addr) { #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 __be64 *p = (__be64 *)addr; return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | (p[1] ^ cpu_to_be64(2))) == 0UL; #else return ((addr->s6_addr32[0] ^ htonl(0xff020000)) | addr->s6_addr32[1] | addr->s6_addr32[2] | (addr->s6_addr32[3] ^ htonl(0x00000002))) == 0; #endif }

Contributors

PersonTokensPropCommitsCommitProp
Hideaki Yoshifuji / 吉藤英明11198.23%480.00%
Björn Mork21.77%120.00%
Total113100.00%5100.00%


static inline bool ipv6_addr_is_isatap(const struct in6_addr *addr) { return (addr->s6_addr32[2] | htonl(0x02000000)) == htonl(0x02005EFE); }

Contributors

PersonTokensPropCommitsCommitProp
Fred L. Templin3296.97%150.00%
Hideaki Yoshifuji / 吉藤英明13.03%150.00%
Total33100.00%2100.00%


static inline bool ipv6_addr_is_solict_mult(const struct in6_addr *addr) { #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 __be64 *p = (__be64 *)addr; return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) | ((p[1] ^ cpu_to_be64(0x00000001ff000000UL)) & cpu_to_be64(0xffffffffff000000UL))) == 0UL; #else return ((addr->s6_addr32[0] ^ htonl(0xff020000)) | addr->s6_addr32[1] | (addr->s6_addr32[2] ^ htonl(0x00000001)) | (addr->s6_addr[12] ^ 0xff)) == 0; #endif }

Contributors

PersonTokensPropCommitsCommitProp
Hideaki Yoshifuji / 吉藤英明12298.39%266.67%
Björn Mork21.61%133.33%
Total124100.00%3100.00%

#ifdef CONFIG_PROC_FS int if6_proc_init(void); void if6_proc_exit(void); #endif #endif

Overall Contributors

PersonTokensPropCommitsCommitProp
Hideaki Yoshifuji / 吉藤英明62327.66%2221.57%
Linus Torvalds (pre-git)50522.42%98.82%
Américo Wang1737.68%87.84%
David L Stevens1416.26%32.94%
Eric Dumazet1205.33%54.90%
Yuval Shaia863.82%10.98%
Matan Barak833.69%10.98%
Alexander Aring672.98%21.96%
Jiri Pirko482.13%32.94%
Krister Johansen441.95%10.98%
Daniel Lezcano351.55%54.90%
Fred L. Templin351.55%10.98%
Linus Torvalds291.29%32.94%
Erik Kline271.20%10.98%
Masahide Nakamura210.93%21.96%
Catalin(ux aka Dino) M. Boie200.89%10.98%
Nicolas Dichtel200.89%10.98%
François-Xavier Le Bail200.89%10.98%
Moni Shoua180.80%10.98%
Arnaldo Carvalho de Melo170.75%10.98%
Linus Lüssing150.67%10.98%
Neil Horman100.44%32.94%
Hannes Frederic Sowa90.40%10.98%
Sabrina Dubroca90.40%10.98%
David Ahern80.36%21.96%
Elena Reshetova70.31%21.96%
Maciej Żenczykowski70.31%10.98%
Ville Nuorvala60.27%10.98%
Björn Mork60.27%10.98%
Al Viro60.27%21.96%
Benjamin Thery50.22%10.98%
Brian Haley50.22%10.98%
Roopa Prabhu50.22%10.98%
Vishwanath Pai50.22%10.98%
Patrick McHardy40.18%21.96%
Herbert Xu40.18%21.96%
Craig Gallek30.13%10.98%
Lorenzo Colitti10.04%10.98%
Josef Bacik10.04%10.98%
Joe Perches10.04%10.98%
Greg Kroah-Hartman10.04%10.98%
Florian Westphal10.04%10.98%
Noriaki Takamiya10.04%10.98%
Total2252100.00%102100.00%
Directory: include/net
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.