diff options
Diffstat (limited to 'include/net/addrconf.h')
| -rw-r--r-- | include/net/addrconf.h | 31 | 
1 files changed, 19 insertions, 12 deletions
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index fb314de2b61..f679877bb60 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h @@ -67,6 +67,10 @@ int ipv6_chk_addr(struct net *net, const struct in6_addr *addr,  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, @@ -77,9 +81,9 @@ 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, -		      unsigned char banned_flags); +		      u32 banned_flags);  int ipv6_get_lladdr(struct net_device *dev, struct in6_addr *addr, -		    unsigned char banned_flags); +		    u32 banned_flags);  int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2);  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); @@ -201,8 +205,9 @@ void ipv6_sock_ac_close(struct sock *sk);  int ipv6_dev_ac_inc(struct net_device *dev, const struct in6_addr *addr);  int __ipv6_dev_ac_dec(struct inet6_dev *idev, const struct in6_addr *addr);  bool ipv6_chk_acast_addr(struct net *net, struct net_device *dev, -				const struct in6_addr *addr); - +			 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); @@ -244,6 +249,13 @@ static inline struct inet6_dev *in6_dev_get(const struct net_device *dev)  	return idev;  } +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; +} +  void in6_dev_finish_destroy(struct inet6_dev *idev);  static inline void in6_dev_put(struct inet6_dev *idev) @@ -294,15 +306,10 @@ static inline void addrconf_addr_solict_mult(const struct in6_addr *addr,  		      htonl(0xFF000000) | addr->s6_addr32[3]);  } -static inline bool ipv6_addr_is_multicast(const struct in6_addr *addr) -{ -	return (addr->s6_addr32[0] & htonl(0xFF000000)) == htonl(0xFF000000); -} -  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 -	__u64 *p = (__u64 *)addr; +	__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)) | @@ -314,7 +321,7 @@ static inline bool ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr)  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 -	__u64 *p = (__u64 *)addr; +	__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)) | @@ -331,7 +338,7 @@ static inline bool ipv6_addr_is_isatap(const struct in6_addr *addr)  static inline bool ipv6_addr_is_solict_mult(const struct in6_addr *addr)  {  #if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) && BITS_PER_LONG == 64 -	__u64 *p = (__u64 *)addr; +	__be64 *p = (__be64 *)addr;  	return ((p[0] ^ cpu_to_be64(0xff02000000000000UL)) |  		((p[1] ^ cpu_to_be64(0x00000001ff000000UL)) &  		 cpu_to_be64(0xffffffffff000000UL))) == 0UL;  | 
