* [PATCH net-next v3 0/2] Implement udp tunnel port for txgbe
@ 2025-04-17 8:03 Jiawen Wu
2025-04-17 8:03 ` [PATCH net-next v3 1/2] net: txgbe: Support to set UDP tunnel port Jiawen Wu
2025-04-17 8:03 ` [PATCH net-next v3 2/2] net: wangxun: restrict feature flags for tunnel packets Jiawen Wu
0 siblings, 2 replies; 7+ messages in thread
From: Jiawen Wu @ 2025-04-17 8:03 UTC (permalink / raw)
To: netdev, andrew+netdev, davem, edumazet, kuba, pabeni, horms,
dlemoal, jdamato, saikrishnag, vadim.fedorenko,
przemyslaw.kitszel, ecree.xilinx, rmk+kernel
Cc: mengyuanlou, Jiawen Wu
Setting UDP tunnel port is supported on TXGBE devices, to implement
hardware offload for various tunnel packets.
v3:
- Link to v2: https://lore.kernel.org/all/20250414091022.383328-1-jiawenwu@trustnetic.com/
- Use .sync_table to simplify the flow
- Remove SLEEP flag and add OPEN_ONLY flag
v2:
- Link to v1: https://lore.kernel.org/all/20250410074456.321847-1-jiawenwu@trustnetic.com/
- Remove pointless checks
- Adjust definition order
Jiawen Wu (2):
net: txgbe: Support to set UDP tunnel port
net: wangxun: restrict feature flags for tunnel packets
drivers/net/ethernet/wangxun/libwx/wx_lib.c | 27 +++++++++++++
drivers/net/ethernet/wangxun/libwx/wx_lib.h | 3 ++
drivers/net/ethernet/wangxun/ngbe/ngbe_main.c | 1 +
.../net/ethernet/wangxun/txgbe/txgbe_main.c | 39 +++++++++++++++++++
.../net/ethernet/wangxun/txgbe/txgbe_type.h | 3 ++
5 files changed, 73 insertions(+)
--
2.27.0
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH net-next v3 1/2] net: txgbe: Support to set UDP tunnel port
2025-04-17 8:03 [PATCH net-next v3 0/2] Implement udp tunnel port for txgbe Jiawen Wu
@ 2025-04-17 8:03 ` Jiawen Wu
2025-04-17 23:57 ` Jakub Kicinski
2025-04-17 8:03 ` [PATCH net-next v3 2/2] net: wangxun: restrict feature flags for tunnel packets Jiawen Wu
1 sibling, 1 reply; 7+ messages in thread
From: Jiawen Wu @ 2025-04-17 8:03 UTC (permalink / raw)
To: netdev, andrew+netdev, davem, edumazet, kuba, pabeni, horms,
dlemoal, jdamato, saikrishnag, vadim.fedorenko,
przemyslaw.kitszel, ecree.xilinx, rmk+kernel
Cc: mengyuanlou, Jiawen Wu
Tunnel types VXLAN/VXLAN_GPE/GENEVE are supported for txgbe devices. The
hardware supports to set only one port for each tunnel type.
Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
---
.../net/ethernet/wangxun/txgbe/txgbe_main.c | 38 +++++++++++++++++++
.../net/ethernet/wangxun/txgbe/txgbe_type.h | 3 ++
2 files changed, 41 insertions(+)
diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
index 6d9134a3ce4d..95e5262a1e9c 100644
--- a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
+++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
@@ -8,6 +8,7 @@
#include <linux/string.h>
#include <linux/etherdevice.h>
#include <linux/phylink.h>
+#include <net/udp_tunnel.h>
#include <net/ip.h>
#include <linux/if_vlan.h>
@@ -392,6 +393,8 @@ static int txgbe_open(struct net_device *netdev)
txgbe_up_complete(wx);
+ udp_tunnel_nic_reset_ntf(netdev);
+
return 0;
err_free_irq:
@@ -537,6 +540,39 @@ void txgbe_do_reset(struct net_device *netdev)
txgbe_reset(wx);
}
+static int txgbe_udp_tunnel_sync(struct net_device *dev, unsigned int table)
+{
+ struct wx *wx = netdev_priv(dev);
+ struct udp_tunnel_info ti;
+
+ udp_tunnel_nic_get_port(dev, table, 0, &ti);
+ switch (ti.type) {
+ case UDP_TUNNEL_TYPE_VXLAN:
+ wr32(wx, TXGBE_CFG_VXLAN, ntohs(ti.port));
+ break;
+ case UDP_TUNNEL_TYPE_VXLAN_GPE:
+ wr32(wx, TXGBE_CFG_VXLAN_GPE, ntohs(ti.port));
+ break;
+ case UDP_TUNNEL_TYPE_GENEVE:
+ wr32(wx, TXGBE_CFG_GENEVE, ntohs(ti.port));
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static const struct udp_tunnel_nic_info txgbe_udp_tunnels = {
+ .sync_table = txgbe_udp_tunnel_sync,
+ .flags = UDP_TUNNEL_NIC_INFO_OPEN_ONLY,
+ .tables = {
+ { .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_VXLAN, },
+ { .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_VXLAN_GPE, },
+ { .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_GENEVE, },
+ },
+};
+
static const struct net_device_ops txgbe_netdev_ops = {
.ndo_open = txgbe_open,
.ndo_stop = txgbe_close,
@@ -632,6 +668,7 @@ static int txgbe_probe(struct pci_dev *pdev,
wx->driver_name = txgbe_driver_name;
txgbe_set_ethtool_ops(netdev);
netdev->netdev_ops = &txgbe_netdev_ops;
+ netdev->udp_tunnel_nic_info = &txgbe_udp_tunnels;
/* setup the private structure */
err = txgbe_sw_init(wx);
@@ -677,6 +714,7 @@ static int txgbe_probe(struct pci_dev *pdev,
netdev->features |= NETIF_F_HIGHDMA;
netdev->hw_features |= NETIF_F_GRO;
netdev->features |= NETIF_F_GRO;
+ netdev->features |= NETIF_F_RX_UDP_TUNNEL_PORT;
netdev->priv_flags |= IFF_UNICAST_FLT;
netdev->priv_flags |= IFF_SUPP_NOFCS;
diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h b/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h
index 5937cbc6bd05..cb553318641d 100644
--- a/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h
+++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_type.h
@@ -88,6 +88,9 @@
/* Port cfg registers */
#define TXGBE_CFG_PORT_ST 0x14404
#define TXGBE_CFG_PORT_ST_LINK_UP BIT(0)
+#define TXGBE_CFG_VXLAN 0x14410
+#define TXGBE_CFG_VXLAN_GPE 0x14414
+#define TXGBE_CFG_GENEVE 0x14418
/* I2C registers */
#define TXGBE_I2C_BASE 0x14900
--
2.27.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH net-next v3 2/2] net: wangxun: restrict feature flags for tunnel packets
2025-04-17 8:03 [PATCH net-next v3 0/2] Implement udp tunnel port for txgbe Jiawen Wu
2025-04-17 8:03 ` [PATCH net-next v3 1/2] net: txgbe: Support to set UDP tunnel port Jiawen Wu
@ 2025-04-17 8:03 ` Jiawen Wu
1 sibling, 0 replies; 7+ messages in thread
From: Jiawen Wu @ 2025-04-17 8:03 UTC (permalink / raw)
To: netdev, andrew+netdev, davem, edumazet, kuba, pabeni, horms,
dlemoal, jdamato, saikrishnag, vadim.fedorenko,
przemyslaw.kitszel, ecree.xilinx, rmk+kernel
Cc: mengyuanlou, Jiawen Wu, Michal Kubiak
Implement ndo_features_check to restrict Tx checksum offload flags, since
there are some inner layer length and protocols unsupported.
Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: Michal Kubiak <michal.kubiak@intel.com>
---
drivers/net/ethernet/wangxun/libwx/wx_lib.c | 27 +++++++++++++++++++
drivers/net/ethernet/wangxun/libwx/wx_lib.h | 3 +++
drivers/net/ethernet/wangxun/ngbe/ngbe_main.c | 1 +
.../net/ethernet/wangxun/txgbe/txgbe_main.c | 1 +
4 files changed, 32 insertions(+)
diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.c b/drivers/net/ethernet/wangxun/libwx/wx_lib.c
index 18422b940dbe..2a808afeb414 100644
--- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c
+++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c
@@ -3000,6 +3000,33 @@ netdev_features_t wx_fix_features(struct net_device *netdev,
}
EXPORT_SYMBOL(wx_fix_features);
+#define WX_MAX_TUNNEL_HDR_LEN 80
+netdev_features_t wx_features_check(struct sk_buff *skb,
+ struct net_device *netdev,
+ netdev_features_t features)
+{
+ struct wx *wx = netdev_priv(netdev);
+
+ if (!skb->encapsulation)
+ return features;
+
+ if (wx->mac.type == wx_mac_em)
+ return features & ~NETIF_F_CSUM_MASK;
+
+ if (unlikely(skb_inner_mac_header(skb) - skb_transport_header(skb) >
+ WX_MAX_TUNNEL_HDR_LEN))
+ return features & ~NETIF_F_CSUM_MASK;
+
+ if (skb->inner_protocol_type == ENCAP_TYPE_ETHER &&
+ skb->inner_protocol != htons(ETH_P_IP) &&
+ skb->inner_protocol != htons(ETH_P_IPV6) &&
+ skb->inner_protocol != htons(ETH_P_TEB))
+ return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
+
+ return features;
+}
+EXPORT_SYMBOL(wx_features_check);
+
void wx_set_ring(struct wx *wx, u32 new_tx_count,
u32 new_rx_count, struct wx_ring *temp_ring)
{
diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.h b/drivers/net/ethernet/wangxun/libwx/wx_lib.h
index fdeb0c315b75..919f49999308 100644
--- a/drivers/net/ethernet/wangxun/libwx/wx_lib.h
+++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.h
@@ -33,6 +33,9 @@ void wx_get_stats64(struct net_device *netdev,
int wx_set_features(struct net_device *netdev, netdev_features_t features);
netdev_features_t wx_fix_features(struct net_device *netdev,
netdev_features_t features);
+netdev_features_t wx_features_check(struct sk_buff *skb,
+ struct net_device *netdev,
+ netdev_features_t features);
void wx_set_ring(struct wx *wx, u32 new_tx_count,
u32 new_rx_count, struct wx_ring *temp_ring);
diff --git a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
index fd102078f5c9..82e27b9cfc9c 100644
--- a/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
+++ b/drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
@@ -587,6 +587,7 @@ static const struct net_device_ops ngbe_netdev_ops = {
.ndo_set_rx_mode = wx_set_rx_mode,
.ndo_set_features = wx_set_features,
.ndo_fix_features = wx_fix_features,
+ .ndo_features_check = wx_features_check,
.ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = wx_set_mac,
.ndo_get_stats64 = wx_get_stats64,
diff --git a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
index 95e5262a1e9c..80e6b01c799b 100644
--- a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
+++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
@@ -581,6 +581,7 @@ static const struct net_device_ops txgbe_netdev_ops = {
.ndo_set_rx_mode = wx_set_rx_mode,
.ndo_set_features = wx_set_features,
.ndo_fix_features = wx_fix_features,
+ .ndo_features_check = wx_features_check,
.ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = wx_set_mac,
.ndo_get_stats64 = wx_get_stats64,
--
2.27.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v3 1/2] net: txgbe: Support to set UDP tunnel port
2025-04-17 8:03 ` [PATCH net-next v3 1/2] net: txgbe: Support to set UDP tunnel port Jiawen Wu
@ 2025-04-17 23:57 ` Jakub Kicinski
2025-04-18 1:44 ` Jiawen Wu
0 siblings, 1 reply; 7+ messages in thread
From: Jakub Kicinski @ 2025-04-17 23:57 UTC (permalink / raw)
To: Jiawen Wu
Cc: netdev, andrew+netdev, davem, edumazet, pabeni, horms, dlemoal,
jdamato, saikrishnag, vadim.fedorenko, przemyslaw.kitszel,
ecree.xilinx, rmk+kernel, mengyuanlou
On Thu, 17 Apr 2025 16:03:27 +0800 Jiawen Wu wrote:
> @@ -392,6 +393,8 @@ static int txgbe_open(struct net_device *netdev)
^^^^^^^^^^
>
> txgbe_up_complete(wx);
>
> + udp_tunnel_nic_reset_ntf(netdev);
^^^^^^^^^^^^^^^^^^^^^^^^
> return 0;
> + .flags = UDP_TUNNEL_NIC_INFO_OPEN_ONLY,
Documentation says:
/* Device only supports offloads when it's open, all ports
* will be removed before close and re-added after open.
*/
UDP_TUNNEL_NIC_INFO_OPEN_ONLY = BIT(1),
Are you sure you have to explicitly reset?
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH net-next v3 1/2] net: txgbe: Support to set UDP tunnel port
2025-04-17 23:57 ` Jakub Kicinski
@ 2025-04-18 1:44 ` Jiawen Wu
2025-04-18 2:19 ` Jakub Kicinski
0 siblings, 1 reply; 7+ messages in thread
From: Jiawen Wu @ 2025-04-18 1:44 UTC (permalink / raw)
To: 'Jakub Kicinski'
Cc: netdev, andrew+netdev, davem, edumazet, pabeni, horms, dlemoal,
jdamato, saikrishnag, vadim.fedorenko, przemyslaw.kitszel,
ecree.xilinx, rmk+kernel, mengyuanlou
On Fri, Apr 18, 2025 7:58 AM, Jakub Kicinski wrote:
> On Thu, 17 Apr 2025 16:03:27 +0800 Jiawen Wu wrote:
> > @@ -392,6 +393,8 @@ static int txgbe_open(struct net_device *netdev)
> ^^^^^^^^^^
> >
> > txgbe_up_complete(wx);
> >
> > + udp_tunnel_nic_reset_ntf(netdev);
> ^^^^^^^^^^^^^^^^^^^^^^^^
> > return 0;
>
> > + .flags = UDP_TUNNEL_NIC_INFO_OPEN_ONLY,
>
> Documentation says:
>
> /* Device only supports offloads when it's open, all ports
> * will be removed before close and re-added after open.
> */
> UDP_TUNNEL_NIC_INFO_OPEN_ONLY = BIT(1),
>
> Are you sure you have to explicitly reset?
Yes. Stop device will reset hardware, which reset UDP port to the default value.
So it has to re-configure the ports.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH net-next v3 1/2] net: txgbe: Support to set UDP tunnel port
2025-04-18 1:44 ` Jiawen Wu
@ 2025-04-18 2:19 ` Jakub Kicinski
2025-04-18 2:36 ` Jiawen Wu
0 siblings, 1 reply; 7+ messages in thread
From: Jakub Kicinski @ 2025-04-18 2:19 UTC (permalink / raw)
To: Jiawen Wu
Cc: netdev, andrew+netdev, davem, edumazet, pabeni, horms, dlemoal,
jdamato, saikrishnag, vadim.fedorenko, przemyslaw.kitszel,
ecree.xilinx, rmk+kernel, mengyuanlou
On Fri, 18 Apr 2025 09:44:00 +0800 Jiawen Wu wrote:
> On Fri, Apr 18, 2025 7:58 AM, Jakub Kicinski wrote:
> > On Thu, 17 Apr 2025 16:03:27 +0800 Jiawen Wu wrote:
> > > @@ -392,6 +393,8 @@ static int txgbe_open(struct net_device *netdev)
> > ^^^^^^^^^^
> > >
> > > txgbe_up_complete(wx);
> > >
> > > + udp_tunnel_nic_reset_ntf(netdev);
> > ^^^^^^^^^^^^^^^^^^^^^^^^
> > > return 0;
> >
> > > + .flags = UDP_TUNNEL_NIC_INFO_OPEN_ONLY,
> >
> > Documentation says:
> >
> > /* Device only supports offloads when it's open, all ports
> > * will be removed before close and re-added after open.
> > */
> > UDP_TUNNEL_NIC_INFO_OPEN_ONLY = BIT(1),
> >
> > Are you sure you have to explicitly reset?
>
> Yes. Stop device will reset hardware, which reset UDP port to the default value.
> So it has to re-configure the ports.
My point is that this is basically what the
UDP_TUNNEL_NIC_INFO_OPEN_ONLY flag already assumes.
There should be no need to reset if you already told the core
with the flag that the device forgets everything when closed.
Could you retest without the reset_ntf ?
^ permalink raw reply [flat|nested] 7+ messages in thread
* RE: [PATCH net-next v3 1/2] net: txgbe: Support to set UDP tunnel port
2025-04-18 2:19 ` Jakub Kicinski
@ 2025-04-18 2:36 ` Jiawen Wu
0 siblings, 0 replies; 7+ messages in thread
From: Jiawen Wu @ 2025-04-18 2:36 UTC (permalink / raw)
To: 'Jakub Kicinski'
Cc: netdev, andrew+netdev, davem, edumazet, pabeni, horms, dlemoal,
jdamato, saikrishnag, vadim.fedorenko, przemyslaw.kitszel,
ecree.xilinx, rmk+kernel, mengyuanlou
On Fri, Apr 18, 2025 10:20 AM, Jakub Kicinski wrote:
> On Fri, 18 Apr 2025 09:44:00 +0800 Jiawen Wu wrote:
> > On Fri, Apr 18, 2025 7:58 AM, Jakub Kicinski wrote:
> > > On Thu, 17 Apr 2025 16:03:27 +0800 Jiawen Wu wrote:
> > > > @@ -392,6 +393,8 @@ static int txgbe_open(struct net_device *netdev)
> > > ^^^^^^^^^^
> > > >
> > > > txgbe_up_complete(wx);
> > > >
> > > > + udp_tunnel_nic_reset_ntf(netdev);
> > > ^^^^^^^^^^^^^^^^^^^^^^^^
> > > > return 0;
> > >
> > > > + .flags = UDP_TUNNEL_NIC_INFO_OPEN_ONLY,
> > >
> > > Documentation says:
> > >
> > > /* Device only supports offloads when it's open, all ports
> > > * will be removed before close and re-added after open.
> > > */
> > > UDP_TUNNEL_NIC_INFO_OPEN_ONLY = BIT(1),
> > >
> > > Are you sure you have to explicitly reset?
> >
> > Yes. Stop device will reset hardware, which reset UDP port to the default value.
> > So it has to re-configure the ports.
>
> My point is that this is basically what the
> UDP_TUNNEL_NIC_INFO_OPEN_ONLY flag already assumes.
> There should be no need to reset if you already told the core
> with the flag that the device forgets everything when closed.
>
> Could you retest without the reset_ntf ?
Thanks for the guidance.
The test result looks the same as before, when I remove reset_ntf.
I'll fix it in patch v4. :)
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-04-18 2:36 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-17 8:03 [PATCH net-next v3 0/2] Implement udp tunnel port for txgbe Jiawen Wu
2025-04-17 8:03 ` [PATCH net-next v3 1/2] net: txgbe: Support to set UDP tunnel port Jiawen Wu
2025-04-17 23:57 ` Jakub Kicinski
2025-04-18 1:44 ` Jiawen Wu
2025-04-18 2:19 ` Jakub Kicinski
2025-04-18 2:36 ` Jiawen Wu
2025-04-17 8:03 ` [PATCH net-next v3 2/2] net: wangxun: restrict feature flags for tunnel packets Jiawen Wu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).