1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2010-2014 Intel Corporation
13 #include <rte_cycles.h>
14 #include <rte_ether.h>
16 #include <rte_byteorder.h>
17 #include <rte_sched.h>
25 static struct rte_sched_subport_params subport_param
[] = {
27 .tb_rate
= 1250000000,
30 .tc_rate
= {1250000000, 1250000000, 1250000000, 1250000000},
35 static struct rte_sched_pipe_params pipe_profile
[] = {
40 .tc_rate
= {305175, 305175, 305175, 305175},
43 .wrr_weights
= {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
47 static struct rte_sched_port_params port_param
= {
48 .socket
= 0, /* computed */
49 .rate
= 0, /* computed */
51 .frame_overhead
= RTE_SCHED_FRAME_OVERHEAD_DEFAULT
,
52 .n_subports_per_port
= 1,
53 .n_pipes_per_subport
= 1024,
54 .qsize
= {32, 32, 32, 32},
55 .pipe_profiles
= pipe_profile
,
60 #define MBUF_DATA_SZ (2048 + RTE_PKTMBUF_HEADROOM)
61 #define MEMPOOL_CACHE_SZ 0
65 static struct rte_mempool
*
68 struct rte_mempool
* mp
;
70 mp
= rte_mempool_lookup("test_sched");
72 mp
= rte_pktmbuf_pool_create("test_sched", NB_MBUF
,
73 MEMPOOL_CACHE_SZ
, 0, MBUF_DATA_SZ
, SOCKET
);
79 prepare_pkt(struct rte_sched_port
*port
, struct rte_mbuf
*mbuf
)
81 struct ether_hdr
*eth_hdr
;
82 struct vlan_hdr
*vlan1
, *vlan2
;
83 struct ipv4_hdr
*ip_hdr
;
85 /* Simulate a classifier */
86 eth_hdr
= rte_pktmbuf_mtod(mbuf
, struct ether_hdr
*);
87 vlan1
= (struct vlan_hdr
*)(ð_hdr
->ether_type
);
88 vlan2
= (struct vlan_hdr
*)((uintptr_t)ð_hdr
->ether_type
+ sizeof(struct vlan_hdr
));
89 eth_hdr
= (struct ether_hdr
*)((uintptr_t)ð_hdr
->ether_type
+ 2 *sizeof(struct vlan_hdr
));
90 ip_hdr
= (struct ipv4_hdr
*)((uintptr_t)eth_hdr
+ sizeof(eth_hdr
->ether_type
));
92 vlan1
->vlan_tci
= rte_cpu_to_be_16(SUBPORT
);
93 vlan2
->vlan_tci
= rte_cpu_to_be_16(PIPE
);
94 eth_hdr
->ether_type
= rte_cpu_to_be_16(ETHER_TYPE_IPv4
);
95 ip_hdr
->dst_addr
= IPv4(0,0,TC
,QUEUE
);
98 rte_sched_port_pkt_write(port
, mbuf
, SUBPORT
, PIPE
, TC
, QUEUE
,
108 * test main entrance for library sched
113 struct rte_mempool
*mp
= NULL
;
114 struct rte_sched_port
*port
= NULL
;
116 struct rte_mbuf
*in_mbufs
[10];
117 struct rte_mbuf
*out_mbufs
[10];
122 mp
= create_mempool();
123 TEST_ASSERT_NOT_NULL(mp
, "Error creating mempool\n");
125 port_param
.socket
= 0;
126 port_param
.rate
= (uint64_t) 10000 * 1000 * 1000 / 8;
128 port
= rte_sched_port_config(&port_param
);
129 TEST_ASSERT_NOT_NULL(port
, "Error config sched port\n");
131 err
= rte_sched_subport_config(port
, SUBPORT
, subport_param
);
132 TEST_ASSERT_SUCCESS(err
, "Error config sched, err=%d\n", err
);
134 for (pipe
= 0; pipe
< port_param
.n_pipes_per_subport
; pipe
++) {
135 err
= rte_sched_pipe_config(port
, SUBPORT
, pipe
, 0);
136 TEST_ASSERT_SUCCESS(err
, "Error config sched pipe %u, err=%d\n", pipe
, err
);
139 for (i
= 0; i
< 10; i
++) {
140 in_mbufs
[i
] = rte_pktmbuf_alloc(mp
);
141 TEST_ASSERT_NOT_NULL(in_mbufs
[i
], "Packet allocation failed\n");
142 prepare_pkt(port
, in_mbufs
[i
]);
146 err
= rte_sched_port_enqueue(port
, in_mbufs
, 10);
147 TEST_ASSERT_EQUAL(err
, 10, "Wrong enqueue, err=%d\n", err
);
149 err
= rte_sched_port_dequeue(port
, out_mbufs
, 10);
150 TEST_ASSERT_EQUAL(err
, 10, "Wrong dequeue, err=%d\n", err
);
152 for (i
= 0; i
< 10; i
++) {
153 enum rte_color color
;
154 uint32_t subport
, traffic_class
, queue
;
156 color
= rte_sched_port_pkt_read_color(out_mbufs
[i
]);
157 TEST_ASSERT_EQUAL(color
, RTE_COLOR_YELLOW
, "Wrong color\n");
159 rte_sched_port_pkt_read_tree_path(port
, out_mbufs
[i
],
160 &subport
, &pipe
, &traffic_class
, &queue
);
162 TEST_ASSERT_EQUAL(subport
, SUBPORT
, "Wrong subport\n");
163 TEST_ASSERT_EQUAL(pipe
, PIPE
, "Wrong pipe\n");
164 TEST_ASSERT_EQUAL(traffic_class
, TC
, "Wrong traffic_class\n");
165 TEST_ASSERT_EQUAL(queue
, QUEUE
, "Wrong queue\n");
170 struct rte_sched_subport_stats subport_stats
;
172 rte_sched_subport_read_stats(port
, SUBPORT
, &subport_stats
, &tc_ov
);
174 TEST_ASSERT_EQUAL(subport_stats
.n_pkts_tc
[TC
-1], 10, "Wrong subport stats\n");
176 struct rte_sched_queue_stats queue_stats
;
178 rte_sched_queue_read_stats(port
, QUEUE
, &queue_stats
, &qlen
);
180 TEST_ASSERT_EQUAL(queue_stats
.n_pkts
, 10, "Wrong queue stats\n");
183 rte_sched_port_free(port
);
188 REGISTER_TEST_COMMAND(sched_autotest
, test_sched
);