New upstream version 17.11.4
[deb_dpdk.git] / drivers / net / tap / tap_flow.c
index 41f7345..f10bbf6 100644 (file)
@@ -464,7 +464,7 @@ tap_flow_create_eth(const struct rte_flow_item *item, void *data)
        if (!flow)
                return 0;
        msg = &flow->msg;
-       if (!is_zero_ether_addr(&spec->dst)) {
+       if (!is_zero_ether_addr(&mask->dst)) {
                nlattr_add(&msg->nh, TCA_FLOWER_KEY_ETH_DST, ETHER_ADDR_LEN,
                           &spec->dst.addr_bytes);
                nlattr_add(&msg->nh,
@@ -570,13 +570,13 @@ tap_flow_create_ipv4(const struct rte_flow_item *item, void *data)
                info->eth_type = htons(ETH_P_IP);
        if (!spec)
                return 0;
-       if (spec->hdr.dst_addr) {
+       if (mask->hdr.dst_addr) {
                nlattr_add32(&msg->nh, TCA_FLOWER_KEY_IPV4_DST,
                             spec->hdr.dst_addr);
                nlattr_add32(&msg->nh, TCA_FLOWER_KEY_IPV4_DST_MASK,
                             mask->hdr.dst_addr);
        }
-       if (spec->hdr.src_addr) {
+       if (mask->hdr.src_addr) {
                nlattr_add32(&msg->nh, TCA_FLOWER_KEY_IPV4_SRC,
                             spec->hdr.src_addr);
                nlattr_add32(&msg->nh, TCA_FLOWER_KEY_IPV4_SRC_MASK,
@@ -626,13 +626,13 @@ tap_flow_create_ipv6(const struct rte_flow_item *item, void *data)
                info->eth_type = htons(ETH_P_IPV6);
        if (!spec)
                return 0;
-       if (memcmp(spec->hdr.dst_addr, empty_addr, 16)) {
+       if (memcmp(mask->hdr.dst_addr, empty_addr, 16)) {
                nlattr_add(&msg->nh, TCA_FLOWER_KEY_IPV6_DST,
                           sizeof(spec->hdr.dst_addr), &spec->hdr.dst_addr);
                nlattr_add(&msg->nh, TCA_FLOWER_KEY_IPV6_DST_MASK,
                           sizeof(mask->hdr.dst_addr), &mask->hdr.dst_addr);
        }
-       if (memcmp(spec->hdr.src_addr, empty_addr, 16)) {
+       if (memcmp(mask->hdr.src_addr, empty_addr, 16)) {
                nlattr_add(&msg->nh, TCA_FLOWER_KEY_IPV6_SRC,
                           sizeof(spec->hdr.src_addr), &spec->hdr.src_addr);
                nlattr_add(&msg->nh, TCA_FLOWER_KEY_IPV6_SRC_MASK,
@@ -680,10 +680,10 @@ tap_flow_create_udp(const struct rte_flow_item *item, void *data)
        nlattr_add8(&msg->nh, TCA_FLOWER_KEY_IP_PROTO, IPPROTO_UDP);
        if (!spec)
                return 0;
-       if (spec->hdr.dst_port & mask->hdr.dst_port)
+       if (mask->hdr.dst_port)
                nlattr_add16(&msg->nh, TCA_FLOWER_KEY_UDP_DST,
                             spec->hdr.dst_port);
-       if (spec->hdr.src_port & mask->hdr.src_port)
+       if (mask->hdr.src_port)
                nlattr_add16(&msg->nh, TCA_FLOWER_KEY_UDP_SRC,
                             spec->hdr.src_port);
        return 0;
@@ -726,10 +726,10 @@ tap_flow_create_tcp(const struct rte_flow_item *item, void *data)
        nlattr_add8(&msg->nh, TCA_FLOWER_KEY_IP_PROTO, IPPROTO_TCP);
        if (!spec)
                return 0;
-       if (spec->hdr.dst_port & mask->hdr.dst_port)
+       if (mask->hdr.dst_port)
                nlattr_add16(&msg->nh, TCA_FLOWER_KEY_TCP_DST,
                             spec->hdr.dst_port);
-       if (spec->hdr.src_port & mask->hdr.src_port)
+       if (mask->hdr.src_port)
                nlattr_add16(&msg->nh, TCA_FLOWER_KEY_TCP_SRC,
                             spec->hdr.src_port);
        return 0;
@@ -1089,13 +1089,29 @@ priv_flow_process(struct pmd_internals *pmd,
                        const struct rte_flow_action_queue *queue =
                                (const struct rte_flow_action_queue *)
                                actions->conf;
+
                        if (action)
                                goto exit_action_not_supported;
                        action = 1;
-                       if (!queue || (queue->index >= pmd->nb_queues))
+                       if (!queue ||
+                           (queue->index > pmd->dev->data->nb_rx_queues - 1))
                                goto exit_action_not_supported;
                        if (flow)
                                err = add_action_skbedit(flow, queue->index);
+               } else if (actions->type == RTE_FLOW_ACTION_TYPE_RSS) {
+                       /* Fake RSS support. */
+                       const struct rte_flow_action_rss *rss =
+                               (const struct rte_flow_action_rss *)
+                               actions->conf;
+
+                       if (action)
+                               goto exit_action_not_supported;
+                       action = 1;
+                       if (!rss || rss->num < 1 ||
+                           (rss->queue[0] > pmd->dev->data->nb_rx_queues - 1))
+                               goto exit_action_not_supported;
+                       if (flow)
+                               err = add_action_skbedit(flow, rss->queue[0]);
                } else {
                        goto exit_action_not_supported;
                }
@@ -1446,7 +1462,7 @@ tap_flow_isolate(struct rte_eth_dev *dev,
        return 0;
 error:
        pmd->flow_isolate = 0;
-       return -rte_flow_error_set(
+       return rte_flow_error_set(
                error, ENOTSUP, RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
                "TC rule creation failed");
 }