X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-pmd%2Ftestpmd.h;h=bf3669134aa08d5a6dcc71c8399d04ae1905f058;hb=5984037501c144ee2535ed57e27029554aa97dd7;hp=6b901a894f0314c45c34dea33ae6b4baf3605f08;hpb=de956d5ecf080c32e65d84654fd9d774e8ce3fb3;p=dpdk.git diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index 6b901a894f..bf3669134a 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -11,8 +11,12 @@ #include #include #include +#include #include #include +#ifdef RTE_HAS_JANSSON +#include +#endif #define RTE_PORT_ALL (~(portid_t)0x0) @@ -137,10 +141,13 @@ struct fwd_stream { uint64_t rx_bad_l4_csum ; /**< received packets has bad l4 checksum */ uint64_t rx_bad_outer_l4_csum; /**< received packets has bad outer l4 checksum */ + uint64_t rx_bad_outer_ip_csum; + /**< received packets having bad outer ip checksum */ unsigned int gro_times; /**< GRO operation times */ uint64_t core_cycles; /**< used for RX and TX processing */ struct pkt_burst_stats rx_burst_stats; struct pkt_burst_stats tx_burst_stats; + struct fwd_lcore *lcore; /**< Lcore being scheduled. */ }; /** @@ -149,7 +156,7 @@ struct fwd_stream { */ enum age_action_context_type { ACTION_AGE_CONTEXT_TYPE_FLOW, - ACTION_AGE_CONTEXT_TYPE_SHARED_ACTION, + ACTION_AGE_CONTEXT_TYPE_INDIRECT_ACTION, }; /** Descriptor for a single flow. */ @@ -163,13 +170,15 @@ struct port_flow { uint8_t data[]; /**< Storage for flow rule description */ }; -/* Descriptor for shared action */ -struct port_shared_action { - struct port_shared_action *next; /**< Next flow in list. */ - uint32_t id; /**< Shared action ID. */ +/* Descriptor for indirect action */ +struct port_indirect_action { + struct port_indirect_action *next; /**< Next flow in list. */ + uint32_t id; /**< Indirect action ID. */ enum rte_flow_action_type type; /**< Action type. */ - struct rte_flow_shared_action *action; /**< Shared action handle. */ + struct rte_flow_action_handle *handle; /**< Indirect action handle. */ enum age_action_context_type age_type; /**< Age action context type. */ + /** If true, the action applies to "transfer" flows, and vice versa */ + bool transfer; }; struct port_flow_tunnel { @@ -192,6 +201,17 @@ struct tunnel_ops { uint32_t items:1; }; +/** Information for an extended statistics to show. */ +struct xstat_display_info { + /** Supported xstats IDs in the order of xstats_display */ + uint64_t *ids_supp; + size_t ids_supp_sz; + uint64_t *prev_values; + uint64_t *curr_values; + uint64_t prev_ns; + bool allocated; +}; + /** * The data structure associated with each port. */ @@ -206,8 +226,6 @@ struct rte_port { uint16_t tunnel_tso_segsz; /**< Segmentation offload MSS for tunneled pkts. */ uint16_t tx_vlan_id;/**< The tag ID */ uint16_t tx_vlan_id_outer;/**< The outer tag ID */ - uint8_t tx_queue_stats_mapping_enabled; - uint8_t rx_queue_stats_mapping_enabled; volatile uint16_t port_status; /**< port started or not */ uint8_t need_setup; /**< port just attached */ uint8_t need_reconfig; /**< need reconfiguring port or not */ @@ -222,8 +240,8 @@ struct rte_port { uint32_t mc_addr_nb; /**< nb. of addr. in mc_addr_pool */ uint8_t slave_flag; /**< bonding slave port */ struct port_flow *flow_list; /**< Associated flows. */ - struct port_shared_action *actions_list; - /**< Associated shared actions. */ + struct port_indirect_action *actions_list; + /**< Associated indirect actions. */ LIST_HEAD(, port_flow_tunnel) flow_tunnel_list; const struct rte_eth_rxtx_callback *rx_dump_cb[RTE_MAX_QUEUES_PER_PORT+1]; const struct rte_eth_rxtx_callback *tx_dump_cb[RTE_MAX_QUEUES_PER_PORT+1]; @@ -233,6 +251,9 @@ struct rte_port { /**< dynamic flags. */ uint64_t mbuf_dynf; const struct rte_eth_rxtx_callback *tx_set_dynf_cb[RTE_MAX_QUEUES_PER_PORT+1]; + /** Associated port which is supposed to handle "transfer" flows */ + portid_t flow_transfer_proxy; + struct xstat_display_info xstats_info; }; /** @@ -249,7 +270,6 @@ struct fwd_lcore { streamid_t stream_idx; /**< index of 1st stream in "fwd_streams" */ streamid_t stream_nb; /**< number of streams in "fwd_streams" */ lcoreid_t cpuid_idx; /**< index of logical core in CPU id table */ - queueid_t tx_queue; /**< TX queue to send forwarded packets */ volatile char stopped; /**< stop forwarding when set */ }; @@ -268,7 +288,7 @@ struct fwd_lcore { * Forwards packets unchanged on the same port. * Check that sent IEEE1588 PTP packets are timestamped by the hardware. */ -typedef void (*port_fwd_begin_t)(portid_t pi); +typedef int (*port_fwd_begin_t)(portid_t pi); typedef void (*port_fwd_end_t)(portid_t pi); typedef void (*packet_fwd_t)(struct fwd_stream *fs); @@ -279,6 +299,27 @@ struct fwd_engine { packet_fwd_t packet_fwd; /**< Mandatory. */ }; +#define FLEX_ITEM_MAX_SAMPLES_NUM 16 +#define FLEX_ITEM_MAX_LINKS_NUM 16 +#define FLEX_MAX_FLOW_PATTERN_LENGTH 64 +#define FLEX_MAX_PARSERS_NUM 8 +#define FLEX_MAX_PATTERNS_NUM 64 +#define FLEX_PARSER_ERR ((struct flex_item *)-1) + +struct flex_item { + struct rte_flow_item_flex_conf flex_conf; + struct rte_flow_item_flex_handle *flex_handle; + uint32_t flex_id; +}; + +struct flex_pattern { + struct rte_flow_item_flex spec, mask; + uint8_t spec_pattern[FLEX_MAX_FLOW_PATTERN_LENGTH]; + uint8_t mask_pattern[FLEX_MAX_FLOW_PATTERN_LENGTH]; +}; +extern struct flex_item *flex_items[RTE_MAX_ETHPORTS][FLEX_MAX_PARSERS_NUM]; +extern struct flex_pattern flex_patterns[FLEX_MAX_PATTERNS_NUM]; + #define BURST_TX_WAIT_US 1 #define BURST_TX_RETRIES 64 @@ -298,11 +339,14 @@ extern struct fwd_engine five_tuple_swap_fwd_engine; #ifdef RTE_LIBRTE_IEEE1588 extern struct fwd_engine ieee1588_fwd_engine; #endif +extern struct fwd_engine shared_rxq_engine; extern struct fwd_engine * fwd_engines[]; /**< NULL terminated array. */ extern cmdline_parse_inst_t cmd_set_raw; extern cmdline_parse_inst_t cmd_show_set_raw; extern cmdline_parse_inst_t cmd_show_set_raw_all; +extern cmdline_parse_inst_t cmd_set_flex_is_pattern; +extern cmdline_parse_inst_t cmd_set_flex_spec_pattern; extern uint16_t mempool_flags; @@ -326,25 +370,6 @@ enum dcb_mode_enable DCB_ENABLED }; -#define MAX_TX_QUEUE_STATS_MAPPINGS 1024 /* MAX_PORT of 32 @ 32 tx_queues/port */ -#define MAX_RX_QUEUE_STATS_MAPPINGS 4096 /* MAX_PORT of 32 @ 128 rx_queues/port */ - -struct queue_stats_mappings { - portid_t port_id; - uint16_t queue_id; - uint8_t stats_counter_id; -} __rte_cache_aligned; - -extern struct queue_stats_mappings tx_queue_stats_mappings_array[]; -extern struct queue_stats_mappings rx_queue_stats_mappings_array[]; - -/* Assign both tx and rx queue stats mappings to the same default values */ -extern struct queue_stats_mappings *tx_queue_stats_mappings; -extern struct queue_stats_mappings *rx_queue_stats_mappings; - -extern uint16_t nb_tx_queue_stats_mappings; -extern uint16_t nb_rx_queue_stats_mappings; - extern uint8_t xstats_hide_zero; /**< Hide zero values for xstats display */ /* globals used for configuration */ @@ -362,6 +387,7 @@ extern uint8_t no_flush_rx; /**dev_info.device) { - printf("Invalid device\n"); + fprintf(stderr, "Invalid device\n"); return 0; } @@ -711,7 +756,7 @@ port_pci_reg_read(struct rte_port *port, uint32_t reg_off) if (bus && !strcmp(bus->name, "pci")) { pci_dev = RTE_DEV_TO_PCI(port->dev_info.device); } else { - printf("Not a PCI device\n"); + fprintf(stderr, "Not a PCI device\n"); return 0; } @@ -731,7 +776,7 @@ port_pci_reg_write(struct rte_port *port, uint32_t reg_off, uint32_t reg_v) void *reg_addr; if (!port->dev_info.device) { - printf("Invalid device\n"); + fprintf(stderr, "Invalid device\n"); return; } @@ -739,7 +784,7 @@ port_pci_reg_write(struct rte_port *port, uint32_t reg_off, uint32_t reg_v) if (bus && !strcmp(bus->name, "pci")) { pci_dev = RTE_DEV_TO_PCI(port->dev_info.device); } else { - printf("Not a PCI device\n"); + fprintf(stderr, "Not a PCI device\n"); return; } @@ -779,7 +824,7 @@ inc_tx_burst_stats(struct fwd_stream *fs, uint16_t nb_tx) } /* Prototypes */ -unsigned int parse_item_list(char* str, const char* item_name, +unsigned int parse_item_list(const char *str, const char *item_name, unsigned int max_items, unsigned int *parsed_items, int check_unique_values); void launch_args_parse(int argc, char** argv); @@ -790,17 +835,16 @@ void nic_stats_display(portid_t port_id); void nic_stats_clear(portid_t port_id); void nic_xstats_display(portid_t port_id); void nic_xstats_clear(portid_t port_id); -void nic_stats_mapping_display(portid_t port_id); void device_infos_display(const char *identifier); void port_infos_display(portid_t port_id); void port_summary_display(portid_t port_id); void port_eeprom_display(portid_t port_id); void port_module_eeprom_display(portid_t port_id); void port_summary_header_display(void); -void port_offload_cap_display(portid_t port_id); void rx_queue_infos_display(portid_t port_idi, uint16_t queue_id); void tx_queue_infos_display(portid_t port_idi, uint16_t queue_id); void fwd_lcores_config_display(void); +bool pkt_fwd_shared_rxq_check(void); void pkt_fwd_config_display(struct fwd_config *cfg); void rxtx_config_display(void); void fwd_config_setup(void); @@ -821,14 +865,14 @@ void port_reg_bit_field_set(portid_t port_id, uint32_t reg_off, uint8_t bit1_pos, uint8_t bit2_pos, uint32_t value); void port_reg_display(portid_t port_id, uint32_t reg_off); void port_reg_set(portid_t port_id, uint32_t reg_off, uint32_t value); -int port_shared_action_create(portid_t port_id, uint32_t id, - const struct rte_flow_shared_action_conf *conf, +int port_action_handle_create(portid_t port_id, uint32_t id, + const struct rte_flow_indir_action_conf *conf, const struct rte_flow_action *action); -int port_shared_action_destroy(portid_t port_id, +int port_action_handle_destroy(portid_t port_id, uint32_t n, const uint32_t *action); -struct rte_flow_shared_action *port_shared_action_get_by_id(portid_t port_id, +struct rte_flow_action_handle *port_action_handle_get_by_id(portid_t port_id, uint32_t id); -int port_shared_action_update(portid_t port_id, uint32_t id, +int port_action_handle_update(portid_t port_id, uint32_t id, const struct rte_flow_action *action); int port_flow_validate(portid_t port_id, const struct rte_flow_attr *attr, @@ -840,12 +884,13 @@ int port_flow_create(portid_t port_id, const struct rte_flow_item *pattern, const struct rte_flow_action *actions, const struct tunnel_ops *tunnel_ops); -int port_shared_action_query(portid_t port_id, uint32_t id); +int port_action_handle_query(portid_t port_id, uint32_t id); void update_age_action_context(const struct rte_flow_action *actions, struct port_flow *pf); int port_flow_destroy(portid_t port_id, uint32_t n, const uint32_t *rule); int port_flow_flush(portid_t port_id); -int port_flow_dump(portid_t port_id, const char *file_name); +int port_flow_dump(portid_t port_id, bool dump_all, + uint32_t rule, const char *file_name); int port_flow_query(portid_t port_id, uint32_t rule, const struct rte_flow_action *action); void port_flow_list(portid_t port_id, uint32_t n, const uint32_t *group); @@ -857,6 +902,8 @@ void port_flow_tunnel_list(portid_t port_id); void port_flow_tunnel_destroy(portid_t port_id, uint32_t tunnel_id); void port_flow_tunnel_create(portid_t port_id, const struct tunnel_ops *ops); int port_flow_isolate(portid_t port_id, int set); +int port_meter_policy_add(portid_t port_id, uint32_t policy_id, + const struct rte_flow_action *actions); void rx_ring_desc_display(portid_t port_id, queueid_t rxq_id, uint16_t rxd_id); void tx_ring_desc_display(portid_t port_id, queueid_t txq_id, uint16_t txd_id); @@ -901,7 +948,7 @@ void show_tx_pkt_segments(void); void set_tx_pkt_times(unsigned int *tx_times); void show_tx_pkt_times(void); void set_tx_pkt_split(const char *name); -int parse_fec_mode(const char *name, enum rte_eth_fec_mode *mode); +int parse_fec_mode(const char *name, uint32_t *fec_capa); void show_fec_capability(uint32_t num, struct rte_eth_fec_capa *speed_fec_capa); void set_nb_pkt_per_burst(uint16_t pkt_burst); char *list_pkt_forwarding_modes(void); @@ -956,7 +1003,7 @@ int set_vf_rate_limit(portid_t port_id, uint16_t vf, uint16_t rate, void port_rss_hash_conf_show(portid_t port_id, int show_rss_key); void port_rss_hash_key_update(portid_t port_id, char rss_type[], - uint8_t *hash_key, uint hash_key_len); + uint8_t *hash_key, uint8_t hash_key_len); int rx_queue_id_is_invalid(queueid_t rxq_id); int tx_queue_id_is_invalid(queueid_t txq_id); void setup_gro(const char *onoff, portid_t port_id); @@ -965,6 +1012,8 @@ void show_gro(portid_t port_id); void setup_gso(const char *mode, portid_t port_id); int eth_dev_info_get_print_err(uint16_t port_id, struct rte_eth_dev_info *dev_info); +int eth_dev_conf_get_print_err(uint16_t port_id, + struct rte_eth_conf *dev_conf); void eth_set_promisc_mode(uint16_t port_id, int enable); void eth_set_allmulticast_mode(uint16_t port, int enable); int eth_link_get_nowait_print_err(uint16_t port_id, struct rte_eth_link *link); @@ -1027,6 +1076,16 @@ uint16_t tx_pkt_set_dynf(uint16_t port_id, __rte_unused uint16_t queue, __rte_unused void *user_param); void add_tx_dynf_callback(portid_t portid); void remove_tx_dynf_callback(portid_t portid); +int update_mtu_from_frame_size(portid_t portid, uint32_t max_rx_pktlen); +int update_jumbo_frame_offload(portid_t portid); +void flex_item_create(portid_t port_id, uint16_t flex_id, const char *filename); +void flex_item_destroy(portid_t port_id, uint16_t flex_id); +void port_flex_item_flush(portid_t port_id); + +extern int flow_parse(const char *src, void *result, unsigned int size, + struct rte_flow_attr **attr, + struct rte_flow_item **pattern, + struct rte_flow_action **actions); /* * Work-around of a compilation error with ICC on invocations of the