net/mlx5: optimize header modify action memory
[dpdk.git] / app / test-pmd / config.c
index 803d982..04ae0fe 100644 (file)
@@ -1618,90 +1618,99 @@ port_action_handle_query(portid_t port_id, uint32_t id)
 {
        struct rte_flow_error error;
        struct port_indirect_action *pia;
-       uint64_t default_data;
-       void *data = NULL;
-       int ret = 0;
+       union {
+               struct rte_flow_query_count count;
+               struct rte_flow_query_age age;
+               struct rte_flow_action_conntrack ct;
+       } query;
 
        pia = action_get_by_id(port_id, id);
        if (!pia)
                return -EINVAL;
        switch (pia->type) {
        case RTE_FLOW_ACTION_TYPE_AGE:
-               data = &default_data;
+       case RTE_FLOW_ACTION_TYPE_COUNT:
                break;
        default:
-               printf("Indirect action %u (type: %d) on port %u doesn't"
-                      " support query\n", id, pia->type, port_id);
-               return -1;
+               printf("Indirect action %u (type: %d) on port %u doesn't support query\n",
+                      id, pia->type, port_id);
+               return -ENOTSUP;
        }
-       if (rte_flow_action_handle_query(port_id, pia->handle, data, &error))
-               ret = port_flow_complain(&error);
+       /* Poisoning to make sure PMDs update it in case of error. */
+       memset(&error, 0x55, sizeof(error));
+       memset(&query, 0, sizeof(query));
+       if (rte_flow_action_handle_query(port_id, pia->handle, &query, &error))
+               return port_flow_complain(&error);
        switch (pia->type) {
        case RTE_FLOW_ACTION_TYPE_AGE:
-               if (!ret) {
-                       struct rte_flow_query_age *resp = data;
-
-                       printf("AGE:\n"
-                              " aged: %u\n"
-                              " sec_since_last_hit_valid: %u\n"
-                              " sec_since_last_hit: %" PRIu32 "\n",
-                              resp->aged,
-                              resp->sec_since_last_hit_valid,
-                              resp->sec_since_last_hit);
-               }
-               data = NULL;
+               printf("Indirect AGE action:\n"
+                      " aged: %u\n"
+                      " sec_since_last_hit_valid: %u\n"
+                      " sec_since_last_hit: %" PRIu32 "\n",
+                      query.age.aged,
+                      query.age.sec_since_last_hit_valid,
+                      query.age.sec_since_last_hit);
+               break;
+       case RTE_FLOW_ACTION_TYPE_COUNT:
+               printf("Indirect COUNT action:\n"
+                      " hits_set: %u\n"
+                      " bytes_set: %u\n"
+                      " hits: %" PRIu64 "\n"
+                      " bytes: %" PRIu64 "\n",
+                      query.count.hits_set,
+                      query.count.bytes_set,
+                      query.count.hits,
+                      query.count.bytes);
                break;
        case RTE_FLOW_ACTION_TYPE_CONNTRACK:
-               if (!ret) {
-                       struct rte_flow_action_conntrack *ct = data;
-
-                       printf("Conntrack Context:\n"
-                              "  Peer: %u, Flow dir: %s, Enable: %u\n"
-                              "  Live: %u, SACK: %u, CACK: %u\n"
-                              "  Packet dir: %s, Liberal: %u, State: %u\n"
-                              "  Factor: %u, Retrans: %u, TCP flags: %u\n"
-                              "  Last Seq: %u, Last ACK: %u\n"
-                              "  Last Win: %u, Last End: %u\n",
-                              ct->peer_port,
-                              ct->is_original_dir ? "Original" : "Reply",
-                              ct->enable, ct->live_connection,
-                              ct->selective_ack, ct->challenge_ack_passed,
-                              ct->last_direction ? "Original" : "Reply",
-                              ct->liberal_mode, ct->state,
-                              ct->max_ack_window, ct->retransmission_limit,
-                              ct->last_index, ct->last_seq, ct->last_ack,
-                              ct->last_window, ct->last_end);
-                       printf("  Original Dir:\n"
-                              "    scale: %u, fin: %u, ack seen: %u\n"
-                              " unacked data: %u\n    Sent end: %u,"
-                              "    Reply end: %u, Max win: %u, Max ACK: %u\n",
-                              ct->original_dir.scale,
-                              ct->original_dir.close_initiated,
-                              ct->original_dir.last_ack_seen,
-                              ct->original_dir.data_unacked,
-                              ct->original_dir.sent_end,
-                              ct->original_dir.reply_end,
-                              ct->original_dir.max_win,
-                              ct->original_dir.max_ack);
-                       printf("  Reply Dir:\n"
-                              "    scale: %u, fin: %u, ack seen: %u\n"
-                              " unacked data: %u\n    Sent end: %u,"
-                              "    Reply end: %u, Max win: %u, Max ACK: %u\n",
-                              ct->reply_dir.scale,
-                              ct->reply_dir.close_initiated,
-                              ct->reply_dir.last_ack_seen,
-                              ct->reply_dir.data_unacked,
-                              ct->reply_dir.sent_end, ct->reply_dir.reply_end,
-                              ct->reply_dir.max_win, ct->reply_dir.max_ack);
-               }
-               data = NULL;
+               printf("Conntrack Context:\n"
+                      "  Peer: %u, Flow dir: %s, Enable: %u\n"
+                      "  Live: %u, SACK: %u, CACK: %u\n"
+                      "  Packet dir: %s, Liberal: %u, State: %u\n"
+                      "  Factor: %u, Retrans: %u, TCP flags: %u\n"
+                      "  Last Seq: %u, Last ACK: %u\n"
+                      "  Last Win: %u, Last End: %u\n",
+                      query.ct.peer_port,
+                      query.ct.is_original_dir ? "Original" : "Reply",
+                      query.ct.enable, query.ct.live_connection,
+                      query.ct.selective_ack, query.ct.challenge_ack_passed,
+                      query.ct.last_direction ? "Original" : "Reply",
+                      query.ct.liberal_mode, query.ct.state,
+                      query.ct.max_ack_window, query.ct.retransmission_limit,
+                      query.ct.last_index, query.ct.last_seq,
+                      query.ct.last_ack, query.ct.last_window,
+                      query.ct.last_end);
+               printf("  Original Dir:\n"
+                      "    scale: %u, fin: %u, ack seen: %u\n"
+                      " unacked data: %u\n    Sent end: %u,"
+                      "    Reply end: %u, Max win: %u, Max ACK: %u\n",
+                      query.ct.original_dir.scale,
+                      query.ct.original_dir.close_initiated,
+                      query.ct.original_dir.last_ack_seen,
+                      query.ct.original_dir.data_unacked,
+                      query.ct.original_dir.sent_end,
+                      query.ct.original_dir.reply_end,
+                      query.ct.original_dir.max_win,
+                      query.ct.original_dir.max_ack);
+               printf("  Reply Dir:\n"
+                      "    scale: %u, fin: %u, ack seen: %u\n"
+                      " unacked data: %u\n    Sent end: %u,"
+                      "    Reply end: %u, Max win: %u, Max ACK: %u\n",
+                      query.ct.reply_dir.scale,
+                      query.ct.reply_dir.close_initiated,
+                      query.ct.reply_dir.last_ack_seen,
+                      query.ct.reply_dir.data_unacked,
+                      query.ct.reply_dir.sent_end,
+                      query.ct.reply_dir.reply_end,
+                      query.ct.reply_dir.max_win,
+                      query.ct.reply_dir.max_ack);
                break;
        default:
-               printf("Indirect action %u (type: %d) on port %u doesn't"
-                      " support query\n", id, pia->type, port_id);
-               ret = -1;
+               printf("Indirect action %u (type: %d) on port %u doesn't support query\n",
+                      id, pia->type, port_id);
+               break;
        }
-       return ret;
+       return 0;
 }
 
 static struct port_flow_tunnel *
