Commit 3b05aa99 authored by Jiawen Wu's avatar Jiawen Wu Committed by Jakub Kicinski
Browse files

net: wangxun: restrict feature flags for tunnel packets



Implement ndo_features_check to restrict Tx checksum offload flags, since
there are some inner layer length and protocols unsupported.

Signed-off-by: default avatarJiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: default avatarMichal Kubiak <michal.kubiak@intel.com>
Link: https://patch.msgid.link/20250421022956.508018-3-jiawenwu@trustnetic.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent f294516f
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -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)
{
+3 −0
Original line number Diff line number Diff line
@@ -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);

+1 −0
Original line number Diff line number Diff line
@@ -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,
+1 −0
Original line number Diff line number Diff line
@@ -579,6 +579,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,