.\" Automatically generated by Pandoc 3.1.3 .\" .\" Define V font for inline verbatim, using C font in formats .\" that render this, and otherwise B font. .ie "\f[CB]x\f[]"x" \{\ . ftr V B . ftr VI BI . ftr VB B . ftr VBI BI .\} .el \{\ . ftr V CR . ftr VI CI . ftr VB CB . ftr VBI CBI .\} .TH "MLX5DV_DR API" "3" "2019-03-28" "mlx5" "mlx5 Programmer\[cq]s Manual" .hy .SH NAME .PP mlx5dv_dr_domain_create, mlx5dv_dr_domain_sync, mlx5dv_dr_domain_destroy, mlx5dv_dr_domain_set_reclaim_device_memory, mlx5dv_dr_domain_allow_duplicate_rules - Manage flow domains .PP mlx5dv_dr_table_create, mlx5dv_dr_table_destroy - Manage flow tables .PP mlx5dv_dr_matcher_create, mlx5dv_dr_matcher_destroy, mlx5dv_dr_matcher_set_layout - Manage flow matchers .PP mlx5dv_dr_rule_create, mlx5dv_dr_rule_destroy - Manage flow rules .PP mlx5dv_dr_action_create_drop - Create drop action .PP mlx5dv_dr_action_create_default_miss - Create default miss action .PP mlx5dv_dr_action_create_tag - Create tag actions .PP mlx5dv_dr_action_create_dest_ibv_qp - Create packet destination QP action .PP mlx5dv_dr_action_create_dest_table - Create packet destination dr table action .PP mlx5dv_dr_action_create_dest_root_table - Create packet destination root table action .PP mlx5dv_dr_action_create_dest_vport - Create packet destination vport action .PP mlx5dv_dr_action_create_dest_ib_port - Create packet destination IB port action .PP mlx5dv_dr_action_create_dest_devx_tir - Create packet destination TIR action .PP mlx5dv_dr_action_create_dest_array - Create destination array action .PP mlx5dv_dr_action_create_packet_reformat - Create packet reformat actions .PP mlx5dv_dr_action_create_modify_header - Create modify header actions .PP mlx5dv_dr_action_create_flow_counter - Create devx flow counter actions .PP mlx5dv_dr_action_create_aso, mlx5dv_dr_action_modify_aso - Create and modify ASO actions .PP mlx5dv_dr_action_create_flow_meter, mlx5dv_dr_action_modify_flow_meter - Create and modify meter action .PP mlx5dv_dr_action_create_flow_sampler - Create flow sampler action .PP mlx5dv_dr_action_create_pop_vlan - Create pop vlan action .PP mlx5dv_dr_action_create_push_vlan- Create push vlan action .PP mlx5dv_dr_action_destroy - Destroy actions .PP mlx5dv_dr_aso_other_domain_link, mlx5dv_dr_aso_other_domain_unlink - link/unlink ASO devx object to work with different domains .SH SYNOPSIS .IP .nf \f[C] #include struct mlx5dv_dr_domain *mlx5dv_dr_domain_create( struct ibv_context *ctx, enum mlx5dv_dr_domain_type type); int mlx5dv_dr_domain_sync( struct mlx5dv_dr_domain *domain, uint32_t flags); int mlx5dv_dr_domain_destroy(struct mlx5dv_dr_domain *domain); void mlx5dv_dr_domain_set_reclaim_device_memory( struct mlx5dv_dr_domain *dmn, bool enable); void mlx5dv_dr_domain_allow_duplicate_rules(struct mlx5dv_dr_domain *dmn, bool allow); struct mlx5dv_dr_table *mlx5dv_dr_table_create( struct mlx5dv_dr_domain *domain, uint32_t level); int mlx5dv_dr_table_destroy(struct mlx5dv_dr_table *table); struct mlx5dv_dr_matcher *mlx5dv_dr_matcher_create( struct mlx5dv_dr_table *table, uint16_t priority, uint8_t match_criteria_enable, struct mlx5dv_flow_match_parameters *mask); int mlx5dv_dr_matcher_destroy(struct mlx5dv_dr_matcher *matcher); int mlx5dv_dr_matcher_set_layout(struct mlx5dv_dr_matcher *matcher, struct mlx5dv_dr_matcher_layout *matcher_layout); struct mlx5dv_dr_rule *mlx5dv_dr_rule_create( struct mlx5dv_dr_matcher *matcher, struct mlx5dv_flow_match_parameters *value, size_t num_actions, struct mlx5dv_dr_action *actions[]); void mlx5dv_dr_rule_destroy(struct mlx5dv_dr_rule *rule); struct mlx5dv_dr_action *mlx5dv_dr_action_create_drop(void); struct mlx5dv_dr_action *mlx5dv_dr_action_create_default_miss(void); struct mlx5dv_dr_action *mlx5dv_dr_action_create_tag( uint32_t tag_value); struct mlx5dv_dr_action *mlx5dv_dr_action_create_dest_ibv_qp( struct ibv_qp *ibqp); struct mlx5dv_dr_action *mlx5dv_dr_action_create_dest_table( struct mlx5dv_dr_table *table); struct mlx5dv_dr_action *mlx5dv_dr_action_create_dest_root_table( struct mlx5dv_dr_table *table, uint16_t priority); struct mlx5dv_dr_action *mlx5dv_dr_action_create_dest_vport( struct mlx5dv_dr_domain *domain, uint32_t vport); struct mlx5dv_dr_action *mlx5dv_dr_action_create_dest_ib_port( struct mlx5dv_dr_domain *domain, uint32_t ib_port); struct mlx5dv_dr_action *mlx5dv_dr_action_create_dest_devx_tir( struct mlx5dv_devx_obj *devx_obj); struct mlx5dv_dr_action *mlx5dv_dr_action_create_packet_reformat( struct mlx5dv_dr_domain *domain, uint32_t flags, enum mlx5dv_flow_action_packet_reformat_type reformat_type, size_t data_sz, void *data); struct mlx5dv_dr_action *mlx5dv_dr_action_create_modify_header( struct mlx5dv_dr_domain *domain, uint32_t flags, size_t actions_sz, __be64 actions[]); struct mlx5dv_dr_action *mlx5dv_dr_action_create_flow_counter( struct mlx5dv_devx_obj *devx_obj, uint32_t offset); struct mlx5dv_dr_action * mlx5dv_dr_action_create_aso(struct mlx5dv_dr_domain *domain, struct mlx5dv_devx_obj *devx_obj, uint32_t offset, uint32_t flags, uint8_t return_reg_c); int mlx5dv_dr_action_modify_aso(struct mlx5dv_dr_action *action, uint32_t offset, uint32_t flags, uint8_t return_reg_c); struct mlx5dv_dr_action * mlx5dv_dr_action_create_flow_meter(struct mlx5dv_dr_flow_meter_attr *attr); int mlx5dv_dr_action_modify_flow_meter(struct mlx5dv_dr_action *action, struct mlx5dv_dr_flow_meter_attr *attr, __be64 modify_field_select); struct mlx5dv_dr_action * mlx5dv_dr_action_create_flow_sampler(struct mlx5dv_dr_flow_sampler_attr *attr); struct mlx5dv_dr_action * mlx5dv_dr_action_create_dest_array(struct mlx5dv_dr_domain *domain, size_t num_dest, struct mlx5dv_dr_action_dest_attr *dests[]); struct mlx5dv_dr_action *mlx5dv_dr_action_create_pop_vlan(void); struct mlx5dv_dr_action *mlx5dv_dr_action_create_push_vlan( struct mlx5dv_dr_domain *dmn, __be32 vlan_hdr) int mlx5dv_dr_action_destroy(struct mlx5dv_dr_action *action); int mlx5dv_dr_aso_other_domain_link(struct mlx5dv_devx_obj *devx_obj, struct mlx5dv_dr_domain *peer_dmn, struct mlx5dv_dr_domain *dmn, uint32_t flags, uint8_t return_reg_c); int mlx5dv_dr_aso_other_domain_unlink(struct mlx5dv_devx_obj *devx_obj, struct mlx5dv_dr_domain *dmn); \f[R] .fi .SH DESCRIPTION .PP The Direct Rule API (mlx5dv_dr_*) allows complete access by verbs application to the device\[ga]s packet steering functionality. .PP Steering flow rules are the combination of attributes with a match pattern and a list of actions. Rules can have several distinct actions (such as counting, encapsulating, decapsulating before redirecting packets to a particular queue or port, etc.). In order to manage the rule execution order for the packet processing matching by HW, multiple flow tables in an ordered chain and multiple flow matchers sorted by priorities are defined. .SS Domain .PP \f[I]mlx5dv_dr_domain_create()\f[R] creates a DR domain object to be used with \f[I]mlx5dv_dr_table_create()\f[R] and \f[I]mlx5dv_dr_action_create_*()\f[R]. .PP A domain should be destroyed by calling \f[I]mlx5dv_dr_domain_destroy()\f[R] once all depended resources are released. .PP The device support the following domains types: .PP \f[B]MLX5DV_DR_DOMAIN_TYPE_NIC_RX\f[R] Manage ethernet packets received on the NIC. Packets in this domain can be dropped, dispatched to QP\[ga]s, modified or redirected to additional tables inside the domain. Default behavior: Drop packet. .PP \f[B]MLX5DV_DR_DOMAIN_TYPE_NIC_TX\f[R] Manage ethernet packets transmit on the NIC. Packets in this domain can be dropped, modified or redirected to additional tables inside the domain. Default behavior: Forward packet to NIC vport (to eSwitch or wire). .PP \f[B]MLX5DV_DR_DOMAIN_TYPE_FDB\f[R] Manage ethernet packets in the eSwitch Forwarding Data Base for packets received from wire or from any other vport. Packets in this domain can be dropped, dispatched to vport, modified or redirected to additional tables inside the domain. Default behavior: Forward packet to eSwitch manager vport. .PP \f[I]mlx5dv_dr_domain_sync()\f[R] is used in order to flush the rule submission queue. By default, rules in a domain are updated in HW asynchronously. \f[B]flags\f[R] should be a set of type \f[I]enum mlx5dv_dr_domain_sync_flags\f[R]: .PP \f[B]MLX5DV_DR_DOMAIN_SYNC_FLAGS_SW\f[R]: block until completion of all software queued tasks. .PP \f[B]MLX5DV_DR_DOMAIN_SYNC_FLAGS_HW\f[R]: clear the steering HW cache to enforce next packet hits the latest rules, in addition to the SW SYNC handling. .PP \f[B]MLX5DV_DR_DOMAIN_SYNC_FLAGS_MEM\f[R]: sync device memory to free cached memory. .PP \f[I]mlx5dv_dr_domain_set_reclaim_device_memory()\f[R] is used to enable the reclaiming of device memory back to the system when not in use, by default this feature is disabled. .PP \f[I]mlx5dv_dr_domain_allow_duplicate_rules()\f[R] is used to allow or prevent insertion of rules matching on same fields(duplicates) on non root tables, by default this feature is allowed. .SS Table .PP \f[I]mlx5dv_dr_table_create()\f[R] creates a DR table in the \f[B]domain\f[R], at the appropriate \f[B]level\f[R], and can be used with \f[I]mlx5dv_dr_matcher_create()\f[R], \f[I]mlx5dv_dr_action_create_dest_table()\f[R] and \f[I]mlx5dv_dr_action_create_dest_root_table\f[R]. All packets start traversing the steering domain tree at table \f[B]level\f[R] zero (0). Using rule and action, packets can by redirected to other tables in the domain. .PP A table should be destroyed by calling \f[I]mlx5dv_dr_table_destroy()\f[R] once all depended resources are released. .SS Matcher .PP \f[I]mlx5dv_dr_matcher_create()\f[R] create a matcher object in \f[B]table\f[R], at sorted \f[B]priority\f[R] (lower value is check first). A matcher can hold multiple rules, all with identical \f[B]mask\f[R] of type \f[I]struct mlx5dv_flow_match_parameters\f[R] which represents the exact attributes to be compared by HW steering. The \f[B]match_criteria_enable\f[R] and \f[B]mask\f[R] are defined in a device spec format. Only the fields that where masked in the \f[I]matcher\f[R] should be filled by the rule in \f[I]mlx5dv_dr_rule_create()\f[R]. .PP A matcher should be destroyed by calling \f[I]mlx5dv_dr_matcher_destroy()\f[R] once all depended resources are released. .PP \f[I]mlx5dv_dr_matcher_set_layout()\f[R] is used to set specific layout parameters of a matcher, on some conditions setting some attributes might not be supported, in such cases ENOTSUP will be returned. \f[B]flags\f[R] should be a set of type \f[I]enum mlx5dv_dr_matcher_layout_flags\f[R]: .PP \f[B]MLX5DV_DR_MATCHER_LAYOUT_RESIZABLE\f[R]: The matcher can resize its scale and resources according to the rules that are inserted or removed. .PP \f[B]MLX5DV_DR_MATCHER_LAYOUT_NUM_RULE\f[R]: Indicates a hint from the application about the number of the rules the matcher is expected to handle. This allows preallocation of matcher resources for faster rule updates when using with non-resizable layout mode. .SS Actions .PP A set of action create API are defined by \f[I]mlx5dv_dr_action_create_*()\f[R]. All action are created as \f[I]struct mlx5dv_dr_action\f[R]. An action should be destroyed by calling \f[I]mlx5dv_dr_action_destroy()\f[R] once all depended rules are destroyed. .PP When an action handle is reused for multiple rules, the same action will be executed. e.g.: action `count' will count multiple flows rules on the same HW flow counter context. action `drop' will drop packets of different rule from any matcher. .PP Action: Drop \f[I]mlx5dv_dr_action_create_drop\f[R] create a terminating action which drops packets. Can not be mixed with Destination actions. .PP Action: Default miss \f[I]mlx5dv_dr_action_create_default_miss\f[R] create a terminating action which will execute the default behavior based on the domain type. .PP Action: Tag \f[I]mlx5dv_dr_action_create_tag\f[R] creates a non-terminating action which tags packets with \f[B]tag_value\f[R]. The \f[B]tag_value\f[R] is available in the CQE of the packet received. Valid only on domain type NIC_RX. .PP Action: Destination \f[I]mlx5dv_dr_action_create_dest_ibv_qp\f[R] creates a terminating action delivering the packet to a QP, defined by \f[B]ibqp\f[R]. Valid only on domain type NIC_RX. \f[I]mlx5dv_dr_action_create_dest_table\f[R] creates a forwarding action to another flow table, defined by \f[B]table\f[R]. The destination \f[B]table\f[R] must be from the same domain with a level higher than zero. \f[I]mlx5dv_dr_action_create_dest_root_table\f[R] creates a forwarding action to another priority inside a root flow table, defined by \f[B]table\f[R] and \f[B]priority\f[R]. \f[I]mlx5dv_dr_action_create_dest_vport\f[R] creates a forwarding action to a \f[B]vport\f[R] on the same \f[B]domain\f[R]. Valid only on domain type FDB. \f[I]mlx5dv_dr_action_create_dest_ib_port\f[R] creates a forwarding action to a \f[B]ib_port\f[R] on the same \f[B]domain\f[R]. The valid range of ports is a based on the capability phys_port_cnt_ex provided by ibq_query_device_ex and it is possible to query the ports details using mlx5dv_query_port. Action is supported only on domain type FDB. \f[I]mlx5dv_dr_action_create_dest_devx_tir\f[R] creates a terminating action delivering the packet to a TIR, defined by \f[B]devx_obj\f[R]. Valid only on domain type NIC_RX. .PP Action: Array \f[I]mlx5dv_dr_action_create_dest_array\f[R] creates an action which replicates a packet to multiple destinations. \f[B]num_dest\f[R] defines the number of replication destinations. Each \f[B]dests\f[R] destination array entry can be of different \f[B]type\f[R]. Use type MLX5DV_DR_ACTION_DEST for direct forwarding to an action destination. Use type MLX5DV_DR_ACTION_DEST_REFORMAT when reformat action should be performed on the packet before it is forwarding to the destination action. .PP Action: Packet Reformat \f[I]mlx5dv_dr_action_create_packet_reformat\f[R] create a packet reformat context and action in the \f[B]domain\f[R]. The \f[B]reformat_type\f[R], \f[B]data_sz\f[R] and \f[B]data\f[R] are defined in \f[I]man mlx5dv_create_flow_action_packet_reformat\f[R]. .PP Action: Modify Header \f[I]mlx5dv_dr_action_create_modify_header\f[R] create a modify header context and action in the \f[B]domain\f[R]. The \f[B]actions_sz\f[R] and \f[B]actions\f[R] are defined in \f[I]man mlx5dv_create_flow_action_modify_header\f[R]. .PP Action: Flow Count \f[I]mlx5dv_dr_action_create_flow_counter\f[R] creates a flow counter action from a DEVX flow counter object, based on \f[B]devx_obj\f[R] and specific counter index from \f[B]offset\f[R] in the counter bulk. .PP Action: ASO \f[I]mlx5dv_dr_action_create_aso\f[R] receives a \f[B]domain\f[R] pointer and creates an ASO action from the DEVX ASO object, based on \f[B]devx_obj\f[R]. Use \f[B]offset\f[R] to select the specific ASO object in the \f[B]devx_obj\f[R] bulk. DR rules using this action can optionally update the ASO object value according to \f[B]flags\f[R] to choose the specific wanted behavior of this object. After a packet hits the rule with the ASO object the value of the ASO object will be copied into the chosen \f[B]return_reg_c\f[R] which can be used for match in following DR rules. .PP \f[I]mlx5dv_dr_action_modify_aso\f[R] modifies ASO action \f[B]action\f[R] with new values for \f[B]offset\f[R], \f[B]return_reg_c\f[R] and \f[B]flags\f[R]. Only new DR rules using this \f[B]action\f[R] will use the modified values. Existing DR rules do not change the HW action values stored. .PP \f[B]flags\f[R] can be set to one of the types of \f[I]mlx5dv_dr_action_aso_first_hit_flags\f[R] or \f[I]mlx5dv_dr_action_aso_flow_meter_flags\f[R] or \f[I]mlx5dv_dr_action_aso_ct_flags\f[R]: \f[B]MLX5DV_DR_ACTION_ASO_FIRST_HIT_FLAGS_SET\f[R]: is used to set the ASO first hit object context, else the context is only copied to the return_reg_c. \f[B]MLX5DV_DR_ACTION_FLAGS_ASO_FLOW_METER_RED\f[R]: is used to indicate to update the initial color in ASO flow meter object value to red. \f[B]MLX5DV_DR_ACTION_FLAGS_ASO_FLOW_METER_YELLOW\f[R]: is used to indicate to update the initial color in ASO flow meter object value to yellow. \f[B]MLX5DV_DR_ACTION_FLAGS_ASO_FLOW_METER_GREEN\f[R]: is used to indicate to update the initial color in ASO flow meter object value to green. \f[B]MLX5DV_DR_ACTION_FLAGS_ASO_FLOW_METER_UNDEFINED\f[R]: is used to indicate to update the initial color in ASO flow meter object value to undefined. \f[B]MLX5DV_DR_ACTION_FLAGS_ASO_CT_DIRECTION_INITIATOR\f[R]: is used to indicate the TCP connection direction the SYN packet was sent on. \f[B]MLX5DV_DR_ACTION_FLAGS_ASO_CT_DIRECTION_RESPONDER\f[R]: is used to indicate the TCP connection direction the SYN-ACK packet was sent on. .PP Action: Meter \f[I]mlx5dv_dr_action_create_flow_meter\f[R] creates a meter action based on the flow meter parameters. The paramertes are according to the device specification. \f[I]mlx5dv_dr_action_modify_flow_meter\f[R] modifies existing flow meter \f[B]action\f[R] based on \f[B]modify_field_select\f[R]. \f[B]modify_field_select\f[R] is according to the device specification. .PP Action: Sampler \f[I]mlx5dv_dr_action_create_flow_sampler\f[R] creates a sampler action, allowing us to duplicate and sample a portion of traffic. Packets steered to the sampler action will be sampled with an approximate probability of 1/sample_ratio provided in \f[B]attr\f[R], and sample_actions provided in \f[B]attr\f[R] will be executed over them. All original packets will be steered to default_next_table in \f[B]attr\f[R]. A modify header format SET_ACTION data can be provided in action of \f[B]attr\f[R], which can be executed on packets before going to default flow table. On some devices, this is required to set register value. .PP Action Flags: action \f[B]flags\f[R] can be set to one of the types of \f[I]enum mlx5dv_dr_action_flags\f[R]: .PP Action: Pop Vlan \f[I]mlx5dv_dr_action_create_pop_vlan\f[R] creates a pop vlan action which removes VLAN tags from packets layer 2. .PP Action: Push Vlan \f[I]mlx5dv_dr_action_create_push_vlan\f[R] creates a push vlan action which adds VLAN tags to packets layer 2. .PP \f[B]MLX5DV_DR_ACTION_FLAGS_ROOT_LEVEL\f[R]: is used to indicate the action is targeted for flow table in level=0 (ROOT) of the specific domain. .SS Rule .PP \f[I]mlx5dv_dr_rule_create()\f[R] creates a HW steering rule entry in \f[B]matcher\f[R]. The \f[B]value\f[R] of type \f[I]struct mlx5dv_flow_match_parameters\f[R] holds the exact attribute values of the steering rule to be matched, in a device spec format. Only the fields that where masked in the \f[I]matcher\f[R] should be filled. HW will perform the set of \f[B]num_actions\f[R] from the \f[B]action\f[R] array of type \f[I]struct mlx5dv_dr_action\f[R], once a packet matches the exact \f[B]value\f[R] of the rule (referred to as a `hit'). .PP \f[I]mlx5dv_dr_rule_destroy()\f[R] destroys the rule. .SS Other .PP \f[I]mlx5dv_dr_aso_other_domain_link()\f[R] links the ASO devx object, \f[B]devx_obj\f[R] to a domain \f[B]dmn\f[R], this will allow creating a rule with ASO action using the given object on the linked domain \f[B]dmn\f[R]. \f[B]peer_dmn\f[R] is the domain that the ASO devx object was created on. \f[B]dmn\f[R] is the domain that ASO devx object will be linked to. \f[B]flags\f[R] choose the specific wanted behavior of this object according to the flags, same as for ASO action creation flags. \f[B]regc_index\f[R] After a packet hits the rule with the ASO object the value of the ASO object will be copied into the regc register indicated by this param, and then we can use the value for matching in the following DR rules. .PP \f[I]mlx5dv_dr_aso_other_domain_unlink()\f[R] will unlink the \f[B]devx_obj\f[R] from the linked \f[B]dmn\f[R]. \f[B]dmn\f[R] is the domain that ASO devx object is linked to. .SH RETURN VALUE .PP The create API calls will return a pointer to the relevant object: table, matcher, action, rule. on failure, NULL will be returned and errno will be set. .PP The destroy API calls will returns 0 on success, or the value of errno on failure (which indicates the failure reason). .SH LIMITATIONS .PP Application can verify is a feature is supported by \f[I]trail and error\f[R]. No capabilities are exposed, as the combination of all the options exposed are way to large to define. .PP Tables are size less by definition. They are expected to grow and shrink to accommodate for all rules, according to driver capabilities. Once reaching a limit, an error is returned. .PP Matchers in same priority, in the same table, will have undefined ordered. .PP A rule with identical value pattern to another rule on a given matcher are rejected. .PP IP version in matcher mask and rule should be equal and set to 4, 6 or 0. # SEE ALSO .PP \f[B]mlx5dv_open_device(3)\f[R], \f[B]mlx5dv_create_flow_action_packet_reformat(3)\f[R], \f[B]mlx5dv_create_flow_action_modify_header(3)\f[R]. .SH AUTHOR .PP Alex Rosenbaum Alex Vesker