@@ -41,13 +41,70 @@ struct sockaddr_in *zperf_get_sin(void)
41
41
return & in4_addr_my ;
42
42
}
43
43
44
- #define ZPERF_WORK_Q_THREAD_PRIORITY \
45
- CLAMP(CONFIG_ZPERF_WORK_Q_THREAD_PRIORITY, K_HIGHEST_APPLICATION_THREAD_PRIO, \
44
+ #define ZPERF_WORK_Q_THREAD_PRIORITY \
45
+ CLAMP(CONFIG_ZPERF_WORK_Q_THREAD_PRIORITY, \
46
+ K_HIGHEST_APPLICATION_THREAD_PRIO, \
46
47
K_LOWEST_APPLICATION_THREAD_PRIO)
47
- K_THREAD_STACK_DEFINE (zperf_work_q_stack , CONFIG_ZPERF_WORK_Q_STACK_SIZE );
48
48
49
+ #if defined(CONFIG_ZPERF_SESSION_PER_THREAD )
50
+ struct zperf_work {
51
+ struct k_work_q * queue ;
52
+ struct z_thread_stack_element * stack ;
53
+ size_t stack_size ;
54
+ };
55
+
56
+ #define CREATE_WORK_Q (i , _ ) \
57
+ static struct k_work_q zperf_work_q_##i; \
58
+ static K_KERNEL_STACK_DEFINE(zperf_work_q_stack_##i, \
59
+ CONFIG_ZPERF_WORK_Q_STACK_SIZE)
60
+
61
+ /* Both UDP and TCP can have separate sessions so multiply by 2 */
62
+ #if defined(CONFIG_NET_UDP ) && defined(CONFIG_NET_TCP )
63
+ #define MAX_SESSION_COUNT UTIL_X2(CONFIG_NET_ZPERF_MAX_SESSIONS)
64
+ #define SESSION_INDEX CONFIG_NET_ZPERF_MAX_SESSIONS
65
+ #else
66
+ #define MAX_SESSION_COUNT CONFIG_NET_ZPERF_MAX_SESSIONS
67
+ #define SESSION_INDEX 0
68
+ #endif
69
+
70
+ LISTIFY (MAX_SESSION_COUNT , CREATE_WORK_Q , (;), _ );
71
+
72
+ #define SET_WORK_Q (i , _ ) \
73
+ [i] = { \
74
+ .queue = &zperf_work_q_##i, \
75
+ .stack = zperf_work_q_stack_##i, \
76
+ .stack_size = K_THREAD_STACK_SIZEOF(zperf_work_q_stack_##i), \
77
+ }
78
+
79
+ static struct zperf_work zperf_work_q [] = {
80
+ LISTIFY (MAX_SESSION_COUNT , SET_WORK_Q , (,), _ )
81
+ };
82
+
83
+ struct k_work_q * get_queue (enum session_proto proto , int session_id )
84
+ {
85
+ if (session_id < 0 || session_id >= CONFIG_NET_ZPERF_MAX_SESSIONS ) {
86
+ return NULL ;
87
+ }
88
+
89
+ if (proto < 0 || proto >= SESSION_PROTO_END ) {
90
+ return NULL ;
91
+ }
92
+
93
+ NET_DBG ("%s using queue %d for session %d\n" ,
94
+ proto == SESSION_UDP ? "UDP" : "TCP" ,
95
+ proto * SESSION_INDEX + session_id ,
96
+ session_id );
97
+
98
+ return zperf_work_q [proto * SESSION_INDEX + session_id ].queue ;
99
+ }
100
+
101
+ #else /* CONFIG_ZPERF_SESSION_PER_THREAD */
102
+
103
+ K_THREAD_STACK_DEFINE (zperf_work_q_stack , CONFIG_ZPERF_WORK_Q_STACK_SIZE );
49
104
static struct k_work_q zperf_work_q ;
50
105
106
+ #endif /* CONFIG_ZPERF_SESSION_PER_THREAD */
107
+
51
108
int zperf_get_ipv6_addr (char * host , char * prefix_str , struct in6_addr * addr )
52
109
{
53
110
struct net_if_ipv6_prefix * prefix ;
@@ -220,28 +277,62 @@ uint32_t zperf_packet_duration(uint32_t packet_size, uint32_t rate_in_kbps)
220
277
(rate_in_kbps * 1024U ));
221
278
}
222
279
223
- void zperf_async_work_submit (struct k_work * work )
280
+ void zperf_async_work_submit (enum session_proto proto , int session_id , struct k_work * work )
224
281
{
282
+ #if defined(CONFIG_ZPERF_SESSION_PER_THREAD )
283
+ k_work_submit_to_queue (zperf_work_q [proto * SESSION_INDEX + session_id ].queue , work );
284
+ #else
285
+ ARG_UNUSED (proto );
286
+ ARG_UNUSED (session_id );
287
+
225
288
k_work_submit_to_queue (& zperf_work_q , work );
289
+ #endif
226
290
}
227
291
228
292
static int zperf_init (void )
229
293
{
294
+ #if defined(CONFIG_ZPERF_SESSION_PER_THREAD )
295
+
296
+ ARRAY_FOR_EACH (zperf_work_q , i ) {
297
+ struct k_work_queue_config cfg = {
298
+ .no_yield = false,
299
+ };
300
+
301
+ #define MAX_NAME_LEN sizeof("zperf_work_q[xxx]")
302
+ char name [MAX_NAME_LEN ];
303
+
304
+ snprintk (name , sizeof (name ), "zperf_work_q[%d]" , i );
305
+ cfg .name = name ;
306
+
307
+ k_work_queue_init (zperf_work_q [i ].queue );
308
+
309
+ k_work_queue_start (zperf_work_q [i ].queue ,
310
+ zperf_work_q [i ].stack ,
311
+ zperf_work_q [i ].stack_size ,
312
+ ZPERF_WORK_Q_THREAD_PRIORITY ,
313
+ & cfg );
314
+ }
315
+
316
+ #else /* CONFIG_ZPERF_SESSION_PER_THREAD */
230
317
231
318
k_work_queue_init (& zperf_work_q );
232
319
k_work_queue_start (& zperf_work_q , zperf_work_q_stack ,
233
- K_THREAD_STACK_SIZEOF (zperf_work_q_stack ), ZPERF_WORK_Q_THREAD_PRIORITY ,
320
+ K_THREAD_STACK_SIZEOF (zperf_work_q_stack ),
321
+ ZPERF_WORK_Q_THREAD_PRIORITY ,
234
322
NULL );
235
323
k_thread_name_set (& zperf_work_q .thread , "zperf_work_q" );
236
324
325
+ #endif /* CONFIG_ZPERF_SESSION_PER_THREAD */
326
+
237
327
if (IS_ENABLED (CONFIG_NET_UDP )) {
238
328
zperf_udp_uploader_init ();
239
329
}
240
330
if (IS_ENABLED (CONFIG_NET_TCP )) {
241
331
zperf_tcp_uploader_init ();
242
332
}
243
333
244
- if (IS_ENABLED (CONFIG_NET_ZPERF_SERVER )) {
334
+ if (IS_ENABLED (CONFIG_NET_ZPERF_SERVER ) ||
335
+ IS_ENABLED (CONFIG_ZPERF_SESSION_PER_THREAD )) {
245
336
zperf_session_init ();
246
337
}
247
338
0 commit comments