Commit 7b3e018f authored by Menglong Dong's avatar Menglong Dong Committed by David S. Miller
Browse files

net: vxlan: make vxlan_remcsum() return drop reasons



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: default avatarMenglong Dong <dongml2@chinatelecom.cn>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Reviewed-by: default avatarKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4c06d9da
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -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) = { };