diff options
Diffstat (limited to 'include/net/inet_frag.h')
| -rw-r--r-- | include/net/inet_frag.h | 24 | 
1 files changed, 22 insertions, 2 deletions
diff --git a/include/net/inet_frag.h b/include/net/inet_frag.h index 0a1dcc2fa2f..4182c9be8bb 100644 --- a/include/net/inet_frag.h +++ b/include/net/inet_frag.h @@ -41,7 +41,7 @@ struct inet_frag_queue {  	struct netns_frags	*net;  }; -#define INETFRAGS_HASHSZ		64 +#define INETFRAGS_HASHSZ	1024  /* averaged:   * max_depth = default ipfrag_high_thresh / INETFRAGS_HASHSZ / @@ -50,10 +50,16 @@ struct inet_frag_queue {   */  #define INETFRAGS_MAXDEPTH		128 +struct inet_frag_bucket { +	struct hlist_head	chain; +	spinlock_t		chain_lock; +}; +  struct inet_frags { -	struct hlist_head	hash[INETFRAGS_HASHSZ]; +	struct inet_frag_bucket	hash[INETFRAGS_HASHSZ];  	/* This rwlock is a global lock (seperate per IPv4, IPv6 and  	 * netfilter). Important to keep this on a seperate cacheline. +	 * Its primarily a rebuild protection rwlock.  	 */  	rwlock_t		lock ____cacheline_aligned_in_smp;  	int			secret_interval; @@ -143,6 +149,7 @@ static inline void inet_frag_lru_del(struct inet_frag_queue *q)  {  	spin_lock(&q->net->lru_lock);  	list_del(&q->lru_list); +	q->net->nqueues--;  	spin_unlock(&q->net->lru_lock);  } @@ -151,6 +158,19 @@ static inline void inet_frag_lru_add(struct netns_frags *nf,  {  	spin_lock(&nf->lru_lock);  	list_add_tail(&q->lru_list, &nf->lru_list); +	q->net->nqueues++;  	spin_unlock(&nf->lru_lock);  } + +/* RFC 3168 support : + * We want to check ECN values of all fragments, do detect invalid combinations. + * In ipq->ecn, we store the OR value of each ip4_frag_ecn() fragment value. + */ +#define	IPFRAG_ECN_NOT_ECT	0x01 /* one frag had ECN_NOT_ECT */ +#define	IPFRAG_ECN_ECT_1	0x02 /* one frag had ECN_ECT_1 */ +#define	IPFRAG_ECN_ECT_0	0x04 /* one frag had ECN_ECT_0 */ +#define	IPFRAG_ECN_CE		0x08 /* one frag had ECN_CE */ + +extern const u8 ip_frag_ecn_table[16]; +  #endif  |