@@ -45,7 +45,7 @@ static const char *priority2str(enum net_priority priority)
45
45
#if defined(CONFIG_NET_STATISTICS_ETHERNET ) && \
46
46
defined(CONFIG_NET_STATISTICS_USER_API )
47
47
static void print_eth_stats (struct net_if * iface , struct net_stats_eth * data ,
48
- const struct shell * sh )
48
+ const struct shell * sh , struct net_shell_user_data * user_data )
49
49
{
50
50
PR ("Statistics for Ethernet interface %p [%d]\n" , iface ,
51
51
net_if_get_by_iface (iface ));
@@ -69,16 +69,42 @@ static void print_eth_stats(struct net_if *iface, struct net_stats_eth *data,
69
69
70
70
#if defined(CONFIG_NET_STATISTICS_ETHERNET_VENDOR )
71
71
if (data -> vendor ) {
72
- PR ("Vendor specific statistics for Ethernet "
73
- "interface %p [%d]:\n" ,
74
- iface , net_if_get_by_iface (iface ));
75
72
size_t i = 0 ;
73
+ enum net_shell_stats_format format = NET_SHELL_STATS_FORMAT_DEFAULT ;
74
+
75
+ if (user_data ) {
76
+ format = user_data -> vendor_stats_format ;
77
+ }
78
+
79
+ PR ("Vendor specific statistics for Ethernet interface %p [%d]:\n" ,
80
+ iface , net_if_get_by_iface (iface ));
81
+
82
+ /* Print key-value pairs if requested */
83
+ if (format == NET_SHELL_STATS_FORMAT_DEFAULT ||
84
+ format == NET_SHELL_STATS_FORMAT_KEY_VALUE ||
85
+ format == NET_SHELL_STATS_FORMAT_BOTH ) {
86
+ do {
87
+ PR ("%s : %u\n" , data -> vendor [i ].key , data -> vendor [i ].value );
88
+ i ++ ;
89
+ } while (data -> vendor [i ].key );
90
+ }
76
91
77
- do {
78
- PR ("%s : %u\n" , data -> vendor [i ].key ,
79
- data -> vendor [i ].value );
80
- i ++ ;
81
- } while (data -> vendor [i ].key );
92
+ /* Print hex blob if requested */
93
+ if (format == NET_SHELL_STATS_FORMAT_HEX_BLOB ||
94
+ format == NET_SHELL_STATS_FORMAT_BOTH ) {
95
+ /* Suitable for parsing */
96
+ PR ("Vendor stats hex blob: " );
97
+ for (i = 0 ; data -> vendor [i ].key ; i ++ ) {
98
+ uint32_t v = data -> vendor [i ].value ;
99
+
100
+ PR ("%02x%02x%02x%02x" ,
101
+ (uint8_t )(v & 0xFF ),
102
+ (uint8_t )((v >> 8 ) & 0xFF ),
103
+ (uint8_t )((v >> 16 ) & 0xFF ),
104
+ (uint8_t )((v >> 24 ) & 0xFF ));
105
+ }
106
+ PR ("\n" );
107
+ }
82
108
}
83
109
#endif /* CONFIG_NET_STATISTICS_ETHERNET_VENDOR */
84
110
}
@@ -513,7 +539,7 @@ static void net_shell_print_statistics(struct net_if *iface, void *user_data)
513
539
ret = net_mgmt (NET_REQUEST_STATS_GET_ETHERNET , iface ,
514
540
& eth_data , sizeof (eth_data ));
515
541
if (!ret ) {
516
- print_eth_stats (iface , & eth_data , sh );
542
+ print_eth_stats (iface , & eth_data , sh , data );
517
543
}
518
544
}
519
545
#endif /* CONFIG_NET_STATISTICS_ETHERNET && CONFIG_NET_STATISTICS_USER_API */
@@ -551,6 +577,18 @@ int cmd_net_stats_all(const struct shell *sh, size_t argc, char *argv[])
551
577
552
578
#if defined(CONFIG_NET_STATISTICS )
553
579
user_data .sh = sh ;
580
+ user_data .vendor_stats_format = NET_SHELL_STATS_FORMAT_DEFAULT ;
581
+
582
+ /* Parse format argument if provided */
583
+ if (argc > 1 ) {
584
+ if (strcmp (argv [1 ], "key-value" ) == 0 ) {
585
+ user_data .vendor_stats_format = NET_SHELL_STATS_FORMAT_KEY_VALUE ;
586
+ } else if (strcmp (argv [1 ], "hex-blob" ) == 0 ) {
587
+ user_data .vendor_stats_format = NET_SHELL_STATS_FORMAT_HEX_BLOB ;
588
+ } else if (strcmp (argv [1 ], "both" ) == 0 ) {
589
+ user_data .vendor_stats_format = NET_SHELL_STATS_FORMAT_BOTH ;
590
+ }
591
+ }
554
592
555
593
/* Print global network statistics */
556
594
net_shell_print_statistics_all (& user_data );
@@ -596,6 +634,18 @@ int cmd_net_stats_iface(const struct shell *sh, size_t argc, char *argv[])
596
634
}
597
635
598
636
data .sh = sh ;
637
+ data .vendor_stats_format = NET_SHELL_STATS_FORMAT_DEFAULT ;
638
+
639
+ /* Parse format argument if provided */
640
+ if (argc > 2 ) {
641
+ if (strcmp (argv [2 ], "key-value" ) == 0 ) {
642
+ data .vendor_stats_format = NET_SHELL_STATS_FORMAT_KEY_VALUE ;
643
+ } else if (strcmp (argv [2 ], "hex-blob" ) == 0 ) {
644
+ data .vendor_stats_format = NET_SHELL_STATS_FORMAT_HEX_BLOB ;
645
+ } else if (strcmp (argv [2 ], "both" ) == 0 ) {
646
+ data .vendor_stats_format = NET_SHELL_STATS_FORMAT_BOTH ;
647
+ }
648
+ }
599
649
600
650
net_shell_print_statistics (iface , & data );
601
651
#else
@@ -645,15 +695,20 @@ static int cmd_net_stats(const struct shell *sh, size_t argc, char *argv[])
645
695
646
696
SHELL_STATIC_SUBCMD_SET_CREATE (net_cmd_stats ,
647
697
SHELL_CMD (all , NULL ,
648
- "Show network statistics for all network interfaces." ,
698
+ "Show network statistics for all network interfaces.\n"
699
+ "Usage: net stats all [key-value|hex-blob|both]" ,
649
700
cmd_net_stats_all ),
650
701
SHELL_CMD (iface , IFACE_DYN_CMD ,
651
- "'net stats <index>' shows network statistics for "
652
- "one specific network interface." ,
702
+ "'net stats <index> [key-value|hex-blob|both]' shows network statistics for "
703
+ "one specific network interface.\n"
704
+ "Format options:\n"
705
+ " key-value: Show vendor stats as key-value pairs (default)\n"
706
+ " hex-blob: Show vendor stats as hex blob for parsing\n"
707
+ " both: Show both key-value and hex blob formats" ,
653
708
cmd_net_stats_iface ),
654
709
SHELL_SUBCMD_SET_END
655
710
);
656
711
657
712
SHELL_SUBCMD_ADD ((net ), stats , & net_cmd_stats ,
658
713
"Show network statistics." ,
659
- cmd_net_stats , 1 , 1 );
714
+ cmd_net_stats , 1 , 3 );
0 commit comments