diff options
author | Fan Du <fan.du@windriver.com> | 2014-01-02 22:18:32 -0500 |
---|---|---|
committer | Steffen Klassert <steffen.klassert@secunet.com> | 2014-01-03 01:29:12 -0500 |
commit | c454997e68eb013510ba128283ad3b4aefeff630 (patch) | |
tree | c32cd7284c1e831c84aa962bced9fb0d816b5c51 /net/xfrm | |
parent | cf93d47ed4489cc349678f397290b3ecba868a3b (diff) |
{pktgen, xfrm} Introduce xfrm_state_lookup_byspi for pktgen
Introduce xfrm_state_lookup_byspi to find user specified by custom
from "pgset spi xxx". Using this scheme, any flow regardless its
saddr/daddr could be transform by SA specified with configurable
spi.
Signed-off-by: Fan Du <fan.du@windriver.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Diffstat (limited to 'net/xfrm')
-rw-r--r-- | net/xfrm/xfrm_state.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 300744094ad8..62181486ead8 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -915,6 +915,28 @@ xfrm_stateonly_find(struct net *net, u32 mark, | |||
915 | } | 915 | } |
916 | EXPORT_SYMBOL(xfrm_stateonly_find); | 916 | EXPORT_SYMBOL(xfrm_stateonly_find); |
917 | 917 | ||
918 | struct xfrm_state *xfrm_state_lookup_byspi(struct net *net, __be32 spi, | ||
919 | unsigned short family) | ||
920 | { | ||
921 | struct xfrm_state *x; | ||
922 | struct xfrm_state_walk *w; | ||
923 | |||
924 | spin_lock_bh(&net->xfrm.xfrm_state_lock); | ||
925 | list_for_each_entry(w, &net->xfrm.state_all, all) { | ||
926 | x = container_of(w, struct xfrm_state, km); | ||
927 | if (x->props.family != family || | ||
928 | x->id.spi != spi) | ||
929 | continue; | ||
930 | |||
931 | spin_unlock_bh(&net->xfrm.xfrm_state_lock); | ||
932 | xfrm_state_hold(x); | ||
933 | return x; | ||
934 | } | ||
935 | spin_unlock_bh(&net->xfrm.xfrm_state_lock); | ||
936 | return NULL; | ||
937 | } | ||
938 | EXPORT_SYMBOL(xfrm_state_lookup_byspi); | ||
939 | |||
918 | static void __xfrm_state_insert(struct xfrm_state *x) | 940 | static void __xfrm_state_insert(struct xfrm_state *x) |
919 | { | 941 | { |
920 | struct net *net = xs_net(x); | 942 | struct net *net = xs_net(x); |