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 / neighbour.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  10.2 KB  |  380 lines

  1. #ifndef _NET_NEIGHBOUR_H
  2. #define _NET_NEIGHBOUR_H
  3.  
  4. /*
  5.  *    Generic neighbour manipulation
  6.  *
  7.  *    Authors:
  8.  *    Pedro Roque        <roque@di.fc.ul.pt>
  9.  *    Alexey Kuznetsov    <kuznet@ms2.inr.ac.ru>
  10.  *
  11.  *     Changes:
  12.  *
  13.  *    Harald Welte:        <laforge@gnumonks.org>
  14.  *        - Add neighbour cache statistics like rtstat
  15.  */
  16.  
  17. /* The following flags & states are exported to user space,
  18.    so that they should be moved to include/linux/ directory.
  19.  */
  20.  
  21. /*
  22.  *    Neighbor Cache Entry Flags
  23.  */
  24.  
  25. #define NTF_PROXY    0x08    /* == ATF_PUBL */
  26. #define NTF_ROUTER    0x80
  27.  
  28. /*
  29.  *    Neighbor Cache Entry States.
  30.  */
  31.  
  32. #define NUD_INCOMPLETE    0x01
  33. #define NUD_REACHABLE    0x02
  34. #define NUD_STALE    0x04
  35. #define NUD_DELAY    0x08
  36. #define NUD_PROBE    0x10
  37. #define NUD_FAILED    0x20
  38.  
  39. /* Dummy states */
  40. #define NUD_NOARP    0x40
  41. #define NUD_PERMANENT    0x80
  42. #define NUD_NONE    0x00
  43.  
  44. /* NUD_NOARP & NUD_PERMANENT are pseudostates, they never change
  45.    and make no address resolution or NUD.
  46.    NUD_PERMANENT is also cannot be deleted by garbage collectors.
  47.  */
  48.  
  49. #ifdef __KERNEL__
  50.  
  51. #include <asm/atomic.h>
  52. #include <linux/netdevice.h>
  53. #include <linux/skbuff.h>
  54. #include <linux/rcupdate.h>
  55. #include <linux/seq_file.h>
  56.  
  57. #include <linux/err.h>
  58. #include <linux/sysctl.h>
  59.  
  60. #define NUD_IN_TIMER    (NUD_INCOMPLETE|NUD_REACHABLE|NUD_DELAY|NUD_PROBE)
  61. #define NUD_VALID    (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY)
  62. #define NUD_CONNECTED    (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE)
  63.  
  64. struct neighbour;
  65.  
  66. struct neigh_parms
  67. {
  68.     struct net_device *dev;
  69.     struct neigh_parms *next;
  70.     int    (*neigh_setup)(struct neighbour *);
  71.     void    (*neigh_destructor)(struct neighbour *);
  72.     struct neigh_table *tbl;
  73.  
  74.     void    *sysctl_table;
  75.  
  76.     int dead;
  77.     atomic_t refcnt;
  78.     struct rcu_head rcu_head;
  79.  
  80.     int    base_reachable_time;
  81.     int    retrans_time;
  82.     int    gc_staletime;
  83.     int    reachable_time;
  84.     int    delay_probe_time;
  85.  
  86.     int    queue_len;
  87.     int    ucast_probes;
  88.     int    app_probes;
  89.     int    mcast_probes;
  90.     int    anycast_delay;
  91.     int    proxy_delay;
  92.     int    proxy_qlen;
  93.     int    locktime;
  94. };
  95.  
  96. struct neigh_statistics
  97. {
  98.     unsigned long allocs;        /* number of allocated neighs */
  99.     unsigned long destroys;        /* number of destroyed neighs */
  100.     unsigned long hash_grows;    /* number of hash resizes */
  101.  
  102.     unsigned long res_failed;    /* nomber of failed resolutions */
  103.  
  104.     unsigned long lookups;        /* number of lookups */
  105.     unsigned long hits;        /* number of hits (among lookups) */
  106.  
  107.     unsigned long rcv_probes_mcast;    /* number of received mcast ipv6 */
  108.     unsigned long rcv_probes_ucast; /* number of received ucast ipv6 */
  109.  
  110.     unsigned long periodic_gc_runs;    /* number of periodic GC runs */
  111.     unsigned long forced_gc_runs;    /* number of forced GC runs */
  112. };
  113.  
  114. #define NEIGH_CACHE_STAT_INC(tbl, field)                \
  115.     do {                                \
  116.         preempt_disable();                    \
  117.         (per_cpu_ptr((tbl)->stats, smp_processor_id())->field)++; \
  118.         preempt_enable();                    \
  119.     } while (0)
  120.  
  121. struct neighbour
  122. {
  123.     struct neighbour    *next;
  124.     struct neigh_table    *tbl;
  125.     struct neigh_parms    *parms;
  126.     struct net_device        *dev;
  127.     unsigned long        used;
  128.     unsigned long        confirmed;
  129.     unsigned long        updated;
  130.     __u8            flags;
  131.     __u8            nud_state;
  132.     __u8            type;
  133.     __u8            dead;
  134.     atomic_t        probes;
  135.     rwlock_t        lock;
  136.     unsigned char        ha[(MAX_ADDR_LEN+sizeof(unsigned long)-1)&~(sizeof(unsigned long)-1)];
  137.     struct hh_cache        *hh;
  138.     atomic_t        refcnt;
  139.     int            (*output)(struct sk_buff *skb);
  140.     struct sk_buff_head    arp_queue;
  141.     struct timer_list    timer;
  142.     struct neigh_ops    *ops;
  143.     u8            primary_key[0];
  144. };
  145.  
  146. struct neigh_ops
  147. {
  148.     int            family;
  149.     void            (*solicit)(struct neighbour *, struct sk_buff*);
  150.     void            (*error_report)(struct neighbour *, struct sk_buff*);
  151.     int            (*output)(struct sk_buff*);
  152.     int            (*connected_output)(struct sk_buff*);
  153.     int            (*hh_output)(struct sk_buff*);
  154.     int            (*queue_xmit)(struct sk_buff*);
  155. };
  156.  
  157. struct pneigh_entry
  158. {
  159.     struct pneigh_entry    *next;
  160.     struct net_device        *dev;
  161.     u8            key[0];
  162. };
  163.  
  164. /*
  165.  *    neighbour table manipulation
  166.  */
  167.  
  168.  
  169. struct neigh_table
  170. {
  171.     struct neigh_table    *next;
  172.     int            family;
  173.     int            entry_size;
  174.     int            key_len;
  175.     __u32            (*hash)(const void *pkey, const struct net_device *);
  176.     int            (*constructor)(struct neighbour *);
  177.     int            (*pconstructor)(struct pneigh_entry *);
  178.     void            (*pdestructor)(struct pneigh_entry *);
  179.     void            (*proxy_redo)(struct sk_buff *skb);
  180.     char            *id;
  181.     struct neigh_parms    parms;
  182.     /* HACK. gc_* shoul follow parms without a gap! */
  183.     int            gc_interval;
  184.     int            gc_thresh1;
  185.     int            gc_thresh2;
  186.     int            gc_thresh3;
  187.     unsigned long        last_flush;
  188.     struct timer_list     gc_timer;
  189.     struct timer_list     proxy_timer;
  190.     struct sk_buff_head    proxy_queue;
  191.     atomic_t        entries;
  192.     rwlock_t        lock;
  193.     unsigned long        last_rand;
  194.     kmem_cache_t        *kmem_cachep;
  195.     struct neigh_statistics    *stats;
  196.     struct neighbour    **hash_buckets;
  197.     unsigned int        hash_mask;
  198.     __u32            hash_rnd;
  199.     unsigned int        hash_chain_gc;
  200.     struct pneigh_entry    **phash_buckets;
  201. #ifdef CONFIG_PROC_FS
  202.     struct proc_dir_entry    *pde;
  203. #endif
  204. };
  205.  
  206. /* flags for neigh_update() */
  207. #define NEIGH_UPDATE_F_OVERRIDE            0x00000001
  208. #define NEIGH_UPDATE_F_WEAK_OVERRIDE        0x00000002
  209. #define NEIGH_UPDATE_F_OVERRIDE_ISROUTER    0x00000004
  210. #define NEIGH_UPDATE_F_ISROUTER            0x40000000
  211. #define NEIGH_UPDATE_F_ADMIN            0x80000000
  212.  
  213. extern void            neigh_table_init(struct neigh_table *tbl);
  214. extern void            neigh_table_init_no_netlink(struct neigh_table *tbl);
  215. extern int            neigh_table_clear(struct neigh_table *tbl);
  216. extern struct neighbour *    neigh_lookup(struct neigh_table *tbl,
  217.                          const void *pkey,
  218.                          struct net_device *dev);
  219. extern struct neighbour *    neigh_lookup_nodev(struct neigh_table *tbl,
  220.                            const void *pkey);
  221. extern struct neighbour *    neigh_create(struct neigh_table *tbl,
  222.                          const void *pkey,
  223.                          struct net_device *dev);
  224. extern void            neigh_destroy(struct neighbour *neigh);
  225. extern int            __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb);
  226. extern int            neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new, 
  227.                          u32 flags);
  228. extern void            neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev);
  229. extern int            neigh_ifdown(struct neigh_table *tbl, struct net_device *dev);
  230. extern int            neigh_resolve_output(struct sk_buff *skb);
  231. extern int            neigh_connected_output(struct sk_buff *skb);
  232. extern int            neigh_compat_output(struct sk_buff *skb);
  233. extern struct neighbour     *neigh_event_ns(struct neigh_table *tbl,
  234.                         u8 *lladdr, void *saddr,
  235.                         struct net_device *dev);
  236.  
  237. extern struct neigh_parms    *neigh_parms_alloc(struct net_device *dev, struct neigh_table *tbl);
  238. extern void            neigh_parms_release(struct neigh_table *tbl, struct neigh_parms *parms);
  239. extern void            neigh_parms_destroy(struct neigh_parms *parms);
  240. extern unsigned long        neigh_rand_reach_time(unsigned long base);
  241.  
  242. extern void            pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
  243.                            struct sk_buff *skb);
  244. extern struct pneigh_entry    *pneigh_lookup(struct neigh_table *tbl, const void *key, struct net_device *dev, int creat);
  245. extern int            pneigh_delete(struct neigh_table *tbl, const void *key, struct net_device *dev);
  246.  
  247. struct netlink_callback;
  248. struct nlmsghdr;
  249. extern int neigh_dump_info(struct sk_buff *skb, struct netlink_callback *cb);
  250. extern int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg);
  251. extern int neigh_delete(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg);
  252. extern void neigh_app_ns(struct neighbour *n);
  253.  
  254. extern int neightbl_dump_info(struct sk_buff *skb, struct netlink_callback *cb);
  255. extern int neightbl_set(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg);
  256.  
  257. extern void neigh_for_each(struct neigh_table *tbl, void (*cb)(struct neighbour *, void *), void *cookie);
  258. extern void __neigh_for_each_release(struct neigh_table *tbl, int (*cb)(struct neighbour *));
  259. extern void pneigh_for_each(struct neigh_table *tbl, void (*cb)(struct pneigh_entry *));
  260.  
  261. struct neigh_seq_state {
  262.     struct neigh_table *tbl;
  263.     void *(*neigh_sub_iter)(struct neigh_seq_state *state,
  264.                 struct neighbour *n, loff_t *pos);
  265.     unsigned int bucket;
  266.     unsigned int flags;
  267. #define NEIGH_SEQ_NEIGH_ONLY    0x00000001
  268. #define NEIGH_SEQ_IS_PNEIGH    0x00000002
  269. #define NEIGH_SEQ_SKIP_NOARP    0x00000004
  270. };
  271. extern void *neigh_seq_start(struct seq_file *, loff_t *, struct neigh_table *, unsigned int);
  272. extern void *neigh_seq_next(struct seq_file *, void *, loff_t *);
  273. extern void neigh_seq_stop(struct seq_file *, void *);
  274.  
  275. extern int            neigh_sysctl_register(struct net_device *dev, 
  276.                               struct neigh_parms *p,
  277.                               int p_id, int pdev_id,
  278.                               char *p_name,
  279.                               proc_handler *proc_handler,
  280.                               ctl_handler *strategy);
  281. extern void            neigh_sysctl_unregister(struct neigh_parms *p);
  282.  
  283. static inline void __neigh_parms_put(struct neigh_parms *parms)
  284. {
  285.     atomic_dec(&parms->refcnt);
  286. }
  287.  
  288. static inline void neigh_parms_put(struct neigh_parms *parms)
  289. {
  290.     if (atomic_dec_and_test(&parms->refcnt))
  291.         neigh_parms_destroy(parms);
  292. }
  293.  
  294. static inline struct neigh_parms *neigh_parms_clone(struct neigh_parms *parms)
  295. {
  296.     atomic_inc(&parms->refcnt);
  297.     return parms;
  298. }
  299.  
  300. /*
  301.  *    Neighbour references
  302.  */
  303.  
  304. static inline void neigh_release(struct neighbour *neigh)
  305. {
  306.     if (atomic_dec_and_test(&neigh->refcnt))
  307.         neigh_destroy(neigh);
  308. }
  309.  
  310. static inline struct neighbour * neigh_clone(struct neighbour *neigh)
  311. {
  312.     if (neigh)
  313.         atomic_inc(&neigh->refcnt);
  314.     return neigh;
  315. }
  316.  
  317. #define neigh_hold(n)    atomic_inc(&(n)->refcnt)
  318.  
  319. static inline void neigh_confirm(struct neighbour *neigh)
  320. {
  321.     if (neigh)
  322.         neigh->confirmed = jiffies;
  323. }
  324.  
  325. static inline int neigh_is_connected(struct neighbour *neigh)
  326. {
  327.     return neigh->nud_state&NUD_CONNECTED;
  328. }
  329.  
  330. static inline int neigh_is_valid(struct neighbour *neigh)
  331. {
  332.     return neigh->nud_state&NUD_VALID;
  333. }
  334.  
  335. static inline int neigh_event_send(struct neighbour *neigh, struct sk_buff *skb)
  336. {
  337.     neigh->used = jiffies;
  338.     if (!(neigh->nud_state&(NUD_CONNECTED|NUD_DELAY|NUD_PROBE)))
  339.         return __neigh_event_send(neigh, skb);
  340.     return 0;
  341. }
  342.  
  343. static inline struct neighbour *
  344. __neigh_lookup(struct neigh_table *tbl, const void *pkey, struct net_device *dev, int creat)
  345. {
  346.     struct neighbour *n = neigh_lookup(tbl, pkey, dev);
  347.  
  348.     if (n || !creat)
  349.         return n;
  350.  
  351.     n = neigh_create(tbl, pkey, dev);
  352.     return IS_ERR(n) ? NULL : n;
  353. }
  354.  
  355. static inline struct neighbour *
  356. __neigh_lookup_errno(struct neigh_table *tbl, const void *pkey,
  357.   struct net_device *dev)
  358. {
  359.     struct neighbour *n = neigh_lookup(tbl, pkey, dev);
  360.  
  361.     if (n)
  362.         return n;
  363.  
  364.     return neigh_create(tbl, pkey, dev);
  365. }
  366.  
  367. struct neighbour_cb {
  368.     unsigned long sched_next;
  369.     unsigned int flags;
  370. };
  371.  
  372. #define LOCALLY_ENQUEUED 0x1
  373.  
  374. #define NEIGH_CB(skb)    ((struct neighbour_cb *)(skb)->cb)
  375.  
  376. #endif
  377. #endif
  378.  
  379.  
  380.