|
1 | 1 | /* SPDX-License-Identifier: BSD-3-Clause
|
2 | 2 | * Copyright (c) 2015-2018 Linaro Limited
|
3 |
| - * Copyright (c) 2022 Marvell |
| 3 | + * Copyright (c) 2025 Marvell |
4 | 4 | * Copyright (c) 2022 Nokia
|
5 | 5 | */
|
6 | 6 |
|
@@ -4717,6 +4717,113 @@ static void traffic_mngr_test_queue_stats(void)
|
4717 | 4717 | CU_ASSERT(odp_tm_is_idle(odp_tm_systems[0]));
|
4718 | 4718 | }
|
4719 | 4719 |
|
| 4720 | +static int traffic_mngr_check_node_stats(void) |
| 4721 | +{ |
| 4722 | + int i; |
| 4723 | + |
| 4724 | + for (i = 0; i < NUM_LEVELS; i++) { |
| 4725 | + /* Report test case as active if even one level supports |
| 4726 | + * stats. |
| 4727 | + */ |
| 4728 | + if (tm_capabilities.per_level[i].node_stats.all_counters) |
| 4729 | + return ODP_TEST_ACTIVE; |
| 4730 | + } |
| 4731 | + |
| 4732 | + return ODP_TEST_INACTIVE; |
| 4733 | +} |
| 4734 | + |
| 4735 | +static void traffic_mngr_test_node_stats(void) |
| 4736 | +{ |
| 4737 | + odp_tm_node_stats_t stats_start[NUM_LEVELS]; |
| 4738 | + odp_tm_node_stats_capability_t stats_capa; |
| 4739 | + odp_tm_node_t nodes[NUM_LEVELS]; |
| 4740 | + odp_tm_node_stats_t stats_stop; |
| 4741 | + odp_tm_queue_info_t q_info; |
| 4742 | + odp_tm_node_info_t n_info; |
| 4743 | + odp_tm_queue_t tm_queue; |
| 4744 | + odp_tm_capabilities_t capa; |
| 4745 | + pkt_info_t pkt_info; |
| 4746 | + uint32_t pkts_sent; |
| 4747 | + uint32_t num_pkts = ODPH_MIN(50u, MAX_PKTS); |
| 4748 | + uint32_t pkt_len = 256; |
| 4749 | + int i; |
| 4750 | + |
| 4751 | + CU_ASSERT_FATAL(odp_tm_capability(odp_tm_systems[0], &capa) == 0); |
| 4752 | + |
| 4753 | + /* Reuse threshold test node */ |
| 4754 | + tm_queue = find_tm_queue(0, "node_1_2_1", 0); |
| 4755 | + CU_ASSERT_FATAL(tm_queue != ODP_TM_INVALID); |
| 4756 | + |
| 4757 | + /* Find parent nodes */ |
| 4758 | + CU_ASSERT_FATAL(odp_tm_queue_info(tm_queue, &q_info) == 0); |
| 4759 | + CU_ASSERT_FATAL(q_info.next_tm_node != ODP_TM_INVALID); |
| 4760 | + nodes[NUM_LEVELS - 1] = q_info.next_tm_node; |
| 4761 | + |
| 4762 | + for (i = NUM_LEVELS - 2; i >= 0; i--) { |
| 4763 | + CU_ASSERT_FATAL(odp_tm_node_info(nodes[i + 1], &n_info) == 0); |
| 4764 | + CU_ASSERT_FATAL(n_info.level == (i + 1)); |
| 4765 | + CU_ASSERT_FATAL(n_info.next_tm_node != ODP_TM_INVALID); |
| 4766 | + |
| 4767 | + /* Save next TM node */ |
| 4768 | + nodes[i] = n_info.next_tm_node; |
| 4769 | + } |
| 4770 | + |
| 4771 | + init_xmt_pkts(&pkt_info); |
| 4772 | + pkt_info.drop_eligible = false; |
| 4773 | + pkt_info.pkt_class = 1; |
| 4774 | + CU_ASSERT_FATAL(make_pkts(num_pkts, pkt_len, &pkt_info) == 0); |
| 4775 | + |
| 4776 | + /* Collect available node stats */ |
| 4777 | + for (i = 0; i < NUM_LEVELS; i++) { |
| 4778 | + if (capa.per_level[i].node_stats.all_counters == 0) |
| 4779 | + continue; |
| 4780 | + |
| 4781 | + CU_ASSERT(odp_tm_node_stats(nodes[i], &stats_start[i]) == 0); |
| 4782 | + } |
| 4783 | + |
| 4784 | + pkts_sent = send_pkts(tm_queue, num_pkts); |
| 4785 | + |
| 4786 | + num_rcv_pkts = receive_pkts(odp_tm_systems[0], rcv_pktin, pkts_sent, |
| 4787 | + 1 * GBPS); |
| 4788 | + |
| 4789 | + /* Collect available node stats and validate */ |
| 4790 | + for (i = 0; i < NUM_LEVELS; i++) { |
| 4791 | + stats_capa = capa.per_level[i].node_stats; |
| 4792 | + |
| 4793 | + if (stats_capa.all_counters == 0) |
| 4794 | + continue; |
| 4795 | + |
| 4796 | + CU_ASSERT(odp_tm_node_stats(nodes[i], &stats_stop) == 0); |
| 4797 | + |
| 4798 | + if (stats_capa.counter.packets) |
| 4799 | + CU_ASSERT(stats_stop.packets >= stats_start[i].packets + num_rcv_pkts); |
| 4800 | + if (stats_capa.counter.octets) |
| 4801 | + CU_ASSERT(stats_stop.octets >= stats_start[i].octets + |
| 4802 | + (num_rcv_pkts * pkt_len)); |
| 4803 | + CU_ASSERT((stats_stop.discards - stats_start[i].discards) == 0); |
| 4804 | + CU_ASSERT((stats_stop.discard_octets - stats_start[i].discard_octets) == 0); |
| 4805 | + |
| 4806 | + printf("\nLevel %d TM node statistics\n-------------------\n", i); |
| 4807 | + printf(" discards: %" PRIu64 "\n", stats_stop.discards); |
| 4808 | + printf(" discard octets: %" PRIu64 "\n", stats_stop.discard_octets); |
| 4809 | + printf(" octets: %" PRIu64 "\n", stats_stop.octets); |
| 4810 | + printf(" packets: %" PRIu64 "\n", stats_stop.packets); |
| 4811 | + |
| 4812 | + /* Check that all unsupported counters are still zero */ |
| 4813 | + if (!stats_capa.counter.discards) |
| 4814 | + CU_ASSERT(stats_stop.discards == 0); |
| 4815 | + if (!stats_capa.counter.discard_octets) |
| 4816 | + CU_ASSERT(stats_stop.discard_octets == 0); |
| 4817 | + if (!stats_capa.counter.octets) |
| 4818 | + CU_ASSERT(stats_stop.octets == 0); |
| 4819 | + if (!stats_capa.counter.packets) |
| 4820 | + CU_ASSERT(stats_stop.packets == 0); |
| 4821 | + } |
| 4822 | + |
| 4823 | + flush_leftover_pkts(odp_tm_systems[0], rcv_pktin); |
| 4824 | + CU_ASSERT(odp_tm_is_idle(odp_tm_systems[0])); |
| 4825 | +} |
| 4826 | + |
4720 | 4827 | static int traffic_mngr_check_wred(void)
|
4721 | 4828 | {
|
4722 | 4829 | /* Check if wred is part of created odp_tm_t capabilities */
|
@@ -5088,6 +5195,8 @@ odp_testinfo_t traffic_mngr_suite[] = {
|
5088 | 5195 | traffic_mngr_check_query),
|
5089 | 5196 | ODP_TEST_INFO_CONDITIONAL(traffic_mngr_test_queue_stats,
|
5090 | 5197 | traffic_mngr_check_queue_stats),
|
| 5198 | + ODP_TEST_INFO_CONDITIONAL(traffic_mngr_test_node_stats, |
| 5199 | + traffic_mngr_check_node_stats), |
5091 | 5200 | ODP_TEST_INFO_CONDITIONAL(traffic_mngr_test_vlan_marking,
|
5092 | 5201 | traffic_mngr_check_vlan_marking),
|
5093 | 5202 | ODP_TEST_INFO_CONDITIONAL(traffic_mngr_test_ecn_marking,
|
|
0 commit comments