net: vxlan: make vxlan_remcsum() return drop reasons
authorMenglong Dong <menglong8.dong@gmail.com>
Wed, 9 Oct 2024 02:28:23 +0000 (10:28 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 13 Oct 2024 10:33:09 +0000 (11:33 +0100)
Make vxlan_remcsum() support skb drop reasons by changing the return
value type of it from bool to enum skb_drop_reason.

The only drop reason in vxlan_remcsum() comes from pskb_may_pull_reason(),
so we just return it.

Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
Reviewed-by: Simon Horman <horms@kernel.org>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxlan/vxlan_core.c

index 40111d05d18e487878e80af3aa5ebc4a2ea2609c..e3ac46d6e1482a35d7e123fbef81642b921157d4 100644 (file)
@@ -1551,9 +1551,11 @@ static void vxlan_sock_release(struct vxlan_dev *vxlan)
 #endif
 }
 
-static bool vxlan_remcsum(struct vxlanhdr *unparsed,
-                         struct sk_buff *skb, u32 vxflags)
+static enum skb_drop_reason vxlan_remcsum(struct vxlanhdr *unparsed,
+                                         struct sk_buff *skb,
+                                         u32 vxflags)
 {
+       enum skb_drop_reason reason;
        size_t start, offset;
 
        if (!(unparsed->vx_flags & VXLAN_HF_RCO) || skb->remcsum_offload)
@@ -1562,15 +1564,17 @@ static bool vxlan_remcsum(struct vxlanhdr *unparsed,
        start = vxlan_rco_start(unparsed->vx_vni);
        offset = start + vxlan_rco_offset(unparsed->vx_vni);
 
-       if (!pskb_may_pull(skb, offset + sizeof(u16)))
-               return false;
+       reason = pskb_may_pull_reason(skb, offset + sizeof(u16));
+       if (reason)
+               return reason;
 
        skb_remcsum_process(skb, (void *)(vxlan_hdr(skb) + 1), start, offset,
                            !!(vxflags & VXLAN_F_REMCSUM_NOPARTIAL));
 out:
        unparsed->vx_flags &= ~VXLAN_HF_RCO;
        unparsed->vx_vni &= VXLAN_VNI_MASK;
-       return true;
+
+       return SKB_NOT_DROPPED_YET;
 }
 
 static void vxlan_parse_gbp_hdr(struct vxlanhdr *unparsed,
@@ -1723,9 +1727,11 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
                goto drop;
        }
 
-       if (vs->flags & VXLAN_F_REMCSUM_RX)
-               if (unlikely(!vxlan_remcsum(&unparsed, skb, vs->flags)))
+       if (vs->flags & VXLAN_F_REMCSUM_RX) {
+               reason = vxlan_remcsum(&unparsed, skb, vs->flags);
+               if (unlikely(reason))
                        goto drop;
+       }
 
        if (vxlan_collect_metadata(vs)) {
                IP_TUNNEL_DECLARE_FLAGS(flags) = { };