@@ -1931,6 +1940,9 @@ port_flow_create(portid_t port_id,
        memset(&error, 0x22, sizeof(error));
        flow = rte_flow_create(port_id, attr, pattern, actions, &error);
        if (!flow) {
+               if (tunnel_ops->enabled)
+                       port_flow_tunnel_offload_cmd_release(port_id,
+                                                            tunnel_ops, pft);
                free(pf);
                return port_flow_complain(&error);
        }
@@ -3605,13 +3617,14 @@ set_tx_pkt_split(const char *name)
 }
 
 int
-parse_fec_mode(const char *name, uint32_t *mode)
+parse_fec_mode(const char *name, uint32_t *fec_capa)
 {
        uint8_t i;
 
        for (i = 0; i < RTE_DIM(fec_mode_name); i++) {
                if (strcmp(fec_mode_name[i].name, name) == 0) {
-                       *mode = RTE_ETH_FEC_MODE_TO_CAPA(fec_mode_name[i].mode);
+                       *fec_capa =
+                               RTE_ETH_FEC_MODE_TO_CAPA(fec_mode_name[i].mode);
                        return 0;
                }
        }
@@ -4437,6 +4450,47 @@ set_record_burst_stats(uint8_t on_off)
        record_burst_stats = on_off;
 }
 
