-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 41912 b: refs/heads/master c: f618012 h: refs/heads/master v: v3
- Loading branch information
Martin Josefsson
authored and
David S. Miller
committed
Dec 3, 2006
1 parent
ae1cda6
commit 12f9bc9
Showing
13 changed files
with
200 additions
and
151 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: 7e5d03bb9d2b96fdeab0cb0c98b93e6cf7130c96 | ||
refs/heads/master: f61801218a58381f498ae5c38ae3eae0bc73e976 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
/* | ||
* connection tracking event cache. | ||
*/ | ||
|
||
#ifndef _NF_CONNTRACK_ECACHE_H | ||
#define _NF_CONNTRACK_ECACHE_H | ||
#include <net/netfilter/nf_conntrack.h> | ||
|
||
#include <linux/notifier.h> | ||
#include <linux/interrupt.h> | ||
#include <net/netfilter/nf_conntrack_expect.h> | ||
|
||
#ifdef CONFIG_NF_CONNTRACK_EVENTS | ||
struct nf_conntrack_ecache { | ||
struct nf_conn *ct; | ||
unsigned int events; | ||
}; | ||
DECLARE_PER_CPU(struct nf_conntrack_ecache, nf_conntrack_ecache); | ||
|
||
#define CONNTRACK_ECACHE(x) (__get_cpu_var(nf_conntrack_ecache).x) | ||
|
||
extern struct atomic_notifier_head nf_conntrack_chain; | ||
extern struct atomic_notifier_head nf_conntrack_expect_chain; | ||
|
||
static inline int nf_conntrack_register_notifier(struct notifier_block *nb) | ||
{ | ||
return atomic_notifier_chain_register(&nf_conntrack_chain, nb); | ||
} | ||
|
||
static inline int nf_conntrack_unregister_notifier(struct notifier_block *nb) | ||
{ | ||
return atomic_notifier_chain_unregister(&nf_conntrack_chain, nb); | ||
} | ||
|
||
static inline int | ||
nf_conntrack_expect_register_notifier(struct notifier_block *nb) | ||
{ | ||
return atomic_notifier_chain_register(&nf_conntrack_expect_chain, nb); | ||
} | ||
|
||
static inline int | ||
nf_conntrack_expect_unregister_notifier(struct notifier_block *nb) | ||
{ | ||
return atomic_notifier_chain_unregister(&nf_conntrack_expect_chain, | ||
nb); | ||
} | ||
|
||
extern void nf_ct_deliver_cached_events(const struct nf_conn *ct); | ||
extern void __nf_ct_event_cache_init(struct nf_conn *ct); | ||
extern void nf_ct_event_cache_flush(void); | ||
|
||
static inline void | ||
nf_conntrack_event_cache(enum ip_conntrack_events event, | ||
const struct sk_buff *skb) | ||
{ | ||
struct nf_conn *ct = (struct nf_conn *)skb->nfct; | ||
struct nf_conntrack_ecache *ecache; | ||
|
||
local_bh_disable(); | ||
ecache = &__get_cpu_var(nf_conntrack_ecache); | ||
if (ct != ecache->ct) | ||
__nf_ct_event_cache_init(ct); | ||
ecache->events |= event; | ||
local_bh_enable(); | ||
} | ||
|
||
static inline void nf_conntrack_event(enum ip_conntrack_events event, | ||
struct nf_conn *ct) | ||
{ | ||
if (nf_ct_is_confirmed(ct) && !nf_ct_is_dying(ct)) | ||
atomic_notifier_call_chain(&nf_conntrack_chain, event, ct); | ||
} | ||
|
||
static inline void | ||
nf_conntrack_expect_event(enum ip_conntrack_expect_events event, | ||
struct nf_conntrack_expect *exp) | ||
{ | ||
atomic_notifier_call_chain(&nf_conntrack_expect_chain, event, exp); | ||
} | ||
|
||
#else /* CONFIG_NF_CONNTRACK_EVENTS */ | ||
|
||
static inline void nf_conntrack_event_cache(enum ip_conntrack_events event, | ||
const struct sk_buff *skb) {} | ||
static inline void nf_conntrack_event(enum ip_conntrack_events event, | ||
struct nf_conn *ct) {} | ||
static inline void nf_ct_deliver_cached_events(const struct nf_conn *ct) {} | ||
static inline void | ||
nf_conntrack_expect_event(enum ip_conntrack_expect_events event, | ||
struct nf_conntrack_expect *exp) {} | ||
static inline void nf_ct_event_cache_flush(void) {} | ||
#endif /* CONFIG_NF_CONNTRACK_EVENTS */ | ||
|
||
#endif /*_NF_CONNTRACK_ECACHE_H*/ | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
/* Event cache for netfilter. */ | ||
|
||
/* (C) 1999-2001 Paul `Rusty' Russell | ||
* (C) 2002-2006 Netfilter Core Team <coreteam@netfilter.org> | ||
* (C) 2003,2004 USAGI/WIDE Project <http://www.linux-ipv6.org> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#include <linux/types.h> | ||
#include <linux/netfilter.h> | ||
#include <linux/skbuff.h> | ||
#include <linux/vmalloc.h> | ||
#include <linux/stddef.h> | ||
#include <linux/err.h> | ||
#include <linux/percpu.h> | ||
#include <linux/notifier.h> | ||
#include <linux/kernel.h> | ||
#include <linux/netdevice.h> | ||
|
||
#include <net/netfilter/nf_conntrack.h> | ||
#include <net/netfilter/nf_conntrack_l3proto.h> | ||
#include <net/netfilter/nf_conntrack_protocol.h> | ||
#include <net/netfilter/nf_conntrack_expect.h> | ||
#include <net/netfilter/nf_conntrack_helper.h> | ||
#include <net/netfilter/nf_conntrack_core.h> | ||
|
||
ATOMIC_NOTIFIER_HEAD(nf_conntrack_chain); | ||
ATOMIC_NOTIFIER_HEAD(nf_conntrack_expect_chain); | ||
|
||
DEFINE_PER_CPU(struct nf_conntrack_ecache, nf_conntrack_ecache); | ||
|
||
/* deliver cached events and clear cache entry - must be called with locally | ||
* disabled softirqs */ | ||
static inline void | ||
__nf_ct_deliver_cached_events(struct nf_conntrack_ecache *ecache) | ||
{ | ||
if (nf_ct_is_confirmed(ecache->ct) && !nf_ct_is_dying(ecache->ct) | ||
&& ecache->events) | ||
atomic_notifier_call_chain(&nf_conntrack_chain, ecache->events, | ||
ecache->ct); | ||
|
||
ecache->events = 0; | ||
nf_ct_put(ecache->ct); | ||
ecache->ct = NULL; | ||
} | ||
|
||
/* Deliver all cached events for a particular conntrack. This is called | ||
* by code prior to async packet handling for freeing the skb */ | ||
void nf_ct_deliver_cached_events(const struct nf_conn *ct) | ||
{ | ||
struct nf_conntrack_ecache *ecache; | ||
|
||
local_bh_disable(); | ||
ecache = &__get_cpu_var(nf_conntrack_ecache); | ||
if (ecache->ct == ct) | ||
__nf_ct_deliver_cached_events(ecache); | ||
local_bh_enable(); | ||
} | ||
|
||
/* Deliver cached events for old pending events, if current conntrack != old */ | ||
void __nf_ct_event_cache_init(struct nf_conn *ct) | ||
{ | ||
struct nf_conntrack_ecache *ecache; | ||
|
||
/* take care of delivering potentially old events */ | ||
ecache = &__get_cpu_var(nf_conntrack_ecache); | ||
BUG_ON(ecache->ct == ct); | ||
if (ecache->ct) | ||
__nf_ct_deliver_cached_events(ecache); | ||
/* initialize for this conntrack/packet */ | ||
ecache->ct = ct; | ||
nf_conntrack_get(&ct->ct_general); | ||
} | ||
|
||
/* flush the event cache - touches other CPU's data and must not be called | ||
* while packets are still passing through the code */ | ||
void nf_ct_event_cache_flush(void) | ||
{ | ||
struct nf_conntrack_ecache *ecache; | ||
int cpu; | ||
|
||
for_each_possible_cpu(cpu) { | ||
ecache = &per_cpu(nf_conntrack_ecache, cpu); | ||
if (ecache->ct) | ||
nf_ct_put(ecache->ct); | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.