X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest-pmd%2Ftestpmd.h;h=2149ecd93a20a346bdd95ef1f3194da6e8e648ba;hb=c8557ed434213fe11ecd867819823ea6865311d2;hp=ce83f31f0d04a6b05a66ac05f772a8c6f62fc36e;hpb=ecf86ccb4b13dea737eeb81ac54a7cbcccfd263d;p=dpdk.git diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h index ce83f31f0d..2149ecd93a 100644 --- a/app/test-pmd/testpmd.h +++ b/app/test-pmd/testpmd.h @@ -9,10 +9,18 @@ #include #include +#ifdef RTE_LIB_GRO #include +#endif +#ifdef RTE_LIB_GSO #include +#endif +#include #include #include +#ifdef RTE_HAS_JANSSON +#include +#endif #define RTE_PORT_ALL (~(portid_t)0x0) @@ -92,7 +100,7 @@ enum { * that are recorded for each forwarding stream. */ struct pkt_burst_stats { - unsigned int pkt_burst_spread[MAX_PKT_BURST]; + unsigned int pkt_burst_spread[MAX_PKT_BURST + 1]; }; /** Information for a given RSS type. */ @@ -139,10 +147,13 @@ struct fwd_stream { /**< received packets has bad outer l4 checksum */ uint64_t rx_bad_outer_ip_csum; /**< received packets having bad outer ip checksum */ +#ifdef RTE_LIB_GRO unsigned int gro_times; /**< GRO operation times */ +#endif 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. */ }; /** @@ -151,7 +162,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. */ @@ -165,12 +176,12 @@ 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. */ }; @@ -194,6 +205,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. */ @@ -222,8 +244,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 +255,7 @@ 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]; + struct xstat_display_info xstats_info; }; /** @@ -243,9 +266,13 @@ struct rte_port { * CPU id. configuration table. */ struct fwd_lcore { +#ifdef RTE_LIB_GSO struct rte_gso_ctx gso_ctx; /**< GSO context */ +#endif struct rte_mempool *mbp; /**< The mbuf pool to use by this core */ +#ifdef RTE_LIB_GRO void *gro_ctx; /**< GRO context */ +#endif 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 */ @@ -267,7 +294,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); @@ -278,6 +305,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 @@ -297,11 +345,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; @@ -342,6 +393,7 @@ extern uint8_t no_flush_rx; /**dev_info.device) { - printf("Invalid device\n"); + fprintf(stderr, "Invalid device\n"); return 0; } @@ -692,7 +766,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; } @@ -712,7 +786,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; } @@ -720,7 +794,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; } @@ -760,7 +834,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); @@ -780,6 +854,7 @@ void port_summary_header_display(void); 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); @@ -800,14 +875,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, @@ -819,12 +894,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); @@ -836,6 +912,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); @@ -880,7 +958,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); @@ -935,15 +1013,21 @@ 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); +#ifdef RTE_LIB_GRO void setup_gro(const char *onoff, portid_t port_id); void setup_gro_flush_cycles(uint8_t cycles); void show_gro(portid_t port_id); +#endif +#ifdef RTE_LIB_GSO void setup_gso(const char *mode, portid_t port_id); +#endif 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); @@ -1006,7 +1090,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