summaryrefslogtreecommitdiff
path: root/lib/dpif.c
diff options
context:
space:
mode:
authorJohn Hurley <john.hurley@netronome.com>2019-04-09 15:36:14 +0100
committerSimon Horman <simon.horman@netronome.com>2019-04-10 13:55:59 +0200
commit608ff46aaf0dd4330c2488c260ee42992e17a6fd (patch)
tree622a7dcc2375d1d0f5667db6858fa7e8dad7f038 /lib/dpif.c
parent95255018a83ee460a5e2e4833e3f444a502c5804 (diff)
downloadopenvswitch-608ff46aaf0dd4330c2488c260ee42992e17a6fd.tar.gz
ovs-tc: offload datapath rules matching on internal ports
Rules applied to OvS internal ports are not represented in TC datapaths. However, it is possible to support rules matching on internal ports in TC. The start_xmit ndo of OvS internal ports directs packets back into the OvS kernel datapath where they are rematched with the ingress port now being that of the internal port. Due to this, rules matching on an internal port can be added as TC filters to an egress qdisc for these ports. Allow rules applied to internal ports to be offloaded to TC as egress filters. Rules redirecting to an internal port are also offloaded. These are supported by the redirect ingress functionality applied in an earlier patch. Signed-off-by: John Hurley <john.hurley@netronome.com> Reviewed-by: Roi Dayan <roid@mellanox.com> Signed-off-by: Simon Horman <simon.horman@netronome.com>
Diffstat (limited to 'lib/dpif.c')
-rw-r--r--lib/dpif.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/lib/dpif.c b/lib/dpif.c
index 457c9bfb9..063ba2052 100644
--- a/lib/dpif.c
+++ b/lib/dpif.c
@@ -101,12 +101,9 @@ static bool should_log_flow_message(const struct vlog_module *module,
struct seq *tnl_conf_seq;
static bool
-dpif_is_internal_port(const char *type)
+dpif_is_tap_port(const char *type)
{
- /* For userspace datapath, tap devices are the equivalent
- * of internal devices in the kernel datapath, so both
- * these types are 'internal' devices. */
- return !strcmp(type, "internal") || !strcmp(type, "tap");
+ return !strcmp(type, "tap");
}
static void
@@ -359,7 +356,7 @@ do_open(const char *name, const char *type, bool create, struct dpif **dpifp)
struct netdev *netdev;
int err;
- if (dpif_is_internal_port(dpif_port.type)) {
+ if (dpif_is_tap_port(dpif_port.type)) {
continue;
}
@@ -434,7 +431,7 @@ dpif_remove_netdev_ports(struct dpif *dpif) {
struct dpif_port dpif_port;
DPIF_PORT_FOR_EACH (&dpif_port, &port_dump, dpif) {
- if (!dpif_is_internal_port(dpif_port.type)) {
+ if (!dpif_is_tap_port(dpif_port.type)) {
netdev_ports_remove(dpif_port.port_no, dpif->dpif_class);
}
}
@@ -582,7 +579,7 @@ dpif_port_add(struct dpif *dpif, struct netdev *netdev, odp_port_t *port_nop)
VLOG_DBG_RL(&dpmsg_rl, "%s: added %s as port %"PRIu32,
dpif_name(dpif), netdev_name, port_no);
- if (!dpif_is_internal_port(netdev_get_type(netdev))) {
+ if (!dpif_is_tap_port(netdev_get_type(netdev))) {
struct dpif_port dpif_port;