2005-04-17 02:20:36 +04:00
# ifndef _NDISC_H
# define _NDISC_H
/*
* ICMP codes for neighbour discovery messages
*/
# define NDISC_ROUTER_SOLICITATION 133
# define NDISC_ROUTER_ADVERTISEMENT 134
# define NDISC_NEIGHBOUR_SOLICITATION 135
# define NDISC_NEIGHBOUR_ADVERTISEMENT 136
# define NDISC_REDIRECT 137
/*
* ndisc options
*/
enum {
__ND_OPT_PREFIX_INFO_END = 0 ,
ND_OPT_SOURCE_LL_ADDR = 1 , /* RFC2461 */
ND_OPT_TARGET_LL_ADDR = 2 , /* RFC2461 */
ND_OPT_PREFIX_INFO = 3 , /* RFC2461 */
ND_OPT_REDIRECT_HDR = 4 , /* RFC2461 */
ND_OPT_MTU = 5 , /* RFC2461 */
2006-03-21 04:06:24 +03:00
__ND_OPT_ARRAY_MAX ,
ND_OPT_ROUTE_INFO = 24 , /* RFC4191 */
2007-10-11 08:22:05 +04:00
ND_OPT_RDNSS = 25 , /* RFC5006 */
2005-04-17 02:20:36 +04:00
__ND_OPT_MAX
} ;
# define MAX_RTR_SOLICITATION_DELAY HZ
# define ND_REACHABLE_TIME (30*HZ)
# define ND_RETRANS_TIMER HZ
# define ND_MIN_RANDOM_FACTOR (1 / 2)
# define ND_MAX_RANDOM_FACTOR (3 / 2)
# ifdef __KERNEL__
2005-12-27 07:43:12 +03:00
# include <linux/compiler.h>
2005-04-17 02:20:36 +04:00
# include <linux/icmpv6.h>
2005-12-27 07:43:12 +03:00
# include <linux/in6.h>
# include <linux/types.h>
2005-04-17 02:20:36 +04:00
# include <net/neighbour.h>
2005-12-27 07:43:12 +03:00
struct ctl_table ;
struct file ;
struct inet6_dev ;
struct net_device ;
struct net_proto_family ;
struct sk_buff ;
2005-04-17 02:20:36 +04:00
extern struct neigh_table nd_tbl ;
struct nd_msg {
struct icmp6hdr icmph ;
struct in6_addr target ;
__u8 opt [ 0 ] ;
} ;
struct rs_msg {
struct icmp6hdr icmph ;
__u8 opt [ 0 ] ;
} ;
struct ra_msg {
struct icmp6hdr icmph ;
2006-11-15 07:56:00 +03:00
__be32 reachable_time ;
__be32 retrans_timer ;
2005-04-17 02:20:36 +04:00
} ;
struct nd_opt_hdr {
__u8 nd_opt_type ;
__u8 nd_opt_len ;
} __attribute__ ( ( __packed__ ) ) ;
2008-02-29 22:13:15 +03:00
extern int ndisc_init ( void ) ;
2005-04-17 02:20:36 +04:00
extern void ndisc_cleanup ( void ) ;
extern int ndisc_rcv ( struct sk_buff * skb ) ;
extern void ndisc_send_ns ( struct net_device * dev ,
struct neighbour * neigh ,
struct in6_addr * solicit ,
struct in6_addr * daddr ,
struct in6_addr * saddr ) ;
extern void ndisc_send_rs ( struct net_device * dev ,
struct in6_addr * saddr ,
struct in6_addr * daddr ) ;
extern void ndisc_forwarding_on ( void ) ;
extern void ndisc_forwarding_off ( void ) ;
extern void ndisc_send_redirect ( struct sk_buff * skb ,
struct neighbour * neigh ,
struct in6_addr * target ) ;
extern int ndisc_mc_map ( struct in6_addr * addr , char * buf , struct net_device * dev , int dir ) ;
/*
* IGMP
*/
2008-02-29 22:13:15 +03:00
extern int igmp6_init ( void ) ;
2005-04-17 02:20:36 +04:00
extern void igmp6_cleanup ( void ) ;
extern int igmp6_event_query ( struct sk_buff * skb ) ;
extern int igmp6_event_report ( struct sk_buff * skb ) ;
extern void igmp6_cleanup ( void ) ;
# ifdef CONFIG_SYSCTL
2005-12-27 07:43:12 +03:00
extern int ndisc_ifinfo_sysctl_change ( struct ctl_table * ctl ,
2005-04-17 02:20:36 +04:00
int write ,
struct file * filp ,
void __user * buffer ,
size_t * lenp ,
loff_t * ppos ) ;
# endif
extern void inet6_ifinfo_notify ( int event ,
struct inet6_dev * idev ) ;
static inline struct neighbour * ndisc_get_neigh ( struct net_device * dev , struct in6_addr * addr )
{
if ( dev )
return __neigh_lookup ( & nd_tbl , addr , dev , 1 ) ;
return NULL ;
}
# endif /* __KERNEL__ */
# endif