From: Satheesh Paul <psathe...@marvell.com> Add support to dump hardware internal representation information of rte flow to file.
Every flow rule added will be dumped in the below format. MCAM Index:1881 Interface :NIX-RX (0) Priority :1 NPC RX Action:0X00000000404001 ActionOp:NIX_RX_ACTIONOP_UCAST (1) PF_FUNC: 0X400 RQ Index:0X004 Match Id:0000 Flow Key Alg:0 NPC RX VTAG Action:0X00000000008100 VTAG0:relptr:0 lid:0X1 type:0 Patterns: NPC_PARSE_NIBBLE_CHAN:000 NPC_PARSE_NIBBLE_LA_LTYPE:LA_ETHER NPC_PARSE_NIBBLE_LB_LTYPE:NONE NPC_PARSE_NIBBLE_LC_LTYPE:LC_IP NPC_PARSE_NIBBLE_LD_LTYPE:LD_TCP NPC_PARSE_NIBBLE_LE_LTYPE:NONE LA_ETHER, hdr offset:0, len:0X6, key offset:0X8,\ Data:0X4AE124FC7FFF, Mask:0XFFFFFFFFFFFF LA_ETHER, hdr offset:0XC, len:0X2, key offset:0X4, Data:0XCA5A,\ Mask:0XFFFF LC_IP, hdr offset:0XC, len:0X8, key offset:0X10,\ Data:0X0A01010300000000, Mask:0XFFFFFFFF00000000 LD_TCP, hdr offset:0, len:0X4, key offset:0X18, Data:0X03450000,\ Mask:0XFFFF0000 MCAM Raw Data : DW0 :0000CA5A01202000 DW0_Mask:0000FFFF0FF0F000 DW1 :00004AE124FC7FFF DW1_Mask:0000FFFFFFFFFFFF DW2 :0A01010300000000 DW2_Mask:FFFFFFFF00000000 DW3 :0000000003450000 DW3_Mask:00000000FFFF0000 DW4 :0000000000000000 DW4_Mask:0000000000000000 DW5 :0000000000000000 DW5_Mask:0000000000000000 DW6 :0000000000000000 DW6_Mask:0000000000000000 ci: skip_checkpatch skip_checkformat Signed-off-by: Satheesh Paul <psathe...@marvell.com> --- drivers/net/cnxk/cnxk_rte_flow.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/net/cnxk/cnxk_rte_flow.c b/drivers/net/cnxk/cnxk_rte_flow.c index 8486e9e..453425e 100644 --- a/drivers/net/cnxk/cnxk_rte_flow.c +++ b/drivers/net/cnxk/cnxk_rte_flow.c @@ -328,6 +328,33 @@ cnxk_flow_isolate(struct rte_eth_dev *dev __rte_unused, int enable __rte_unused, return -rte_errno; } +static int +cnxk_flow_dev_dump(struct rte_eth_dev *dev, struct rte_flow *flow, + FILE *file, struct rte_flow_error *error) +{ + struct cnxk_eth_dev *hw = dev->data->dev_private; + struct roc_npc *npc = &hw->npc; + + if (file == NULL) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL, + "Invalid file"); + return -rte_errno; + } + + if (flow != NULL) { + rte_flow_error_set(error, EINVAL, + RTE_FLOW_ERROR_TYPE_HANDLE, + NULL, + "Invalid argument"); + return -EINVAL; + } + + roc_npc_flow_dump(file, npc); + + return 0; +} + const struct rte_flow_ops cnxk_flow_ops = { .validate = cnxk_flow_validate, .create = cnxk_flow_create, @@ -335,4 +362,5 @@ const struct rte_flow_ops cnxk_flow_ops = { .flush = cnxk_flow_flush, .query = cnxk_flow_query, .isolate = cnxk_flow_isolate, + .dev_dump = cnxk_flow_dev_dump, }; -- 2.8.4