ndisc.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _NDISC_H
  2. #define _NDISC_H
  3. /*
  4.  * ICMP codes for neighbour discovery messages
  5.  */
  6. #define NDISC_ROUTER_SOLICITATION 133
  7. #define NDISC_ROUTER_ADVERTISEMENT 134
  8. #define NDISC_NEIGHBOUR_SOLICITATION 135
  9. #define NDISC_NEIGHBOUR_ADVERTISEMENT 136
  10. #define NDISC_REDIRECT 137
  11. /*
  12.  * ndisc options
  13.  */
  14. #define ND_OPT_SOURCE_LL_ADDR 1
  15. #define ND_OPT_TARGET_LL_ADDR 2
  16. #define ND_OPT_PREFIX_INFO 3
  17. #define ND_OPT_REDIRECT_HDR 4
  18. #define ND_OPT_MTU 5
  19. #define MAX_RTR_SOLICITATION_DELAY HZ
  20. #define ND_REACHABLE_TIME (30*HZ)
  21. #define ND_RETRANS_TIMER HZ
  22. #define ND_MIN_RANDOM_FACTOR (1/2)
  23. #define ND_MAX_RANDOM_FACTOR (3/2)
  24. #ifdef __KERNEL__
  25. #include <linux/skbuff.h>
  26. #include <linux/netdevice.h>
  27. #include <linux/icmpv6.h>
  28. #include <net/neighbour.h>
  29. #include <asm/atomic.h>
  30. extern struct neigh_table nd_tbl;
  31. struct nd_msg {
  32.         struct icmp6hdr icmph;
  33.         struct in6_addr target;
  34. __u8 opt[0];
  35. };
  36. struct ra_msg {
  37.         struct icmp6hdr icmph;
  38. __u32 reachable_time;
  39. __u32 retrans_timer;
  40. };
  41. struct nd_opt_hdr {
  42. __u8 nd_opt_type;
  43. __u8 nd_opt_len;
  44. } __attribute__((__packed__));
  45. struct ndisc_options {
  46. struct nd_opt_hdr *nd_opt_array[7];
  47. struct nd_opt_hdr *nd_opt_piend;
  48. };
  49. #define nd_opts_src_lladdr nd_opt_array[ND_OPT_SOURCE_LL_ADDR]
  50. #define nd_opts_tgt_lladdr nd_opt_array[ND_OPT_TARGET_LL_ADDR]
  51. #define nd_opts_pi nd_opt_array[ND_OPT_PREFIX_INFO]
  52. #define nd_opts_pi_end nd_opt_piend
  53. #define nd_opts_rh nd_opt_array[ND_OPT_REDIRECT_HDR]
  54. #define nd_opts_mtu nd_opt_array[ND_OPT_MTU]
  55. extern struct nd_opt_hdr *ndisc_next_option(struct nd_opt_hdr *cur, struct nd_opt_hdr *end);
  56. extern struct ndisc_options *ndisc_parse_options(u8 *opt, int opt_len, struct ndisc_options *ndopts);
  57. extern int ndisc_init(struct net_proto_family *ops);
  58. extern void ndisc_cleanup(void);
  59. extern int ndisc_rcv(struct sk_buff *skb);
  60. extern void ndisc_send_ns(struct net_device *dev,
  61.       struct neighbour *neigh,
  62.       struct in6_addr *solicit,
  63.       struct in6_addr *daddr,
  64.       struct in6_addr *saddr);
  65. extern void ndisc_send_rs(struct net_device *dev,
  66.       struct in6_addr *saddr,
  67.       struct in6_addr *daddr);
  68. extern void ndisc_forwarding_on(void);
  69. extern void ndisc_forwarding_off(void);
  70. extern void ndisc_send_redirect(struct sk_buff *skb,
  71.     struct neighbour *neigh,
  72.     struct in6_addr *target);
  73. extern int ndisc_mc_map(struct in6_addr *addr, char *buf, struct net_device *dev, int dir);
  74. struct rt6_info * dflt_rt_lookup(void);
  75. /*
  76.  * IGMP
  77.  */
  78. extern int igmp6_init(struct net_proto_family *ops);
  79. extern void igmp6_cleanup(void);
  80. extern int igmp6_event_query(struct sk_buff *skb);
  81. extern int igmp6_event_report(struct sk_buff *skb);
  82. extern void igmp6_cleanup(void);
  83. static inline struct neighbour * ndisc_get_neigh(struct net_device *dev, struct in6_addr *addr)
  84. {
  85. if (dev)
  86. return __neigh_lookup(&nd_tbl, addr, dev, 1);
  87. return NULL;
  88. }
  89. #endif /* __KERNEL__ */
  90. #endif