app/testpmd: fix copy of raw flow item
[dpdk.git] / app / test-pmd / config.c
index 7f5f40f..bcaf429 100644 (file)
@@ -407,6 +407,7 @@ port_infos_display(portid_t port_id)
        static const char *info_border = "*********************";
        portid_t pid;
        uint16_t mtu;
+       char name[RTE_ETH_NAME_MAX_LEN];
 
        if (port_id_is_invalid(port_id, ENABLED_WARN)) {
                printf("Valid port range is [0");
@@ -423,6 +424,8 @@ port_infos_display(portid_t port_id)
               info_border, port_id, info_border);
        rte_eth_macaddr_get(port_id, &mac_addr);
        print_ethaddr("MAC address: ", &mac_addr);
+       rte_eth_dev_get_name_by_port(port_id, name);
+       printf("\nDevice name: %s", name);
        printf("\nDriver name: %s", dev_info.driver_name);
        printf("\nConnect to socket: %u", port->socket_id);
 
@@ -517,6 +520,18 @@ port_infos_display(portid_t port_id)
        printf("Min possible number of TXDs per queue: %hu\n",
                dev_info.tx_desc_lim.nb_min);
        printf("TXDs number alignment: %hu\n", dev_info.tx_desc_lim.nb_align);
+
+       /* Show switch info only if valid switch domain and port id is set */
+       if (dev_info.switch_info.domain_id !=
+               RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID) {
+               if (dev_info.switch_info.name)
+                       printf("Switch name: %s\n", dev_info.switch_info.name);
+
+               printf("Switch domain Id: %u\n",
+                       dev_info.switch_info.domain_id);
+               printf("Switch Port Id: %u\n",
+                       dev_info.switch_info.port_id);
+       }
 }
 
 void
@@ -1062,7 +1077,8 @@ flow_item_spec_copy(void *buf, const struct rte_flow_item *item,
                dst.raw = buf;
                off = RTE_ALIGN_CEIL(sizeof(struct rte_flow_item_raw),
                                     sizeof(*src.raw->pattern));
-               size = off + src.raw->length * sizeof(*src.raw->pattern);
+               size = off + ((const struct rte_flow_item_raw *)item->spec)->
+                       length * sizeof(*src.raw->pattern);
                if (dst.raw) {
                        memcpy(dst.raw, src.raw, sizeof(*src.raw));
                        dst.raw->pattern = memcpy((uint8_t *)dst.raw + off,
@@ -1099,13 +1115,32 @@ static const struct {
        MK_FLOW_ACTION(FLAG, 0),
        MK_FLOW_ACTION(QUEUE, sizeof(struct rte_flow_action_queue)),
        MK_FLOW_ACTION(DROP, 0),
-       MK_FLOW_ACTION(COUNT, 0),
+       MK_FLOW_ACTION(COUNT, sizeof(struct rte_flow_action_count)),
        MK_FLOW_ACTION(RSS, sizeof(struct rte_flow_action_rss)),
        MK_FLOW_ACTION(PF, 0),
        MK_FLOW_ACTION(VF, sizeof(struct rte_flow_action_vf)),
        MK_FLOW_ACTION(PHY_PORT, sizeof(struct rte_flow_action_phy_port)),
        MK_FLOW_ACTION(PORT_ID, sizeof(struct rte_flow_action_port_id)),
        MK_FLOW_ACTION(METER, sizeof(struct rte_flow_action_meter)),
+       MK_FLOW_ACTION(OF_SET_MPLS_TTL,
+                      sizeof(struct rte_flow_action_of_set_mpls_ttl)),
+       MK_FLOW_ACTION(OF_DEC_MPLS_TTL, 0),
+       MK_FLOW_ACTION(OF_SET_NW_TTL,
+                      sizeof(struct rte_flow_action_of_set_nw_ttl)),
+       MK_FLOW_ACTION(OF_DEC_NW_TTL, 0),
+       MK_FLOW_ACTION(OF_COPY_TTL_OUT, 0),
+       MK_FLOW_ACTION(OF_COPY_TTL_IN, 0),
+       MK_FLOW_ACTION(OF_POP_VLAN, 0),
+       MK_FLOW_ACTION(OF_PUSH_VLAN,
+                      sizeof(struct rte_flow_action_of_push_vlan)),
+       MK_FLOW_ACTION(OF_SET_VLAN_VID,
+                      sizeof(struct rte_flow_action_of_set_vlan_vid)),
+       MK_FLOW_ACTION(OF_SET_VLAN_PCP,
+                      sizeof(struct rte_flow_action_of_set_vlan_pcp)),
+       MK_FLOW_ACTION(OF_POP_MPLS,
+                      sizeof(struct rte_flow_action_of_pop_mpls)),
+       MK_FLOW_ACTION(OF_PUSH_MPLS,
+                      sizeof(struct rte_flow_action_of_push_mpls)),
 };
 
 /** Compute storage space needed by action configuration and copy it. */
@@ -1433,7 +1468,7 @@ port_flow_flush(portid_t port_id)
 /** Query a flow rule. */
 int
 port_flow_query(portid_t port_id, uint32_t rule,
-               enum rte_flow_action_type action)
+               const struct rte_flow_action *action)
 {
        struct rte_flow_error error;
        struct rte_port *port;
@@ -1454,16 +1489,17 @@ port_flow_query(portid_t port_id, uint32_t rule,
                printf("Flow rule #%u not found\n", rule);
                return -ENOENT;
        }
-       if ((unsigned int)action >= RTE_DIM(flow_action) ||
-           !flow_action[action].name)
+       if ((unsigned int)action->type >= RTE_DIM(flow_action) ||
+           !flow_action[action->type].name)
                name = "unknown";
        else
-               name = flow_action[action].name;
-       switch (action) {
+               name = flow_action[action->type].name;
+       switch (action->type) {
        case RTE_FLOW_ACTION_TYPE_COUNT:
                break;
        default:
-               printf("Cannot query action type %d (%s)\n", action, name);
+               printf("Cannot query action type %d (%s)\n",
+                       action->type, name);
                return -ENOTSUP;
        }
        /* Poisoning to make sure PMDs update it in case of error. */
@@ -1471,7 +1507,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
        memset(&query, 0, sizeof(query));
        if (rte_flow_query(port_id, pf->flow, action, &query, &error))
                return port_flow_complain(&error);
-       switch (action) {
+       switch (action->type) {
        case RTE_FLOW_ACTION_TYPE_COUNT:
                printf("%s:\n"
                       " hits_set: %u\n"
@@ -1486,7 +1522,7 @@ port_flow_query(portid_t port_id, uint32_t rule,
                break;
        default:
                printf("Cannot display result for action type %d (%s)\n",
-                      action, name);
+                      action->type, name);
                break;
        }
        return 0;