24
24
#include <sys/stat.h>
25
25
#include <net/if.h>
26
26
#include <errno.h>
27
+ #include <inttypes.h>
27
28
28
29
/* local includes */
29
30
#include "gtp_guard.h"
@@ -223,6 +224,186 @@ gtp_config_write(vty_t *vty)
223
224
return CMD_SUCCESS ;
224
225
}
225
226
227
+ /* XXX TODO, extend gtp_server_for_each_worker(gtp_server_t *srv, int (*hdl) (gtp_server_worker_t *)) */
228
+ static int
229
+ _gtp_server_for_each_worker (gtp_server_t * srv , int (* cb ) (gtp_server_worker_t * , void * ), void * arg )
230
+ {
231
+ gtp_server_worker_t * w ;
232
+
233
+ pthread_mutex_lock (& srv -> workers_mutex );
234
+ list_for_each_entry (w , & srv -> workers , next )
235
+ (* cb ) (w , arg );
236
+ pthread_mutex_unlock (& srv -> workers_mutex );
237
+ return 0 ;
238
+ }
239
+
240
+ struct vty_server_work_arg {
241
+ vty_t * vty ;
242
+ const gtp_msg_type_map_t * msg_type2str ;
243
+ };
244
+
245
+ static int
246
+ vty_server_worker (gtp_server_worker_t * w , void * arg )
247
+ {
248
+ char flags2str [BUFSIZ ];
249
+ vty_t * vty = ((struct vty_server_work_arg * )arg )-> vty ;
250
+ const gtp_msg_type_map_t * msg_type2str = ((struct vty_server_work_arg * )arg )-> msg_type2str ;
251
+ char fdpath [PATH_MAX ];
252
+
253
+ vty_out (vty , " %s worker %d task 0x%lx fd %d (%s)%s"
254
+ " flags:%s%s"
255
+ " seed:%d pbuff:%p (len:%d size:%d bytes)%s"
256
+ " rx:%" PRIu64 "bytes %" PRIu64 "pkt | tx:%" PRIu64 "bytes %" PRIu64 "pkt%s"
257
+ , w -> pname
258
+ , w -> id
259
+ , w -> task
260
+ , w -> fd , w -> fd >= 0 ? gtp_disk_fd2filename (w -> fd , fdpath , sizeof (fdpath )) : "none"
261
+ , VTY_NEWLINE
262
+ , gtp_flags2str (flags2str , sizeof (flags2str ), w -> flags )
263
+ , VTY_NEWLINE
264
+ , w -> seed , w -> pbuff
265
+ , pkt_buffer_len (w -> pbuff ), pkt_buffer_size (w -> pbuff )
266
+ , VTY_NEWLINE
267
+ , w -> rx_bytes , w -> rx_pkt
268
+ , w -> tx_bytes , w -> tx_pkt
269
+ , VTY_NEWLINE );
270
+
271
+ vty_out (vty , " RX:%s"
272
+ , VTY_NEWLINE );
273
+ for (int i = 0 ; i < ARRAY_SIZE (w -> msg_stats .rx ); i ++ ) {
274
+ if (w -> msg_stats .rx [i ].count != 0 )
275
+ vty_out (vty , " %s(%d): %d%s"
276
+ , msg_type2str
277
+ ? msg_type2str [i ].name
278
+ : "null"
279
+ , i
280
+ , w -> msg_stats .rx [i ].count
281
+ , VTY_NEWLINE );
282
+ if (w -> msg_stats .rx [i ].unsupported != 0 )
283
+ vty_out (vty , " %s(%d): %d (not supported)%s"
284
+ , msg_type2str
285
+ ? msg_type2str [i ].name ? msg_type2str [i ].name : "bad type"
286
+ : "null"
287
+ , i
288
+ , w -> msg_stats .rx [i ].unsupported
289
+ , VTY_NEWLINE );
290
+ if (w -> cause_stats .rx [i ].count != 0 )
291
+ vty_out (vty , " %s(%d): %d%s"
292
+ , gtpc_msg_cause2str [i ].name ? gtpc_msg_cause2str [i ].name : "bad cause"
293
+ , i
294
+ , w -> cause_stats .rx [i ].count
295
+ , VTY_NEWLINE );
296
+ }
297
+ vty_out (vty , " TX:%s"
298
+ , VTY_NEWLINE );
299
+ for (int i = 0 ; i < ARRAY_SIZE (w -> msg_stats .tx ); i ++ ) {
300
+ if (w -> msg_stats .tx [i ].count != 0 )
301
+ vty_out (vty , " %s(%d): %d%s"
302
+ , msg_type2str
303
+ ? msg_type2str [i ].name
304
+ : "null"
305
+ , i
306
+ , w -> msg_stats .tx [i ].count
307
+ , VTY_NEWLINE );
308
+ if (w -> msg_stats .tx [i ].unsupported != 0 )
309
+ vty_out (vty , " %s(%d): %d (not supported)%s"
310
+ , msg_type2str
311
+ ? msg_type2str [i ].name ? msg_type2str [i ].name : "bad type"
312
+ : "null"
313
+ , i
314
+ , w -> msg_stats .tx [i ].unsupported
315
+ , VTY_NEWLINE );
316
+ if (w -> cause_stats .tx [i ].count != 0 )
317
+ vty_out (vty , " %s(%d): %d%s"
318
+ , gtpc_msg_cause2str [i ].name ? gtpc_msg_cause2str [i ].name : "bad cause"
319
+ , i
320
+ , w -> cause_stats .tx [i ].count
321
+ , VTY_NEWLINE );
322
+ }
323
+
324
+ return CMD_SUCCESS ;
325
+ }
326
+
327
+ static int
328
+ vty_server (vty_t * vty , gtp_server_t * srv , const char * gtplane , const gtp_msg_type_map_t * msg_type2str )
329
+ {
330
+ char flags2str [BUFSIZ ];
331
+
332
+ vty_out (vty , " %s: %s port %d with %d threads%s"
333
+ " flags:0x%lx (%s)%s"
334
+ , gtplane
335
+ , inet_sockaddrtos (& srv -> addr )
336
+ , ntohs (inet_sockaddrport (& srv -> addr ))
337
+ , srv -> thread_cnt
338
+ , VTY_NEWLINE
339
+ , srv -> flags , gtp_flags2str (flags2str , sizeof (flags2str ), srv -> flags )
340
+ , VTY_NEWLINE );
341
+ struct vty_server_work_arg arg = {
342
+ .vty = vty ,
343
+ .msg_type2str = msg_type2str ,
344
+ };
345
+ _gtp_server_for_each_worker (srv , vty_server_worker , & arg );
346
+
347
+ return CMD_SUCCESS ;
348
+ }
349
+
350
+ /* show handlers */
351
+ DEFUN (show_workers_gtp_router ,
352
+ show_workers_gtp_router_cmd ,
353
+ "show workers gtp-router (*|STRING) [plane (gtpu|gtpc|both)]" ,
354
+ SHOW_STR
355
+ "workers tasks\n"
356
+ "gtp-router gtpc and gtpu workers\n"
357
+ "all workers\n"
358
+ "Router name\n"
359
+ "GTPu\n"
360
+ "GTPc\n"
361
+ "both GTPu and GTPc\n" )
362
+ {
363
+ const list_head_t * l = & daemon_data -> gtp_router_ctx ;
364
+ gtp_router_t * ctx ;
365
+
366
+ const char * name = (argc > 0 ) ? argv [0 ] : "*" ;
367
+ const char * plane = (argc > 2 ) ? argv [2 ] : "both" ;
368
+
369
+ list_for_each_entry (ctx , l , next ) {
370
+ char flags2str [BUFSIZ ];
371
+
372
+ if ((name [0 ] != '*' ) && (strcmp (name , ctx -> name ) != 0 ))
373
+ continue ;
374
+
375
+ vty_out (vty , "gtp-router %s refcnt:%d%s"
376
+ " flags:0x%lx (%s)%s"
377
+ , ctx -> name
378
+ , ctx -> refcnt
379
+ , VTY_NEWLINE
380
+ , ctx -> flags , gtp_flags2str (flags2str , sizeof (flags2str ), ctx -> flags )
381
+ , VTY_NEWLINE );
382
+
383
+ if ((strcmp (plane , "both" ) == 0 ) ||
384
+ (strcmp (plane , "gtpc" ) == 0 )) {
385
+ gtp_server_t * srv = & ctx -> gtpc ;
386
+ if (__test_bit (GTP_FL_CTL_BIT , & srv -> flags ))
387
+ vty_server (vty , srv , "gtpc" , gtpc_msg_type2str );
388
+ else
389
+ vty_out (vty , " gtpc: none%s"
390
+ , VTY_NEWLINE );
391
+ }
392
+
393
+ if ((strcmp (plane , "both" ) == 0 ) ||
394
+ (strcmp (plane , "gtpu" ) == 0 )) {
395
+ gtp_server_t * srv = & ctx -> gtpu ;
396
+ if (__test_bit (GTP_FL_UPF_BIT , & srv -> flags ))
397
+ vty_server (vty , srv , "gtpu" , gtpu_msg_type2str );
398
+ else
399
+ vty_out (vty , " gtpu: none%s"
400
+ , VTY_NEWLINE );
401
+ }
402
+ }
403
+
404
+ return CMD_SUCCESS ;
405
+ }
406
+
226
407
227
408
/*
228
409
* VTY init
@@ -239,5 +420,7 @@ gtp_router_vty_init(void)
239
420
install_element (GTP_ROUTER_NODE , & gtpc_router_tunnel_endpoint_cmd );
240
421
install_element (GTP_ROUTER_NODE , & gtpu_router_tunnel_endpoint_cmd );
241
422
423
+ install_element (ENABLE_NODE , & show_workers_gtp_router_cmd );
424
+
242
425
return 0 ;
243
426
}
0 commit comments