22 #include <sys/resource.h>
29 #include <odp/helper/odph_api.h>
31 #define NUM_SVC_CLASSES 4
32 #define USERS_PER_SVC_CLASS 2
33 #define APPS_PER_USER 2
34 #define TM_QUEUES_PER_APP 2
35 #define NUM_USERS (USERS_PER_SVC_CLASS * NUM_SVC_CLASSES)
36 #define NUM_TM_QUEUES (NUM_USERS * APPS_PER_USER * TM_QUEUES_PER_APP)
37 #define TM_QUEUES_PER_USER (TM_QUEUES_PER_APP * APPS_PER_USER)
38 #define TM_QUEUES_PER_CLASS (USERS_PER_SVC_CLASS * TM_QUEUES_PER_USER)
39 #define MAX_NODES_PER_LEVEL (NUM_USERS * APPS_PER_USER)
43 #define PERCENT(percent) (100 * percent)
48 #define RANDOM_BUF_LEN 1024
54 } profile_params_set_t;
67 static profile_params_set_t COMPANY_PROFILE_PARAMS = {
69 .commit_rate = 50 * MBPS, .commit_burst = 1000000,
70 .peak_rate = 0, .peak_burst = 0,
71 .dual_rate = FALSE, .shaper_len_adjust = 20
75 .max_pkts = 100000, .enable_max_pkts = TRUE,
76 .max_bytes = 10000000, .enable_max_bytes = TRUE
81 .min_threshold = PERCENT(70),
82 .med_threshold = PERCENT(90),
83 .med_drop_prob = PERCENT(80),
84 .max_drop_prob = PERCENT(100),
86 .use_byte_fullness = FALSE,
90 .min_threshold = PERCENT(70),
91 .med_threshold = PERCENT(90),
92 .med_drop_prob = PERCENT(80),
93 .max_drop_prob = PERCENT(100),
95 .use_byte_fullness = FALSE,
99 .min_threshold = PERCENT(40),
100 .med_threshold = PERCENT(70),
101 .med_drop_prob = PERCENT(70),
102 .max_drop_prob = PERCENT(100),
104 .use_byte_fullness = FALSE,
109 static profile_params_set_t COS0_PROFILE_PARAMS = {
111 .commit_rate = 1 * MBPS, .commit_burst = 100000,
112 .peak_rate = 4 * MBPS, .peak_burst = 200000,
113 .dual_rate = TRUE, .shaper_len_adjust = 20
116 .threshold_params = {
117 .max_pkts = 10000, .enable_max_pkts = TRUE,
118 .max_bytes = 1000000, .enable_max_bytes = TRUE
123 .min_threshold = PERCENT(80),
124 .med_threshold = PERCENT(90),
125 .med_drop_prob = PERCENT(50),
126 .max_drop_prob = PERCENT(100),
128 .use_byte_fullness = FALSE,
132 .min_threshold = PERCENT(80),
133 .med_threshold = PERCENT(90),
134 .med_drop_prob = PERCENT(50),
135 .max_drop_prob = PERCENT(100),
137 .use_byte_fullness = FALSE,
141 .min_threshold = PERCENT(60),
142 .med_threshold = PERCENT(80),
143 .med_drop_prob = PERCENT(70),
144 .max_drop_prob = PERCENT(100),
146 .use_byte_fullness = FALSE,
151 static profile_params_set_t COS1_PROFILE_PARAMS = {
153 .commit_rate = 500 * KBPS, .commit_burst = 50000,
154 .peak_rate = 1500 * KBPS, .peak_burst = 150000,
155 .dual_rate = TRUE, .shaper_len_adjust = 20
158 .threshold_params = {
159 .max_pkts = 5000, .enable_max_pkts = TRUE,
160 .max_bytes = 500000, .enable_max_bytes = TRUE
165 .min_threshold = PERCENT(40),
166 .med_threshold = PERCENT(90),
167 .med_drop_prob = PERCENT(70),
168 .max_drop_prob = PERCENT(100),
170 .use_byte_fullness = FALSE,
174 .min_threshold = PERCENT(40),
175 .med_threshold = PERCENT(90),
176 .med_drop_prob = PERCENT(70),
177 .max_drop_prob = PERCENT(100),
179 .use_byte_fullness = FALSE,
183 .min_threshold = PERCENT(50),
184 .med_threshold = PERCENT(80),
185 .med_drop_prob = PERCENT(80),
186 .max_drop_prob = PERCENT(100),
188 .use_byte_fullness = FALSE,
193 static profile_params_set_t COS2_PROFILE_PARAMS = {
195 .commit_rate = 200 * KBPS, .commit_burst = 20000,
196 .peak_rate = 400 * KBPS, .peak_burst = 40000,
197 .dual_rate = TRUE, .shaper_len_adjust = 20
200 .threshold_params = {
201 .max_pkts = 1000, .enable_max_pkts = TRUE,
202 .max_bytes = 100000, .enable_max_bytes = TRUE
207 .min_threshold = PERCENT(50),
208 .med_threshold = PERCENT(80),
209 .med_drop_prob = PERCENT(70),
210 .max_drop_prob = PERCENT(100),
212 .use_byte_fullness = FALSE,
216 .min_threshold = PERCENT(50),
217 .med_threshold = PERCENT(80),
218 .med_drop_prob = PERCENT(70),
219 .max_drop_prob = PERCENT(100),
221 .use_byte_fullness = FALSE,
225 .min_threshold = PERCENT(40),
226 .med_threshold = PERCENT(70),
227 .med_drop_prob = PERCENT(80),
228 .max_drop_prob = PERCENT(100),
230 .use_byte_fullness = FALSE,
235 static profile_params_set_t COS3_PROFILE_PARAMS = {
237 .commit_rate = 100 * KBPS, .commit_burst = 5000,
238 .peak_rate = 0, .peak_burst = 0,
239 .dual_rate = FALSE, .shaper_len_adjust = 20
242 .threshold_params = {
243 .max_pkts = 400, .enable_max_pkts = TRUE,
244 .max_bytes = 60000, .enable_max_bytes = TRUE
249 .min_threshold = PERCENT(40),
250 .med_threshold = PERCENT(70),
251 .med_drop_prob = PERCENT(80),
252 .max_drop_prob = PERCENT(100),
254 .use_byte_fullness = FALSE,
258 .min_threshold = PERCENT(40),
259 .med_threshold = PERCENT(70),
260 .med_drop_prob = PERCENT(80),
261 .max_drop_prob = PERCENT(100),
263 .use_byte_fullness = FALSE,
267 .min_threshold = PERCENT(30),
268 .med_threshold = PERCENT(60),
269 .med_drop_prob = PERCENT(80),
270 .max_drop_prob = PERCENT(100),
272 .use_byte_fullness = FALSE,
277 static profile_set_t COMPANY_PROFILE_SET;
278 static profile_set_t COS_PROFILE_SETS[NUM_SVC_CLASSES];
279 static profile_set_t USER_PROFILE_SETS[NUM_SVC_CLASSES];
280 static profile_set_t APP_PROFILE_SETS[NUM_SVC_CLASSES][APPS_PER_USER];
286 static odp_tm_queue_t queue_num_tbls[NUM_SVC_CLASSES][TM_QUEUES_PER_CLASS];
287 static uint32_t next_queue_nums[NUM_SVC_CLASSES];
289 static uint8_t random_buf[RANDOM_BUF_LEN];
290 static uint32_t next_rand_byte;
295 static uint32_t g_num_pkts_to_send = 100;
296 static uint8_t g_print_tm_stats = TRUE;
300 static uint64_t tm_shaper_min_rate;
301 static uint64_t tm_shaper_max_rate;
302 static uint32_t tm_shaper_min_burst;
303 static uint32_t tm_shaper_max_burst;
306 clamp_rate(uint64_t rate)
308 uint64_t val = ODPH_MIN(ODPH_MAX(rate, tm_shaper_min_rate), tm_shaper_max_rate);
314 printf(
"INFO: Clamped shaper rate from %" PRIu64
" bps"
315 " to %" PRIu64
" bps\n", rate, val);
320 clamp_burst(uint32_t burst)
322 uint32_t val = ODPH_MIN(ODPH_MAX(burst, tm_shaper_min_burst), tm_shaper_max_burst);
328 printf(
"INFO: Clamped shaper burst from %" PRIu32
"bits to %" PRIu32
"bits\n",
335 static uint32_t create_profile_set(profile_params_set_t *profile_params_set,
336 profile_set_t *profile_set,
337 const char *base_name,
339 uint32_t shaper_scale,
340 uint32_t threshold_scale)
345 uint32_t err_cnt, color;
350 snprintf(name,
sizeof(name),
"%s", base_name);
352 snprintf(name,
sizeof(name),
"%s-%" PRIu32,
353 base_name, name_idx);
356 shaper = &profile_params_set->shaper_params;
373 thresholds = &profile_params_set->threshold_params;
378 profile_set->threshold_profile =
385 snprintf(wred_name,
sizeof(wred_name),
"%s-%" PRIu32,
389 wred = &profile_params_set->wred_params[color];
396 profile_set->wred_profiles[color] =
407 static uint32_t init_profile_sets(
void)
409 uint32_t class_shaper_scale, class_threshold_scale, user_shaper_scale;
410 uint32_t user_threshold_scale, err_cnt, app_idx;
412 class_shaper_scale = TM_QUEUES_PER_CLASS / 2;
413 class_threshold_scale = TM_QUEUES_PER_CLASS;
414 user_shaper_scale = TM_QUEUES_PER_USER / 2;
415 user_threshold_scale = TM_QUEUES_PER_USER;
418 err_cnt += create_profile_set(&COMPANY_PROFILE_PARAMS,
419 &COMPANY_PROFILE_SET,
420 "CompanyProfiles", 0, 1, 1);
422 err_cnt += create_profile_set(&COS0_PROFILE_PARAMS,
423 &COS_PROFILE_SETS[0],
"ServiceClass0", 0,
425 class_threshold_scale);
426 err_cnt += create_profile_set(&COS1_PROFILE_PARAMS,
427 &COS_PROFILE_SETS[1],
"ServiceClass1", 0,
429 class_threshold_scale);
430 err_cnt += create_profile_set(&COS2_PROFILE_PARAMS,
431 &COS_PROFILE_SETS[2],
"ServiceClass2", 0,
433 class_threshold_scale);
434 err_cnt += create_profile_set(&COS3_PROFILE_PARAMS,
435 &COS_PROFILE_SETS[3],
"ServiceClass3", 0,
437 class_threshold_scale);
439 err_cnt += create_profile_set(&COS0_PROFILE_PARAMS,
440 &USER_PROFILE_SETS[0],
"UserSvc0", 0,
441 user_shaper_scale, user_threshold_scale);
442 err_cnt += create_profile_set(&COS1_PROFILE_PARAMS,
443 &USER_PROFILE_SETS[1],
"UserSvc1", 0,
444 user_shaper_scale, user_threshold_scale);
445 err_cnt += create_profile_set(&COS2_PROFILE_PARAMS,
446 &USER_PROFILE_SETS[2],
"UserSvc2", 0,
447 user_shaper_scale, user_threshold_scale);
448 err_cnt += create_profile_set(&COS3_PROFILE_PARAMS,
449 &USER_PROFILE_SETS[3],
"UserSvc3", 0,
450 user_shaper_scale, user_threshold_scale);
452 for (app_idx = 0; app_idx < APPS_PER_USER; app_idx++) {
453 err_cnt += create_profile_set(&COS0_PROFILE_PARAMS,
454 &APP_PROFILE_SETS[0][app_idx],
455 "AppSvc0", app_idx + 1, 1, 1);
456 err_cnt += create_profile_set(&COS1_PROFILE_PARAMS,
457 &APP_PROFILE_SETS[1][app_idx],
458 "AppSvc1", app_idx + 1, 1, 1);
459 err_cnt += create_profile_set(&COS2_PROFILE_PARAMS,
460 &APP_PROFILE_SETS[2][app_idx],
461 "AppSvc2", app_idx + 1, 1, 1);
462 err_cnt += create_profile_set(&COS3_PROFILE_PARAMS,
463 &APP_PROFILE_SETS[3][app_idx],
464 "AppSvc3", app_idx + 1, 1, 1);
478 profile_set_t *profile_set;
479 uint32_t app_idx, queue_idx, svc_class_queue_num;
483 profile_set = &USER_PROFILE_SETS[svc_class];
490 profile_set->wred_profiles[0];
492 profile_set->wred_profiles[1];
494 profile_set->wred_profiles[2];
495 tm_node_params.
level = 2;
497 snprintf(user_name,
sizeof(user_name),
"Subscriber-%" PRIu32, user_num);
502 for (app_idx = 0; app_idx < APPS_PER_USER; app_idx++) {
503 profile_set = &APP_PROFILE_SETS[svc_class][app_idx];
504 for (queue_idx = 0; queue_idx < TM_QUEUES_PER_APP;
508 profile_set->shaper_profile;
510 profile_set->threshold_profile;
511 tm_queue_params.
priority = svc_class;
526 svc_class_queue_num = next_queue_nums[svc_class]++;
527 queue_num_tbls[svc_class][svc_class_queue_num] =
535 static int config_company_node(
const char *company_name)
538 profile_set_t *profile_set;
540 uint32_t cos_idx, user_idx;
543 profile_set = &COMPANY_PROFILE_SET;
549 profile_set->wred_profiles[0];
551 profile_set->wred_profiles[1];
553 profile_set->wred_profiles[2];
554 tm_node_params.
level = 0;
559 for (cos_idx = 0; cos_idx < NUM_SVC_CLASSES; cos_idx++) {
561 profile_set = &COS_PROFILE_SETS[cos_idx];
565 profile_set->threshold_profile;
566 tm_node_params.
level = 1;
575 snprintf(cos_node_name,
sizeof(cos_node_name),
576 "%s-Class-%" PRIu32, company_name, cos_idx);
581 for (user_idx = 0; user_idx < USERS_PER_SVC_CLASS; user_idx++)
582 config_example_user(cos_tm_node, cos_idx,
583 cos_idx * 256 + user_idx);
590 static int create_and_config_tm(
void)
596 uint32_t level, err_cnt;
606 for (level = 0; level < 3; level++) {
607 per_level = &requirements.
per_level[level];
623 odp_tm_test =
odp_tm_create(
"TM test", &requirements, &egress);
625 printf(
"Error: failed to create TM\n");
630 printf(
"Error: failed to get tm capability");
639 for (level = 1; level < tm_capa.
max_levels; level++) {
642 if (level_capa->
min_rate > tm_shaper_min_rate)
643 tm_shaper_min_rate = level_capa->
min_rate;
645 if (level_capa->
min_burst > tm_shaper_min_burst)
646 tm_shaper_min_burst = level_capa->
min_burst;
648 if (level_capa->
max_rate < tm_shaper_max_rate)
649 tm_shaper_max_rate = level_capa->
max_rate;
651 if (level_capa->
max_burst < tm_shaper_max_burst)
652 tm_shaper_max_burst = level_capa->
max_burst;
655 if (tm_shaper_min_rate > tm_shaper_max_rate ||
656 tm_shaper_min_burst > tm_shaper_max_burst) {
657 printf(
"Error: No shaper rate supported by all TM levels");
661 err_cnt = init_profile_sets();
663 printf(
"%s init_profile_sets encountered %" PRIu32
" errors\n",
666 config_company_node(
"TestCompany");
670 static uint32_t random_8(
void)
674 if (RANDOM_BUF_LEN <= next_rand_byte) {
679 rand8 = random_buf[next_rand_byte++];
683 static uint32_t random_16(
void)
685 uint8_t byte1, byte2;
687 if ((RANDOM_BUF_LEN - 1) <= next_rand_byte) {
692 byte1 = random_buf[next_rand_byte++];
693 byte2 = random_buf[next_rand_byte++];
694 return (((uint16_t)byte1) << 8) | ((uint16_t)byte2);
697 static uint32_t pkt_service_class(
void)
708 else if (rand8 >= 25 && rand8 <= 49)
710 else if (rand8 >= 50 && rand8 <= 150)
712 else if (rand8 >= 151 && rand8 <= 255)
721 uint8_t rand8a, rand8b, pkt_color, drop_eligible;
725 pkt_color = (rand8a < 224) ? 0 : ((rand8a < 248) ? 1 : 2);
726 drop_eligible = (rand8b < 240) ? 1 : 0;
729 printf(
"%s odp_packet_alloc failure *******\n", __func__);
744 static int traffic_generator(uint32_t pkts_to_send)
750 uint32_t svc_class, queue_num, pkt_len, pkts_into_tm;
751 uint32_t pkts_from_tm, pkt_cnt, millisecs, odp_tm_enq_errs;
756 pool_params.
pkt.
num = pkts_to_send + 10;
757 pool_params.
pkt.
len = 1600;
765 while (pkt_cnt < pkts_to_send) {
766 svc_class = pkt_service_class();
767 queue_num = random_16() & (TM_QUEUES_PER_CLASS - 1);
768 tm_queue = queue_num_tbls[svc_class][queue_num];
769 pkt_len = ((uint32_t)((random_8() & 0x7F) + 2)) * 32;
770 pkt_len = ODPH_MIN(pkt_len, 1500u);
771 pkt = make_odp_packet(pkt_len);
783 printf(
"%s odp_tm_enq_errs=%" PRIu32
"\n", __func__, odp_tm_enq_errs);
789 for (millisecs = 0; millisecs < 600000; millisecs++) {
797 printf(
"%s WARNING stopped waiting for the TM system "
798 "to be IDLE!\n", __func__);
801 for (millisecs = 0; millisecs < 2000; millisecs++) {
805 if (pkts_into_tm <= pkts_from_tm)
812 static int process_cmd_line_options(uint32_t argc,
char *argv[])
818 while (arg_idx < argc) {
819 arg = argv[arg_idx++];
822 }
else if (arg[0] ==
'-') {
828 atoi(argv[arg_idx++]);
832 g_print_tm_stats = FALSE;
836 printf(
"Unrecognized cmd line option '%s'\n",
849 static void signal_handler(
int signal)
851 size_t num_stack_frames;
852 const char *signal_name;
857 signal_name =
"SIGILL";
break;
859 signal_name =
"SIGFPE";
break;
861 signal_name =
"SIGSEGV";
break;
863 signal_name =
"SIGTERM";
break;
865 signal_name =
"SIGBUS";
break;
867 signal_name =
"UNKNOWN";
break;
870 num_stack_frames = backtrace(bt_array, 100);
871 printf(
"Received signal=%u (%s) exiting.", signal, signal_name);
872 backtrace_symbols_fd(bt_array, num_stack_frames, fileno(stderr));
878 static int destroy_tm_queues(
void)
884 for (i = 0; i < NUM_SVC_CLASSES; i++)
885 for (
class = 0;
class < TM_QUEUES_PER_CLASS;
class++) {
889 tm_queue = queue_num_tbls[i][
class];
893 printf(
"Err: odp_tm_queue_info %d\n", ret);
899 printf(
"Err: odp_tm_node_disconnect %d\n", ret);
905 printf(
"odp_tm_queue_disconnect %d\n", ret);
911 printf(
"odp_tm_queue_destroy %d\n", ret);
919 int main(
int argc,
char *argv[])
921 struct sigaction signal_action;
922 struct rlimit rlimit;
923 uint32_t pkts_into_tm, pkts_from_tm;
927 memset(&signal_action, 0,
sizeof(signal_action));
928 signal_action.sa_handler = signal_handler;
929 sigfillset(&signal_action.sa_mask);
930 sigaction(SIGILL, &signal_action, NULL);
931 sigaction(SIGFPE, &signal_action, NULL);
932 sigaction(SIGSEGV, &signal_action, NULL);
933 sigaction(SIGTERM, &signal_action, NULL);
934 sigaction(SIGBUS, &signal_action, NULL);
936 getrlimit(RLIMIT_CORE, &rlimit);
937 rlimit.rlim_cur = rlimit.rlim_max;
938 setrlimit(RLIMIT_CORE, &rlimit);
942 printf(
"Error: odp_init_global() failed, rc = %d\n", rc);
948 printf(
"Error: odp_init_local() failed, rc = %d\n", rc);
952 if (process_cmd_line_options(argc, argv) < 0)
955 rc = create_and_config_tm();
962 printf(
"Error: odp_tm_start() failed, rc=%d\n", rc);
972 traffic_generator(g_num_pkts_to_send);
976 printf(
"pkts_into_tm=%" PRIu32
" pkts_from_tm=%" PRIu32
"\n",
977 pkts_into_tm, pkts_from_tm);
984 printf(
"Error: odp_tm_stop() failed, rc = %d\n", rc);
988 rc = destroy_tm_queues();
990 printf(
"Error: destroy_tm_queues() failed, rc = %d\n", rc);
996 printf(
"Error: odp_pool_destroy() failed, rc = %d\n", rc);
1002 printf(
"Error: odp_tm_destroy() failed, rc = %d\n", rc);
1008 printf(
"Error: odp_term_local() failed, rc = %d\n", rc);
1014 printf(
"Error: odp_term_global() failed, rc = %d\n", rc);
void odp_atomic_init_u32(odp_atomic_u32_t *atom, uint32_t val)
Initialize atomic uint32 variable.
uint32_t odp_atomic_load_u32(odp_atomic_u32_t *atom)
Load value of atomic uint32 variable.
void odp_atomic_inc_u32(odp_atomic_u32_t *atom)
Increment atomic uint32 variable.
#define ODP_UNUSED
Intentionally unused variables of functions.
int void odp_override_abort(void) ODP_NORETURN
ODP abort function.
int odp_init_local(odp_instance_t instance, odp_thread_type_t thr_type)
Thread local ODP initialization.
int odp_init_global(odp_instance_t *instance, const odp_init_t *params, const odp_platform_init_t *platform_params)
Global ODP initialization.
int odp_term_local(void)
Thread local ODP termination.
int odp_term_global(odp_instance_t instance)
Global ODP termination.
uint64_t odp_instance_t
ODP instance ID.
int odp_override_log(odp_log_level_t level, const char *fmt,...) ODP_PRINTF_FORMAT(2
ODP log function.
void odp_packet_color_set(odp_packet_t pkt, odp_packet_color_t color)
Set packet color.
#define ODP_NUM_PACKET_COLORS
Maximum number of packet colors which accommodates ODP_PACKET_GREEN, ODP_PACKET_YELLOW and ODP_PACKET...
void odp_packet_drop_eligible_set(odp_packet_t pkt, odp_bool_t status)
Set drop eligible status.
odp_packet_t odp_packet_alloc(odp_pool_t pool, uint32_t len)
Allocate a packet from a packet pool.
void odp_packet_shaper_len_adjust_set(odp_packet_t pkt, int8_t adj)
Set shaper length adjustment.
#define ODP_PACKET_INVALID
Invalid packet.
@ ODP_PACKET_YELLOW
Packet is yellow.
@ ODP_PACKET_RED
Packet is red.
@ ODP_PACKET_GREEN
Packet is green.
odp_pool_t odp_pool_create(const char *name, const odp_pool_param_t *param)
Create a pool.
int odp_pool_destroy(odp_pool_t pool)
Destroy a pool previously created by odp_pool_create()
@ ODP_POOL_PACKET
Packet pool.
int32_t odp_random_data(uint8_t *buf, uint32_t len, odp_random_kind_t kind)
Generate random byte data.
bool odp_bool_t
Boolean type.
@ ODP_THREAD_CONTROL
Control thread.
int odp_tm_destroy(odp_tm_t tm)
Destroy a TM system.
odp_tm_node_t odp_tm_node_create(odp_tm_t tm, const char *name, const odp_tm_node_params_t *params)
Create an tm_node with a specific set of implemented strict priority levels as given by the prioritie...
odp_bool_t odp_tm_is_idle(odp_tm_t tm)
The odp_tm_is_idle function is used to determine if the specified ODP traffic management system still...
odp_tm_threshold_t odp_tm_threshold_create(const char *name, const odp_tm_threshold_params_t *params)
odp_tm_threshold_create() creates a queue threshold profile object, which can subsequently be attache...
odp_tm_wred_t odp_tm_wred_create(const char *name, const odp_tm_wred_params_t *params)
odp_tm_wred_create() creates a WRED (Weighted Random Early Detection) profile object,...
odp_tm_handle_t odp_tm_t
Each odp_tm_t value represents a specific TM system.
odp_tm_t odp_tm_create(const char *name, odp_tm_requirements_t *requirements, odp_tm_egress_t *egress)
Create/instantiate a TM Packet Scheduling system.
odp_tm_handle_t odp_tm_wred_t
Each odp_tm_wred_t value is an opaque ODP handle representing a specific WRED profile usable across a...
void odp_tm_egress_init(odp_tm_egress_t *egress)
Initialize Egress record.
void odp_tm_node_params_init(odp_tm_node_params_t *params)
Initialize TM node parameters.
odp_tm_handle_t odp_tm_node_t
Each odp_tm_node_t value is an opaque ODP handle representing a specific tm_node within a specific TM...
int odp_tm_node_disconnect(odp_tm_node_t src_tm_node)
Disconnect a tm_node to tm_node linkage.
void odp_tm_queue_params_init(odp_tm_queue_params_t *params)
Initialize TM queue parameters.
int odp_tm_enq(odp_tm_queue_t tm_queue, odp_packet_t pkt)
Send packet to TM system.
#define ODP_TM_NAME_LEN
Maximum traffic manager name length, including the null character.
int odp_tm_queue_connect(odp_tm_queue_t tm_queue, odp_tm_node_t dst_tm_node)
The odp_tm_queue_connect() function connects the indicated tm_queue to a parent tm_node or to the egr...
odp_tm_queue_t odp_tm_queue_create(odp_tm_t tm, const odp_tm_queue_params_t *params)
TM queue create.
odp_tm_handle_t odp_tm_queue_t
Each odp_tm_queue_t value is an opaque ODP handle representing a specific tm_queue within a specific ...
void odp_tm_shaper_params_init(odp_tm_shaper_params_t *params)
Initialize TM shaper parameters.
odp_tm_shaper_t odp_tm_shaper_create(const char *name, const odp_tm_shaper_params_t *params)
odp_tm_shaper_create() creates a shaper profile object, which can subsequently be attached to any num...
int odp_tm_start(odp_tm_t tm)
Start a TM system.
int odp_tm_node_connect(odp_tm_node_t src_tm_node, odp_tm_node_t dst_tm_node)
Connects two tm_nodes.
#define ODP_TM_INVALID
The ODP_TM_INVALID constant can be used with any ODP TM handle type and indicates that this value doe...
odp_tm_handle_t odp_tm_threshold_t
Each odp_tm_threshold_t value is an opaque ODP handle representing a specific queue threshold profile...
void odp_tm_threshold_params_init(odp_tm_threshold_params_t *params)
Initialize TM threshold parameters.
int odp_tm_queue_destroy(odp_tm_queue_t tm_queue)
Destroy an tm_queue object.
int odp_tm_capability(odp_tm_t tm, odp_tm_capabilities_t *capabilities)
Query Specific TM Capabilities.
int odp_tm_queue_disconnect(odp_tm_queue_t tm_queue)
Disconnect a tm_queue from a tm_system.
void odp_tm_stats_print(odp_tm_t tm)
The odp_tm_stats_print function is used to write implementation-defined information about the specifi...
void odp_tm_wred_params_init(odp_tm_wred_params_t *params)
Initialize TM WRED parameters.
int odp_tm_queue_info(odp_tm_queue_t tm_queue, odp_tm_queue_info_t *info)
Get tm_queue Info.
int odp_tm_stop(odp_tm_t tm)
Stop a TM system.
#define ODP_TM_ROOT
Constant that is used to refer to the egress/root node of the TM subsystem's tree/hierarchy of nodes.
void odp_tm_requirements_init(odp_tm_requirements_t *requirements)
Initialize Requirements record fields to their default values.
odp_tm_handle_t odp_tm_shaper_t
Each odp_tm_shaper_t value is an opaque ODP handle representing a specific shaper profile usable acro...
Global initialization parameters.
odp_log_func_t log_fn
Replacement for the default log fn.
uint32_t uarea_size
Minimum user area size in bytes.
uint32_t num
Number of buffers in the pool.
odp_pool_type_t type
Pool type.
uint32_t len
Minimum length of 'num' packets.
uint32_t seg_len
Minimum number of packet data bytes that can be stored in the first segment of a newly allocated pack...
struct odp_pool_param_t::@126 pkt
Parameters for packet pools.
odp_tm_level_capabilities_t per_level[ODP_TM_MAX_LEVELS]
The per_level array specifies the TM system capabilities that can vary based upon the tm_node level.
uint8_t max_levels
max_levels specifies that maximum number of levels of hierarchical scheduling allowed by this TM Syst...
The odp_tm_egress_t type is used to describe that type of "egress spigot" associated with this TM sys...
odp_tm_egress_kind_t egress_kind
Union discriminator.
odp_tm_egress_fcn_t egress_fcn
Output to user func.
uint64_t max_rate
Maximum allowed value for odp_tm_shaper_params_t::commit_rate and odp_tm_shaper_params_t::peak_rate w...
uint64_t min_rate
Minimum allowed value for odp_tm_shaper_params_t::commit_rate and odp_tm_shaper_params_t::peak_rate w...
uint32_t max_burst
Maximum allowed value for odp_tm_shaper_params_t::commit_burst and odp_tm_shaper_params_t::peak_burst...
uint32_t min_burst
Minimum allowed value for odp_tm_shaper_params_t::commit_burst and odp_tm_shaper_params_t::peak_burst...
odp_bool_t tm_node_dual_slope_needed
tm_node_dual_slope_needed indicates that the tm_nodes at this level are expected to use the dual slop...
odp_bool_t tm_node_wred_needed
tm_node_wred_needed indicates that the tm_nodes at this level are expected to participate in some for...
uint32_t max_num_tm_nodes
max_num_tm_nodes specifies the maximum number of tm_nodes required at this level.
uint32_t max_weight
max_weight only has significance when the weights_supported field below is true, in which case it spe...
odp_bool_t weights_needed
weights_needed indicates that the tm_node schedulers at this level are expected have different weight...
uint32_t max_fanin_per_node
max_fanin_per_level specifies the maximum number of fan_in links to any given scheduler (whether weig...
odp_bool_t tm_node_shaper_needed
tm_node_shaper_needed indicates that the tm_nodes at this level are expected to do TM shaping,
uint8_t max_priority
max_priority specifies the maximum number of strict priority levels that will be used by any tm_node ...
uint32_t min_weight
min_weight only has significance when the weights_supported field below is true, in which case it spe...
odp_bool_t fair_queuing_needed
fair_queuing_needed indicates that the tm_node schedulers at this level are expected to implement WFQ...
odp_tm_shaper_t shaper_profile
The shaper profile to be associated with this tm_node.
uint32_t max_fanin
The max_fanin sets the maximum number of src tm_queues and producer tm_nodes that can be simultaneous...
odp_tm_threshold_t threshold_profile
The threshold profile to be used in setting the max queue fullness for WRED and/or tail drop.
uint8_t level
The level (or tm_node stage) sets the level for this tm_node It must be in range 0....
odp_tm_wred_t wred_profile[ODP_NUM_PACKET_COLORS]
The WRED profile(s) to be associated with this tm_node.
The odp_tm_queue_info_t record type is used to return various bits of information about a given tm_qu...
odp_tm_node_t next_tm_node
The next_tm_node is the "next" node in the tree - i.e.
odp_tm_threshold_t threshold_profile
The threshold profile to be used in setting the max queue fullness for WRED and/or tail drop.
uint8_t priority
The strict priority level assigned to packets in this tm_queue - in other words all packets associate...
odp_tm_wred_t wred_profile[ODP_NUM_PACKET_COLORS]
The WRED profile(s) to be associated with this tm_queue.
odp_tm_shaper_t shaper_profile
The shaper profile to be associated with this tm_queue.
uint32_t max_tm_queues
max_tm_queues specifies the maximum number of tm_queues that will be used for this TM System.
odp_bool_t tm_queue_wred_needed
tm_queue_wred_needed indicates that the tm_queues are expected to participate in some form of Random ...
uint8_t num_levels
num_levels specifies that number of levels of hierarchical scheduling that will be used.
odp_tm_level_requirements_t per_level[ODP_TM_MAX_LEVELS]
The per_level array specifies the TM system requirements that can vary based upon the tm_node level.
odp_bool_t tm_queue_shaper_needed
tm_queue_shaper_needed indicates that the tm_queues are expected to do TM shaping.
uint32_t commit_burst
The commit burst tolerance for this shaper profile.
odp_bool_t dual_rate
If dual_rate is TRUE it indicates the desire for the implementation to use dual rate shaping for pack...
int8_t shaper_len_adjust
The shaper_len_adjust is a value between -128 and 127 which is directly added to the frame_len of a p...
uint64_t commit_rate
The committed information rate for this shaper profile.
uint32_t peak_burst
The peak burst tolerance for this shaper profile.
uint64_t peak_rate
The peak information rate for this shaper profile.
uint64_t max_bytes
max byte cnt for this threshold profile
odp_bool_t enable_max_bytes
TRUE if max_bytes is valid.
odp_bool_t enable_max_pkts
TRUE if max_pkts is valid.
uint64_t max_pkts
max pkt cnt for this threshold profile
odp_tm_percent_t med_drop_prob
The med_drop_prob is only used when dual-slope WRED is being used, in which case med_drop_prob MUST b...
odp_bool_t use_byte_fullness
When use_byte_fullness is true then WRED will use queue memory usage as the fullness criterion,...
odp_tm_percent_t med_threshold
The meaning of med_threshold depends upon whether single-slope or dual-slope WRED is being used or no...
odp_bool_t enable_wred
When enable_wred is false, all tm_queues and tm_nodes that are attached to this profile will not take...
odp_tm_percent_t max_drop_prob
The max_drop_prob equals the drop probability when the queue fullness almost equals 100%.
odp_tm_percent_t min_threshold
When min_threshold is set to zero then single-slope WRED is enabled, as described in the description ...