Skip to content

Commit 9a109dd

Browse files
Manish Chopradavem330
authored andcommitted
qed/qede: Add GENEVE tunnel slowpath configuration support
This patch enables GENEVE tunnel on the adapter and add support for driver hooks to configure UDP ports for GENEVE tunnel offload to be performed by the adapter. Signed-off-by: Manish Chopra <manish.chopra@qlogic.com> Signed-off-by: Yuval Mintz <Yuval.Mintz@qlogic.com> Signed-off-by: Ariel Elior <Ariel.Elior@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent b18e170 commit 9a109dd

File tree

4 files changed

+69
-1
lines changed

4 files changed

+69
-1
lines changed

drivers/net/ethernet/qlogic/Kconfig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,14 @@ config QEDE_VXLAN
114114
support for Virtual eXtensible Local Area Network (VXLAN)
115115
in the driver.
116116

117+
config QEDE_GENEVE
118+
bool "Generic Network Virtualization Encapsulation (GENEVE) support"
119+
depends on QEDE && GENEVE && !(QEDE=y && GENEVE=m)
120+
---help---
121+
This allows one to create GENEVE virtual interfaces that provide
122+
Layer 2 Networks over Layer 3 Networks. GENEVE is often used
123+
to tunnel virtual network infrastructure in virtualized environments.
124+
Say Y here if you want to enable hardware offload support for
125+
Generic Network Virtualization Encapsulation (GENEVE) in the driver.
126+
117127
endif # NET_VENDOR_QLOGIC

drivers/net/ethernet/qlogic/qed/qed_main.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,10 @@ static int qed_slowpath_start(struct qed_dev *cdev,
778778
data = cdev->firmware->data;
779779

780780
memset(&tunn_info, 0, sizeof(tunn_info));
781-
tunn_info.tunn_mode |= 1 << QED_MODE_VXLAN_TUNN;
781+
tunn_info.tunn_mode |= 1 << QED_MODE_VXLAN_TUNN |
782+
1 << QED_MODE_L2GENEVE_TUNN |
783+
1 << QED_MODE_IPGENEVE_TUNN;
784+
782785
tunn_info.tunn_clss_vxlan = QED_TUNN_CLSS_MAC_VLAN;
783786

784787
rc = qed_hw_init(cdev, &tunn_info, true,

drivers/net/ethernet/qlogic/qede/qede.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ struct qede_dev {
170170
struct delayed_work sp_task;
171171
unsigned long sp_flags;
172172
u16 vxlan_dst_port;
173+
u16 geneve_dst_port;
173174
};
174175

175176
enum QEDE_STATE {
@@ -292,6 +293,7 @@ struct qede_fastpath {
292293

293294
#define QEDE_SP_RX_MODE 1
294295
#define QEDE_SP_VXLAN_PORT_CONFIG 2
296+
#define QEDE_SP_GENEVE_PORT_CONFIG 3
295297

296298
union qede_reload_args {
297299
u16 mtu;

drivers/net/ethernet/qlogic/qede/qede_main.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
#ifdef CONFIG_QEDE_VXLAN
2828
#include <net/vxlan.h>
2929
#endif
30+
#ifdef CONFIG_QEDE_GENEVE
31+
#include <net/geneve.h>
32+
#endif
3033
#include <linux/ip.h>
3134
#include <net/ipv6.h>
3235
#include <net/tcp.h>
@@ -1859,6 +1862,40 @@ static void qede_del_vxlan_port(struct net_device *dev,
18591862
}
18601863
#endif
18611864

1865+
#ifdef CONFIG_QEDE_GENEVE
1866+
static void qede_add_geneve_port(struct net_device *dev,
1867+
sa_family_t sa_family, __be16 port)
1868+
{
1869+
struct qede_dev *edev = netdev_priv(dev);
1870+
u16 t_port = ntohs(port);
1871+
1872+
if (edev->geneve_dst_port)
1873+
return;
1874+
1875+
edev->geneve_dst_port = t_port;
1876+
1877+
DP_VERBOSE(edev, QED_MSG_DEBUG, "Added geneve port=%d", t_port);
1878+
set_bit(QEDE_SP_GENEVE_PORT_CONFIG, &edev->sp_flags);
1879+
schedule_delayed_work(&edev->sp_task, 0);
1880+
}
1881+
1882+
static void qede_del_geneve_port(struct net_device *dev,
1883+
sa_family_t sa_family, __be16 port)
1884+
{
1885+
struct qede_dev *edev = netdev_priv(dev);
1886+
u16 t_port = ntohs(port);
1887+
1888+
if (t_port != edev->geneve_dst_port)
1889+
return;
1890+
1891+
edev->geneve_dst_port = 0;
1892+
1893+
DP_VERBOSE(edev, QED_MSG_DEBUG, "Deleted geneve port=%d", t_port);
1894+
set_bit(QEDE_SP_GENEVE_PORT_CONFIG, &edev->sp_flags);
1895+
schedule_delayed_work(&edev->sp_task, 0);
1896+
}
1897+
#endif
1898+
18621899
static const struct net_device_ops qede_netdev_ops = {
18631900
.ndo_open = qede_open,
18641901
.ndo_stop = qede_close,
@@ -1874,6 +1911,10 @@ static const struct net_device_ops qede_netdev_ops = {
18741911
.ndo_add_vxlan_port = qede_add_vxlan_port,
18751912
.ndo_del_vxlan_port = qede_del_vxlan_port,
18761913
#endif
1914+
#ifdef CONFIG_QEDE_GENEVE
1915+
.ndo_add_geneve_port = qede_add_geneve_port,
1916+
.ndo_del_geneve_port = qede_del_geneve_port,
1917+
#endif
18771918
};
18781919

18791920
/* -------------------------------------------------------------------------
@@ -2064,6 +2105,15 @@ static void qede_sp_task(struct work_struct *work)
20642105
qed_ops->tunn_config(cdev, &tunn_params);
20652106
}
20662107

2108+
if (test_and_clear_bit(QEDE_SP_GENEVE_PORT_CONFIG, &edev->sp_flags)) {
2109+
struct qed_tunn_params tunn_params;
2110+
2111+
memset(&tunn_params, 0, sizeof(tunn_params));
2112+
tunn_params.update_geneve_port = 1;
2113+
tunn_params.geneve_port = edev->geneve_dst_port;
2114+
qed_ops->tunn_config(cdev, &tunn_params);
2115+
}
2116+
20672117
mutex_unlock(&edev->qede_lock);
20682118
}
20692119

@@ -3215,6 +3265,9 @@ static int qede_open(struct net_device *ndev)
32153265

32163266
#ifdef CONFIG_QEDE_VXLAN
32173267
vxlan_get_rx_port(ndev);
3268+
#endif
3269+
#ifdef CONFIG_QEDE_GENEVE
3270+
geneve_get_rx_port(ndev);
32183271
#endif
32193272
return 0;
32203273
}

0 commit comments

Comments
 (0)