diff --git a/include/netutils/netlib.h b/include/netutils/netlib.h index 2f4dee012..acab1ba01 100644 --- a/include/netutils/netlib.h +++ b/include/netutils/netlib.h @@ -375,6 +375,12 @@ ssize_t netlib_get_route(FAR struct rtentry *rtelist, unsigned int nentries, sa_family_t family); #endif +#if defined(CONFIG_NET_IPv4) && defined(CONFIG_NETUTILS_DHCPC) +/* DHCP */ + +int netlib_obtain_ipv4addr(FAR const char *ifname); +#endif + #ifdef CONFIG_NET_ICMPv6_AUTOCONF /* ICMPv6 Autoconfiguration */ diff --git a/netutils/netinit/netinit.c b/netutils/netinit/netinit.c index bb5d8e87c..f0017a056 100644 --- a/netutils/netinit/netinit.c +++ b/netutils/netinit/netinit.c @@ -34,15 +34,12 @@ #endif #include -#include #include #include #include #include #include #include -#include -#include #include #include #include @@ -51,9 +48,6 @@ #include #include "netutils/netlib.h" -#if defined(CONFIG_NETUTILS_DHCPC) || defined(CONFIG_NETINIT_DNS) -# include "netutils/dhcpc.h" -#endif #ifdef CONFIG_NET_6LOWPAN # include @@ -627,12 +621,6 @@ static void netinit_set_ipaddrs(void) #if defined(NETINIT_HAVE_NETDEV) && !defined(CONFIG_NETINIT_NETLOCAL) static void netinit_net_bringup(void) { -#ifdef CONFIG_NETUTILS_DHCPC - uint8_t mac[IFHWADDRLEN]; - struct dhcpc_state ds; - FAR void *handle; -#endif - /* Bring the network up. */ if (netlib_ifup(NET_DEVNAME) < 0) @@ -658,46 +646,10 @@ static void netinit_net_bringup(void) #ifdef CONFIG_NETUTILS_DHCPC if (g_use_dhcpc) { - /* Get the MAC address of the NIC */ - - netlib_getmacaddr(NET_DEVNAME, mac); - - /* Set up the DHCPC modules */ - - handle = dhcpc_open(NET_DEVNAME, &mac, IFHWADDRLEN); - if (handle == NULL) + if (netlib_obtain_ipv4addr(NET_DEVNAME) < 0) { return; } - - /* 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 (dhcpc_request(handle, &ds) == OK) - { - netlib_set_ipv4addr(NET_DEVNAME, &ds.ipaddr); - - if (ds.netmask.s_addr != 0) - { - netlib_set_ipv4netmask(NET_DEVNAME, &ds.netmask); - } - - if (ds.default_router.s_addr != 0) - { - netlib_set_dripv4addr(NET_DEVNAME, &ds.default_router); - } - -# ifdef CONFIG_NETINIT_DNS - if (ds.dnsaddr.s_addr != 0) - { - netlib_set_ipv4dnsaddr(&ds.dnsaddr); - } -# endif - } - - dhcpc_close(handle); } #endif diff --git a/netutils/netlib/CMakeLists.txt b/netutils/netlib/CMakeLists.txt index 73c20227e..87958ffd6 100644 --- a/netutils/netlib/CMakeLists.txt +++ b/netutils/netlib/CMakeLists.txt @@ -53,6 +53,9 @@ if(CONFIG_NETUTILS_NETLIB) if(CONFIG_NET_IPTABLES) list(APPEND SRCS netlib_iptables.c) endif() + if(CONFIG_NETUTILS_DHCPC) + list(APPEND SRCS netlib_obtainipv4addr.c) + endif() endif() if(CONFIG_NET_IPv6) diff --git a/netutils/netlib/Makefile b/netutils/netlib/Makefile index 4e3e00d2b..a088160e6 100644 --- a/netutils/netlib/Makefile +++ b/netutils/netlib/Makefile @@ -53,6 +53,9 @@ endif ifeq ($(CONFIG_NET_IPTABLES),y) CSRCS += netlib_iptables.c endif +ifeq ($(CONFIG_NETUTILS_DHCPC),y) +CSRCS += netlib_obtainipv4addr.c +endif endif ifeq ($(CONFIG_NET_IPv6),y) diff --git a/netutils/netlib/netlib_obtainipv4addr.c b/netutils/netlib/netlib_obtainipv4addr.c new file mode 100644 index 000000000..71b669352 --- /dev/null +++ b/netutils/netlib/netlib_obtainipv4addr.c @@ -0,0 +1,181 @@ +/**************************************************************************** + * apps/netutils/netlib/netlib_obtainipv4addr.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include "netutils/dhcpc.h" +#include "netutils/netlib.h" + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: dhcp_setup_result + * + * Description: + * Set network connection parameters + * + * Parameters: + * ifname The name of the interface to use + * ds The configure network parameter values + * + * Return: + * 0 on success + * Negative integer on failure + * + ****************************************************************************/ + +static int dhcp_setup_result(FAR const char *ifname, + FAR struct dhcpc_state *ds) +{ + int ret = netlib_set_ipv4addr(ifname, &ds->ipaddr); + if (ret < 0) + { + nerr("ERROR: set IPv4 address failed: %d\n", ret); + return ret; + } + + if (ds->netmask.s_addr != 0) + { + ret = netlib_set_ipv4netmask(ifname, &ds->netmask); + if (ret < 0) + { + nerr("ERROR: set IPv4 netmask failed: %d\n", ret); + return ret; + } + } + + if (ds->default_router.s_addr != 0) + { + ret = netlib_set_dripv4addr(ifname, &ds->default_router); + if (ret < 0) + { + nerr("ERROR: set default router address failed: %d\n", ret); + return ret; + } + } + +#ifdef CONFIG_NETDB_DNSCLIENT + if (ds->dnsaddr.s_addr != 0) + { + ret = netlib_set_ipv4dnsaddr(&ds->dnsaddr); + if (ret < 0) + { + nerr("ERROR: set the DNS server address failed: %d\n", ret); + return ret; + } + } +#endif + + return OK; +} + +/**************************************************************************** + * Name: dhcp_obtain_statefuladdr + * + * Description: + * Configure network by dhcp + * + * Parameters: + * ifname The name of the interface to use + * + * Return: + * 0 on success + * Negative integer on failure + * + ****************************************************************************/ + +static int dhcp_obtain_statefuladdr(FAR const char *ifname) +{ + struct dhcpc_state ds; + FAR void *handle; + uint8_t mac[IFHWADDRLEN]; + + int ret = netlib_getmacaddr(ifname, mac); + if (ret < 0) + { + nerr("ERROR: get MAC address failed for '%s' : %d\n", ifname, ret); + return ret; + } + + /* Set up the DHCPC modules */ + + handle = dhcpc_open(ifname, &mac, IFHWADDRLEN); + if (handle == NULL) + { + nerr("ERROR: dhcpc open failed for '%s'\n", ifname); + return -EINVAL; + } + + /* 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. + */ + + ret = dhcpc_request(handle, &ds); + if (ret == OK) + { + ret = dhcp_setup_result(ifname, &ds); + } + else + { + nerr("ERROR: dhcpc request failed: %d\n", ret); + } + + dhcpc_close(handle); + return ret; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: netlib_obtain_ipv4addr + * + * Description: + * Perform DHCP in an attempt to get the IP + * address of the specified network device. + * + * Parameters: + * ifname The name of the interface to use + * + * Return: + * 0 on success + * Negative integer on failure + * + ****************************************************************************/ + +int netlib_obtain_ipv4addr(FAR const char *ifname) +{ + if (ifname == NULL) + { + nerr("ERROR: Invalid network card name\n"); + return -EINVAL; + } + + return dhcp_obtain_statefuladdr(ifname); +} diff --git a/nshlib/nsh_netcmds.c b/nshlib/nsh_netcmds.c index 5f6c03201..e60181f2d 100644 --- a/nshlib/nsh_netcmds.c +++ b/nshlib/nsh_netcmds.c @@ -90,10 +90,6 @@ # endif #endif -#ifdef CONFIG_NETINIT_DHCPC -# include "netutils/dhcpc.h" -#endif - #include "nsh.h" #include "nsh_console.h" @@ -579,9 +575,6 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) bool badarg = false; #ifdef HAVE_HWADDR mac_addr_t macaddr; -#endif -#if defined(CONFIG_NETINIT_DHCPC) - FAR void *handle; #endif int ret; int mtu = 0; @@ -833,7 +826,7 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) { if (hostip != NULL) { -#if defined(CONFIG_NETINIT_DHCPC) +#if defined(CONFIG_NETUTILS_DHCPC) if (strcmp(hostip, "dhcp") == 0) { /* Set DHCP addr */ @@ -1041,48 +1034,11 @@ int cmd_ifconfig(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) #endif /* CONFIG_NET_IPv4 */ #endif /* CONFIG_NETDB_DNSCLIENT */ -#if defined(CONFIG_NETINIT_DHCPC) - /* Get the MAC address of the NIC */ +#if defined(CONFIG_NETUTILS_DHCPC) if (!gip) { - netlib_getmacaddr("eth0", macaddr); - - /* Set up the DHCPC modules */ - - handle = dhcpc_open("eth0", &macaddr, 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 != NULL) - { - struct dhcpc_state ds; - - dhcpc_request(handle, &ds); - netlib_set_ipv4addr("eth0", &ds.ipaddr); - - if (ds.netmask.s_addr != 0) - { - netlib_set_ipv4netmask("eth0", &ds.netmask); - } - - if (ds.default_router.s_addr != 0) - { - netlib_set_dripv4addr("eth0", &ds.default_router); - } - -#ifdef CONFIG_NETDB_DNSCLIENT - if (ds.dnsaddr.s_addr != 0) - { - netlib_set_ipv4dnsaddr(&ds.dnsaddr); - } -#endif - - dhcpc_close(handle); - } + netlib_obtain_ipv4addr(ifname); } #endif diff --git a/system/dhcpc/renew_main.c b/system/dhcpc/renew_main.c index bc0297e8c..33200f52e 100644 --- a/system/dhcpc/renew_main.c +++ b/system/dhcpc/renew_main.c @@ -30,7 +30,6 @@ #include #include "netutils/netlib.h" -#include "netutils/dhcpc.h" /**************************************************************************** * Private Functions @@ -56,10 +55,6 @@ static void dhcpc_showusage(FAR const char *progname, int exitcode) int main(int argc, FAR char *argv[]) { - FAR const char *devname; - FAR void *handle; - uint8_t mac[IFHWADDRLEN]; - struct dhcpc_state ds; int ret; /* One and only one argument is expected: The network device name. */ @@ -70,50 +65,12 @@ int main(int argc, FAR char *argv[]) dhcpc_showusage(argv[0], EXIT_FAILURE); } - devname = argv[1]; - - /* Get the MAC address of the NIC */ - - netlib_getmacaddr(devname, mac); - - /* Set up the DHCPC modules */ - - handle = dhcpc_open(devname, &mac, IFHWADDRLEN); - if (handle == NULL) - { - fprintf(stderr, "ERROR: dhcpc_open() for '%s' failed\n", devname); - return EXIT_FAILURE; - } - - /* Get an IP address. */ - - ret = dhcpc_request(handle, &ds); + ret = netlib_obtain_ipv4addr(argv[1]); if (ret < 0) { - dhcpc_close(handle); - fprintf(stderr, "ERROR: dhcpc_request() failed\n"); + fprintf(stderr, "ERROR: netlib_obtain_ipv4addr() failed\n"); return EXIT_FAILURE; } - /* Save the addresses that we obtained. */ - - netlib_set_ipv4addr(devname, &ds.ipaddr); - - if (ds.netmask.s_addr != 0) - { - netlib_set_ipv4netmask(devname, &ds.netmask); - } - - if (ds.default_router.s_addr != 0) - { - netlib_set_dripv4addr(devname, &ds.default_router); - } - - if (ds.dnsaddr.s_addr != 0) - { - netlib_set_ipv4dnsaddr(&ds.dnsaddr); - } - - dhcpc_close(handle); return EXIT_SUCCESS; }