+static char*
+flowtype_to_str(uint16_t flow_type)
+{
+       struct flow_type_info {
+               char str[32];
+               uint16_t ftype;
+       };
+
+       uint8_t i;
+       static struct flow_type_info flowtype_str_table[] = {
+               {"raw", RTE_ETH_FLOW_RAW},
+               {"ipv4", RTE_ETH_FLOW_IPV4},
+               {"ipv4-frag", RTE_ETH_FLOW_FRAG_IPV4},
+               {"ipv4-tcp", RTE_ETH_FLOW_NONFRAG_IPV4_TCP},
+               {"ipv4-udp", RTE_ETH_FLOW_NONFRAG_IPV4_UDP},
+               {"ipv4-sctp", RTE_ETH_FLOW_NONFRAG_IPV4_SCTP},
+               {"ipv4-other", RTE_ETH_FLOW_NONFRAG_IPV4_OTHER},
+               {"ipv6", RTE_ETH_FLOW_IPV6},
+               {"ipv6-frag", RTE_ETH_FLOW_FRAG_IPV6},
+               {"ipv6-tcp", RTE_ETH_FLOW_NONFRAG_IPV6_TCP},
+               {"ipv6-udp", RTE_ETH_FLOW_NONFRAG_IPV6_UDP},
+               {"ipv6-sctp", RTE_ETH_FLOW_NONFRAG_IPV6_SCTP},
+               {"ipv6-other", RTE_ETH_FLOW_NONFRAG_IPV6_OTHER},
+               {"l2_payload", RTE_ETH_FLOW_L2_PAYLOAD},
+               {"port", RTE_ETH_FLOW_PORT},
+               {"vxlan", RTE_ETH_FLOW_VXLAN},
+               {"geneve", RTE_ETH_FLOW_GENEVE},
+               {"nvgre", RTE_ETH_FLOW_NVGRE},
+               {"vxlan-gpe", RTE_ETH_FLOW_VXLAN_GPE},
+       };
+
+       for (i = 0; i < RTE_DIM(flowtype_str_table); i++) {
+               if (flowtype_str_table[i].ftype == flow_type)
+                       return flowtype_str_table[i].str;
+       }
+
+       return NULL;
+}
+
+#if defined(RTE_NET_I40E) || defined(RTE_NET_IXGBE)
+
 static inline void
 print_fdir_mask(struct rte_eth_fdir_masks *mask)
 {
@@ -4496,47 +4550,6 @@ print_fdir_flex_payload(struct rte_eth_fdir_flex_conf *flex_conf, uint32_t num)
        printf("\n");
 }
 
-static char *
-flowtype_to_str(uint16_t flow_type)
-{
-       struct flow_type_info {
-               char str[32];
-               uint16_t ftype;
-       };
-
-       uint8_t i;
-       static struct flow_type_info flowtype_str_table[] = {
-               {"raw", RTE_ETH_FLOW_RAW},
-               {"ipv4", RTE_ETH_FLOW_IPV4},
-               {"ipv4-frag", RTE_ETH_FLOW_FRAG_IPV4},
-               {"ipv4-tcp", RTE_ETH_FLOW_NONFRAG_IPV4_TCP},
-               {"ipv4-udp", RTE_ETH_FLOW_NONFRAG_IPV4_UDP},
-               {"ipv4-sctp", RTE_ETH_FLOW_NONFRAG_IPV4_SCTP},
-               {"ipv4-other", RTE_ETH_FLOW_NONFRAG_IPV4_OTHER},
-               {"ipv6", RTE_ETH_FLOW_IPV6},
-               {"ipv6-frag", RTE_ETH_FLOW_FRAG_IPV6},
-               {"ipv6-tcp", RTE_ETH_FLOW_NONFRAG_IPV6_TCP},
-               {"ipv6-udp", RTE_ETH_FLOW_NONFRAG_IPV6_UDP},
-               {"ipv6-sctp", RTE_ETH_FLOW_NONFRAG_IPV6_SCTP},
-               {"ipv6-other", RTE_ETH_FLOW_NONFRAG_IPV6_OTHER},
-               {"l2_payload", RTE_ETH_FLOW_L2_PAYLOAD},
-               {"port", RTE_ETH_FLOW_PORT},
-               {"vxlan", RTE_ETH_FLOW_VXLAN},
-               {"geneve", RTE_ETH_FLOW_GENEVE},
-               {"nvgre", RTE_ETH_FLOW_NVGRE},
-               {"vxlan-gpe", RTE_ETH_FLOW_VXLAN_GPE},
-       };
-
-       for (i = 0; i < RTE_DIM(flowtype_str_table); i++) {
-               if (flowtype_str_table[i].ftype == flow_type)
-                       return flowtype_str_table[i].str;
-       }
-
-       return NULL;
-}
-
-#if defined(RTE_NET_I40E) || defined(RTE_NET_IXGBE)
-
 static inline void
 print_fdir_flex_mask(struct rte_eth_fdir_flex_conf *flex_conf, uint32_t num)
 {