diff --git a/ChangeLog.txt b/ChangeLog.txt index 6ce50e4ab..a7c6c76d7 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -1466,8 +1466,8 @@ calls (2015-11-25). * apps/nshlib: If CONFIG_NETDEV_STATISTICS=y, then print the network driver statistics in the ifconfig (15-11-26). - * apps/nshlib: The 'ifconfig' command now uses /proc/net/stat to - show network statistics. A consequence of this is that you cannot - view network statistics if the procfs is not enabled and mounted - at /proc (2015-11-27). - + * apps/nshlib: The 'ifconfig' command now uses /proc/net/ to view + and network device configuration/status and /proc/net/stat to show + network statistics. A consequence of this is that you cannot view + this network information if the procfs is not enabled and mounted at + /proc (2015-11-27). diff --git a/nshlib/nsh.h b/nshlib/nsh.h index a1e900647..f5405dbed 100644 --- a/nshlib/nsh.h +++ b/nshlib/nsh.h @@ -601,16 +601,23 @@ */ #if defined(CONFIG_BUILD_PROTECTED) || defined(CONFIG_BUILD_KERNEL) -# undef CONFIG_NSH_DISABLE_PS /* 'ps' depends on sched_foreach */ +# undef CONFIG_NSH_DISABLE_PS /* 'ps' depends on sched_foreach */ # define CONFIG_NSH_DISABLE_PS 1 -# undef CONFIG_NSH_DISABLE_DF /* 'df' depends on foreach_mountpoint */ +# undef CONFIG_NSH_DISABLE_DF /* 'df' depends on foreach_mountpoint */ # define CONFIG_NSH_DISABLE_DF 1 -# undef CONFIG_NSH_DISABLE_MKFATFS /* 'mkfatfs' depends on mkfatfs interface */ +# undef CONFIG_NSH_DISABLE_MKFATFS /* 'mkfatfs' depends on mkfatfs interface */ # define CONFIG_NSH_DISABLE_MKFATFS 1 -# undef CONFIG_NSH_DISABLE_MKRD /* 'mkrd' depends on ramdisk_register */ +# undef CONFIG_NSH_DISABLE_MKRD /* 'mkrd' depends on ramdisk_register */ # define CONFIG_NSH_DISABLE_MKRD 1 #endif +/* Certain commands are only available if the procfs file system is enable */ + +#if !defined(CONFIG_FS_PROCFS) || defined(CONFIG_FS_PROCFS_EXCLUDE_NET) +# undef CONFIG_NSH_DISABLE_IFCONFIG /* 'ifconfig' depends on network procfs */ +# define CONFIG_NSH_DISABLE_IFCONFIG 1 +#endif + /**************************************************************************** * Public Types ****************************************************************************/ diff --git a/nshlib/nsh_netcmds.c b/nshlib/nsh_netcmds.c index 58e24e60e..214d88829 100644 --- a/nshlib/nsh_netcmds.c +++ b/nshlib/nsh_netcmds.c @@ -285,88 +285,6 @@ static inline void net_statistics(FAR struct nsh_vtbl_s *vtbl) # define net_statistics(vtbl) #endif -/**************************************************************************** - * Name: net_statistics - ****************************************************************************/ - -#if defined(CONFIG_NETDEV_STATISTICS) && !defined(CONFIG_NSH_DISABLE_IFCONFIG) -static inline void netdev_statistics(FAR struct nsh_vtbl_s *vtbl, - FAR struct net_driver_s *dev) -{ - FAR struct netdev_statistics_s *stats = &dev->d_statistics; - FAR char *fmt; - - /* Rx Statistics */ - - nsh_output(vtbl, "\tRX: %-8s %-8s %-8s\n", - "Received", "Fragment", "Errors"); - nsh_output(vtbl, "\t %08lx %08lx %08lx\n", - (unsigned long)stats->rx_packets, - (unsigned long)stats->rx_fragments, - (unsigned long)stats->rx_errors); - - fmt = "\t " -#ifdef CONFIG_NET_IPv4 - "%-8s " -#endif -#ifdef CONFIG_NET_IPv6 - "%-8s " -#endif -#ifdef CONFIG_NET_ARP - "%-8s " -#endif - "%-8s\n"; - - nsh_output(vtbl, fmt -#ifdef CONFIG_NET_IPv4 - , "IPv4" -#endif -#ifdef CONFIG_NET_IPv6 - , "IPv6" -#endif -#ifdef CONFIG_NET_ARP - , "ARP" -#endif - , "Dropped"); - - fmt = "\t " -#ifdef CONFIG_NET_IPv4 - "%08lx " -#endif -#ifdef CONFIG_NET_IPv6 - "%08lx " -#endif -#ifdef CONFIG_NET_ARP - "%08lx " -#endif - "%08lx\n"; - - nsh_output(vtbl, fmt -#ifdef CONFIG_NET_IPv4 - , (unsigned long)stats->rx_ipv4 -#endif -#ifdef CONFIG_NET_IPv6 - , (unsigned long)stats->rx_ipv6 -#endif -#ifdef CONFIG_NET_ARP - , (unsigned long)stats->rx_arp -#endif - , (unsigned long)stats->rx_dropped); - - nsh_output(vtbl, "\tTX: %-8s %-8s %-8s %-8s\n", - "Queued", "Sent", "Erorts", "Timeouts"); - nsh_output(vtbl, "\t %08lx %08lx %08lx %08lx\n", - (unsigned long)stats->tx_packets, - (unsigned long)stats->tx_done, - (unsigned long)stats->tx_errors, - (unsigned long)stats->tx_timeouts); - nsh_output(vtbl, "\tTotal Errors: %08x\n\n", - (unsigned long)stats->errors); -} -#else -# define netdev_statistics(vtbl,dev) -#endif - /**************************************************************************** * Name: ifconfig_callback ****************************************************************************/ @@ -374,153 +292,16 @@ static inline void netdev_statistics(FAR struct nsh_vtbl_s *vtbl, #if !defined(CONFIG_NSH_DISABLE_IFUPDOWN) || !defined(CONFIG_NSH_DISABLE_IFCONFIG) static int ifconfig_callback(FAR struct net_driver_s *dev, void *arg) { - struct nsh_vtbl_s *vtbl = (struct nsh_vtbl_s*)arg; -#ifdef CONFIG_NET_IPv4 - struct in_addr addr; -#endif -#ifdef CONFIG_NET_IPv6 - char addrstr[INET6_ADDRSTRLEN]; - uint8_t preflen; -#endif - uint8_t iff; - const char *status; - int ret; + FAR struct nsh_vtbl_s *vtbl = (FAR struct nsh_vtbl_s *)arg; + char buffer[IFNAMSIZ + 12]; - /* Get the interface status: RUNNING, UP, or DOWN */ + DEBUGASSERT(dev != NULL && vtbl != NULL); - ret = netlib_getifstatus(dev->d_ifname, &iff); - if (ret != OK) - { - nsh_output(vtbl, "\tGet %s interface flags error: %d\n", - dev->d_ifname, ret); - } + /* Construct the full path to the /proc/net entry for this device */ - if (iff & IFF_RUNNING) - { - status = "RUNNING"; - } - else if (iff & IFF_UP) - { - status = "UP"; - } - else - { - status = "DOWN"; - } + snprintf(buffer, IFNAMSIZ + 12, "/proc/net/%s", dev->d_ifname); + (void)nsh_catfile(vtbl, "ifconfig", buffer); -#if defined(CONFIG_NET_MULTILINK) - /* If there are multiple link types being supported, then selected the - * output appropriate for the link type associated with this device. - */ - - switch (dev->d_lltype) - { -# if defined(CONFIG_NET_ETHERNET) - case NET_LL_ETHERNET: - nsh_output(vtbl, "%s\tLink encap:Ethernet HWaddr %s", - dev->d_ifname, ether_ntoa(&dev->d_mac)); - break; -# endif - -# if defined(CONFIG_NET_LOOPBACK) - case NET_LL_LOOPBACK: - nsh_output(vtbl, "%s\tLink encap:Local Loopback", dev->d_ifname); - break; -# endif - -# if defined(CONFIG_NET_SLIP) - case NET_LL_SLIP: - nsh_output(vtbl, "%s\tLink encap:SLIP", dev->d_ifname); - break; -# endif - -# if defined(CONFIG_NET_PPP) - case NET_LL_PPP: - nsh_output(vtbl, "%s\tLink encap:P-t-P", dev->d_ifname); - break; -# endif - -# if defined(CONFIG_NET_TUN) - case NET_LL_TUN: - nsh_output(vtbl, "%s\tLink encap:TUN", dev->d_ifname); - break; -# endif - - default: - nsh_output(vtbl, "%s\tLink encap:UNSPEC", dev->d_ifname); - } - - nsh_output(vtbl, " at %s\n", status); - -#elif defined(CONFIG_NET_ETHERNET) - nsh_output(vtbl, "%s\tLink encap:Ethernet HWaddr %s at %s\n", - dev->d_ifname, ether_ntoa(&dev->d_mac), status); - -#elif defined(CONFIG_NET_LOOPBACK) - nsh_output(vtbl, "%s\tLink encap:Local Loopback at %s\n", dev->d_ifname, status); - -#elif defined(CONFIG_NET_SLIP) - nsh_output(vtbl, "%s\tLink encap:SLIP at %s\n", dev->d_ifname, status); - -#elif defined(CONFIG_NET_PPP) - nsh_output(vtbl, "%s\tLink encap:P-t-P at %s\n", dev->d_ifname, status); - -#elif defined(CONFIG_NET_TUN) - nsh_output(vtbl, "%s\tLink encap:TUN at %s\n", dev->d_ifname, status); - -#endif - -#ifdef CONFIG_NET_IPv4 - /* Show the IPv4 address */ - - addr.s_addr = dev->d_ipaddr; - nsh_output(vtbl, "\tinet addr:%s ", inet_ntoa(addr)); - - /* Show the IPv4 default router address */ - - addr.s_addr = dev->d_draddr; - nsh_output(vtbl, "DRaddr:%s ", inet_ntoa(addr)); - - /* Show the IPv4 network mask */ - - addr.s_addr = dev->d_netmask; - nsh_output(vtbl, "Mask:%s\n", inet_ntoa(addr)); - -#if defined(CONFIG_NSH_DHCPC) || defined(CONFIG_NSH_DNS) - netlib_get_ipv4dnsaddr(&addr); - nsh_output(vtbl, "\tDNSaddr:%s\n", inet_ntoa(addr)); -#endif -#endif - -#ifdef CONFIG_NET_IPv6 - /* Convert the 128 network mask to a human friendly prefix length */ - - preflen = netlib_ipv6netmask2prefix(dev->d_ipv6netmask); - - /* Show the assigned IPv6 address */ - - if (inet_ntop(AF_INET6, dev->d_ipv6addr, addrstr, INET6_ADDRSTRLEN)) - { - nsh_output(vtbl, "\tinet6 addr:%s/%d\n", addrstr, preflen); - } - - /* REVISIT: Show the IPv6 default router address */ - - if (inet_ntop(AF_INET6, dev->d_ipv6draddr, addrstr, INET6_ADDRSTRLEN)) - { - nsh_output(vtbl, "\tinet6 DRaddr:%s/%d\n", addrstr, preflen); - } - -#if defined(CONFIG_NSH_DHCPCv6) || defined(CONFIG_NSH_DNS) -# warning Missing logic -#endif -#endif - - nsh_output(vtbl, "\n"); - - /* Show driver statistics */ - - netdev_statistics(vtbl, dev); return OK; } #endif /* !CONFIG_NSH_DISABLE_IFUPDOWN || !CONFIG_NSH_DISABLE_IFCONFIG */