2007-10-15 02:24:19 -07:00
# ifndef __NET_FRAG_H__
# define __NET_FRAG_H__
2008-01-22 06:02:14 -08:00
struct netns_frags {
2008-01-22 06:06:23 -08:00
int nqueues ;
2008-01-22 06:07:25 -08:00
atomic_t mem ;
2008-01-22 06:11:48 -08:00
struct list_head lru_list ;
2008-01-22 06:09:37 -08:00
/* sysctls */
int timeout ;
2008-01-22 06:10:13 -08:00
int high_thresh ;
int low_thresh ;
2008-01-22 06:02:14 -08:00
} ;
2007-10-15 02:24:19 -07:00
struct inet_frag_queue {
struct hlist_node list ;
2008-01-22 06:02:14 -08:00
struct netns_frags * net ;
2007-10-15 02:24:19 -07:00
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 */
2010-06-29 04:39:37 +00:00
struct sk_buff * fragments_tail ;
2007-10-15 02:24:19 -07:00
ktime_t stamp ;
int len ; /* total length of orig datagram */
int meat ;
__u8 last_in ; /* first/last segment arrived? */
2008-03-28 16:35:27 -07:00
# define INET_FRAG_COMPLETE 4
# define INET_FRAG_FIRST_IN 2
# define INET_FRAG_LAST_IN 1
2007-10-15 02:24:19 -07:00
} ;
2007-10-15 02:31:52 -07:00
# define INETFRAGS_HASHSZ 64
struct inet_frags {
struct hlist_head hash [ INETFRAGS_HASHSZ ] ;
rwlock_t lock ;
u32 rnd ;
2007-10-15 02:39:14 -07:00
int qsize ;
2008-01-22 06:11:04 -08:00
int secret_interval ;
2007-10-15 02:31:52 -07:00
struct timer_list secret_timer ;
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 * ) ;
2008-01-22 06:06:23 -08:00
void inet_frags_init_net ( struct netns_frags * nf ) ;
2008-01-22 06:12:39 -08:00
void inet_frags_exit_net ( struct netns_frags * nf , struct inet_frags * f ) ;
2008-01-22 06:06:23 -08:00
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 ) ;
2008-01-22 06:07:25 -08:00
int inet_frag_evictor ( struct netns_frags * nf , struct inet_frags * f ) ;
2008-01-22 06:02:14 -08:00
struct inet_frag_queue * inet_frag_find ( struct netns_frags * nf ,
2009-02-25 10:32:52 +00:00
struct inet_frags * f , void * key , unsigned int hash )
__releases ( & f - > lock ) ;
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