]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: vxlan: make vxlan_snoop() return drop reasons
authorMenglong Dong <menglong8.dong@gmail.com>
Wed, 9 Oct 2024 02:28:24 +0000 (10:28 +0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 13 Oct 2024 10:33:09 +0000 (11:33 +0100)
Change the return type of vxlan_snoop() from bool to enum
skb_drop_reason. In this commit, two drop reasons are introduced:

  SKB_DROP_REASON_MAC_INVALID_SOURCE
  SKB_DROP_REASON_VXLAN_ENTRY_EXISTS

Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxlan/vxlan_core.c
include/net/dropreason-core.h

index e3ac46d6e1482a35d7e123fbef81642b921157d4..947c29d6605ca1bdedf7fc1ecad6209d8ba3849c 100644 (file)
@@ -1437,9 +1437,10 @@ errout:
  * and Tunnel endpoint.
  * Return true if packet is bogus and should be dropped.
  */
-static bool vxlan_snoop(struct net_device *dev,
-                       union vxlan_addr *src_ip, const u8 *src_mac,
-                       u32 src_ifindex, __be32 vni)
+static enum skb_drop_reason vxlan_snoop(struct net_device *dev,
+                                       union vxlan_addr *src_ip,
+                                       const u8 *src_mac, u32 src_ifindex,
+                                       __be32 vni)
 {
        struct vxlan_dev *vxlan = netdev_priv(dev);
        struct vxlan_fdb *f;
@@ -1447,7 +1448,7 @@ static bool vxlan_snoop(struct net_device *dev,
 
        /* Ignore packets from invalid src-address */
        if (!is_valid_ether_addr(src_mac))
-               return true;
+               return SKB_DROP_REASON_MAC_INVALID_SOURCE;
 
 #if IS_ENABLED(CONFIG_IPV6)
        if (src_ip->sa.sa_family == AF_INET6 &&
@@ -1461,15 +1462,15 @@ static bool vxlan_snoop(struct net_device *dev,
 
                if (likely(vxlan_addr_equal(&rdst->remote_ip, src_ip) &&
                           rdst->remote_ifindex == ifindex))
-                       return false;
+                       return SKB_NOT_DROPPED_YET;
 
                /* Don't migrate static entries, drop packets */
                if (f->state & (NUD_PERMANENT | NUD_NOARP))
-                       return true;
+                       return SKB_DROP_REASON_VXLAN_ENTRY_EXISTS;
 
                /* Don't override an fdb with nexthop with a learnt entry */
                if (rcu_access_pointer(f->nh))
-                       return true;
+                       return SKB_DROP_REASON_VXLAN_ENTRY_EXISTS;
 
                if (net_ratelimit())
                        netdev_info(dev,
@@ -1497,7 +1498,7 @@ static bool vxlan_snoop(struct net_device *dev,
                spin_unlock(&vxlan->hash_lock[hash_index]);
        }
 
-       return false;
+       return SKB_NOT_DROPPED_YET;
 }
 
 static bool __vxlan_sock_release_prep(struct vxlan_sock *vs)
index 98259d2b3e92604404cc016b07759398841f9eb1..1cb8d7c953beb032f88835157cb4fd6bd5f8caea 100644 (file)
@@ -94,6 +94,8 @@
        FN(TC_RECLASSIFY_LOOP)          \
        FN(VXLAN_INVALID_HDR)           \
        FN(VXLAN_VNI_NOT_FOUND)         \
+       FN(MAC_INVALID_SOURCE)          \
+       FN(VXLAN_ENTRY_EXISTS)          \
        FN(IP_TUNNEL_ECN)               \
        FNe(MAX)
 
@@ -429,6 +431,13 @@ enum skb_drop_reason {
        SKB_DROP_REASON_VXLAN_INVALID_HDR,
        /** @SKB_DROP_REASON_VXLAN_VNI_NOT_FOUND: no VXLAN device found for VNI */
        SKB_DROP_REASON_VXLAN_VNI_NOT_FOUND,
+       /** @SKB_DROP_REASON_MAC_INVALID_SOURCE: source mac is invalid */
+       SKB_DROP_REASON_MAC_INVALID_SOURCE,
+       /**
+        * @SKB_DROP_REASON_VXLAN_ENTRY_EXISTS: trying to migrate a static
+        * entry or an entry pointing to a nexthop.
+        */
+       SKB_DROP_REASON_VXLAN_ENTRY_EXISTS,
        /**
         * @SKB_DROP_REASON_IP_TUNNEL_ECN: skb is dropped according to
         * RFC 6040 4.2, see __INET_ECN_decapsulate() for detail.