2007-10-15 02:24:19 -07:00
# ifndef __NET_FRAG_H__
# define __NET_FRAG_H__
struct inet_frag_queue {
struct hlist_node list ;
struct list_head lru_list ; /* lru list member */
spinlock_t lock ;
atomic_t refcnt ;
struct timer_list timer ; /* when will this queue expire? */
struct sk_buff * fragments ; /* list of received fragments */
ktime_t stamp ;
int len ; /* total length of orig datagram */
int meat ;
__u8 last_in ; /* first/last segment arrived? */
# define COMPLETE 4
# define FIRST_IN 2
# define LAST_IN 1
} ;
2007-10-15 02:31:52 -07:00
# define INETFRAGS_HASHSZ 64
2007-10-15 02:33:45 -07:00
struct inet_frags_ctl {
int high_thresh ;
int low_thresh ;
int timeout ;
int secret_interval ;
} ;
2007-10-15 02:31:52 -07:00
struct inet_frags {
struct list_head lru_list ;
struct hlist_head hash [ INETFRAGS_HASHSZ ] ;
rwlock_t lock ;
u32 rnd ;
int nqueues ;
2007-10-15 02:39:14 -07:00
int qsize ;
2007-10-15 02:31:52 -07:00
atomic_t mem ;
struct timer_list secret_timer ;
2007-10-15 02:33:45 -07:00
struct inet_frags_ctl * ctl ;
2007-10-15 02:38:08 -07:00
unsigned int ( * hashfn ) ( struct inet_frag_queue * ) ;
2007-10-17 19:46:47 -07:00
void ( * constructor ) ( struct inet_frag_queue * q ,
void * arg ) ;
2007-10-15 02:39:14 -07:00
void ( * destructor ) ( struct inet_frag_queue * ) ;
void ( * skb_free ) ( struct sk_buff * ) ;
2007-10-17 19:47:21 -07:00
int ( * match ) ( struct inet_frag_queue * q ,
void * arg ) ;
2007-10-17 19:45:23 -07:00
void ( * frag_expire ) ( unsigned long data ) ;
2007-10-15 02:31:52 -07:00
} ;
void inet_frags_init ( struct inet_frags * ) ;
void inet_frags_fini ( struct inet_frags * ) ;
2007-10-15 02:37:18 -07:00
void inet_frag_kill ( struct inet_frag_queue * q , struct inet_frags * f ) ;
2007-10-15 02:39:14 -07:00
void inet_frag_destroy ( struct inet_frag_queue * q ,
struct inet_frags * f , int * work ) ;
2007-10-15 02:40:06 -07:00
int inet_frag_evictor ( struct inet_frags * f ) ;
2007-10-17 19:47:21 -07:00
struct inet_frag_queue * inet_frag_find ( struct inet_frags * f , void * key ,
unsigned int hash ) ;
2007-10-15 02:37:18 -07:00
2007-10-15 02:41:56 -07:00
static inline void inet_frag_put ( struct inet_frag_queue * q , struct inet_frags * f )
{
if ( atomic_dec_and_test ( & q - > refcnt ) )
inet_frag_destroy ( q , f , NULL ) ;
}
2007-10-15 02:24:19 -07:00
# endif