@@ -1495,7 +1495,6 @@ static inline void ixgbe_rx_checksum(struct ixgbe_ring *ring,
1495
1495
struct sk_buff * skb )
1496
1496
{
1497
1497
__le16 pkt_info = rx_desc -> wb .lower .lo_dword .hs_rss .pkt_info ;
1498
- __le16 hdr_info = rx_desc -> wb .lower .lo_dword .hs_rss .hdr_info ;
1499
1498
bool encap_pkt = false;
1500
1499
1501
1500
skb_checksum_none_assert (skb );
@@ -1504,8 +1503,8 @@ static inline void ixgbe_rx_checksum(struct ixgbe_ring *ring,
1504
1503
if (!(ring -> netdev -> features & NETIF_F_RXCSUM ))
1505
1504
return ;
1506
1505
1507
- if (( pkt_info & cpu_to_le16 ( IXGBE_RXDADV_PKTTYPE_VXLAN )) &&
1508
- ( hdr_info & cpu_to_le16 (IXGBE_RXDADV_PKTTYPE_TUNNEL >> 16 ) )) {
1506
+ /* check for VXLAN and Geneve packets */
1507
+ if ( pkt_info & cpu_to_le16 (IXGBE_RXDADV_PKTTYPE_VXLAN )) {
1509
1508
encap_pkt = true;
1510
1509
skb -> encapsulation = 1 ;
1511
1510
}
@@ -3922,6 +3921,9 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
3922
3921
rfctl &= ~IXGBE_RFCTL_RSC_DIS ;
3923
3922
if (!(adapter -> flags2 & IXGBE_FLAG2_RSC_ENABLED ))
3924
3923
rfctl |= IXGBE_RFCTL_RSC_DIS ;
3924
+
3925
+ /* disable NFS filtering */
3926
+ rfctl |= (IXGBE_RFCTL_NFSW_DIS | IXGBE_RFCTL_NFSR_DIS );
3925
3927
IXGBE_WRITE_REG (hw , IXGBE_RFCTL , rfctl );
3926
3928
3927
3929
/* Program registers for the distribution of queues */
@@ -4586,18 +4588,23 @@ static void ixgbe_napi_disable_all(struct ixgbe_adapter *adapter)
4586
4588
}
4587
4589
}
4588
4590
4589
- static void ixgbe_clear_vxlan_port (struct ixgbe_adapter * adapter )
4591
+ static void ixgbe_clear_udp_tunnel_port (struct ixgbe_adapter * adapter , u32 mask )
4590
4592
{
4591
- switch (adapter -> hw .mac .type ) {
4592
- case ixgbe_mac_X550 :
4593
- case ixgbe_mac_X550EM_x :
4594
- case ixgbe_mac_x550em_a :
4595
- IXGBE_WRITE_REG (& adapter -> hw , IXGBE_VXLANCTRL , 0 );
4593
+ struct ixgbe_hw * hw = & adapter -> hw ;
4594
+ u32 vxlanctrl ;
4595
+
4596
+ if (!(adapter -> flags & (IXGBE_FLAG_VXLAN_OFFLOAD_CAPABLE |
4597
+ IXGBE_FLAG_GENEVE_OFFLOAD_CAPABLE )))
4598
+ return ;
4599
+
4600
+ vxlanctrl = IXGBE_READ_REG (hw , IXGBE_VXLANCTRL ) && ~mask ;
4601
+ IXGBE_WRITE_REG (hw , IXGBE_VXLANCTRL , vxlanctrl );
4602
+
4603
+ if (mask & IXGBE_VXLANCTRL_VXLAN_UDPPORT_MASK )
4596
4604
adapter -> vxlan_port = 0 ;
4597
- break ;
4598
- default :
4599
- break ;
4600
- }
4605
+
4606
+ if (mask & IXGBE_VXLANCTRL_GENEVE_UDPPORT_MASK )
4607
+ adapter -> geneve_port = 0 ;
4601
4608
}
4602
4609
4603
4610
#ifdef CONFIG_IXGBE_DCB
@@ -5711,8 +5718,10 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter)
5711
5718
if (fwsm & IXGBE_FWSM_TS_ENABLED )
5712
5719
adapter -> flags2 |= IXGBE_FLAG2_TEMP_SENSOR_CAPABLE ;
5713
5720
break ;
5714
- case ixgbe_mac_X550EM_x :
5715
5721
case ixgbe_mac_x550em_a :
5722
+ adapter -> flags |= IXGBE_FLAG_GENEVE_OFFLOAD_CAPABLE ;
5723
+ /* fall through */
5724
+ case ixgbe_mac_X550EM_x :
5716
5725
#ifdef CONFIG_IXGBE_DCB
5717
5726
adapter -> flags &= ~IXGBE_FLAG_DCB_CAPABLE ;
5718
5727
#endif
@@ -6144,7 +6153,7 @@ int ixgbe_open(struct net_device *netdev)
6144
6153
6145
6154
ixgbe_up_complete (adapter );
6146
6155
6147
- ixgbe_clear_vxlan_port (adapter );
6156
+ ixgbe_clear_udp_tunnel_port (adapter , IXGBE_VXLANCTRL_ALL_UDPPORT_MASK );
6148
6157
udp_tunnel_get_rx_info (netdev );
6149
6158
6150
6159
return 0 ;
@@ -7223,9 +7232,9 @@ static void ixgbe_service_task(struct work_struct *work)
7223
7232
ixgbe_service_event_complete (adapter );
7224
7233
return ;
7225
7234
}
7226
- if (adapter -> flags2 & IXGBE_FLAG2_VXLAN_REREG_NEEDED ) {
7235
+ if (adapter -> flags2 & IXGBE_FLAG2_UDP_TUN_REREG_NEEDED ) {
7227
7236
rtnl_lock ();
7228
- adapter -> flags2 &= ~IXGBE_FLAG2_VXLAN_REREG_NEEDED ;
7237
+ adapter -> flags2 &= ~IXGBE_FLAG2_UDP_TUN_REREG_NEEDED ;
7229
7238
udp_tunnel_get_rx_info (adapter -> netdev );
7230
7239
rtnl_unlock ();
7231
7240
}
@@ -7665,6 +7674,10 @@ static void ixgbe_atr(struct ixgbe_ring *ring,
7665
7674
if (adapter -> vxlan_port &&
7666
7675
udp_hdr (skb )-> dest == adapter -> vxlan_port )
7667
7676
hdr .network = skb_inner_network_header (skb );
7677
+
7678
+ if (adapter -> geneve_port &&
7679
+ udp_hdr (skb )-> dest == adapter -> geneve_port )
7680
+ hdr .network = skb_inner_network_header (skb );
7668
7681
}
7669
7682
7670
7683
/* Currently only IPv4/IPv6 with TCP is supported */
@@ -8800,10 +8813,23 @@ static int ixgbe_set_features(struct net_device *netdev,
8800
8813
netdev -> features = features ;
8801
8814
8802
8815
if ((adapter -> flags & IXGBE_FLAG_VXLAN_OFFLOAD_CAPABLE )) {
8803
- if (features & NETIF_F_RXCSUM )
8804
- adapter -> flags2 |= IXGBE_FLAG2_VXLAN_REREG_NEEDED ;
8805
- else
8806
- ixgbe_clear_vxlan_port (adapter );
8816
+ if (features & NETIF_F_RXCSUM ) {
8817
+ adapter -> flags2 |= IXGBE_FLAG2_UDP_TUN_REREG_NEEDED ;
8818
+ } else {
8819
+ u32 port_mask = IXGBE_VXLANCTRL_VXLAN_UDPPORT_MASK ;
8820
+
8821
+ ixgbe_clear_udp_tunnel_port (adapter , port_mask );
8822
+ }
8823
+ }
8824
+
8825
+ if ((adapter -> flags & IXGBE_FLAG_GENEVE_OFFLOAD_CAPABLE )) {
8826
+ if (features & NETIF_F_RXCSUM ) {
8827
+ adapter -> flags2 |= IXGBE_FLAG2_UDP_TUN_REREG_NEEDED ;
8828
+ } else {
8829
+ u32 port_mask = IXGBE_VXLANCTRL_GENEVE_UDPPORT_MASK ;
8830
+
8831
+ ixgbe_clear_udp_tunnel_port (adapter , port_mask );
8832
+ }
8807
8833
}
8808
8834
8809
8835
if (need_reset )
@@ -8816,67 +8842,115 @@ static int ixgbe_set_features(struct net_device *netdev,
8816
8842
}
8817
8843
8818
8844
/**
8819
- * ixgbe_add_vxlan_port - Get notifications about VXLAN ports that come up
8845
+ * ixgbe_add_udp_tunnel_port - Get notifications about adding UDP tunnel ports
8820
8846
* @dev: The port's netdev
8821
8847
* @ti: Tunnel endpoint information
8822
8848
**/
8823
- static void ixgbe_add_vxlan_port (struct net_device * dev ,
8824
- struct udp_tunnel_info * ti )
8849
+ static void ixgbe_add_udp_tunnel_port (struct net_device * dev ,
8850
+ struct udp_tunnel_info * ti )
8825
8851
{
8826
8852
struct ixgbe_adapter * adapter = netdev_priv (dev );
8827
8853
struct ixgbe_hw * hw = & adapter -> hw ;
8828
8854
__be16 port = ti -> port ;
8829
-
8830
- if (ti -> type != UDP_TUNNEL_TYPE_VXLAN )
8831
- return ;
8855
+ u32 port_shift = 0 ;
8856
+ u32 reg ;
8832
8857
8833
8858
if (ti -> sa_family != AF_INET )
8834
8859
return ;
8835
8860
8836
- if (!(adapter -> flags & IXGBE_FLAG_VXLAN_OFFLOAD_CAPABLE ))
8837
- return ;
8861
+ switch (ti -> type ) {
8862
+ case UDP_TUNNEL_TYPE_VXLAN :
8863
+ if (!(adapter -> flags & IXGBE_FLAG_VXLAN_OFFLOAD_CAPABLE ))
8864
+ return ;
8838
8865
8839
- if (adapter -> vxlan_port == port )
8840
- return ;
8866
+ if (adapter -> vxlan_port == port )
8867
+ return ;
8868
+
8869
+ if (adapter -> vxlan_port ) {
8870
+ netdev_info (dev ,
8871
+ "VXLAN port %d set, not adding port %d\n" ,
8872
+ ntohs (adapter -> vxlan_port ),
8873
+ ntohs (port ));
8874
+ return ;
8875
+ }
8876
+
8877
+ adapter -> vxlan_port = port ;
8878
+ break ;
8879
+ case UDP_TUNNEL_TYPE_GENEVE :
8880
+ if (!(adapter -> flags & IXGBE_FLAG_GENEVE_OFFLOAD_CAPABLE ))
8881
+ return ;
8882
+
8883
+ if (adapter -> geneve_port == port )
8884
+ return ;
8885
+
8886
+ if (adapter -> geneve_port ) {
8887
+ netdev_info (dev ,
8888
+ "GENEVE port %d set, not adding port %d\n" ,
8889
+ ntohs (adapter -> geneve_port ),
8890
+ ntohs (port ));
8891
+ return ;
8892
+ }
8841
8893
8842
- if ( adapter -> vxlan_port ) {
8843
- netdev_info ( dev ,
8844
- "Hit Max num of VXLAN ports, not adding port %d\n" ,
8845
- ntohs ( port ));
8894
+ port_shift = IXGBE_VXLANCTRL_GENEVE_UDPPORT_SHIFT ;
8895
+ adapter -> geneve_port = port ;
8896
+ break ;
8897
+ default :
8846
8898
return ;
8847
8899
}
8848
8900
8849
- adapter -> vxlan_port = port ;
8850
- IXGBE_WRITE_REG (hw , IXGBE_VXLANCTRL , ntohs ( port ) );
8901
+ reg = IXGBE_READ_REG ( hw , IXGBE_VXLANCTRL ) | ntohs ( port ) << port_shift ;
8902
+ IXGBE_WRITE_REG (hw , IXGBE_VXLANCTRL , reg );
8851
8903
}
8852
8904
8853
8905
/**
8854
- * ixgbe_del_vxlan_port - Get notifications about VXLAN ports that go away
8906
+ * ixgbe_del_udp_tunnel_port - Get notifications about removing UDP tunnel ports
8855
8907
* @dev: The port's netdev
8856
8908
* @ti: Tunnel endpoint information
8857
8909
**/
8858
- static void ixgbe_del_vxlan_port (struct net_device * dev ,
8859
- struct udp_tunnel_info * ti )
8910
+ static void ixgbe_del_udp_tunnel_port (struct net_device * dev ,
8911
+ struct udp_tunnel_info * ti )
8860
8912
{
8861
8913
struct ixgbe_adapter * adapter = netdev_priv (dev );
8914
+ u32 port_mask ;
8862
8915
8863
- if (ti -> type != UDP_TUNNEL_TYPE_VXLAN )
8916
+ if (ti -> type != UDP_TUNNEL_TYPE_VXLAN &&
8917
+ ti -> type != UDP_TUNNEL_TYPE_GENEVE )
8864
8918
return ;
8865
8919
8866
8920
if (ti -> sa_family != AF_INET )
8867
8921
return ;
8868
8922
8869
- if (!(adapter -> flags & IXGBE_FLAG_VXLAN_OFFLOAD_CAPABLE ))
8870
- return ;
8923
+ switch (ti -> type ) {
8924
+ case UDP_TUNNEL_TYPE_VXLAN :
8925
+ if (!(adapter -> flags & IXGBE_FLAG_VXLAN_OFFLOAD_CAPABLE ))
8926
+ return ;
8871
8927
8872
- if (adapter -> vxlan_port != ti -> port ) {
8873
- netdev_info (dev , "Port %d was not found, not deleting\n" ,
8874
- ntohs (ti -> port ));
8928
+ if (adapter -> vxlan_port != ti -> port ) {
8929
+ netdev_info (dev , "VXLAN port %d not found\n" ,
8930
+ ntohs (ti -> port ));
8931
+ return ;
8932
+ }
8933
+
8934
+ port_mask = IXGBE_VXLANCTRL_VXLAN_UDPPORT_MASK ;
8935
+ break ;
8936
+ case UDP_TUNNEL_TYPE_GENEVE :
8937
+ if (!(adapter -> flags & IXGBE_FLAG_GENEVE_OFFLOAD_CAPABLE ))
8938
+ return ;
8939
+
8940
+ if (adapter -> geneve_port != ti -> port ) {
8941
+ netdev_info (dev , "GENEVE port %d not found\n" ,
8942
+ ntohs (ti -> port ));
8943
+ return ;
8944
+ }
8945
+
8946
+ port_mask = IXGBE_VXLANCTRL_GENEVE_UDPPORT_MASK ;
8947
+ break ;
8948
+ default :
8875
8949
return ;
8876
8950
}
8877
8951
8878
- ixgbe_clear_vxlan_port (adapter );
8879
- adapter -> flags2 |= IXGBE_FLAG2_VXLAN_REREG_NEEDED ;
8952
+ ixgbe_clear_udp_tunnel_port (adapter , port_mask );
8953
+ adapter -> flags2 |= IXGBE_FLAG2_UDP_TUN_REREG_NEEDED ;
8880
8954
}
8881
8955
8882
8956
static int ixgbe_ndo_fdb_add (struct ndmsg * ndm , struct nlattr * tb [],
@@ -9190,8 +9264,8 @@ static const struct net_device_ops ixgbe_netdev_ops = {
9190
9264
.ndo_bridge_getlink = ixgbe_ndo_bridge_getlink ,
9191
9265
.ndo_dfwd_add_station = ixgbe_fwd_add ,
9192
9266
.ndo_dfwd_del_station = ixgbe_fwd_del ,
9193
- .ndo_udp_tunnel_add = ixgbe_add_vxlan_port ,
9194
- .ndo_udp_tunnel_del = ixgbe_del_vxlan_port ,
9267
+ .ndo_udp_tunnel_add = ixgbe_add_udp_tunnel_port ,
9268
+ .ndo_udp_tunnel_del = ixgbe_del_udp_tunnel_port ,
9195
9269
.ndo_features_check = ixgbe_features_check ,
9196
9270
};
9197
9271
0 commit comments