@@ -14,8 +14,16 @@ LOG_MODULE_DECLARE(net_shell);
14
14
15
15
#include "../ip/net_stats.h"
16
16
17
+ enum net_shell_stats_format {
18
+ NET_SHELL_STATS_FORMAT_DEFAULT ,
19
+ NET_SHELL_STATS_FORMAT_KEY_VALUE ,
20
+ NET_SHELL_STATS_FORMAT_HEX_BLOB ,
21
+ NET_SHELL_STATS_FORMAT_BOTH
22
+ };
23
+
17
24
#if defined(CONFIG_NET_STATISTICS )
18
25
26
+
19
27
#if NET_TC_COUNT > 1
20
28
static const char * priority2str (enum net_priority priority )
21
29
{
@@ -45,7 +53,7 @@ static const char *priority2str(enum net_priority priority)
45
53
#if defined(CONFIG_NET_STATISTICS_ETHERNET ) && \
46
54
defined(CONFIG_NET_STATISTICS_USER_API )
47
55
static void print_eth_stats (struct net_if * iface , struct net_stats_eth * data ,
48
- const struct shell * sh )
56
+ const struct shell * sh , struct net_shell_user_data * user_data )
49
57
{
50
58
PR ("Statistics for Ethernet interface %p [%d]\n" , iface ,
51
59
net_if_get_by_iface (iface ));
@@ -110,16 +118,42 @@ static void print_eth_stats(struct net_if *iface, struct net_stats_eth *data,
110
118
111
119
#if defined(CONFIG_NET_STATISTICS_ETHERNET_VENDOR )
112
120
if (data -> vendor ) {
113
- PR ("Vendor specific statistics for Ethernet "
114
- "interface %p [%d]:\n" ,
115
- iface , net_if_get_by_iface (iface ));
116
121
size_t i = 0 ;
122
+ enum net_shell_stats_format format = NET_SHELL_STATS_FORMAT_DEFAULT ;
123
+
124
+ if (user_data ) {
125
+ format = * (enum net_shell_stats_format * )user_data -> user_data ;
126
+ }
117
127
118
- do {
119
- PR ("%s : %u\n" , data -> vendor [i ].key ,
120
- data -> vendor [i ].value );
121
- i ++ ;
122
- } while (data -> vendor [i ].key );
128
+ PR ("Vendor specific statistics for Ethernet interface %p [%d]:\n" ,
129
+ iface , net_if_get_by_iface (iface ));
130
+
131
+ /* Print key-value pairs if requested */
132
+ if (format == NET_SHELL_STATS_FORMAT_DEFAULT ||
133
+ format == NET_SHELL_STATS_FORMAT_KEY_VALUE ||
134
+ format == NET_SHELL_STATS_FORMAT_BOTH ) {
135
+ do {
136
+ PR ("%s : %u\n" , data -> vendor [i ].key , data -> vendor [i ].value );
137
+ i ++ ;
138
+ } while (data -> vendor [i ].key != NULL );
139
+ }
140
+
141
+ /* Print hex blob if requested */
142
+ if (format == NET_SHELL_STATS_FORMAT_HEX_BLOB ||
143
+ format == NET_SHELL_STATS_FORMAT_BOTH ) {
144
+ /* Suitable for parsing */
145
+ PR ("Vendor stats hex blob: " );
146
+ for (i = 0 ; data -> vendor [i ].key != NULL ; i ++ ) {
147
+ uint32_t v = data -> vendor [i ].value ;
148
+
149
+ PR ("%02x%02x%02x%02x" ,
150
+ (uint8_t )(v & 0xFF ),
151
+ (uint8_t )((v >> 8 ) & 0xFF ),
152
+ (uint8_t )((v >> 16 ) & 0xFF ),
153
+ (uint8_t )((v >> 24 ) & 0xFF ));
154
+ }
155
+ PR ("\n" );
156
+ }
123
157
}
124
158
#endif /* CONFIG_NET_STATISTICS_ETHERNET_VENDOR */
125
159
}
@@ -591,7 +625,7 @@ static void net_shell_print_statistics(struct net_if *iface, void *user_data)
591
625
ret = net_mgmt (NET_REQUEST_STATS_GET_ETHERNET , iface ,
592
626
& eth_data , sizeof (eth_data ));
593
627
if (!ret ) {
594
- print_eth_stats (iface , & eth_data , sh );
628
+ print_eth_stats (iface , & eth_data , sh , data );
595
629
}
596
630
}
597
631
#endif /* CONFIG_NET_STATISTICS_ETHERNET && CONFIG_NET_STATISTICS_USER_API */
@@ -628,8 +662,23 @@ int cmd_net_stats_all(const struct shell *sh, size_t argc, char *argv[])
628
662
#endif
629
663
630
664
#if defined(CONFIG_NET_STATISTICS )
665
+ enum net_shell_stats_format format = NET_SHELL_STATS_FORMAT_DEFAULT ;
666
+
631
667
user_data .sh = sh ;
632
668
669
+ /* Parse format argument if provided */
670
+ if (argc > 1 ) {
671
+ if (strcmp (argv [1 ], "key-value" ) == 0 ) {
672
+ format = NET_SHELL_STATS_FORMAT_KEY_VALUE ;
673
+ } else if (strcmp (argv [1 ], "hex-blob" ) == 0 ) {
674
+ format = NET_SHELL_STATS_FORMAT_HEX_BLOB ;
675
+ } else if (strcmp (argv [1 ], "both" ) == 0 ) {
676
+ format = NET_SHELL_STATS_FORMAT_BOTH ;
677
+ }
678
+ }
679
+
680
+ user_data .user_data = & format ;
681
+
633
682
/* Print global network statistics */
634
683
net_shell_print_statistics_all (& user_data );
635
684
#else
@@ -673,8 +722,23 @@ int cmd_net_stats_iface(const struct shell *sh, size_t argc, char *argv[])
673
722
return - ENOEXEC ;
674
723
}
675
724
725
+ enum net_shell_stats_format format = NET_SHELL_STATS_FORMAT_DEFAULT ;
726
+
676
727
data .sh = sh ;
677
728
729
+ /* Parse format argument if provided */
730
+ if (argc > 2 ) {
731
+ if (strcmp (argv [2 ], "key-value" ) == 0 ) {
732
+ format = NET_SHELL_STATS_FORMAT_KEY_VALUE ;
733
+ } else if (strcmp (argv [2 ], "hex-blob" ) == 0 ) {
734
+ format = NET_SHELL_STATS_FORMAT_HEX_BLOB ;
735
+ } else if (strcmp (argv [2 ], "both" ) == 0 ) {
736
+ format = NET_SHELL_STATS_FORMAT_BOTH ;
737
+ }
738
+ }
739
+
740
+ data .user_data = & format ;
741
+
678
742
net_shell_print_statistics (iface , & data );
679
743
#else
680
744
PR_INFO ("Per network interface statistics not collected.\n" );
@@ -702,7 +766,8 @@ static int cmd_net_stats(const struct shell *sh, size_t argc, char *argv[])
702
766
if (strcmp (argv [1 ], "reset" ) == 0 ) {
703
767
net_stats_reset (NULL );
704
768
} else {
705
- cmd_net_stats_iface (sh , argc , argv );
769
+ /* Shift arguments for iface command */
770
+ cmd_net_stats_iface (sh , argc - 1 , & argv [1 ]);
706
771
}
707
772
#else
708
773
ARG_UNUSED (argc );
@@ -723,15 +788,20 @@ static int cmd_net_stats(const struct shell *sh, size_t argc, char *argv[])
723
788
724
789
SHELL_STATIC_SUBCMD_SET_CREATE (net_cmd_stats ,
725
790
SHELL_CMD (all , NULL ,
726
- "Show network statistics for all network interfaces." ,
791
+ "Show network statistics for all network interfaces.\n"
792
+ "Usage: net stats all [key-value|hex-blob|both]" ,
727
793
cmd_net_stats_all ),
728
794
SHELL_CMD (iface , IFACE_DYN_CMD ,
729
- "'net stats <index>' shows network statistics for "
730
- "one specific network interface." ,
795
+ "'net stats <index> [key-value|hex-blob|both]' shows network statistics for "
796
+ "one specific network interface.\n"
797
+ "Format options:\n"
798
+ " key-value: Show vendor stats as key-value pairs (default)\n"
799
+ " hex-blob: Show vendor stats as hex blob for parsing\n"
800
+ " both: Show both key-value and hex blob formats" ,
731
801
cmd_net_stats_iface ),
732
802
SHELL_SUBCMD_SET_END
733
803
);
734
804
735
805
SHELL_SUBCMD_ADD ((net ), stats , & net_cmd_stats ,
736
806
"Show network statistics." ,
737
- cmd_net_stats , 1 , 1 );
807
+ cmd_net_stats , 1 , 3 );
0 commit comments