Commit b0fcee82 authored by Steffen Klassert's avatar Steffen Klassert

xfrm: Add a secpath_set helper.

Add a new helper to set the secpath to the skb.
This avoids code duplication, as this is used
in multiple places.
Signed-off-by: default avatarSteffen Klassert <steffen.klassert@secunet.com>
parent 37b10383
...@@ -1006,6 +1006,7 @@ secpath_put(struct sec_path *sp) ...@@ -1006,6 +1006,7 @@ secpath_put(struct sec_path *sp)
} }
struct sec_path *secpath_dup(struct sec_path *src); struct sec_path *secpath_dup(struct sec_path *src);
int secpath_set(struct sk_buff *skb);
static inline void static inline void
secpath_reset(struct sk_buff *skb) secpath_reset(struct sk_buff *skb)
......
...@@ -69,18 +69,9 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr, ...@@ -69,18 +69,9 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
struct xfrm_state *x = NULL; struct xfrm_state *x = NULL;
int i = 0; int i = 0;
/* Allocate new secpath or COW existing one. */ if (secpath_set(skb)) {
if (!skb->sp || atomic_read(&skb->sp->refcnt) != 1) { XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR);
struct sec_path *sp; goto drop;
sp = secpath_dup(skb->sp);
if (!sp) {
XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR);
goto drop;
}
if (skb->sp)
secpath_put(skb->sp);
skb->sp = sp;
} }
if (1 + skb->sp->len == XFRM_MAX_DEPTH) { if (1 + skb->sp->len == XFRM_MAX_DEPTH) {
......
...@@ -117,6 +117,24 @@ struct sec_path *secpath_dup(struct sec_path *src) ...@@ -117,6 +117,24 @@ struct sec_path *secpath_dup(struct sec_path *src)
} }
EXPORT_SYMBOL(secpath_dup); EXPORT_SYMBOL(secpath_dup);
int secpath_set(struct sk_buff *skb)
{
struct sec_path *sp;
/* Allocate new secpath or COW existing one. */
if (!skb->sp || atomic_read(&skb->sp->refcnt) != 1) {
sp = secpath_dup(skb->sp);
if (!sp)
return -ENOMEM;
if (skb->sp)
secpath_put(skb->sp);
skb->sp = sp;
}
return 0;
}
EXPORT_SYMBOL(secpath_set);
/* Fetch spi and seq from ipsec header */ /* Fetch spi and seq from ipsec header */
int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq) int xfrm_parse_spi(struct sk_buff *skb, u8 nexthdr, __be32 *spi, __be32 *seq)
...@@ -212,18 +230,10 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type) ...@@ -212,18 +230,10 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
break; break;
} }
/* Allocate new secpath or COW existing one. */ err = secpath_set(skb);
if (!skb->sp || atomic_read(&skb->sp->refcnt) != 1) { if (err) {
struct sec_path *sp; XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR);
goto drop;
sp = secpath_dup(skb->sp);
if (!sp) {
XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR);
goto drop;
}
if (skb->sp)
secpath_put(skb->sp);
skb->sp = sp;
} }
seq = 0; seq = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment