Add 13 trace points of control message related with flow rule action list. Signed-off-by: Chaoyong He <chaoyong...@corigine.com> Reviewed-by: Long Wu <long...@corigine.com> Reviewed-by: Peng Zhang <peng.zh...@corigine.com> --- drivers/net/nfp/flower/nfp_flower_cmsg.c | 78 ++++++ drivers/net/nfp/nfp_trace.c | 39 +++ drivers/net/nfp/nfp_trace.h | 298 +++++++++++++++++++++++ 3 files changed, 415 insertions(+)
diff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.c b/drivers/net/nfp/flower/nfp_flower_cmsg.c index 3b492c94ce..bd1fa71d9b 100644 --- a/drivers/net/nfp/flower/nfp_flower_cmsg.c +++ b/drivers/net/nfp/flower/nfp_flower_cmsg.c @@ -339,14 +339,92 @@ nfp_flower_trace_cmsg_flow_pattern(char *cmsg, PMD_DRV_LOG(ERR, "Cmsg flow pattern overlap"); } +static void +nfp_flower_trace_cmsg_flow_action(char *cmsg, + uint8_t len) +{ + uint8_t len_tmp; + + if (len == 0) { + PMD_DRV_LOG(ERR, "Cmsg flow action length is 0"); + return; + } + + for (len_tmp = 0; len_tmp < len;) { + struct nfp_fl_act_head *head = (struct nfp_fl_act_head *)(cmsg + len_tmp); + + switch (head->jump_id) { + case NFP_FL_ACTION_OPCODE_OUTPUT: + rte_pmd_nfp_trace_cmsg_flow_action_output(head); + break; + case NFP_FL_ACTION_OPCODE_PUSH_VLAN: + rte_pmd_nfp_trace_cmsg_flow_action_push_vlan(head); + break; + case NFP_FL_ACTION_OPCODE_POP_VLAN: + rte_pmd_nfp_trace_cmsg_flow_action_pop_vlan(head); + break; + case NFP_FL_ACTION_OPCODE_SET_TUNNEL: + rte_pmd_nfp_trace_cmsg_flow_action_set_tun(head); + break; + case NFP_FL_ACTION_OPCODE_SET_ETHERNET: + rte_pmd_nfp_trace_cmsg_flow_action_set_eth(head); + break; + case NFP_FL_ACTION_OPCODE_SET_IPV4_ADDRS: + rte_pmd_nfp_trace_cmsg_flow_action_set_ipv4_addr(head); + break; + case NFP_FL_ACTION_OPCODE_SET_IPV4_TTL_TOS: + rte_pmd_nfp_trace_cmsg_flow_action_set_ipv4_ttl_tos(head); + break; + case NFP_FL_ACTION_OPCODE_SET_IPV6_SRC: + /* FALLTHROUGH */ + case NFP_FL_ACTION_OPCODE_SET_IPV6_DST: + rte_pmd_nfp_trace_cmsg_flow_action_set_ipv6_addr(head); + break; + case NFP_FL_ACTION_OPCODE_SET_IPV6_TC_HL_FL: + rte_pmd_nfp_trace_cmsg_flow_action_set_ipv6_tc_hl_fl(head); + break; + case NFP_FL_ACTION_OPCODE_SET_TCP: + /* FALLTHROUGH */ + case NFP_FL_ACTION_OPCODE_SET_UDP: + rte_pmd_nfp_trace_cmsg_flow_action_set_tp(head); + break; + case NFP_FL_ACTION_OPCODE_PRE_TUNNEL: + rte_pmd_nfp_trace_cmsg_flow_action_pre_tun(head); + break; + case NFP_FL_ACTION_OPCODE_METER: + rte_pmd_nfp_trace_cmsg_flow_action_meter(head); + break; + case NFP_FL_ACTION_OPCODE_SET_PARTIAL: + rte_pmd_nfp_trace_cmsg_flow_action_set_partial(head); + break; + default: + PMD_DRV_LOG(ERR, "Cmsg flow action not support"); + return; + } + + len_tmp += head->len_lw << NFP_FL_LW_SIZ; + } + + if (len_tmp > len) { + PMD_DRV_LOG(ERR, "Cmsg flow action length error"); + return; + } +} + static void nfp_flower_trace_cmsg_flow(const char *msg, struct nfp_fl_payload *payload) { + struct nfp_fl_rule_metadata *nfp_flow_meta; + rte_pmd_nfp_trace_cmsg_flow(msg); rte_pmd_nfp_trace_cmsg_flow_meta(payload->meta); nfp_flower_trace_cmsg_flow_pattern(payload->unmasked_data, payload->mask_data); nfp_flower_trace_cmsg_flow_pattern(payload->mask_data, payload->action_data); + + nfp_flow_meta = payload->meta; + nfp_flower_trace_cmsg_flow_action(payload->action_data, + nfp_flow_meta->act_len << NFP_FL_LW_SIZ); } int diff --git a/drivers/net/nfp/nfp_trace.c b/drivers/net/nfp/nfp_trace.c index 61162f7563..9cca76e32c 100644 --- a/drivers/net/nfp/nfp_trace.c +++ b/drivers/net/nfp/nfp_trace.c @@ -73,5 +73,44 @@ RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_ipv6_gre_tun, RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_pattern_ipv6_udp_tun, pmd.net.nfp.cmsg.flow.pattern.ipv6_udp_tun) +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_output, + pmd.net.nfp.cmsg.flow.action.output) + +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_push_vlan, + pmd.net.nfp.cmsg.flow.action.push_vlan) + +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_pop_vlan, + pmd.net.nfp.cmsg.flow.action.pop_vlan) + +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_set_tun, + pmd.net.nfp.cmsg.flow.action.set_tun) + +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_set_eth, + pmd.net.nfp.cmsg.flow.action.set_eth) + +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_set_ipv4_addr, + pmd.net.nfp.cmsg.flow.action.set_ipv4_addr) + +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_set_ipv4_ttl_tos, + pmd.net.nfp.cmsg.flow.action.set_ipv4_ttl_tos) + +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_set_ipv6_addr, + pmd.net.nfp.cmsg.flow.action.set_ipv6_addr) + +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_set_ipv6_tc_hl_fl, + pmd.net.nfp.cmsg.flow.action.set_ipv6_tc_hl_fl) + +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_set_tp, + pmd.net.nfp.cmsg.flow.action.set_tp) + +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_pre_tun, + pmd.net.nfp.cmsg.flow.action.pre_tun) + +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_meter, + pmd.net.nfp.cmsg.flow.action.meter) + +RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow_action_set_partial, + pmd.net.nfp.cmsg.flow.action.set_partial) + RTE_TRACE_POINT_REGISTER(rte_pmd_nfp_trace_cmsg_flow, pmd.net.nfp.cmsg.flow) diff --git a/drivers/net/nfp/nfp_trace.h b/drivers/net/nfp/nfp_trace.h index a5a7cc8faf..576cb37c3a 100644 --- a/drivers/net/nfp/nfp_trace.h +++ b/drivers/net/nfp/nfp_trace.h @@ -435,6 +435,304 @@ RTE_TRACE_POINT( rte_trace_point_emit_u32(tun_id); ) +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_output, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_output *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); + + uint16_t flags = rte_be_to_cpu_16(msg->flags); + uint32_t port = rte_be_to_cpu_32(msg->port); + + rte_trace_point_emit_u16(flags); + rte_trace_point_emit_u32(port); +) + +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_push_vlan, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_push_vlan *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); + + uint16_t vlan_tpid = rte_be_to_cpu_16(msg->vlan_tpid); + uint16_t vlan_tci = rte_be_to_cpu_16(msg->vlan_tci); + + rte_trace_point_emit_u16(vlan_tpid); + rte_trace_point_emit_u16(vlan_tci); +) + +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_pop_vlan, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_pop_vlan *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); +) + +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_set_tun, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_set_tun *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); + + uint64_t tun_id = rte_be_to_cpu_64(msg->tun_id); + uint32_t tun_type_index = rte_be_to_cpu_32(msg->tun_type_index); + uint16_t tun_flags = rte_be_to_cpu_16(msg->tun_flags); + uint8_t ttl = msg->ttl; + uint8_t tos = msg->tos; + uint8_t tun_len = msg->tun_len; + uint16_t tun_proto = rte_be_to_cpu_16(msg->tun_proto); + + rte_trace_point_emit_u64(tun_id); + rte_trace_point_emit_u32(tun_type_index); + rte_trace_point_emit_u16(tun_flags); + rte_trace_point_emit_u8(ttl); + rte_trace_point_emit_u8(tos); + rte_trace_point_emit_u8(tun_len); + rte_trace_point_emit_u16(tun_proto); +) + +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_set_eth, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_set_eth *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); + + uint8_t dst_mask_len = RTE_ETHER_ADDR_LEN; + uint8_t *dst_mask = &msg->eth_addr_mask[0]; + uint8_t src_mask_len = RTE_ETHER_ADDR_LEN; + uint8_t *src_mask = &msg->eth_addr_mask[RTE_ETHER_ADDR_LEN]; + uint8_t dst_addr_len = RTE_ETHER_ADDR_LEN; + uint8_t *dst_addr = &msg->eth_addr[0]; + uint8_t src_addr_len = RTE_ETHER_ADDR_LEN; + uint8_t *src_addr = &msg->eth_addr[RTE_ETHER_ADDR_LEN]; + + rte_trace_point_emit_blob(dst_mask, dst_mask_len); + rte_trace_point_emit_blob(src_mask, src_mask_len); + rte_trace_point_emit_blob(dst_addr, dst_addr_len); + rte_trace_point_emit_blob(src_addr, src_addr_len); +) + +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_set_ipv4_addr, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_set_ip4_addrs *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); + + uint32_t ipv4_src_mask = rte_be_to_cpu_32(msg->ipv4_src_mask); + uint32_t ipv4_src = rte_be_to_cpu_32(msg->ipv4_src); + uint32_t ipv4_dst_mask = rte_be_to_cpu_32(msg->ipv4_dst_mask); + uint32_t ipv4_dst = rte_be_to_cpu_32(msg->ipv4_dst); + + rte_trace_point_emit_u32(ipv4_src_mask); + rte_trace_point_emit_u32(ipv4_src); + rte_trace_point_emit_u32(ipv4_dst_mask); + rte_trace_point_emit_u32(ipv4_dst); +) + +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_set_ipv4_ttl_tos, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_set_ip4_ttl_tos *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); + + uint8_t ipv4_ttl_mask = msg->ipv4_ttl_mask; + uint8_t ipv4_tos_mask = msg->ipv4_tos_mask; + uint8_t ipv4_ttl = msg->ipv4_ttl; + uint8_t ipv4_tos = msg->ipv4_tos; + + rte_trace_point_emit_u8(ipv4_ttl_mask); + rte_trace_point_emit_u8(ipv4_tos_mask); + rte_trace_point_emit_u8(ipv4_ttl); + rte_trace_point_emit_u8(ipv4_tos); +) + +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_set_ipv6_addr, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_set_ipv6_addr *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); + + uint32_t ipv6_0_mask = rte_be_to_cpu_32(msg->ipv6[0].mask); + uint32_t ipv6_0_exact = rte_be_to_cpu_32(msg->ipv6[0].exact); + uint32_t ipv6_1_mask = rte_be_to_cpu_32(msg->ipv6[1].mask); + uint32_t ipv6_1_exact = rte_be_to_cpu_32(msg->ipv6[1].exact); + uint32_t ipv6_2_mask = rte_be_to_cpu_32(msg->ipv6[2].mask); + uint32_t ipv6_2_exact = rte_be_to_cpu_32(msg->ipv6[2].exact); + uint32_t ipv6_3_mask = rte_be_to_cpu_32(msg->ipv6[3].mask); + uint32_t ipv6_3_exact = rte_be_to_cpu_32(msg->ipv6[3].exact); + + rte_trace_point_emit_u32(ipv6_0_mask); + rte_trace_point_emit_u32(ipv6_0_exact); + rte_trace_point_emit_u32(ipv6_1_mask); + rte_trace_point_emit_u32(ipv6_1_exact); + rte_trace_point_emit_u32(ipv6_2_mask); + rte_trace_point_emit_u32(ipv6_2_exact); + rte_trace_point_emit_u32(ipv6_3_mask); + rte_trace_point_emit_u32(ipv6_3_exact); +) + +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_set_ipv6_tc_hl_fl, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_set_ipv6_tc_hl_fl *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); + + uint8_t ipv6_tc_mask = msg->ipv6_tc_mask; + uint8_t ipv6_hop_limit_mask = msg->ipv6_hop_limit_mask; + uint8_t ipv6_tc = msg->ipv6_tc; + uint8_t ipv6_hop_limit = msg->ipv6_hop_limit; + + rte_trace_point_emit_u8(ipv6_tc_mask); + rte_trace_point_emit_u8(ipv6_hop_limit_mask); + rte_trace_point_emit_u8(ipv6_tc); + rte_trace_point_emit_u8(ipv6_hop_limit); +) + +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_set_tp, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_set_tport *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); + + uint16_t src_port_mask = rte_be_to_cpu_16(msg->src_port_mask); + uint16_t dst_port_mask = rte_be_to_cpu_16(msg->dst_port_mask); + uint16_t src_port = rte_be_to_cpu_16(msg->src_port); + uint16_t dst_port = rte_be_to_cpu_16(msg->dst_port); + + rte_trace_point_emit_u16(src_port_mask); + rte_trace_point_emit_u16(dst_port_mask); + rte_trace_point_emit_u16(src_port); + rte_trace_point_emit_u16(dst_port); +) + +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_pre_tun, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_pre_tun *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); + + uint16_t flags = rte_be_to_cpu_16(msg->flags); + uint32_t ipv4_dst = rte_be_to_cpu_32(msg->ipv4_dst); + uint8_t ipv6_dst_len = 16; + uint8_t *ipv6_dst = msg->ipv6_dst; + + rte_trace_point_emit_u16(flags); + if ((flags & NFP_FL_PRE_TUN_IPV6) != 0) + rte_trace_point_emit_blob(ipv6_dst, ipv6_dst_len); + else + rte_trace_point_emit_u32(ipv4_dst); +) + +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_meter, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_meter *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); + + uint32_t profile_id = rte_be_to_cpu_32(msg->profile_id); + + rte_trace_point_emit_u32(profile_id); +) + +RTE_TRACE_POINT( + rte_pmd_nfp_trace_cmsg_flow_action_set_partial, + RTE_TRACE_POINT_ARGS(void *cmsg), + + struct nfp_fl_act_mark *msg = cmsg; + + uint8_t jump_id = msg->head.jump_id; + uint8_t len_lw = msg->head.len_lw; + + rte_trace_point_emit_u8(jump_id); + rte_trace_point_emit_u8(len_lw); + + uint32_t mark = rte_be_to_cpu_32(msg->mark); + + rte_trace_point_emit_u32(mark); + + if (len_lw > sizeof(struct nfp_fl_act_mark) >> NFP_FL_LW_SIZ) { + struct nfp_fl_act_partial *partial = cmsg; + + uint8_t flag = partial->flag; + uint16_t queue_id = rte_be_to_cpu_16(partial->queue_id); + + rte_trace_point_emit_u8(flag); + rte_trace_point_emit_u16(queue_id); + } +) + RTE_TRACE_POINT( rte_pmd_nfp_trace_cmsg_flow, RTE_TRACE_POINT_ARGS(const char *name), -- 2.39.1