* [PATCH net-next v3 01/12] net: skb: add pskb_network_may_pull_reason() helper
2024-09-09 7:16 [PATCH net-next v3 00/12] net: vxlan: add skb drop reasons support Menglong Dong
@ 2024-09-09 7:16 ` Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 02/12] net: tunnel: add pskb_inet_may_pull_reason() helper Menglong Dong
` (10 subsequent siblings)
11 siblings, 0 replies; 20+ messages in thread
From: Menglong Dong @ 2024-09-09 7:16 UTC (permalink / raw)
To: idosch, kuba, aleksander.lobakin, horms
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
Introduce the function pskb_network_may_pull_reason() and make
pskb_network_may_pull() a simple inline call to it. The drop reasons of
it just come from pskb_may_pull_reason.
Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
---
include/linux/skbuff.h | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index cf8f6ce06742..fe6f97b550fc 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -3114,9 +3114,15 @@ static inline int skb_inner_network_offset(const struct sk_buff *skb)
return skb_inner_network_header(skb) - skb->data;
}
+static inline enum skb_drop_reason
+pskb_network_may_pull_reason(struct sk_buff *skb, unsigned int len)
+{
+ return pskb_may_pull_reason(skb, skb_network_offset(skb) + len);
+}
+
static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len)
{
- return pskb_may_pull(skb, skb_network_offset(skb) + len);
+ return pskb_network_may_pull_reason(skb, len) == SKB_NOT_DROPPED_YET;
}
/*
--
2.39.2
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH net-next v3 02/12] net: tunnel: add pskb_inet_may_pull_reason() helper
2024-09-09 7:16 [PATCH net-next v3 00/12] net: vxlan: add skb drop reasons support Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 01/12] net: skb: add pskb_network_may_pull_reason() helper Menglong Dong
@ 2024-09-09 7:16 ` Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 03/12] net: tunnel: add skb_vlan_inet_prepare_reason() helper Menglong Dong
` (9 subsequent siblings)
11 siblings, 0 replies; 20+ messages in thread
From: Menglong Dong @ 2024-09-09 7:16 UTC (permalink / raw)
To: idosch, kuba, aleksander.lobakin, horms
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
Introduce the function pskb_inet_may_pull_reason() and make
pskb_inet_may_pull a simple inline call to it. The drop reasons of it just
come from pskb_may_pull_reason().
Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
---
include/net/ip_tunnels.h | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h
index 6194fbb564c6..7fc2f7bf837a 100644
--- a/include/net/ip_tunnels.h
+++ b/include/net/ip_tunnels.h
@@ -439,7 +439,8 @@ int ip_tunnel_encap_del_ops(const struct ip_tunnel_encap_ops *op,
int ip_tunnel_encap_setup(struct ip_tunnel *t,
struct ip_tunnel_encap *ipencap);
-static inline bool pskb_inet_may_pull(struct sk_buff *skb)
+static inline enum skb_drop_reason
+pskb_inet_may_pull_reason(struct sk_buff *skb)
{
int nhlen;
@@ -456,7 +457,12 @@ static inline bool pskb_inet_may_pull(struct sk_buff *skb)
nhlen = 0;
}
- return pskb_network_may_pull(skb, nhlen);
+ return pskb_network_may_pull_reason(skb, nhlen);
+}
+
+static inline bool pskb_inet_may_pull(struct sk_buff *skb)
+{
+ return pskb_inet_may_pull_reason(skb) == SKB_NOT_DROPPED_YET;
}
/* Variant of pskb_inet_may_pull().
--
2.39.2
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH net-next v3 03/12] net: tunnel: add skb_vlan_inet_prepare_reason() helper
2024-09-09 7:16 [PATCH net-next v3 00/12] net: vxlan: add skb drop reasons support Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 01/12] net: skb: add pskb_network_may_pull_reason() helper Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 02/12] net: tunnel: add pskb_inet_may_pull_reason() helper Menglong Dong
@ 2024-09-09 7:16 ` Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 04/12] net: vxlan: add skb drop reasons to vxlan_rcv() Menglong Dong
` (8 subsequent siblings)
11 siblings, 0 replies; 20+ messages in thread
From: Menglong Dong @ 2024-09-09 7:16 UTC (permalink / raw)
To: idosch, kuba, aleksander.lobakin, horms
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
Introduce the function skb_vlan_inet_prepare_reason() and make
skb_vlan_inet_prepare an inline call to it. The drop reasons of it just
come from pskb_may_pull_reason.
Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
---
v3:
- fix some format problems, as Alexander advised
---
include/net/ip_tunnels.h | 22 ++++++++++++++++------
1 file changed, 16 insertions(+), 6 deletions(-)
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h
index 7fc2f7bf837a..d00d8835e789 100644
--- a/include/net/ip_tunnels.h
+++ b/include/net/ip_tunnels.h
@@ -465,13 +465,14 @@ static inline bool pskb_inet_may_pull(struct sk_buff *skb)
return pskb_inet_may_pull_reason(skb) == SKB_NOT_DROPPED_YET;
}
-/* Variant of pskb_inet_may_pull().
+/* Variant of pskb_inet_may_pull_reason().
*/
-static inline bool skb_vlan_inet_prepare(struct sk_buff *skb,
- bool inner_proto_inherit)
+static inline enum skb_drop_reason
+skb_vlan_inet_prepare_reason(struct sk_buff *skb, bool inner_proto_inherit)
{
int nhlen = 0, maclen = inner_proto_inherit ? 0 : ETH_HLEN;
__be16 type = skb->protocol;
+ enum skb_drop_reason reason;
/* Essentially this is skb_protocol(skb, true)
* And we get MAC len.
@@ -492,11 +493,20 @@ static inline bool skb_vlan_inet_prepare(struct sk_buff *skb,
/* For ETH_P_IPV6/ETH_P_IP we make sure to pull
* a base network header in skb->head.
*/
- if (!pskb_may_pull(skb, maclen + nhlen))
- return false;
+ reason = pskb_may_pull_reason(skb, maclen + nhlen);
+ if (reason)
+ return reason;
skb_set_network_header(skb, maclen);
- return true;
+
+ return SKB_NOT_DROPPED_YET;
+}
+
+static inline bool skb_vlan_inet_prepare(struct sk_buff *skb,
+ bool inner_proto_inherit)
+{
+ return skb_vlan_inet_prepare_reason(skb, inner_proto_inherit) ==
+ SKB_NOT_DROPPED_YET;
}
static inline int ip_encap_hlen(struct ip_tunnel_encap *e)
--
2.39.2
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH net-next v3 04/12] net: vxlan: add skb drop reasons to vxlan_rcv()
2024-09-09 7:16 [PATCH net-next v3 00/12] net: vxlan: add skb drop reasons support Menglong Dong
` (2 preceding siblings ...)
2024-09-09 7:16 ` [PATCH net-next v3 03/12] net: tunnel: add skb_vlan_inet_prepare_reason() helper Menglong Dong
@ 2024-09-09 7:16 ` Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 05/12] net: vxlan: make vxlan_remcsum() return drop reasons Menglong Dong
` (7 subsequent siblings)
11 siblings, 0 replies; 20+ messages in thread
From: Menglong Dong @ 2024-09-09 7:16 UTC (permalink / raw)
To: idosch, kuba, aleksander.lobakin, horms
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
Introduce skb drop reasons to the function vxlan_rcv(). Following new
drop reasons are added:
SKB_DROP_REASON_VXLAN_INVALID_HDR
SKB_DROP_REASON_VXLAN_VNI_NOT_FOUND
SKB_DROP_REASON_IP_TUNNEL_ECN
Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
---
v3:
- modify vxlan_set_mac() and vxlan_remcsum() after this patch
v2:
- rename the drop reasons, as Ido advised.
- document the drop reasons
---
drivers/net/vxlan/vxlan_core.c | 26 ++++++++++++++++++++------
include/net/dropreason-core.h | 16 ++++++++++++++++
2 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
index 53dcb9fffc04..04c56f952f29 100644
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -1671,13 +1671,15 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
struct vxlan_metadata _md;
struct vxlan_metadata *md = &_md;
__be16 protocol = htons(ETH_P_TEB);
+ enum skb_drop_reason reason;
bool raw_proto = false;
void *oiph;
__be32 vni = 0;
int nh;
/* Need UDP and VXLAN header to be present */
- if (!pskb_may_pull(skb, VXLAN_HLEN))
+ reason = pskb_may_pull_reason(skb, VXLAN_HLEN);
+ if (reason)
goto drop;
unparsed = *vxlan_hdr(skb);
@@ -1686,6 +1688,7 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
netdev_dbg(skb->dev, "invalid vxlan flags=%#x vni=%#x\n",
ntohl(vxlan_hdr(skb)->vx_flags),
ntohl(vxlan_hdr(skb)->vx_vni));
+ reason = SKB_DROP_REASON_VXLAN_INVALID_HDR;
/* Return non vxlan pkt */
goto drop;
}
@@ -1699,8 +1702,10 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
vni = vxlan_vni(vxlan_hdr(skb)->vx_vni);
vxlan = vxlan_vs_find_vni(vs, skb->dev->ifindex, vni, &vninode);
- if (!vxlan)
+ if (!vxlan) {
+ reason = SKB_DROP_REASON_VXLAN_VNI_NOT_FOUND;
goto drop;
+ }
/* For backwards compatibility, only allow reserved fields to be
* used by VXLAN extensions if explicitly requested.
@@ -1713,8 +1718,10 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
}
if (__iptunnel_pull_header(skb, VXLAN_HLEN, protocol, raw_proto,
- !net_eq(vxlan->net, dev_net(vxlan->dev))))
+ !net_eq(vxlan->net, dev_net(vxlan->dev)))) {
+ reason = SKB_DROP_REASON_NOMEM;
goto drop;
+ }
if (vs->flags & VXLAN_F_REMCSUM_RX)
if (unlikely(!vxlan_remcsum(&unparsed, skb, vs->flags)))
@@ -1728,8 +1735,10 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
tun_dst = udp_tun_rx_dst(skb, vxlan_get_sk_family(vs), flags,
key32_to_tunnel_id(vni), sizeof(*md));
- if (!tun_dst)
+ if (!tun_dst) {
+ reason = SKB_DROP_REASON_NOMEM;
goto drop;
+ }
md = ip_tunnel_info_opts(&tun_dst->u.tun_info);
@@ -1753,6 +1762,7 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
* is more robust and provides a little more security in
* adding extensions to VXLAN.
*/
+ reason = SKB_DROP_REASON_VXLAN_INVALID_HDR;
goto drop;
}
@@ -1773,7 +1783,8 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
skb_reset_network_header(skb);
- if (!pskb_inet_may_pull(skb)) {
+ reason = pskb_inet_may_pull_reason(skb);
+ if (reason) {
DEV_STATS_INC(vxlan->dev, rx_length_errors);
DEV_STATS_INC(vxlan->dev, rx_errors);
vxlan_vnifilter_count(vxlan, vni, vninode,
@@ -1785,6 +1796,7 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
oiph = skb->head + nh;
if (!vxlan_ecn_decapsulate(vs, oiph, skb)) {
+ reason = SKB_DROP_REASON_IP_TUNNEL_ECN;
DEV_STATS_INC(vxlan->dev, rx_frame_errors);
DEV_STATS_INC(vxlan->dev, rx_errors);
vxlan_vnifilter_count(vxlan, vni, vninode,
@@ -1799,6 +1811,7 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
dev_core_stats_rx_dropped_inc(vxlan->dev);
vxlan_vnifilter_count(vxlan, vni, vninode,
VXLAN_VNI_STATS_RX_DROPS, 0);
+ reason = SKB_DROP_REASON_DEV_READY;
goto drop;
}
@@ -1811,8 +1824,9 @@ static int vxlan_rcv(struct sock *sk, struct sk_buff *skb)
return 0;
drop:
+ reason = reason ?: SKB_DROP_REASON_NOT_SPECIFIED;
/* Consume bad packet */
- kfree_skb(skb);
+ kfree_skb_reason(skb, reason);
return 0;
}
diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
index 4748680e8c88..98259d2b3e92 100644
--- a/include/net/dropreason-core.h
+++ b/include/net/dropreason-core.h
@@ -92,6 +92,9 @@
FN(PACKET_SOCK_ERROR) \
FN(TC_CHAIN_NOTFOUND) \
FN(TC_RECLASSIFY_LOOP) \
+ FN(VXLAN_INVALID_HDR) \
+ FN(VXLAN_VNI_NOT_FOUND) \
+ FN(IP_TUNNEL_ECN) \
FNe(MAX)
/**
@@ -418,6 +421,19 @@ enum skb_drop_reason {
* iterations.
*/
SKB_DROP_REASON_TC_RECLASSIFY_LOOP,
+ /**
+ * @SKB_DROP_REASON_VXLAN_INVALID_HDR: VXLAN header is invalid. E.g.:
+ * 1) reserved fields are not zero
+ * 2) "I" flag is not set
+ */
+ 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_IP_TUNNEL_ECN: skb is dropped according to
+ * RFC 6040 4.2, see __INET_ECN_decapsulate() for detail.
+ */
+ SKB_DROP_REASON_IP_TUNNEL_ECN,
/**
* @SKB_DROP_REASON_MAX: the maximum of core drop reasons, which
* shouldn't be used as a real 'reason' - only for tracing code gen
--
2.39.2
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH net-next v3 05/12] net: vxlan: make vxlan_remcsum() return drop reasons
2024-09-09 7:16 [PATCH net-next v3 00/12] net: vxlan: add skb drop reasons support Menglong Dong
` (3 preceding siblings ...)
2024-09-09 7:16 ` [PATCH net-next v3 04/12] net: vxlan: add skb drop reasons to vxlan_rcv() Menglong Dong
@ 2024-09-09 7:16 ` Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 06/12] net: vxlan: make vxlan_snoop() " Menglong Dong
` (6 subsequent siblings)
11 siblings, 0 replies; 20+ messages in thread
From: Menglong Dong @ 2024-09-09 7:16 UTC (permalink / raw)
To: idosch, kuba, aleksander.lobakin, horms
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
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>
---
v3:
- add a empty newline before return, as Alexander advised
- adjust the call of vxlan_remcsum()
---
drivers/net/vxlan/vxlan_core.c | 20 +++++++++++++-------
1 file changed, 13 insertions(+), 7 deletions(-)
diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
index 04c56f952f29..03c82c945b33 100644
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -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) = { };
--
2.39.2
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH net-next v3 06/12] net: vxlan: make vxlan_snoop() return drop reasons
2024-09-09 7:16 [PATCH net-next v3 00/12] net: vxlan: add skb drop reasons support Menglong Dong
` (4 preceding siblings ...)
2024-09-09 7:16 ` [PATCH net-next v3 05/12] net: vxlan: make vxlan_remcsum() return drop reasons Menglong Dong
@ 2024-09-09 7:16 ` Menglong Dong
2024-09-11 8:08 ` Ido Schimmel
2024-09-09 7:16 ` [PATCH net-next v3 07/12] net: vxlan: make vxlan_set_mac() " Menglong Dong
` (5 subsequent siblings)
11 siblings, 1 reply; 20+ messages in thread
From: Menglong Dong @ 2024-09-09 7:16 UTC (permalink / raw)
To: idosch, kuba, aleksander.lobakin, horms
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
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_VXLAN_INVALID_SMAC
SKB_DROP_REASON_VXLAN_ENTRY_EXISTS
Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
---
drivers/net/vxlan/vxlan_core.c | 17 +++++++++--------
include/net/dropreason-core.h | 9 +++++++++
2 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
index 03c82c945b33..2ba25be78ac9 100644
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -1437,9 +1437,10 @@ static int vxlan_fdb_get(struct sk_buff *skb,
* 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_VXLAN_INVALID_SMAC;
#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)
diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
index 98259d2b3e92..1b9ec4a49c38 100644
--- a/include/net/dropreason-core.h
+++ b/include/net/dropreason-core.h
@@ -94,6 +94,8 @@
FN(TC_RECLASSIFY_LOOP) \
FN(VXLAN_INVALID_HDR) \
FN(VXLAN_VNI_NOT_FOUND) \
+ FN(VXLAN_INVALID_SMAC) \
+ 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_VXLAN_INVALID_SMAC: source mac is invalid */
+ SKB_DROP_REASON_VXLAN_INVALID_SMAC,
+ /**
+ * @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.
--
2.39.2
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH net-next v3 06/12] net: vxlan: make vxlan_snoop() return drop reasons
2024-09-09 7:16 ` [PATCH net-next v3 06/12] net: vxlan: make vxlan_snoop() " Menglong Dong
@ 2024-09-11 8:08 ` Ido Schimmel
2024-09-12 2:30 ` Menglong Dong
0 siblings, 1 reply; 20+ messages in thread
From: Ido Schimmel @ 2024-09-11 8:08 UTC (permalink / raw)
To: Menglong Dong
Cc: kuba, aleksander.lobakin, horms, davem, edumazet, pabeni, dsahern,
dongml2, amcohen, gnault, bpoirier, b.galvani, razor, petrm,
linux-kernel, netdev
On Mon, Sep 09, 2024 at 03:16:46PM +0800, Menglong Dong wrote:
> @@ -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_VXLAN_INVALID_SMAC;
[...]
> diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
> index 98259d2b3e92..1b9ec4a49c38 100644
> --- a/include/net/dropreason-core.h
> +++ b/include/net/dropreason-core.h
> @@ -94,6 +94,8 @@
> FN(TC_RECLASSIFY_LOOP) \
> FN(VXLAN_INVALID_HDR) \
> FN(VXLAN_VNI_NOT_FOUND) \
> + FN(VXLAN_INVALID_SMAC) \
Since this is now part of the core reasons, why not name it
"INVALID_SMAC" so that it could be reused outside of the VXLAN driver?
For example, the bridge driver has the exact same check in its receive
path (see br_handle_frame()).
> + FN(VXLAN_ENTRY_EXISTS) \
> FN(IP_TUNNEL_ECN) \
> FNe(MAX)
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net-next v3 06/12] net: vxlan: make vxlan_snoop() return drop reasons
2024-09-11 8:08 ` Ido Schimmel
@ 2024-09-12 2:30 ` Menglong Dong
2024-09-13 9:13 ` Menglong Dong
0 siblings, 1 reply; 20+ messages in thread
From: Menglong Dong @ 2024-09-12 2:30 UTC (permalink / raw)
To: Ido Schimmel
Cc: kuba, aleksander.lobakin, horms, davem, edumazet, pabeni, dsahern,
dongml2, amcohen, gnault, bpoirier, b.galvani, razor, petrm,
linux-kernel, netdev
On Wed, Sep 11, 2024 at 4:08 PM Ido Schimmel <idosch@nvidia.com> wrote:
>
> On Mon, Sep 09, 2024 at 03:16:46PM +0800, Menglong Dong wrote:
> > @@ -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_VXLAN_INVALID_SMAC;
>
> [...]
>
> > diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
> > index 98259d2b3e92..1b9ec4a49c38 100644
> > --- a/include/net/dropreason-core.h
> > +++ b/include/net/dropreason-core.h
> > @@ -94,6 +94,8 @@
> > FN(TC_RECLASSIFY_LOOP) \
> > FN(VXLAN_INVALID_HDR) \
> > FN(VXLAN_VNI_NOT_FOUND) \
> > + FN(VXLAN_INVALID_SMAC) \
>
> Since this is now part of the core reasons, why not name it
> "INVALID_SMAC" so that it could be reused outside of the VXLAN driver?
> For example, the bridge driver has the exact same check in its receive
> path (see br_handle_frame()).
>
Yeah, I checked the br_handle_frame() and it indeed does
the same check.
I'll rename it to INVALID_SMAC for general usage.
Thanks!
Menglong Dong
> > + FN(VXLAN_ENTRY_EXISTS) \
> > FN(IP_TUNNEL_ECN) \
> > FNe(MAX)
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net-next v3 06/12] net: vxlan: make vxlan_snoop() return drop reasons
2024-09-12 2:30 ` Menglong Dong
@ 2024-09-13 9:13 ` Menglong Dong
2024-09-14 9:33 ` Simon Horman
0 siblings, 1 reply; 20+ messages in thread
From: Menglong Dong @ 2024-09-13 9:13 UTC (permalink / raw)
To: Ido Schimmel, Jakub Kicinski, Alexander Lobakin, Simon Horman
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
On Thu, Sep 12, 2024 at 10:30 AM Menglong Dong <menglong8.dong@gmail.com> wrote:
>
> On Wed, Sep 11, 2024 at 4:08 PM Ido Schimmel <idosch@nvidia.com> wrote:
> >
> > On Mon, Sep 09, 2024 at 03:16:46PM +0800, Menglong Dong wrote:
> > > @@ -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_VXLAN_INVALID_SMAC;
> >
> > [...]
> >
> > > diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
> > > index 98259d2b3e92..1b9ec4a49c38 100644
> > > --- a/include/net/dropreason-core.h
> > > +++ b/include/net/dropreason-core.h
> > > @@ -94,6 +94,8 @@
> > > FN(TC_RECLASSIFY_LOOP) \
> > > FN(VXLAN_INVALID_HDR) \
> > > FN(VXLAN_VNI_NOT_FOUND) \
> > > + FN(VXLAN_INVALID_SMAC) \
> >
> > Since this is now part of the core reasons, why not name it
> > "INVALID_SMAC" so that it could be reused outside of the VXLAN driver?
> > For example, the bridge driver has the exact same check in its receive
> > path (see br_handle_frame()).
> >
>
> Yeah, I checked the br_handle_frame() and it indeed does
> the same check.
>
> I'll rename it to INVALID_SMAC for general usage.
>
Hello, does anyone have more comments on this series before I
send the next version?
Thanks!
Menglong Dong
> > > + FN(VXLAN_ENTRY_EXISTS) \
> > > FN(IP_TUNNEL_ECN) \
> > > FNe(MAX)
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net-next v3 06/12] net: vxlan: make vxlan_snoop() return drop reasons
2024-09-13 9:13 ` Menglong Dong
@ 2024-09-14 9:33 ` Simon Horman
2024-09-16 4:39 ` Menglong Dong
0 siblings, 1 reply; 20+ messages in thread
From: Simon Horman @ 2024-09-14 9:33 UTC (permalink / raw)
To: Menglong Dong
Cc: Ido Schimmel, Jakub Kicinski, Alexander Lobakin, davem, edumazet,
pabeni, dsahern, dongml2, amcohen, gnault, bpoirier, b.galvani,
razor, petrm, linux-kernel, netdev
On Fri, Sep 13, 2024 at 05:13:41PM +0800, Menglong Dong wrote:
> On Thu, Sep 12, 2024 at 10:30 AM Menglong Dong <menglong8.dong@gmail.com> wrote:
> >
> > On Wed, Sep 11, 2024 at 4:08 PM Ido Schimmel <idosch@nvidia.com> wrote:
> > >
> > > On Mon, Sep 09, 2024 at 03:16:46PM +0800, Menglong Dong wrote:
> > > > @@ -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_VXLAN_INVALID_SMAC;
> > >
> > > [...]
> > >
> > > > diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
> > > > index 98259d2b3e92..1b9ec4a49c38 100644
> > > > --- a/include/net/dropreason-core.h
> > > > +++ b/include/net/dropreason-core.h
> > > > @@ -94,6 +94,8 @@
> > > > FN(TC_RECLASSIFY_LOOP) \
> > > > FN(VXLAN_INVALID_HDR) \
> > > > FN(VXLAN_VNI_NOT_FOUND) \
> > > > + FN(VXLAN_INVALID_SMAC) \
> > >
> > > Since this is now part of the core reasons, why not name it
> > > "INVALID_SMAC" so that it could be reused outside of the VXLAN driver?
> > > For example, the bridge driver has the exact same check in its receive
> > > path (see br_handle_frame()).
> > >
> >
> > Yeah, I checked the br_handle_frame() and it indeed does
> > the same check.
> >
> > I'll rename it to INVALID_SMAC for general usage.
> >
>
> Hello, does anyone have more comments on this series before I
> send the next version?
Hi,
As you may have noted after posting the above,
net-next is now closed until after v6.12-rc1 has been released.
So, most likely, you will need to hold of on posting v4 until then.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net-next v3 06/12] net: vxlan: make vxlan_snoop() return drop reasons
2024-09-14 9:33 ` Simon Horman
@ 2024-09-16 4:39 ` Menglong Dong
0 siblings, 0 replies; 20+ messages in thread
From: Menglong Dong @ 2024-09-16 4:39 UTC (permalink / raw)
To: Simon Horman
Cc: Ido Schimmel, Jakub Kicinski, Alexander Lobakin, davem, edumazet,
pabeni, dsahern, dongml2, amcohen, gnault, bpoirier, b.galvani,
razor, petrm, linux-kernel, netdev
On Sat, Sep 14, 2024 at 5:33 PM Simon Horman <horms@kernel.org> wrote:
>
> On Fri, Sep 13, 2024 at 05:13:41PM +0800, Menglong Dong wrote:
> > On Thu, Sep 12, 2024 at 10:30 AM Menglong Dong <menglong8.dong@gmail.com> wrote:
> > >
> > > On Wed, Sep 11, 2024 at 4:08 PM Ido Schimmel <idosch@nvidia.com> wrote:
> > > >
> > > > On Mon, Sep 09, 2024 at 03:16:46PM +0800, Menglong Dong wrote:
> > > > > @@ -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_VXLAN_INVALID_SMAC;
> > > >
> > > > [...]
> > > >
> > > > > diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
> > > > > index 98259d2b3e92..1b9ec4a49c38 100644
> > > > > --- a/include/net/dropreason-core.h
> > > > > +++ b/include/net/dropreason-core.h
> > > > > @@ -94,6 +94,8 @@
> > > > > FN(TC_RECLASSIFY_LOOP) \
> > > > > FN(VXLAN_INVALID_HDR) \
> > > > > FN(VXLAN_VNI_NOT_FOUND) \
> > > > > + FN(VXLAN_INVALID_SMAC) \
> > > >
> > > > Since this is now part of the core reasons, why not name it
> > > > "INVALID_SMAC" so that it could be reused outside of the VXLAN driver?
> > > > For example, the bridge driver has the exact same check in its receive
> > > > path (see br_handle_frame()).
> > > >
> > >
> > > Yeah, I checked the br_handle_frame() and it indeed does
> > > the same check.
> > >
> > > I'll rename it to INVALID_SMAC for general usage.
> > >
> >
> > Hello, does anyone have more comments on this series before I
> > send the next version?
>
> Hi,
>
> As you may have noted after posting the above,
> net-next is now closed until after v6.12-rc1 has been released.
> So, most likely, you will need to hold of on posting v4 until then.
Thanks for reminding me that, I'll send the v4 after the net-next
opens.
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH net-next v3 07/12] net: vxlan: make vxlan_set_mac() return drop reasons
2024-09-09 7:16 [PATCH net-next v3 00/12] net: vxlan: add skb drop reasons support Menglong Dong
` (5 preceding siblings ...)
2024-09-09 7:16 ` [PATCH net-next v3 06/12] net: vxlan: make vxlan_snoop() " Menglong Dong
@ 2024-09-09 7:16 ` Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 08/12] net: vxlan: use kfree_skb_reason() in vxlan_xmit() Menglong Dong
` (4 subsequent siblings)
11 siblings, 0 replies; 20+ messages in thread
From: Menglong Dong @ 2024-09-09 7:16 UTC (permalink / raw)
To: idosch, kuba, aleksander.lobakin, horms
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
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: Menglong Dong <dongml2@chinatelecom.cn>
---
v3:
- adjust the call of vxlan_set_mac()
- add SKB_DROP_REASON_LOCAL_MAC
---
drivers/net/vxlan/vxlan_core.c | 19 ++++++++++---------
include/net/dropreason-core.h | 6 ++++++
2 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
index 2ba25be78ac9..6fe5b75220df 100644
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -1609,9 +1609,9 @@ 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,
- struct vxlan_sock *vs,
- struct sk_buff *skb, __be32 vni)
+static enum skb_drop_reason vxlan_set_mac(struct vxlan_dev *vxlan,
+ struct vxlan_sock *vs,
+ struct sk_buff *skb, __be32 vni)
{
union vxlan_addr saddr;
u32 ifindex = skb->dev->ifindex;
@@ -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);
diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
index 1b9ec4a49c38..38f9d567f501 100644
--- a/include/net/dropreason-core.h
+++ b/include/net/dropreason-core.h
@@ -97,6 +97,7 @@
FN(VXLAN_INVALID_SMAC) \
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 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
--
2.39.2
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH net-next v3 08/12] net: vxlan: use kfree_skb_reason() in vxlan_xmit()
2024-09-09 7:16 [PATCH net-next v3 00/12] net: vxlan: add skb drop reasons support Menglong Dong
` (6 preceding siblings ...)
2024-09-09 7:16 ` [PATCH net-next v3 07/12] net: vxlan: make vxlan_set_mac() " Menglong Dong
@ 2024-09-09 7:16 ` Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 09/12] net: vxlan: add drop reasons support to vxlan_xmit_one() Menglong Dong
` (3 subsequent siblings)
11 siblings, 0 replies; 20+ messages in thread
From: Menglong Dong @ 2024-09-09 7:16 UTC (permalink / raw)
To: idosch, kuba, aleksander.lobakin, horms
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
Replace kfree_skb() with kfree_skb_reason() in vxlan_xmit(). Following
new skb drop reasons are introduced for vxlan:
/* no remote found for xmit */
SKB_DROP_REASON_VXLAN_NO_REMOTE
/* txinfo is missed in "external" mode */
SKB_DROP_REASON_TUNNEL_TXINFO
Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
---
v2:
- move the drop reason "TXINFO" from vxlan to core
- rename VXLAN_DROP_REMOTE to VXLAN_DROP_NO_REMOTE
---
drivers/net/vxlan/vxlan_core.c | 6 +++---
include/net/dropreason-core.h | 6 ++++++
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
index 6fe5b75220df..6f35448fbf3c 100644
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -2730,7 +2730,7 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
if (info && info->mode & IP_TUNNEL_INFO_TX)
vxlan_xmit_one(skb, dev, vni, NULL, false);
else
- kfree_skb(skb);
+ kfree_skb_reason(skb, SKB_DROP_REASON_TUNNEL_TXINFO);
return NETDEV_TX_OK;
}
}
@@ -2793,7 +2793,7 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
dev_core_stats_tx_dropped_inc(dev);
vxlan_vnifilter_count(vxlan, vni, NULL,
VXLAN_VNI_STATS_TX_DROPS, 0);
- kfree_skb(skb);
+ kfree_skb_reason(skb, SKB_DROP_REASON_VXLAN_NO_REMOTE);
return NETDEV_TX_OK;
}
}
@@ -2816,7 +2816,7 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
if (fdst)
vxlan_xmit_one(skb, dev, vni, fdst, did_rsc);
else
- kfree_skb(skb);
+ kfree_skb_reason(skb, SKB_DROP_REASON_VXLAN_NO_REMOTE);
}
return NETDEV_TX_OK;
diff --git a/include/net/dropreason-core.h b/include/net/dropreason-core.h
index 38f9d567f501..03dd53a8c2ab 100644
--- a/include/net/dropreason-core.h
+++ b/include/net/dropreason-core.h
@@ -96,7 +96,9 @@
FN(VXLAN_VNI_NOT_FOUND) \
FN(VXLAN_INVALID_SMAC) \
FN(VXLAN_ENTRY_EXISTS) \
+ FN(VXLAN_NO_REMOTE) \
FN(IP_TUNNEL_ECN) \
+ FN(TUNNEL_TXINFO) \
FN(LOCAL_MAC) \
FNe(MAX)
@@ -439,11 +441,15 @@ enum skb_drop_reason {
* entry or an entry pointing to a nexthop.
*/
SKB_DROP_REASON_VXLAN_ENTRY_EXISTS,
+ /** @SKB_DROP_REASON_VXLAN_NO_REMOTE: no remote found for xmit */
+ SKB_DROP_REASON_VXLAN_NO_REMOTE,
/**
* @SKB_DROP_REASON_IP_TUNNEL_ECN: skb is dropped according to
* RFC 6040 4.2, see __INET_ECN_decapsulate() for detail.
*/
SKB_DROP_REASON_IP_TUNNEL_ECN,
+ /** @SKB_DROP_REASON_TUNNEL_TXINFO: tx info for tunnel is missed */
+ SKB_DROP_REASON_TUNNEL_TXINFO,
/**
* @SKB_DROP_REASON_LOCAL_MAC: the source mac address is equal to
* the mac of the local netdev.
--
2.39.2
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH net-next v3 09/12] net: vxlan: add drop reasons support to vxlan_xmit_one()
2024-09-09 7:16 [PATCH net-next v3 00/12] net: vxlan: add skb drop reasons support Menglong Dong
` (7 preceding siblings ...)
2024-09-09 7:16 ` [PATCH net-next v3 08/12] net: vxlan: use kfree_skb_reason() in vxlan_xmit() Menglong Dong
@ 2024-09-09 7:16 ` Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 10/12] net: vxlan: use kfree_skb_reason() in vxlan_mdb_xmit() Menglong Dong
` (2 subsequent siblings)
11 siblings, 0 replies; 20+ messages in thread
From: Menglong Dong @ 2024-09-09 7:16 UTC (permalink / raw)
To: idosch, kuba, aleksander.lobakin, horms
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
Replace kfree_skb/dev_kfree_skb with kfree_skb_reason in vxlan_xmit_one.
No drop reasons are introduced in this commit.
The only concern of mine is replacing dev_kfree_skb with
kfree_skb_reason. The dev_kfree_skb is equal to consume_skb, and I'm not
sure if we can change it to kfree_skb here. In my option, the skb is
"dropped" here, isn't it?
Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
---
drivers/net/vxlan/vxlan_core.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
index 6f35448fbf3c..78e4a78a94f0 100644
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -2374,13 +2374,16 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
bool use_cache;
bool udp_sum = false;
bool xnet = !net_eq(vxlan->net, dev_net(vxlan->dev));
+ enum skb_drop_reason reason;
bool no_eth_encap;
__be32 vni = 0;
no_eth_encap = flags & VXLAN_F_GPE && skb->protocol != htons(ETH_P_TEB);
- if (!skb_vlan_inet_prepare(skb, no_eth_encap))
+ reason = skb_vlan_inet_prepare_reason(skb, no_eth_encap);
+ if (reason)
goto drop;
+ reason = SKB_DROP_REASON_NOT_SPECIFIED;
old_iph = ip_hdr(skb);
info = skb_tunnel_info(skb);
@@ -2484,6 +2487,7 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
tos, use_cache ? dst_cache : NULL);
if (IS_ERR(rt)) {
err = PTR_ERR(rt);
+ reason = SKB_DROP_REASON_IP_OUTNOROUTES;
goto tx_error;
}
@@ -2535,8 +2539,10 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
err = vxlan_build_skb(skb, ndst, sizeof(struct iphdr),
vni, md, flags, udp_sum);
- if (err < 0)
+ if (err < 0) {
+ reason = SKB_DROP_REASON_NOMEM;
goto tx_error;
+ }
udp_tunnel_xmit_skb(rt, sock4->sock->sk, skb, saddr,
pkey->u.ipv4.dst, tos, ttl, df,
@@ -2556,6 +2562,7 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
if (IS_ERR(ndst)) {
err = PTR_ERR(ndst);
ndst = NULL;
+ reason = SKB_DROP_REASON_IP_OUTNOROUTES;
goto tx_error;
}
@@ -2596,8 +2603,10 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
skb_scrub_packet(skb, xnet);
err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr),
vni, md, flags, udp_sum);
- if (err < 0)
+ if (err < 0) {
+ reason = SKB_DROP_REASON_NOMEM;
goto tx_error;
+ }
udp_tunnel6_xmit_skb(ndst, sock6->sock->sk, skb, dev,
&saddr, &pkey->u.ipv6.dst, tos, ttl,
@@ -2612,7 +2621,7 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
drop:
dev_core_stats_tx_dropped_inc(dev);
vxlan_vnifilter_count(vxlan, vni, NULL, VXLAN_VNI_STATS_TX_DROPS, 0);
- dev_kfree_skb(skb);
+ kfree_skb_reason(skb, reason);
return;
tx_error:
@@ -2624,7 +2633,7 @@ void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
dst_release(ndst);
DEV_STATS_INC(dev, tx_errors);
vxlan_vnifilter_count(vxlan, vni, NULL, VXLAN_VNI_STATS_TX_ERRORS, 0);
- kfree_skb(skb);
+ kfree_skb_reason(skb, reason);
}
static void vxlan_xmit_nh(struct sk_buff *skb, struct net_device *dev,
--
2.39.2
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH net-next v3 10/12] net: vxlan: use kfree_skb_reason() in vxlan_mdb_xmit()
2024-09-09 7:16 [PATCH net-next v3 00/12] net: vxlan: add skb drop reasons support Menglong Dong
` (8 preceding siblings ...)
2024-09-09 7:16 ` [PATCH net-next v3 09/12] net: vxlan: add drop reasons support to vxlan_xmit_one() Menglong Dong
@ 2024-09-09 7:16 ` Menglong Dong
2024-09-14 9:30 ` Simon Horman
2024-09-09 7:16 ` [PATCH net-next v3 11/12] net: vxlan: use kfree_skb_reason() in vxlan_encap_bypass() Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 12/12] net: vxlan: use kfree_skb_reason() in encap_bypass_if_local() Menglong Dong
11 siblings, 1 reply; 20+ messages in thread
From: Menglong Dong @ 2024-09-09 7:16 UTC (permalink / raw)
To: idosch, kuba, aleksander.lobakin, horms
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
Replace kfree_skb() with kfree_skb_reason() in vxlan_mdb_xmit. No drop
reaons are introduced in this commit.
Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
---
drivers/net/vxlan/vxlan_mdb.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/vxlan/vxlan_mdb.c b/drivers/net/vxlan/vxlan_mdb.c
index 60eb95a06d55..e1173ae13428 100644
--- a/drivers/net/vxlan/vxlan_mdb.c
+++ b/drivers/net/vxlan/vxlan_mdb.c
@@ -1712,7 +1712,7 @@ netdev_tx_t vxlan_mdb_xmit(struct vxlan_dev *vxlan,
vxlan_xmit_one(skb, vxlan->dev, src_vni,
rcu_dereference(fremote->rd), false);
else
- kfree_skb(skb);
+ kfree_skb_reason(skb, SKB_DROP_REASON_VXLAN_NO_REMOTE);
return NETDEV_TX_OK;
}
--
2.39.2
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH net-next v3 10/12] net: vxlan: use kfree_skb_reason() in vxlan_mdb_xmit()
2024-09-09 7:16 ` [PATCH net-next v3 10/12] net: vxlan: use kfree_skb_reason() in vxlan_mdb_xmit() Menglong Dong
@ 2024-09-14 9:30 ` Simon Horman
2024-09-16 4:38 ` Menglong Dong
0 siblings, 1 reply; 20+ messages in thread
From: Simon Horman @ 2024-09-14 9:30 UTC (permalink / raw)
To: Menglong Dong
Cc: idosch, kuba, aleksander.lobakin, davem, edumazet, pabeni,
dsahern, dongml2, amcohen, gnault, bpoirier, b.galvani, razor,
petrm, linux-kernel, netdev
On Mon, Sep 09, 2024 at 03:16:50PM +0800, Menglong Dong wrote:
> Replace kfree_skb() with kfree_skb_reason() in vxlan_mdb_xmit. No drop
> reaons are introduced in this commit.
nit: reasons
...
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH net-next v3 10/12] net: vxlan: use kfree_skb_reason() in vxlan_mdb_xmit()
2024-09-14 9:30 ` Simon Horman
@ 2024-09-16 4:38 ` Menglong Dong
0 siblings, 0 replies; 20+ messages in thread
From: Menglong Dong @ 2024-09-16 4:38 UTC (permalink / raw)
To: Simon Horman
Cc: idosch, kuba, aleksander.lobakin, davem, edumazet, pabeni,
dsahern, dongml2, amcohen, gnault, bpoirier, b.galvani, razor,
petrm, linux-kernel, netdev
On Sat, Sep 14, 2024 at 5:30 PM Simon Horman <horms@kernel.org> wrote:
>
> On Mon, Sep 09, 2024 at 03:16:50PM +0800, Menglong Dong wrote:
> > Replace kfree_skb() with kfree_skb_reason() in vxlan_mdb_xmit. No drop
> > reaons are introduced in this commit.
>
> nit: reasons
Okay!
>
> ...
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH net-next v3 11/12] net: vxlan: use kfree_skb_reason() in vxlan_encap_bypass()
2024-09-09 7:16 [PATCH net-next v3 00/12] net: vxlan: add skb drop reasons support Menglong Dong
` (9 preceding siblings ...)
2024-09-09 7:16 ` [PATCH net-next v3 10/12] net: vxlan: use kfree_skb_reason() in vxlan_mdb_xmit() Menglong Dong
@ 2024-09-09 7:16 ` Menglong Dong
2024-09-09 7:16 ` [PATCH net-next v3 12/12] net: vxlan: use kfree_skb_reason() in encap_bypass_if_local() Menglong Dong
11 siblings, 0 replies; 20+ messages in thread
From: Menglong Dong @ 2024-09-09 7:16 UTC (permalink / raw)
To: idosch, kuba, aleksander.lobakin, horms
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
Replace kfree_skb with kfree_skb_reason in vxlan_encap_bypass, and no new
skb drop reason is added in this commit.
Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
---
drivers/net/vxlan/vxlan_core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
index 78e4a78a94f0..96afbb262ab6 100644
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -2290,7 +2290,7 @@ static void vxlan_encap_bypass(struct sk_buff *skb, struct vxlan_dev *src_vxlan,
rcu_read_lock();
dev = skb->dev;
if (unlikely(!(dev->flags & IFF_UP))) {
- kfree_skb(skb);
+ kfree_skb_reason(skb, SKB_DROP_REASON_DEV_READY);
goto drop;
}
--
2.39.2
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH net-next v3 12/12] net: vxlan: use kfree_skb_reason() in encap_bypass_if_local()
2024-09-09 7:16 [PATCH net-next v3 00/12] net: vxlan: add skb drop reasons support Menglong Dong
` (10 preceding siblings ...)
2024-09-09 7:16 ` [PATCH net-next v3 11/12] net: vxlan: use kfree_skb_reason() in vxlan_encap_bypass() Menglong Dong
@ 2024-09-09 7:16 ` Menglong Dong
11 siblings, 0 replies; 20+ messages in thread
From: Menglong Dong @ 2024-09-09 7:16 UTC (permalink / raw)
To: idosch, kuba, aleksander.lobakin, horms
Cc: davem, edumazet, pabeni, dsahern, dongml2, amcohen, gnault,
bpoirier, b.galvani, razor, petrm, linux-kernel, netdev
Replace kfree_skb() with kfree_skb_reason() in encap_bypass_if_local, and
no new skb drop reason is added in this commit.
Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
---
drivers/net/vxlan/vxlan_core.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
index 96afbb262ab6..554dbb65a209 100644
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -2341,7 +2341,7 @@ static int encap_bypass_if_local(struct sk_buff *skb, struct net_device *dev,
DEV_STATS_INC(dev, tx_errors);
vxlan_vnifilter_count(vxlan, vni, NULL,
VXLAN_VNI_STATS_TX_ERRORS, 0);
- kfree_skb(skb);
+ kfree_skb_reason(skb, SKB_DROP_REASON_VXLAN_INVALID_HDR);
return -ENOENT;
}
--
2.39.2
^ permalink raw reply related [flat|nested] 20+ messages in thread