Message ID | 20250410074456.321847-3-jiawenwu@trustnetic.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Implement udp tunnel port for txgbe | expand |
On Thu, Apr 10, 2025 at 03:44:56PM +0800, Jiawen Wu wrote: > 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> > --- > 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 59d904f23764..a1f9d2287fdc 100644 > --- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c > +++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c > @@ -2998,6 +2998,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 c984745504b4..0c5d0914e830 100644 > --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c > +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c > @@ -656,6 +656,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 > > Thanks, Reviewed-by: Michal Kubiak <michal.kubiak@intel.com>
diff --git a/drivers/net/ethernet/wangxun/libwx/wx_lib.c b/drivers/net/ethernet/wangxun/libwx/wx_lib.c index 59d904f23764..a1f9d2287fdc 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_lib.c +++ b/drivers/net/ethernet/wangxun/libwx/wx_lib.c @@ -2998,6 +2998,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 c984745504b4..0c5d0914e830 100644 --- a/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c +++ b/drivers/net/ethernet/wangxun/txgbe/txgbe_main.c @@ -656,6 +656,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,
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> --- 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(+)