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

net: vxlan: make vxlan_set_mac() return drop reasons



Change the return type of vxlan_set_mac() from bool to enum
skb_drop_reason. In this commit, the drop reason
"SKB_DROP_REASON_LOCAL_MAC" is introduced for the case that the source
mac of the packet is a local mac.

Signed-off-by: default avatarMenglong Dong <dongml2@chinatelecom.cn>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 289fd4e7
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -1609,7 +1609,7 @@ static void vxlan_parse_gbp_hdr(struct vxlanhdr *unparsed,
	unparsed->vx_flags &= ~VXLAN_GBP_USED_BITS;
}

static bool vxlan_set_mac(struct vxlan_dev *vxlan,
static enum skb_drop_reason vxlan_set_mac(struct vxlan_dev *vxlan,
					  struct vxlan_sock *vs,
					  struct sk_buff *skb, __be32 vni)
{
@@ -1622,7 +1622,7 @@ static bool vxlan_set_mac(struct vxlan_dev *vxlan,

	/* Ignore packet loops (and multicast echo) */
	if (ether_addr_equal(eth_hdr(skb)->h_source, vxlan->dev->dev_addr))
		return false;
		return SKB_DROP_REASON_LOCAL_MAC;

	/* Get address from the outer IP header */
	if (vxlan_get_sk_family(vs) == AF_INET) {
@@ -1635,11 +1635,11 @@ static bool vxlan_set_mac(struct vxlan_dev *vxlan,
#endif
	}

	if ((vxlan->cfg.flags & VXLAN_F_LEARN) &&
	    vxlan_snoop(skb->dev, &saddr, eth_hdr(skb)->h_source, ifindex, vni))
		return false;
	if (!(vxlan->cfg.flags & VXLAN_F_LEARN))
		return SKB_NOT_DROPPED_YET;

	return true;
	return vxlan_snoop(skb->dev, &saddr, eth_hdr(skb)->h_source,
			   ifindex, vni);
}

static bool vxlan_ecn_decapsulate(struct vxlan_sock *vs, void *oiph,
@@ -1774,7 +1774,8 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
	}

	if (!raw_proto) {
		if (!vxlan_set_mac(vxlan, vs, skb, vni))
		reason = vxlan_set_mac(vxlan, vs, skb, vni);
		if (reason)
			goto drop;
	} else {
		skb_reset_mac_header(skb);
+6 −0
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@
	FN(MAC_INVALID_SOURCE)		\
	FN(VXLAN_ENTRY_EXISTS)		\
	FN(IP_TUNNEL_ECN)		\
	FN(LOCAL_MAC)			\
	FNe(MAX)

/**
@@ -443,6 +444,11 @@ enum skb_drop_reason {
	 * RFC 6040 4.2, see __INET_ECN_decapsulate() for detail.
	 */
	SKB_DROP_REASON_IP_TUNNEL_ECN,
	/**
	 * @SKB_DROP_REASON_LOCAL_MAC: the source MAC address is equal to
	 * the MAC address of the local netdev.
	 */
	SKB_DROP_REASON_LOCAL_MAC,
	/**
	 * @SKB_DROP_REASON_MAX: the maximum of core drop reasons, which
	 * shouldn't be used as a real 'reason' - only for tracing code gen