My ofctl flows are below:
uplink is pf port, and uplink-local is vf port.
ovs-ofctl dump-flows br0
cookie=0x0, duration=1495.621s, table=0, n_packets=0, n_bytes=0,
priority=100,\
ip,in_port=uplink actions=output:"uplink-local"
cookie=0x0, duration=1495.614s, table=0, n_packets=0, n_bytes=0,
priority=100,\
ip,in_port="uplink-local" actions=output:uplink
cookie=0x0, duration=1495.607s, table=0, n_packets=81, n_bytes=4828,
priority=\
100,arp,in_port="uplink-local" actions=output:uplink cookie=0x0,
duration=1495.600s,\
table=0, n_packets=0, n_bytes=0, priority=100,arp,in_port=uplink
actions=output:"uplink-local"
debug log information:
2020-04-17T08:29:07.159Z|00086|dpif_netdev(pmd-c10/id:45)|DBG|ovs-netdev: miss
upcall:
skb_priority(0),skb_mark(0),ct_state(0),ct_zone(0),ct_mark(0),ct_label(0),recirc_id(0),dp_hash(0),\
in_port(3),packet_type(ns=0,id=0),eth(src=84:d9:31:ee:44:89,dst=01:80:c2:00:00:0e),eth_type(0x88cc)
vlan_tci=0x0000,dl_src=84:d9:31:ee:44:89,dl_dst=01:80:c2:00:00:0e,dl_type=0x88cc
2020-04-17T08:29:07.159Z|00014|dpif_netdev(dp_netdev_flow_46)|DBG|Mark id for
ufid \
f2de067c-d3c9-49aa-8376-5971cfa5e211 was not found
2020-04-17T08:29:07.160Z|00015|netdev_offload_dpdk(dp_netdev_flow_46)|DBG|uplink:
\
rte_flow 0x17fa8dc00 created:
Attributes: ingress=1, egress=0, prio=0, group=0, transfer=1
rte flow eth pattern:
Spec = null
Mask = null
rte flow count action:
Count: shared=0, id=0
rte flow drop action
2020-04-17T08:29:07.160Z|00016|netdev_offload_dpdk(dp_netdev_flow_46)|DBG|uplink:
\
installed flow 0x17fa8dc00 by ufid f2de067c-d3c9-49aa-8376-5971cfa5e211
2020-04-17T08:29:07.160Z|00017|dpif_netdev(dp_netdev_flow_46)|DBG|Associated
dp_netdev \
flow 0x7f1aec009f10 with mark 1
2020-04-17T08:29:07.160Z|00018|dpif_netdev(dp_netdev_flow_46)|DBG|succeed to
add netdev flow
dpcls rules detail:
arp request flow:
ufid:56a8038a-b036-40d9-9d7e-22ec07c9d766,
skb_priority(0/0),skb_mark(0/0),ct_state(0/0),ct_zone(0/0),\
ct_mark(0/0),ct_label(0/0),recirc_id(0),dp_hash(0/0),in_port(uplink-local),packet_type(ns=0,id=0),\
eth(src=1e:f9:44:7b:b0:84/00:00:00:00:00:00,dst=ff:ff:ff:ff:ff:ff),\
eth_type(0x0806),arp(sip=10.97.234.2/0.0.0.0,tip=10.97.234.1/0.0.0.0,\
op=1/0,sha=1e:f9:44:7b:b0:84/00:00:00:00:00:00,tha=00:00:00:00:00:00/00:00:00:00:00:00),
\
packets:2, bytes:120, used:0.575s, offloaded:yes, dp:dpdk, actions:uplink, \
dp-extra-info:miniflow_bits(5,0)
LLDP flow which config one match all ethernet offload flow:
ufid:8c241a16-05b8-446b-b807-c33cfdb97d33,
skb_priority(0/0),skb_mark(0/0),ct_state(0/0),\
ct_zone(0/0),ct_mark(0/0),ct_label(0/0),recirc_id(0),dp_hash(0/0),in_port(uplink),\
packet_type(ns=0,id=0),eth(src=84:d9:31:ee:44:89/00:00:00:00:00:00,\
dst=01:80:c2:00:00:0e/00:00:00:00:00:00),eth_type(0x88cc), packets:647, \
bytes:84583, used:0.575s, offloaded:yes, dp:dpdk,\
actions:drop, dp-extra-info:miniflow_bits(4,0)
Signed-off-by: JackerDune <[email protected]>
Signed-off-by: dujie <[email protected]>
---
lib/netdev-offload-dpdk.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index f8c46bb..0160598 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -562,6 +562,7 @@ parse_flow_match(struct flow_patterns *patterns,
const struct match *match)
{
uint8_t *next_proto_mask = NULL;
+ bool is_null_eth_head = false;
uint8_t proto = 0;
/* Eth */
@@ -589,6 +590,7 @@ parse_flow_match(struct flow_patterns *patterns,
* NIC (such as XL710) doesn't support that. Below is a workaround,
* which simply matches any L2 pkts.
*/
+ is_null_eth_head = true;
add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_ETH, NULL, NULL);
}
@@ -727,6 +729,17 @@ parse_flow_match(struct flow_patterns *patterns,
}
}
+ /*
+ * Some proto such as LLDP ovs will only config dl_type field
+ * and flow's action is drop. Then a offload flow which match
+ * all ethernet packets will be added, and all ethernet packets
+ * in that port will be hardware dropped.
+ */
+ if (is_null_eth_head && proto == 0) {
+ VLOG_DBG("Null ethernet header without any proto not support");
+ return -1;
+ }
+
add_flow_pattern(patterns, RTE_FLOW_ITEM_TYPE_END, NULL, NULL);
return 0;