X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fsoftnic%2Frte_eth_softnic_internals.h;h=07285ca315a51d81557f6f2f5c9b7936f362f8c7;hb=f9f0b5121f62d8701165d20bfdd14638bc72654d;hp=2aba9a0f30d9a183e3ad59741610f8f02816b529;hpb=202905f3ee4db9df45f00da90da99e0655e60ef6;p=dpdk.git diff --git a/drivers/net/softnic/rte_eth_softnic_internals.h b/drivers/net/softnic/rte_eth_softnic_internals.h index 2aba9a0f30..07285ca315 100644 --- a/drivers/net/softnic/rte_eth_softnic_internals.h +++ b/drivers/net/softnic/rte_eth_softnic_internals.h @@ -18,23 +18,28 @@ #include #include -#include +#include +#include #include +#include +#include #include "rte_eth_softnic.h" #include "conn.h" #define NAME_SIZE 64 +#define SOFTNIC_PATH_MAX 4096 /** * PMD Parameters */ struct pmd_params { - const char *name; - const char *firmware; + char name[NAME_SIZE]; + char firmware[SOFTNIC_PATH_MAX]; uint16_t conn_port; uint32_t cpu_id; + int sc; /**< Service cores. */ /** Traffic Management (TM) */ struct { @@ -43,6 +48,68 @@ struct pmd_params { } tm; }; +/** + * Ethdev Flow API + */ +struct rte_flow; + +TAILQ_HEAD(flow_list, rte_flow); + +struct flow_attr_map { + char pipeline_name[NAME_SIZE]; + uint32_t table_id; + int valid; +}; + +#ifndef SOFTNIC_FLOW_MAX_GROUPS +#define SOFTNIC_FLOW_MAX_GROUPS 64 +#endif + +struct flow_internals { + struct flow_attr_map ingress_map[SOFTNIC_FLOW_MAX_GROUPS]; + struct flow_attr_map egress_map[SOFTNIC_FLOW_MAX_GROUPS]; +}; + +/** + * Meter + */ + +/* MTR meter profile */ +struct softnic_mtr_meter_profile { + TAILQ_ENTRY(softnic_mtr_meter_profile) node; + uint32_t meter_profile_id; + struct rte_mtr_meter_profile params; + uint32_t n_users; +}; + +TAILQ_HEAD(softnic_mtr_meter_profile_list, softnic_mtr_meter_profile); + +/* MTR meter policy */ +struct softnic_mtr_meter_policy { + TAILQ_ENTRY(softnic_mtr_meter_policy) node; + uint32_t meter_policy_id; + enum rte_table_action_policer policer[RTE_COLORS]; + uint32_t n_users; +}; + +TAILQ_HEAD(softnic_mtr_meter_policy_list, softnic_mtr_meter_policy); + +/* MTR meter object */ +struct softnic_mtr { + TAILQ_ENTRY(softnic_mtr) node; + uint32_t mtr_id; + struct rte_mtr_params params; + struct rte_flow *flow; +}; + +TAILQ_HEAD(softnic_mtr_list, softnic_mtr); + +struct mtr_internals { + struct softnic_mtr_meter_profile_list meter_profiles; + struct softnic_mtr_meter_policy_list meter_policies; + struct softnic_mtr_list mtrs; +}; + /** * MEMPOOL */ @@ -106,13 +173,22 @@ TAILQ_HEAD(softnic_link_list, softnic_link); #define TM_MAX_PIPES_PER_SUBPORT 4096 #endif +#ifndef TM_MAX_PIPE_PROFILE +#define TM_MAX_PIPE_PROFILE 256 +#endif + +#ifndef TM_MAX_SUBPORT_PROFILE +#define TM_MAX_SUBPORT_PROFILE 256 +#endif + struct tm_params { struct rte_sched_port_params port_params; - struct rte_sched_subport_params subport_params[TM_MAX_SUBPORTS]; - - struct rte_sched_pipe_params - pipe_profiles[RTE_SCHED_PIPE_PROFILES_PER_PORT]; + struct rte_sched_subport_profile_params + subport_profile[TM_MAX_SUBPORT_PROFILE]; + uint32_t n_subport_profiles; + uint32_t subport_to_profile[TM_MAX_SUBPORT_PROFILE]; + struct rte_sched_pipe_params pipe_profiles[TM_MAX_PIPE_PROFILE]; uint32_t n_pipe_profiles; uint32_t pipe_to_profile[TM_MAX_SUBPORTS * TM_MAX_PIPES_PER_SUBPORT]; }; @@ -203,7 +279,6 @@ struct tm_internals { /** Blueprints */ struct tm_params params; - struct rte_sched_port *sched; }; struct softnic_tmgr_port { @@ -225,6 +300,28 @@ struct softnic_tap { TAILQ_HEAD(softnic_tap_list, softnic_tap); +/** + * Cryptodev + */ +struct softnic_cryptodev_params { + const char *dev_name; + uint32_t dev_id; /**< Valid only when *dev_name* is NULL. */ + uint32_t n_queues; + uint32_t queue_size; + uint32_t session_pool_size; +}; + +struct softnic_cryptodev { + TAILQ_ENTRY(softnic_cryptodev) node; + char name[NAME_SIZE]; + uint16_t dev_id; + uint32_t n_queues; + struct rte_mempool *mp_create; + struct rte_mempool *mp_init; +}; + +TAILQ_HEAD(softnic_cryptodev_list, softnic_cryptodev); + /** * Input port action */ @@ -256,6 +353,7 @@ struct softnic_table_action_profile_params { struct rte_table_action_nat_config nat; struct rte_table_action_ttl_config ttl; struct rte_table_action_stats_config stats; + struct rte_table_action_sym_crypto_config sym_crypto; }; struct softnic_table_action_profile { @@ -267,6 +365,15 @@ struct softnic_table_action_profile { TAILQ_HEAD(softnic_table_action_profile_list, softnic_table_action_profile); +struct softnic_table_meter_profile { + TAILQ_ENTRY(softnic_table_meter_profile) node; + uint32_t meter_profile_id; + struct rte_table_action_meter_profile profile; +}; + +TAILQ_HEAD(softnic_table_meter_profile_list, + softnic_table_meter_profile); + /** * Pipeline */ @@ -281,12 +388,13 @@ enum softnic_port_in_type { PORT_IN_TMGR, PORT_IN_TAP, PORT_IN_SOURCE, + PORT_IN_CRYPTODEV, }; struct softnic_port_in_params { /* Read */ enum softnic_port_in_type type; - const char *dev_name; + char dev_name[NAME_SIZE]; union { struct { uint16_t queue_id; @@ -302,11 +410,17 @@ struct softnic_port_in_params { const char *file_name; uint32_t n_bytes_per_pkt; } source; + + struct { + uint16_t queue_id; + void *f_callback; + void *arg_callback; + } cryptodev; }; uint32_t burst_size; /* Action */ - const char *action_profile_name; + char action_profile_name[NAME_SIZE]; }; enum softnic_port_out_type { @@ -315,11 +429,12 @@ enum softnic_port_out_type { PORT_OUT_TMGR, PORT_OUT_TAP, PORT_OUT_SINK, + PORT_OUT_CRYPTODEV, }; struct softnic_port_out_params { enum softnic_port_out_type type; - const char *dev_name; + char dev_name[NAME_SIZE]; union { struct { uint16_t queue_id; @@ -329,6 +444,11 @@ struct softnic_port_out_params { const char *file_name; uint32_t max_n_pkts; } sink; + + struct { + uint16_t queue_id; + uint32_t op_offset; + } cryptodev; }; uint32_t burst_size; int retry; @@ -354,11 +474,15 @@ struct softnic_table_array_params { uint32_t key_offset; }; +#ifndef TABLE_RULE_MATCH_SIZE_MAX +#define TABLE_RULE_MATCH_SIZE_MAX 256 +#endif + struct softnic_table_hash_params { uint32_t n_keys; uint32_t key_offset; uint32_t key_size; - uint8_t *key_mask; + uint8_t key_mask[TABLE_RULE_MATCH_SIZE_MAX]; uint32_t n_buckets; int extendable_bucket; }; @@ -380,7 +504,7 @@ struct softnic_table_params { } match; /* Action */ - const char *action_profile_name; + char action_profile_name[NAME_SIZE]; }; struct softnic_port_in { @@ -389,10 +513,17 @@ struct softnic_port_in { struct rte_port_in_action *a; }; +struct softnic_port_out { + struct softnic_port_out_params params; +}; + struct softnic_table { struct softnic_table_params params; struct softnic_table_action_profile *ap; struct rte_table_action *a; + struct flow_list flows; + struct rte_table_action_dscp_table dscp_table; + struct softnic_table_meter_profile_list meter_profiles; }; struct pipeline { @@ -400,7 +531,9 @@ struct pipeline { char name[NAME_SIZE]; struct rte_pipeline *p; + struct pipeline_params params; struct softnic_port_in port_in[RTE_PIPELINE_PORT_IN_MAX]; + struct softnic_port_out port_out[RTE_PIPELINE_PORT_OUT_MAX]; struct softnic_table table[RTE_PIPELINE_TABLE_MAX]; uint32_t n_ports_in; uint32_t n_ports_out; @@ -433,13 +566,13 @@ TAILQ_HEAD(pipeline_list, pipeline); #endif /** - * Master thead: data plane thread context + * Main thread: data plane thread context */ struct softnic_thread { struct rte_ring *msgq_req; struct rte_ring *msgq_rsp; - uint32_t enabled; + uint32_t service_id; }; /** @@ -490,12 +623,16 @@ struct pmd_internals { struct tm_internals tm; /**< Traffic Management */ } soft; + struct flow_internals flow; + struct mtr_internals mtr; + struct softnic_conn *conn; struct softnic_mempool_list mempool_list; struct softnic_swq_list swq_list; struct softnic_link_list link_list; struct softnic_tmgr_port_list tmgr_port_list; struct softnic_tap_list tap_list; + struct softnic_cryptodev_list cryptodev_list; struct softnic_port_in_action_profile_list port_in_action_profile_list; struct softnic_table_action_profile_list table_action_profile_list; struct pipeline_list pipeline_list; @@ -503,6 +640,62 @@ struct pmd_internals { struct softnic_thread_data thread_data[RTE_MAX_LCORE]; }; +static inline struct rte_eth_dev * +ETHDEV(struct pmd_internals *softnic) +{ + uint16_t port_id; + int status; + + if (softnic == NULL) + return NULL; + + status = rte_eth_dev_get_port_by_name(softnic->params.name, &port_id); + if (status) + return NULL; + + return &rte_eth_devices[port_id]; +} + +/** + * Ethdev Flow API + */ +int +flow_attr_map_set(struct pmd_internals *softnic, + uint32_t group_id, + int ingress, + const char *pipeline_name, + uint32_t table_id); + +struct flow_attr_map * +flow_attr_map_get(struct pmd_internals *softnic, + uint32_t group_id, + int ingress); + +extern const struct rte_flow_ops pmd_flow_ops; + +/** + * Meter + */ +int +softnic_mtr_init(struct pmd_internals *p); + +void +softnic_mtr_free(struct pmd_internals *p); + +struct softnic_mtr * +softnic_mtr_find(struct pmd_internals *p, + uint32_t mtr_id); + +struct softnic_mtr_meter_profile * +softnic_mtr_meter_profile_find(struct pmd_internals *p, + uint32_t meter_profile_id); + +struct softnic_mtr_meter_policy * +softnic_mtr_meter_policy_find(struct pmd_internals *p, + uint32_t meter_policy_id); + +extern const struct rte_mtr_ops pmd_mtr_ops; + /** * MEMPOOL */ @@ -530,6 +723,9 @@ softnic_swq_init(struct pmd_internals *p); void softnic_swq_free(struct pmd_internals *p); +void +softnic_softnic_swq_free_keep_rxq_txq(struct pmd_internals *p); + struct softnic_swq * softnic_swq_find(struct pmd_internals *p, const char *name); @@ -572,20 +768,13 @@ softnic_tmgr_port_find(struct pmd_internals *p, struct softnic_tmgr_port * softnic_tmgr_port_create(struct pmd_internals *p, - const char *name, - struct rte_sched_port *sched); - -int -tm_init(struct pmd_internals *p); + const char *name); void -tm_free(struct pmd_internals *p); - -int -tm_start(struct pmd_internals *p); +tm_hierarchy_init(struct pmd_internals *p); void -tm_stop(struct pmd_internals *p); +tm_hierarchy_free(struct pmd_internals *p); static inline int tm_used(struct rte_eth_dev *dev) @@ -614,6 +803,24 @@ struct softnic_tap * softnic_tap_create(struct pmd_internals *p, const char *name); +/** + * Sym Crypto + */ +int +softnic_cryptodev_init(struct pmd_internals *p); + +void +softnic_cryptodev_free(struct pmd_internals *p); + +struct softnic_cryptodev * +softnic_cryptodev_find(struct pmd_internals *p, + const char *name); + +struct softnic_cryptodev * +softnic_cryptodev_create(struct pmd_internals *p, + const char *name, + struct softnic_cryptodev_params *params); + /** * Input port action */ @@ -659,6 +866,12 @@ softnic_pipeline_init(struct pmd_internals *p); void softnic_pipeline_free(struct pmd_internals *p); +void +softnic_pipeline_disable_all(struct pmd_internals *p); + +uint32_t +softnic_pipeline_thread_count(struct pmd_internals *p, uint32_t thread_id); + struct pipeline * softnic_pipeline_find(struct pmd_internals *p, const char *name); @@ -684,11 +897,21 @@ softnic_pipeline_port_out_create(struct pmd_internals *p, const char *pipeline_name, struct softnic_port_out_params *params); +int +softnic_pipeline_port_out_find(struct pmd_internals *softnic, + const char *pipeline_name, + const char *name, + uint32_t *port_id); + int softnic_pipeline_table_create(struct pmd_internals *p, const char *pipeline_name, struct softnic_table_params *params); +struct softnic_table_meter_profile * +softnic_pipeline_table_meter_profile_find(struct softnic_table *table, + uint32_t meter_profile_id); + struct softnic_table_rule_match_acl { int ip_version; @@ -720,10 +943,6 @@ struct softnic_table_rule_match_array { uint32_t pos; }; -#ifndef TABLE_RULE_MATCH_SIZE_MAX -#define TABLE_RULE_MATCH_SIZE_MAX 256 -#endif - struct softnic_table_rule_match_hash { uint8_t key[TABLE_RULE_MATCH_SIZE_MAX]; }; @@ -751,6 +970,9 @@ struct softnic_table_rule_match { } match; }; +#ifndef SYM_CRYPTO_MAX_KEY_SIZE +#define SYM_CRYPTO_MAX_KEY_SIZE (256) +#endif struct softnic_table_rule_action { uint64_t action_mask; struct rte_table_action_fwd_params fwd; @@ -762,8 +984,28 @@ struct softnic_table_rule_action { struct rte_table_action_ttl_params ttl; struct rte_table_action_stats_params stats; struct rte_table_action_time_params time; + struct rte_table_action_tag_params tag; + struct rte_table_action_decap_params decap; + struct rte_table_action_sym_crypto_params sym_crypto; + uint8_t sym_crypto_key[SYM_CRYPTO_MAX_KEY_SIZE]; +}; + +struct rte_flow { + TAILQ_ENTRY(rte_flow) node; + struct softnic_table_rule_match match; + struct softnic_table_rule_action action; + void *data; + struct pipeline *pipeline; + uint32_t table_id; }; +int +softnic_pipeline_port_in_stats_read(struct pmd_internals *p, + const char *pipeline_name, + uint32_t port_id, + struct rte_pipeline_port_in_stats *stats, + int clear); + int softnic_pipeline_port_in_enable(struct pmd_internals *p, const char *pipeline_name, @@ -774,6 +1016,100 @@ softnic_pipeline_port_in_disable(struct pmd_internals *p, const char *pipeline_name, uint32_t port_id); +int +softnic_pipeline_port_out_stats_read(struct pmd_internals *p, + const char *pipeline_name, + uint32_t port_id, + struct rte_pipeline_port_out_stats *stats, + int clear); + +int +softnic_pipeline_table_stats_read(struct pmd_internals *p, + const char *pipeline_name, + uint32_t table_id, + struct rte_pipeline_table_stats *stats, + int clear); + +int +softnic_pipeline_table_rule_add(struct pmd_internals *p, + const char *pipeline_name, + uint32_t table_id, + struct softnic_table_rule_match *match, + struct softnic_table_rule_action *action, + void **data); + +int +softnic_pipeline_table_rule_add_bulk(struct pmd_internals *p, + const char *pipeline_name, + uint32_t table_id, + struct softnic_table_rule_match *match, + struct softnic_table_rule_action *action, + void **data, + uint32_t *n_rules); + +int +softnic_pipeline_table_rule_add_default(struct pmd_internals *p, + const char *pipeline_name, + uint32_t table_id, + struct softnic_table_rule_action *action, + void **data); + +int +softnic_pipeline_table_rule_delete(struct pmd_internals *p, + const char *pipeline_name, + uint32_t table_id, + struct softnic_table_rule_match *match); + +int +softnic_pipeline_table_rule_delete_default(struct pmd_internals *p, + const char *pipeline_name, + uint32_t table_id); + +int +softnic_pipeline_table_rule_stats_read(struct pmd_internals *p, + const char *pipeline_name, + uint32_t table_id, + void *data, + struct rte_table_action_stats_counters *stats, + int clear); + +int +softnic_pipeline_table_mtr_profile_add(struct pmd_internals *p, + const char *pipeline_name, + uint32_t table_id, + uint32_t meter_profile_id, + struct rte_table_action_meter_profile *profile); + +int +softnic_pipeline_table_mtr_profile_delete(struct pmd_internals *p, + const char *pipeline_name, + uint32_t table_id, + uint32_t meter_profile_id); + +int +softnic_pipeline_table_rule_mtr_read(struct pmd_internals *p, + const char *pipeline_name, + uint32_t table_id, + void *data, + uint32_t tc_mask, + struct rte_table_action_mtr_counters *stats, + int clear); + +int +softnic_pipeline_table_dscp_table_update(struct pmd_internals *p, + const char *pipeline_name, + uint32_t table_id, + uint64_t dscp_mask, + struct rte_table_action_dscp_table *dscp_table); + +int +softnic_pipeline_table_rule_ttl_read(struct pmd_internals *p, + const char *pipeline_name, + uint32_t table_id, + void *data, + struct rte_table_action_ttl_counters *stats, + int clear); + /** * Thread */ @@ -783,6 +1119,16 @@ softnic_thread_init(struct pmd_internals *p); void softnic_thread_free(struct pmd_internals *p); +int +softnic_thread_pipeline_enable(struct pmd_internals *p, + uint32_t thread_id, + const char *pipeline_name); + +int +softnic_thread_pipeline_disable(struct pmd_internals *p, + uint32_t thread_id, + const char *pipeline_name); + /** * CLI */