2005-04-16 15:20:36 -07:00
# ifndef _ADDRCONF_H
# define _ADDRCONF_H
# define RETRANS_TIMER HZ
# define MAX_RTR_SOLICITATIONS 3
# define RTR_SOLICITATION_INTERVAL (4*HZ)
# define MIN_VALID_LIFETIME (2*3600) /* 2 hours */
# define TEMP_VALID_LIFETIME (7*86400)
# define TEMP_PREFERRED_LIFETIME (86400)
# define REGEN_MAX_RETRY (5)
# define MAX_DESYNC_FACTOR (600)
# define ADDR_CHECK_FREQUENCY (120*HZ)
# define IPV6_MAX_ADDRESSES 16
2007-11-29 22:11:40 +11:00
# include <linux/in.h>
2005-05-03 22:17:18 -07:00
# include <linux/in6.h>
2005-04-16 15:20:36 -07:00
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
2006-11-14 20:56:00 -08:00
__be32 valid ;
__be32 prefered ;
__be32 reserved2 ;
2005-04-16 15:20:36 -07:00
struct in6_addr prefix ;
} ;
# ifdef __KERNEL__
# include <linux/netdevice.h>
# include <net/if_inet6.h>
2005-05-03 14:25:13 -07:00
# include <net/ipv6.h>
2005-04-16 15:20:36 -07:00
# define IN6_ADDR_HSIZE 16
extern int addrconf_init ( void ) ;
extern void addrconf_cleanup ( void ) ;
2008-03-05 10:46:57 -08:00
extern int addrconf_add_ifaddr ( struct net * net ,
void __user * arg ) ;
extern int addrconf_del_ifaddr ( struct net * net ,
void __user * arg ) ;
extern int addrconf_set_dstaddr ( struct net * net ,
void __user * arg ) ;
2005-04-16 15:20:36 -07:00
2008-01-10 22:43:18 -08:00
extern int ipv6_chk_addr ( struct net * net ,
struct in6_addr * addr ,
2005-04-16 15:20:36 -07:00
struct net_device * dev ,
int strict ) ;
2008-01-10 22:43:18 -08:00
2007-06-26 23:56:32 -07:00
# if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
2008-01-10 22:44:40 -08:00
extern int ipv6_chk_home_addr ( struct net * net ,
struct in6_addr * addr ) ;
2006-08-23 19:16:22 -07:00
# endif
2008-03-15 22:54:23 -04:00
extern int ipv6_chk_prefix ( struct in6_addr * addr ,
struct net_device * dev ) ;
2008-01-10 22:44:09 -08:00
extern struct inet6_ifaddr * ipv6_get_ifaddr ( struct net * net ,
[IPV6]: Make address arguments const.
- net/ipv6/addrconf.c:
ipv6_get_ifaddr(), ipv6_dev_get_saddr()
- net/ipv6/mcast.c:
ipv6_sock_mc_join(), ipv6_sock_mc_drop(),
inet6_mc_check(),
ipv6_dev_mc_inc(), __ipv6_dev_mc_dec(), ipv6_dev_mc_dec(),
ipv6_chk_mcast_addr()
- net/ipv6/route.c:
rt6_lookup(), icmp6_dst_alloc()
- net/ipv6/ip6_output.c:
ip6_nd_hdr()
- net/ipv6/ndisc.c:
ndisc_send_ns(), ndisc_send_rs(), ndisc_send_redirect(),
ndisc_get_neigh(), __ndisc_send()
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
2008-04-10 15:42:10 +09:00
const struct in6_addr * addr ,
2008-01-10 22:44:09 -08:00
struct net_device * dev ,
int strict ) ;
2008-08-14 15:33:21 -07:00
extern int ipv6_dev_get_saddr ( struct net * net ,
struct net_device * dev ,
[IPV6]: Make address arguments const.
- net/ipv6/addrconf.c:
ipv6_get_ifaddr(), ipv6_dev_get_saddr()
- net/ipv6/mcast.c:
ipv6_sock_mc_join(), ipv6_sock_mc_drop(),
inet6_mc_check(),
ipv6_dev_mc_inc(), __ipv6_dev_mc_dec(), ipv6_dev_mc_dec(),
ipv6_chk_mcast_addr()
- net/ipv6/route.c:
rt6_lookup(), icmp6_dst_alloc()
- net/ipv6/ip6_output.c:
ip6_nd_hdr()
- net/ipv6/ndisc.c:
ndisc_send_ns(), ndisc_send_rs(), ndisc_send_redirect(),
ndisc_get_neigh(), __ndisc_send()
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
2008-04-10 15:42:10 +09:00
const struct in6_addr * daddr ,
2008-03-25 09:37:42 +09:00
unsigned int srcprefs ,
2005-04-16 15:20:36 -07:00
struct in6_addr * saddr ) ;
2007-04-25 17:08:10 -07:00
extern int ipv6_get_lladdr ( struct net_device * dev ,
struct in6_addr * addr ,
unsigned char banned_flags ) ;
2009-03-24 16:24:51 +00:00
extern int ipv6_rcv_saddr_equal ( const struct sock * sk ,
const struct sock * sk2 ) ;
2005-04-16 15:20:36 -07:00
extern void addrconf_join_solict ( struct net_device * dev ,
struct in6_addr * addr ) ;
extern void addrconf_leave_solict ( struct inet6_dev * idev ,
struct in6_addr * addr ) ;
2008-05-27 17:37:49 +09:00
static inline unsigned long addrconf_timeout_fixup ( u32 timeout ,
unsigned unit )
{
if ( timeout = = 0xffffffff )
return ~ 0UL ;
/*
* Avoid arithmetic overflow .
* Assuming unit is constant and non - zero , this " if " statement
* will go away on 64 bit archs .
*/
if ( 0xfffffffe > LONG_MAX / unit & & timeout > LONG_MAX / unit )
return LONG_MAX / unit ;
return timeout ;
}
static inline int addrconf_finite_timeout ( unsigned long timeout )
{
return ~ timeout ;
}
2007-11-14 15:56:23 +09:00
/*
* IPv6 Address Label subsystem ( addrlabel . c )
*/
extern int ipv6_addr_label_init ( void ) ;
extern void ipv6_addr_label_rtnl_register ( void ) ;
2008-05-28 14:51:24 +02:00
extern u32 ipv6_addr_label ( struct net * net ,
const struct in6_addr * addr ,
2007-11-14 15:56:23 +09:00
int type , int ifindex ) ;
2005-04-16 15:20:36 -07:00
/*
* multicast prototypes ( mcast . c )
*/
[IPV6]: Make address arguments const.
- net/ipv6/addrconf.c:
ipv6_get_ifaddr(), ipv6_dev_get_saddr()
- net/ipv6/mcast.c:
ipv6_sock_mc_join(), ipv6_sock_mc_drop(),
inet6_mc_check(),
ipv6_dev_mc_inc(), __ipv6_dev_mc_dec(), ipv6_dev_mc_dec(),
ipv6_chk_mcast_addr()
- net/ipv6/route.c:
rt6_lookup(), icmp6_dst_alloc()
- net/ipv6/ip6_output.c:
ip6_nd_hdr()
- net/ipv6/ndisc.c:
ndisc_send_ns(), ndisc_send_rs(), ndisc_send_redirect(),
ndisc_get_neigh(), __ndisc_send()
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
2008-04-10 15:42:10 +09:00
extern int ipv6_sock_mc_join ( struct sock * sk , int ifindex ,
const struct in6_addr * addr ) ;
extern int ipv6_sock_mc_drop ( struct sock * sk , int ifindex ,
const struct in6_addr * addr ) ;
2005-04-16 15:20:36 -07:00
extern void ipv6_sock_mc_close ( struct sock * sk ) ;
[IPV6]: Make address arguments const.
- net/ipv6/addrconf.c:
ipv6_get_ifaddr(), ipv6_dev_get_saddr()
- net/ipv6/mcast.c:
ipv6_sock_mc_join(), ipv6_sock_mc_drop(),
inet6_mc_check(),
ipv6_dev_mc_inc(), __ipv6_dev_mc_dec(), ipv6_dev_mc_dec(),
ipv6_chk_mcast_addr()
- net/ipv6/route.c:
rt6_lookup(), icmp6_dst_alloc()
- net/ipv6/ip6_output.c:
ip6_nd_hdr()
- net/ipv6/ndisc.c:
ndisc_send_ns(), ndisc_send_rs(), ndisc_send_redirect(),
ndisc_get_neigh(), __ndisc_send()
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
2008-04-10 15:42:10 +09:00
extern int inet6_mc_check ( struct sock * sk ,
const struct in6_addr * mc_addr ,
const struct in6_addr * src_addr ) ;
2005-04-16 15:20:36 -07:00
[IPV6]: Make address arguments const.
- net/ipv6/addrconf.c:
ipv6_get_ifaddr(), ipv6_dev_get_saddr()
- net/ipv6/mcast.c:
ipv6_sock_mc_join(), ipv6_sock_mc_drop(),
inet6_mc_check(),
ipv6_dev_mc_inc(), __ipv6_dev_mc_dec(), ipv6_dev_mc_dec(),
ipv6_chk_mcast_addr()
- net/ipv6/route.c:
rt6_lookup(), icmp6_dst_alloc()
- net/ipv6/ip6_output.c:
ip6_nd_hdr()
- net/ipv6/ndisc.c:
ndisc_send_ns(), ndisc_send_rs(), ndisc_send_redirect(),
ndisc_get_neigh(), __ndisc_send()
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
2008-04-10 15:42:10 +09:00
extern int ipv6_dev_mc_inc ( struct net_device * dev , const struct in6_addr * addr ) ;
extern int __ipv6_dev_mc_dec ( struct inet6_dev * idev , const struct in6_addr * addr ) ;
extern int ipv6_dev_mc_dec ( struct net_device * dev , const struct in6_addr * addr ) ;
2005-04-16 15:20:36 -07:00
extern void ipv6_mc_up ( struct inet6_dev * idev ) ;
extern void ipv6_mc_down ( struct inet6_dev * idev ) ;
2009-09-15 02:37:40 -07:00
extern void ipv6_mc_unmap ( struct inet6_dev * idev ) ;
extern void ipv6_mc_remap ( struct inet6_dev * idev ) ;
2005-04-16 15:20:36 -07:00
extern void ipv6_mc_init_dev ( struct inet6_dev * idev ) ;
extern void ipv6_mc_destroy_dev ( struct inet6_dev * idev ) ;
extern void addrconf_dad_failure ( struct inet6_ifaddr * ifp ) ;
[IPV6]: Make address arguments const.
- net/ipv6/addrconf.c:
ipv6_get_ifaddr(), ipv6_dev_get_saddr()
- net/ipv6/mcast.c:
ipv6_sock_mc_join(), ipv6_sock_mc_drop(),
inet6_mc_check(),
ipv6_dev_mc_inc(), __ipv6_dev_mc_dec(), ipv6_dev_mc_dec(),
ipv6_chk_mcast_addr()
- net/ipv6/route.c:
rt6_lookup(), icmp6_dst_alloc()
- net/ipv6/ip6_output.c:
ip6_nd_hdr()
- net/ipv6/ndisc.c:
ndisc_send_ns(), ndisc_send_rs(), ndisc_send_redirect(),
ndisc_get_neigh(), __ndisc_send()
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
2008-04-10 15:42:10 +09:00
extern int ipv6_chk_mcast_addr ( struct net_device * dev ,
const struct in6_addr * group ,
const struct in6_addr * src_addr ) ;
2005-04-16 15:20:36 -07:00
extern int ipv6_is_mld ( struct sk_buff * skb , int nexthdr ) ;
extern void addrconf_prefix_rcv ( struct net_device * dev , u8 * opt , int len ) ;
/*
* anycast prototypes ( anycast . c )
*/
extern int ipv6_sock_ac_join ( struct sock * sk , int ifindex , struct in6_addr * addr ) ;
extern int ipv6_sock_ac_drop ( struct sock * sk , int ifindex , struct in6_addr * addr ) ;
extern void ipv6_sock_ac_close ( struct sock * sk ) ;
extern int inet6_ac_check ( struct sock * sk , struct in6_addr * addr , int ifindex ) ;
extern int ipv6_dev_ac_inc ( struct net_device * dev , struct in6_addr * addr ) ;
extern int __ipv6_dev_ac_dec ( struct inet6_dev * idev , struct in6_addr * addr ) ;
2008-03-26 16:52:32 -07:00
extern int ipv6_chk_acast_addr ( struct net * net , struct net_device * dev ,
struct in6_addr * addr ) ;
2005-04-16 15:20:36 -07:00
/* Device notifier */
extern int register_inet6addr_notifier ( struct notifier_block * nb ) ;
extern int unregister_inet6addr_notifier ( struct notifier_block * nb ) ;
static inline struct inet6_dev *
__in6_dev_get ( struct net_device * dev )
{
2010-02-22 17:04:49 -08:00
return rcu_dereference_check ( dev - > ip6_ptr ,
rcu_read_lock_held ( ) | |
lockdep_rtnl_is_held ( ) ) ;
2005-04-16 15:20:36 -07:00
}
static inline struct inet6_dev *
in6_dev_get ( struct net_device * dev )
{
struct inet6_dev * idev = NULL ;
2006-09-22 14:44:24 -07:00
rcu_read_lock ( ) ;
idev = __in6_dev_get ( dev ) ;
2005-04-16 15:20:36 -07:00
if ( idev )
atomic_inc ( & idev - > refcnt ) ;
2006-09-22 14:44:24 -07:00
rcu_read_unlock ( ) ;
2005-04-16 15:20:36 -07:00
return idev ;
}
extern void in6_dev_finish_destroy ( struct inet6_dev * idev ) ;
static inline void
in6_dev_put ( struct inet6_dev * idev )
{
if ( atomic_dec_and_test ( & idev - > refcnt ) )
in6_dev_finish_destroy ( idev ) ;
}
# define __in6_dev_put(idev) atomic_dec(&(idev)->refcnt)
# define in6_dev_hold(idev) atomic_inc(&(idev)->refcnt)
extern void inet6_ifa_finish_destroy ( struct inet6_ifaddr * ifp ) ;
static inline void in6_ifa_put ( struct inet6_ifaddr * ifp )
{
if ( atomic_dec_and_test ( & ifp - > refcnt ) )
inet6_ifa_finish_destroy ( ifp ) ;
}
# define __in6_ifa_put(ifp) atomic_dec(&(ifp)->refcnt)
# define in6_ifa_hold(ifp) atomic_inc(&(ifp)->refcnt)
/*
* 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 ,
2008-02-28 17:03:12 +09:00
htonl ( 0xFF020000 ) , 0 ,
htonl ( 0x1 ) ,
htonl ( 0xFF000000 ) | addr - > s6_addr32 [ 3 ] ) ;
2005-04-16 15:20:36 -07:00
}
static inline int ipv6_addr_is_multicast ( const struct in6_addr * addr )
{
2008-02-28 17:03:12 +09:00
return ( addr - > s6_addr32 [ 0 ] & htonl ( 0xFF000000 ) ) = = htonl ( 0xFF000000 ) ;
2005-04-16 15:20:36 -07:00
}
static inline int ipv6_addr_is_ll_all_nodes ( const struct in6_addr * addr )
{
2008-04-11 20:17:55 +09:00
return ( ( ( addr - > s6_addr32 [ 0 ] ^ htonl ( 0xff020000 ) ) |
addr - > s6_addr32 [ 1 ] | addr - > s6_addr32 [ 2 ] |
( addr - > s6_addr32 [ 3 ] ^ htonl ( 0x00000001 ) ) ) = = 0 ) ;
2005-04-16 15:20:36 -07:00
}
static inline int ipv6_addr_is_ll_all_routers ( const struct in6_addr * addr )
{
2008-04-11 20:17:55 +09:00
return ( ( ( addr - > s6_addr32 [ 0 ] ^ htonl ( 0xff020000 ) ) |
addr - > s6_addr32 [ 1 ] | addr - > s6_addr32 [ 2 ] |
( addr - > s6_addr32 [ 3 ] ^ htonl ( 0x00000002 ) ) ) = = 0 ) ;
2005-04-16 15:20:36 -07:00
}
2008-04-10 15:42:09 +09:00
extern int __ipv6_isatap_ifid ( u8 * eui , __be32 addr ) ;
2007-11-29 22:11:40 +11:00
static inline int ipv6_addr_is_isatap ( const struct in6_addr * addr )
{
return ( ( addr - > s6_addr32 [ 2 ] | htonl ( 0x02000000 ) ) = = htonl ( 0x02005EFE ) ) ;
}
2005-08-16 02:18:02 -03:00
# ifdef CONFIG_PROC_FS
extern int if6_proc_init ( void ) ;
extern void if6_proc_exit ( void ) ;
# endif
2005-04-16 15:20:36 -07:00
# endif
# endif