xfrm: change secpath_set to return secpath struct, not error value
authorFlorian Westphal <fw@strlen.de>
Tue, 18 Dec 2018 16:15:18 +0000 (17:15 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 19 Dec 2018 19:21:37 +0000 (11:21 -0800)
It can only return 0 (success) or -ENOMEM.
Change return value to a pointer to secpath struct.

This avoids direct access to skb->sp:

err = secpath_set(skb);
if (!err) ..
skb->sp-> ...

Becomes:
sp = secpath_set(skb)
if (!sp) ..
sp-> ..

This reduces noise in followup patch which is going to remove skb->sp.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/xfrm.h
net/ipv4/esp4_offload.c
net/ipv6/esp6_offload.c
net/ipv6/xfrm6_input.c
net/xfrm/xfrm_input.c

index 0a8d70d1691886e7ace4747c739cb8d66db48638..62ca62177bc63c71ea28d6fc2f7717773a70cc80 100644 (file)
@@ -1131,7 +1131,7 @@ secpath_put(struct sec_path *sp)
 }
 
 struct sec_path *secpath_dup(struct sec_path *src);
-int secpath_set(struct sk_buff *skb);
+struct sec_path *secpath_set(struct sk_buff *skb);
 
 static inline void
 secpath_reset(struct sk_buff *skb)
index 58834a10c0be77b3d301169f505dcdc7896dd3f4..19bd22aa05f9006960de55500daa85942e4f7d58 100644 (file)
@@ -46,11 +46,12 @@ static struct sk_buff *esp4_gro_receive(struct list_head *head,
 
        xo = xfrm_offload(skb);
        if (!xo || !(xo->flags & CRYPTO_DONE)) {
-               err = secpath_set(skb);
-               if (err)
+               struct sec_path *sp = secpath_set(skb);
+
+               if (!sp)
                        goto out;
 
-               if (skb->sp->len == XFRM_MAX_DEPTH)
+               if (sp->len == XFRM_MAX_DEPTH)
                        goto out;
 
                x = xfrm_state_lookup(dev_net(skb->dev), skb->mark,
@@ -59,8 +60,8 @@ static struct sk_buff *esp4_gro_receive(struct list_head *head,
                if (!x)
                        goto out;
 
-               skb->sp->xvec[skb->sp->len++] = x;
-               skb->sp->olen++;
+               sp->xvec[sp->len++] = x;
+               sp->olen++;
 
                xo = xfrm_offload(skb);
                if (!xo) {
index 6177e217117189d1b9d422958618443c3e4a0f7f..01a97f5dfa4e285cd46cd7ee3f9279fb6cbf4cb6 100644 (file)
@@ -68,11 +68,12 @@ static struct sk_buff *esp6_gro_receive(struct list_head *head,
 
        xo = xfrm_offload(skb);
        if (!xo || !(xo->flags & CRYPTO_DONE)) {
-               err = secpath_set(skb);
-               if (err)
+               struct sec_path *sp = secpath_set(skb);
+
+               if (!sp)
                        goto out;
 
-               if (skb->sp->len == XFRM_MAX_DEPTH)
+               if (sp->len == XFRM_MAX_DEPTH)
                        goto out;
 
                x = xfrm_state_lookup(dev_net(skb->dev), skb->mark,
@@ -81,8 +82,8 @@ static struct sk_buff *esp6_gro_receive(struct list_head *head,
                if (!x)
                        goto out;
 
-               skb->sp->xvec[skb->sp->len++] = x;
-               skb->sp->olen++;
+               sp->xvec[sp->len++] = x;
+               sp->olen++;
 
                xo = xfrm_offload(skb);
                if (!xo) {
index 9ef490dddcea23b82bd703217bfdde49dce41069..97c69df1b3298003bd4ae4a3a51532b3a88bab59 100644 (file)
@@ -86,14 +86,16 @@ int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
 {
        struct net *net = dev_net(skb->dev);
        struct xfrm_state *x = NULL;
+       struct sec_path *sp;
        int i = 0;
 
-       if (secpath_set(skb)) {
+       sp = secpath_set(skb);
+       if (!sp) {
                XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR);
                goto drop;
        }
 
-       if (1 + skb->sp->len == XFRM_MAX_DEPTH) {
+       if (1 + sp->len == XFRM_MAX_DEPTH) {
                XFRM_INC_STATS(net, LINUX_MIB_XFRMINBUFFERERROR);
                goto drop;
        }
index 684c0bc01e2c12ce5ef61195030fbad2cd26fc02..bda929b9ff35f782b6b2f18cb3454b0e494d3ffa 100644 (file)
@@ -145,21 +145,22 @@ struct sec_path *secpath_dup(struct sec_path *src)
 }
 EXPORT_SYMBOL(secpath_dup);
 
-int secpath_set(struct sk_buff *skb)
+struct sec_path *secpath_set(struct sk_buff *skb)
 {
-       struct sec_path *sp;
+       struct sec_path *sp = skb->sp;
 
        /* Allocate new secpath or COW existing one. */
-       if (!skb->sp || refcount_read(&skb->sp->refcnt) != 1) {
+       if (!sp || refcount_read(&sp->refcnt) != 1) {
                sp = secpath_dup(skb->sp);
                if (!sp)
-                       return -ENOMEM;
+                       return NULL;
 
                if (skb->sp)
                        secpath_put(skb->sp);
                skb->sp = sp;
        }
-       return 0;
+
+       return sp;
 }
 EXPORT_SYMBOL(secpath_set);
 
@@ -236,6 +237,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
        bool xfrm_gro = false;
        bool crypto_done = false;
        struct xfrm_offload *xo = xfrm_offload(skb);
+       struct sec_path *sp;
 
        if (encap_type < 0) {
                x = xfrm_input_state(skb);
@@ -312,8 +314,8 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
                break;
        }
 
-       err = secpath_set(skb);
-       if (err) {
+       sp = secpath_set(skb);
+       if (!sp) {
                XFRM_INC_STATS(net, LINUX_MIB_XFRMINERROR);
                goto drop;
        }