mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-04 16:24:29 -04:00
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: Jiawen Wu <jiawenwu@trustnetic.com> Reviewed-by: Michal Kubiak <michal.kubiak@intel.com> Link: https://patch.msgid.link/20250421022956.508018-3-jiawenwu@trustnetic.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
f294516f1f
commit
3b05aa997c
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user