From 6ee106076c82b106d35310449ebc50db0bd95afb Mon Sep 17 00:00:00 2001 From: patacongo Date: Tue, 27 Nov 2012 16:26:54 +0000 Subject: Add chip ID funcitions for Shenzhou and Cloudctrl boards; Extened NSH ifconfig command and improve DHCPC -- All from Darcy Gong git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5393 42af7a65-404d-4744-a932-0658087f49c3 --- apps/ChangeLog.txt | 2 + apps/netutils/dhcpc/dhcpc.c | 23 ++++++++--- apps/nshlib/README.txt | 2 +- apps/nshlib/nsh_netcmds.c | 93 ++++++++++++++++++++++++++++++++++++++------- apps/nshlib/nsh_netinit.c | 2 +- apps/nshlib/nsh_parse.c | 2 +- 6 files changed, 102 insertions(+), 22 deletions(-) (limited to 'apps') diff --git a/apps/ChangeLog.txt b/apps/ChangeLog.txt index 3d09915c3..0b4f58e77 100644 --- a/apps/ChangeLog.txt +++ b/apps/ChangeLog.txt @@ -422,3 +422,5 @@ * apps/examples/elf/test/*/Makefile: OSX doesn't support install -D, use mkdir -p then install without the -D. From Mike Smith. * apps/examples/relays/Makefile: Reduced stack requirement (Darcy Gong). + * apps/nshlib and apps/netutils/dhcpc: Extend the NSH ifconfig command plus + various DHCPC improvements(Darcy Gong). diff --git a/apps/netutils/dhcpc/dhcpc.c b/apps/netutils/dhcpc/dhcpc.c index f5e15c8dc..b34320230 100644 --- a/apps/netutils/dhcpc/dhcpc.c +++ b/apps/netutils/dhcpc/dhcpc.c @@ -351,6 +351,7 @@ void *dhcpc_open(const void *macaddr, int maclen) struct dhcpc_state_s *pdhcpc; struct sockaddr_in addr; struct timeval tv; + int ret; ndbg("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", ((uint8_t*)macaddr)[0], ((uint8_t*)macaddr)[1], ((uint8_t*)macaddr)[2], @@ -369,21 +370,24 @@ void *dhcpc_open(const void *macaddr, int maclen) /* Create a UDP socket */ - pdhcpc->sockfd = socket(PF_INET, SOCK_DGRAM, 0); + pdhcpc->sockfd = socket(PF_INET, SOCK_DGRAM, 0); if (pdhcpc->sockfd < 0) { + nvdbg("socket handle %d\n",ret); free(pdhcpc); return NULL; } - /* bind the socket */ + /* Bind the socket */ addr.sin_family = AF_INET; addr.sin_port = HTONS(DHCPC_CLIENT_PORT); addr.sin_addr.s_addr = INADDR_ANY; - if (bind(pdhcpc->sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) < 0) + ret = bind(pdhcpc->sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)); + if (ret < 0) { + nvdbg("bind status %d\n",ret); close(pdhcpc->sockfd); free(pdhcpc); return NULL; @@ -393,8 +397,11 @@ void *dhcpc_open(const void *macaddr, int maclen) tv.tv_sec = 10; tv.tv_usec = 0; - if (setsockopt(pdhcpc->sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval)) < 0) + + ret = setsockopt(pdhcpc->sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval)); + if (ret < 0) { + nvdbg("setsockopt status %d\n",ret); close(pdhcpc->sockfd); free(pdhcpc); return NULL; @@ -410,9 +417,15 @@ void *dhcpc_open(const void *macaddr, int maclen) void dhcpc_close(void *handle) { - struct dchcpc_state_internal *pdhcpc = (struct dchcpc_state_internal *)handle; + struct dhcpc_state_s *pdhcpc = (struct dhcpc_state_s *)handle; + if (pdhcpc) { + if (pdhcpc->sockfd) + { + close(pdhcpc->sockfd); + } + free(pdhcpc); } } diff --git a/apps/nshlib/README.txt b/apps/nshlib/README.txt index 59f0538f0..bc626e699 100644 --- a/apps/nshlib/README.txt +++ b/apps/nshlib/README.txt @@ -389,7 +389,7 @@ o hexdump Dump data in hexadecimal format from a file or character device. -o ifconfig [nic_name [ip]] [dr|gw|gateway ] [netmask ] [dns ] [hw ] +o ifconfig [nic_name [|dhcp]] [dr|gw|gateway ] [netmask ] [dns ] [hw ] Show the current configuration of the network, for example: diff --git a/apps/nshlib/nsh_netcmds.c b/apps/nshlib/nsh_netcmds.c index d28fe873d..371d30460 100644 --- a/apps/nshlib/nsh_netcmds.c +++ b/apps/nshlib/nsh_netcmds.c @@ -81,10 +81,13 @@ # endif #endif -#ifdef CONFIG_HAVE_GETHOSTBYNAME -# include -#else -# include +#if defined(CONFIG_NSH_DHCPC) || defined(CONFIG_NSH_DNS) +# ifdef CONFIG_HAVE_GETHOSTBYNAME +# include +# else +# include +# endif +# include #endif #include "nsh.h" @@ -568,8 +571,11 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) FAR char *tmp = NULL; FAR char *hw = NULL; FAR char *dns = NULL; - bool badarg=false; - uint8_t mac[6]; + bool badarg = false; + uint8_t mac[IFHWADDRLEN]; +#if defined(CONFIG_NSH_DHCPC) + FAR void *handle; +#endif /* With one or no arguments, ifconfig simply shows the status of ethernet * device: @@ -673,10 +679,23 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) uip_setmacaddr(intf, mac); } - /* Set host ip address */ +#if defined(CONFIG_NSH_DHCPC) + if (!strcmp(hostip, "dhcp")) + { + /* Set DHCP addr */ + + ndbg("DHCPC Mode\n"); + gip = addr.s_addr = 0; + } + else +#endif + { + /* Set host IP address */ + + ndbg("Host IP: %s\n", hostip); + gip = addr.s_addr = inet_addr(hostip); + } - ndbg("Host IP: %s\n", hostip); - gip = addr.s_addr = inet_addr(hostip); uip_sethostaddr(intf, &addr); /* Set gateway */ @@ -688,11 +707,15 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) } else { - ndbg("Gateway: default\n"); - gip = NTOHL(gip); - gip &= ~0x000000ff; - gip |= 0x00000001; - gip = HTONL(gip); + if (gip) + { + ndbg("Gateway: default\n"); + gip = NTOHL(gip); + gip &= ~0x000000ff; + gip |= 0x00000001; + gip = HTONL(gip); + } + addr.s_addr = gip; } @@ -728,6 +751,48 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) resolv_conf(&addr); #endif +#if defined(CONFIG_NSH_DHCPC) + /* Get the MAC address of the NIC */ + + if (!gip) + { + uip_getmacaddr("eth0", mac); + + /* Set up the DHCPC modules */ + + handle = dhcpc_open(&mac, IFHWADDRLEN); + + /* Get an IP address. Note that there is no logic for renewing the IP address in this + * example. The address should be renewed in ds.lease_time/2 seconds. + */ + + if (handle) + { + struct dhcpc_state ds; + + (void)dhcpc_request(handle, &ds); + uip_sethostaddr("eth0", &ds.ipaddr); + + if (ds.netmask.s_addr != 0) + { + uip_setnetmask("eth0", &ds.netmask); + } + + if (ds.default_router.s_addr != 0) + { + uip_setdraddr("eth0", &ds.default_router); + } + + if (ds.dnsaddr.s_addr != 0) + { + resolv_conf(&ds.dnsaddr); + } + + dhcpc_close(handle); + } + } +#endif + return OK; } #endif diff --git a/apps/nshlib/nsh_netinit.c b/apps/nshlib/nsh_netinit.c index bb1c73dff..58d238312 100644 --- a/apps/nshlib/nsh_netinit.c +++ b/apps/nshlib/nsh_netinit.c @@ -156,7 +156,7 @@ int nsh_netinit(void) { struct dhcpc_state ds; (void)dhcpc_request(handle, &ds); - uip_sethostaddr("eth1", &ds.ipaddr); + uip_sethostaddr("eth0", &ds.ipaddr); if (ds.netmask.s_addr != 0) { uip_setnetmask("eth0", &ds.netmask); diff --git a/apps/nshlib/nsh_parse.c b/apps/nshlib/nsh_parse.c index abdf5c321..27068acff 100644 --- a/apps/nshlib/nsh_parse.c +++ b/apps/nshlib/nsh_parse.c @@ -235,7 +235,7 @@ static const struct cmdmap_s g_cmdmap[] = #ifdef CONFIG_NET # ifndef CONFIG_NSH_DISABLE_IFCONFIG - { "ifconfig", cmd_ifconfig, 1, 11, "[nic_name [ip]] [dr|gw|gateway ] [netmask ] [dns ] [hw ]" }, + { "ifconfig", cmd_ifconfig, 1, 11, "[nic_name [|dhcp]] [dr|gw|gateway ] [netmask ] [dns ] [hw ]" }, # endif # ifndef CONFIG_NSH_DISABLE_IFUPDOWN { "ifdown", cmd_ifdown, 2, 2, "" }, -- cgit v1.2.3