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

  1. /*
  2.  *        INETPEER - A storage for permanent information about peers
  3.  *
  4.  *  Version:    $Id: inetpeer.h,v 1.2 2002/01/12 07:54:56 davem Exp $
  5.  *
  6.  *  Authors:    Andrey V. Savochkin <saw@msu.ru>
  7.  */
  8.  
  9. #ifndef _NET_INETPEER_H
  10. #define _NET_INETPEER_H
  11.  
  12. #include <linux/types.h>
  13. #include <linux/init.h>
  14. #include <linux/jiffies.h>
  15. #include <linux/spinlock.h>
  16. #include <asm/atomic.h>
  17.  
  18. struct inet_peer
  19. {
  20.     struct inet_peer    *avl_left, *avl_right;
  21.     struct inet_peer    *unused_next, **unused_prevp;
  22.     unsigned long        dtime;        /* the time of last use of not
  23.                          * referenced entries */
  24.     atomic_t        refcnt;
  25.     __u32            v4daddr;    /* peer's address */
  26.     __u16            avl_height;
  27.     __u16            ip_id_count;    /* IP ID for the next packet */
  28.     atomic_t        rid;        /* Frag reception counter */
  29.     __u32            tcp_ts;
  30.     unsigned long        tcp_ts_stamp;
  31. };
  32.  
  33. void            inet_initpeers(void) __init;
  34.  
  35. /* can be called with or without local BH being disabled */
  36. struct inet_peer    *inet_getpeer(__u32 daddr, int create);
  37.  
  38. extern spinlock_t inet_peer_unused_lock;
  39. extern struct inet_peer **inet_peer_unused_tailp;
  40. /* can be called from BH context or outside */
  41. static inline void    inet_putpeer(struct inet_peer *p)
  42. {
  43.     spin_lock_bh(&inet_peer_unused_lock);
  44.     if (atomic_dec_and_test(&p->refcnt)) {
  45.         p->unused_prevp = inet_peer_unused_tailp;
  46.         p->unused_next = NULL;
  47.         *inet_peer_unused_tailp = p;
  48.         inet_peer_unused_tailp = &p->unused_next;
  49.         p->dtime = jiffies;
  50.     }
  51.     spin_unlock_bh(&inet_peer_unused_lock);
  52. }
  53.  
  54. extern spinlock_t inet_peer_idlock;
  55. /* can be called with or without local BH being disabled */
  56. static inline __u16    inet_getid(struct inet_peer *p, int more)
  57. {
  58.     __u16 id;
  59.  
  60.     spin_lock_bh(&inet_peer_idlock);
  61.     id = p->ip_id_count;
  62.     p->ip_id_count += 1 + more;
  63.     spin_unlock_bh(&inet_peer_idlock);
  64.     return id;
  65. }
  66.  
  67. #endif /* _NET_INETPEER_H */
  68.