home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / net / addrconf.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  6.6 KB  |  248 lines

  1. #ifndef _ADDRCONF_H
  2. #define _ADDRCONF_H
  3.  
  4. #define RETRANS_TIMER    HZ
  5.  
  6. #define MAX_RTR_SOLICITATIONS        3
  7. #define RTR_SOLICITATION_INTERVAL    (4*HZ)
  8.  
  9. #define MIN_VALID_LIFETIME        (2*3600)    /* 2 hours */
  10.  
  11. #define TEMP_VALID_LIFETIME        (7*86400)
  12. #define TEMP_PREFERRED_LIFETIME        (86400)
  13. #define REGEN_MAX_RETRY            (5)
  14. #define MAX_DESYNC_FACTOR        (600)
  15.  
  16. #define ADDR_CHECK_FREQUENCY        (120*HZ)
  17.  
  18. #define IPV6_MAX_ADDRESSES        16
  19.  
  20. #include <linux/in6.h>
  21.  
  22. struct prefix_info {
  23.     __u8            type;
  24.     __u8            length;
  25.     __u8            prefix_len;
  26.  
  27. #if defined(__BIG_ENDIAN_BITFIELD)
  28.     __u8            onlink : 1,
  29.                  autoconf : 1,
  30.                 reserved : 6;
  31. #elif defined(__LITTLE_ENDIAN_BITFIELD)
  32.     __u8            reserved : 6,
  33.                 autoconf : 1,
  34.                 onlink : 1;
  35. #else
  36. #error "Please fix <asm/byteorder.h>"
  37. #endif
  38.     __u32            valid;
  39.     __u32            prefered;
  40.     __u32            reserved2;
  41.  
  42.     struct in6_addr        prefix;
  43. };
  44.  
  45.  
  46. #ifdef __KERNEL__
  47.  
  48. #include <linux/netdevice.h>
  49. #include <net/if_inet6.h>
  50. #include <net/ipv6.h>
  51.  
  52. #define IN6_ADDR_HSIZE        16
  53.  
  54. extern int            addrconf_init(void);
  55. extern void            addrconf_cleanup(void);
  56.  
  57. extern int            addrconf_add_ifaddr(void __user *arg);
  58. extern int            addrconf_del_ifaddr(void __user *arg);
  59. extern int            addrconf_set_dstaddr(void __user *arg);
  60.  
  61. extern int            ipv6_chk_addr(struct in6_addr *addr,
  62.                           struct net_device *dev,
  63.                           int strict);
  64. extern struct inet6_ifaddr *    ipv6_get_ifaddr(struct in6_addr *addr,
  65.                         struct net_device *dev,
  66.                         int strict);
  67. extern int            ipv6_get_saddr(struct dst_entry *dst, 
  68.                            struct in6_addr *daddr,
  69.                            struct in6_addr *saddr);
  70. extern int            ipv6_dev_get_saddr(struct net_device *dev, 
  71.                            struct in6_addr *daddr,
  72.                            struct in6_addr *saddr);
  73. extern int            ipv6_get_lladdr(struct net_device *dev, struct in6_addr *);
  74. extern int            ipv6_rcv_saddr_equal(const struct sock *sk, 
  75.                               const struct sock *sk2);
  76. extern void            addrconf_join_solict(struct net_device *dev,
  77.                     struct in6_addr *addr);
  78. extern void            addrconf_leave_solict(struct inet6_dev *idev,
  79.                     struct in6_addr *addr);
  80.  
  81. /*
  82.  *    multicast prototypes (mcast.c)
  83.  */
  84. extern int ipv6_sock_mc_join(struct sock *sk, int ifindex, 
  85.           struct in6_addr *addr);
  86. extern int ipv6_sock_mc_drop(struct sock *sk, int ifindex, 
  87.           struct in6_addr *addr);
  88. extern void ipv6_sock_mc_close(struct sock *sk);
  89. extern int inet6_mc_check(struct sock *sk, struct in6_addr *mc_addr,
  90.         struct in6_addr *src_addr);
  91.  
  92. extern int ipv6_dev_mc_inc(struct net_device *dev, struct in6_addr *addr);
  93. extern int __ipv6_dev_mc_dec(struct inet6_dev *idev, struct in6_addr *addr);
  94. extern int ipv6_dev_mc_dec(struct net_device *dev, struct in6_addr *addr);
  95. extern void ipv6_mc_up(struct inet6_dev *idev);
  96. extern void ipv6_mc_down(struct inet6_dev *idev);
  97. extern void ipv6_mc_init_dev(struct inet6_dev *idev);
  98. extern void ipv6_mc_destroy_dev(struct inet6_dev *idev);
  99. extern void addrconf_dad_failure(struct inet6_ifaddr *ifp);
  100.  
  101. extern int ipv6_chk_mcast_addr(struct net_device *dev, struct in6_addr *group,
  102.         struct in6_addr *src_addr);
  103. extern int ipv6_is_mld(struct sk_buff *skb, int nexthdr);
  104.  
  105. extern void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len);
  106.  
  107. extern int ipv6_get_hoplimit(struct net_device *dev);
  108.  
  109. /*
  110.  *    anycast prototypes (anycast.c)
  111.  */
  112. extern int ipv6_sock_ac_join(struct sock *sk,int ifindex,struct in6_addr *addr);
  113. extern int ipv6_sock_ac_drop(struct sock *sk,int ifindex,struct in6_addr *addr);
  114. extern void ipv6_sock_ac_close(struct sock *sk);
  115. extern int inet6_ac_check(struct sock *sk, struct in6_addr *addr, int ifindex);
  116.  
  117. extern int ipv6_dev_ac_inc(struct net_device *dev, struct in6_addr *addr);
  118. extern int __ipv6_dev_ac_dec(struct inet6_dev *idev, struct in6_addr *addr);
  119. extern int ipv6_chk_acast_addr(struct net_device *dev, struct in6_addr *addr);
  120.  
  121.  
  122. /* Device notifier */
  123. extern int register_inet6addr_notifier(struct notifier_block *nb);
  124. extern int unregister_inet6addr_notifier(struct notifier_block *nb);
  125.  
  126. static inline struct inet6_dev *
  127. __in6_dev_get(struct net_device *dev)
  128. {
  129.     return (struct inet6_dev *)dev->ip6_ptr;
  130. }
  131.  
  132. extern rwlock_t addrconf_lock;
  133.  
  134. static inline struct inet6_dev *
  135. in6_dev_get(struct net_device *dev)
  136. {
  137.     struct inet6_dev *idev = NULL;
  138.     read_lock(&addrconf_lock);
  139.     idev = dev->ip6_ptr;
  140.     if (idev)
  141.         atomic_inc(&idev->refcnt);
  142.     read_unlock(&addrconf_lock);
  143.     return idev;
  144. }
  145.  
  146. extern void in6_dev_finish_destroy(struct inet6_dev *idev);
  147.  
  148. static inline void
  149. in6_dev_put(struct inet6_dev *idev)
  150. {
  151.     if (atomic_dec_and_test(&idev->refcnt))
  152.         in6_dev_finish_destroy(idev);
  153. }
  154.  
  155. #define __in6_dev_put(idev)  atomic_dec(&(idev)->refcnt)
  156. #define in6_dev_hold(idev)   atomic_inc(&(idev)->refcnt)
  157.  
  158.  
  159. extern void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp);
  160.  
  161. static inline void in6_ifa_put(struct inet6_ifaddr *ifp)
  162. {
  163.     if (atomic_dec_and_test(&ifp->refcnt))
  164.         inet6_ifa_finish_destroy(ifp);
  165. }
  166.  
  167. #define __in6_ifa_put(ifp)    atomic_dec(&(ifp)->refcnt)
  168. #define in6_ifa_hold(ifp)    atomic_inc(&(ifp)->refcnt)
  169.  
  170.  
  171. extern void            addrconf_forwarding_on(void);
  172. /*
  173.  *    Hash function taken from net_alias.c
  174.  */
  175.  
  176. static __inline__ u8 ipv6_addr_hash(const struct in6_addr *addr)
  177. {    
  178.     __u32 word;
  179.  
  180.     /* 
  181.      * We perform the hash function over the last 64 bits of the address
  182.      * This will include the IEEE address token on links that support it.
  183.      */
  184.  
  185.     word = addr->s6_addr32[2] ^ addr->s6_addr32[3];
  186.     word ^= (word >> 16);
  187.     word ^= (word >> 8);
  188.  
  189.     return ((word ^ (word >> 4)) & 0x0f);
  190. }
  191.  
  192. /*
  193.  *    compute link-local solicited-node multicast address
  194.  */
  195.  
  196. static inline void addrconf_addr_solict_mult(const struct in6_addr *addr,
  197.                          struct in6_addr *solicited)
  198. {
  199.     ipv6_addr_set(solicited,
  200.               __constant_htonl(0xFF020000), 0,
  201.               __constant_htonl(0x1),
  202.               __constant_htonl(0xFF000000) | addr->s6_addr32[3]);
  203. }
  204.  
  205.  
  206. static inline void ipv6_addr_all_nodes(struct in6_addr *addr)
  207. {
  208.     ipv6_addr_set(addr,
  209.               __constant_htonl(0xFF020000), 0, 0,
  210.               __constant_htonl(0x1));
  211. }
  212.  
  213. static inline void ipv6_addr_all_routers(struct in6_addr *addr)
  214. {
  215.     ipv6_addr_set(addr,
  216.               __constant_htonl(0xFF020000), 0, 0,
  217.               __constant_htonl(0x2));
  218. }
  219.  
  220. static inline int ipv6_addr_is_multicast(const struct in6_addr *addr)
  221. {
  222.     return (addr->s6_addr32[0] & __constant_htonl(0xFF000000)) == __constant_htonl(0xFF000000);
  223. }
  224.  
  225. static inline int ipv6_addr_is_ll_all_nodes(const struct in6_addr *addr)
  226. {
  227.     return (addr->s6_addr32[0] == htonl(0xff020000) &&
  228.         addr->s6_addr32[1] == 0 &&
  229.         addr->s6_addr32[2] == 0 &&
  230.         addr->s6_addr32[3] == htonl(0x00000001));
  231. }
  232.  
  233. static inline int ipv6_addr_is_ll_all_routers(const struct in6_addr *addr)
  234. {
  235.     return (addr->s6_addr32[0] == htonl(0xff020000) &&
  236.         addr->s6_addr32[1] == 0 &&
  237.         addr->s6_addr32[2] == 0 &&
  238.         addr->s6_addr32[3] == htonl(0x00000002));
  239. }
  240.  
  241. #ifdef CONFIG_PROC_FS
  242. extern int if6_proc_init(void);
  243. extern void if6_proc_exit(void);
  244. #endif
  245.  
  246. #endif
  247. #endif
  248.