diff options
author | Peter Dufault <dufault@hda.com> | 2014-12-23 22:14:50 -0500 |
---|---|---|
committer | Gedare Bloom <gedare@rtems.org> | 2014-12-23 22:14:50 -0500 |
commit | da10694a489a51534ba189417defbea4162cfd8f (patch) | |
tree | 53ad024101d22ca0523c6428af8bc518b4814b66 /cpukit | |
parent | doc: add some red-black tree documentation (diff) | |
download | rtems-da10694a489a51534ba189417defbea4162cfd8f.tar.bz2 |
libnetworking: Make rtems_dhcp_failsafe() run time configurable
rtems_dhcp_failsafe() can be configured at compile time with
various options. This change makes it possible to instead configure
it at runtime.
This will make it marginally larger. I haven't measured the difference
but I'll guess it's in the lower hundreds of bytes. The change could be
modified to leave it either compile time or run time configurable,
I prefer the simplicity of a single method.
closes #1905
Diffstat (limited to 'cpukit')
-rw-r--r-- | cpukit/libnetworking/rtems/rtems_dhcp_failsafe.c | 98 | ||||
-rw-r--r-- | cpukit/libnetworking/rtems/rtems_dhcp_failsafe.h | 37 |
2 files changed, 91 insertions, 44 deletions
diff --git a/cpukit/libnetworking/rtems/rtems_dhcp_failsafe.c b/cpukit/libnetworking/rtems/rtems_dhcp_failsafe.c index 2f5056abca..c491ad9655 100644 --- a/cpukit/libnetworking/rtems/rtems_dhcp_failsafe.c +++ b/cpukit/libnetworking/rtems/rtems_dhcp_failsafe.c @@ -30,18 +30,18 @@ * Optionally, after the interface is configured (either with DHCP or statically), a task is started to monitor it. When the interface remains - disconnected (i.e. its IFF_RUNNING flag is off) for NETWORK_FAIL_TIMEOUT + disconnected (i.e. its IFF_RUNNING flag is off) for network_fail_timeout seconds, the dhcp lease renewal is stopped. As soon as the interface is connected again, DHCP is started again as above. - If NETWORK_FAIL_TIMEOUT is set to 0, the monitor task is not started. + If network_fail_timeout is set to 0, the monitor task is not started. * Optionally, when the interface is disconnected, it is also brought down - for NETWORK_DOWN_TIME seconds. Since this possibly makes the IFF_RUNNING + for network_down_time seconds. Since this possibly makes the IFF_RUNNING flag unuseable, the interface is brought up again before the flag is polled. - If NETWORK_DOWN_TIME is set to 0, the interface is not brought down. + If network_down_time is set to 0, the interface is not brought down. - * Optionally, before DHCP is started, we wait for BROADCAST_DELAY seconds. + * Optionally, before DHCP is started, we wait for broadcast_delay seconds. This is necessary to allow some routers to perform spanning tree discovery. Note that DHCP doesn't work well with multiple interfaces: only one of them @@ -60,6 +60,7 @@ #include <errno.h> #include <rtems/dhcp.h> +#include <rtems/rtems_dhcp_failsafe.h> struct proc; /* Unused parameter of some functions. */ #include <sys/ioctl.h> @@ -73,10 +74,23 @@ struct proc; /* Unused parameter of some functions. */ #include <arpa/inet.h> /* for inet_addr, inet_ntop */ -#define NETWORK_FAIL_TIMEOUT 5 /* the number of seconds before the interface is considered disconnected */ -#define NETWORK_DOWN_TIME 30 /* number of seconds the interface remains down */ -#define BROADCAST_DELAY 0 /* Delay (seconds) before broadcasts are sent */ -#define DHCP_MONITOR_PRIORITY 250 /* Low priority */ +static int network_fail_timeout = RTEMS_DHCP_FAILSAFE_NETWORK_FAIL_TIMEOUT; +static int network_down_time = RTEMS_DHCP_FAILSAFE_NETWORK_DOWN_TIME; +static int broadcast_delay = RTEMS_DHCP_FAILSAFE_BROADCAST_DELAY; +static int dhcp_monitor_priority = RTEMS_DHCP_FAILSAFE_DHCP_MONITOR_PRIORITY; + +void rtems_bsdnet_dhcp_failsafe_config( + int network_fail_timeout_, + int network_down_time_, + int broadcast_delay_, + int dhcp_monitor_priority_ +) +{ + network_fail_timeout = network_fail_timeout_; + network_down_time = network_down_time_; + broadcast_delay = broadcast_delay_; + dhcp_monitor_priority = dhcp_monitor_priority_; +} /* * returns 0 when successful, negative value for failure @@ -117,11 +131,10 @@ static int remove_address(const char *if_name) } -#if NETWORK_DOWN_TIME static int dhcp_if_down (const char* ifname) { - int flags; + int16_t flags; if (rtems_bsdnet_ifconfig (ifname, SIOCGIFFLAGS, &flags) < 0) { printf ("Can't get flags for %s: %s\n", ifname, strerror (errno)); return -1; @@ -136,12 +149,11 @@ dhcp_if_down (const char* ifname) return 0; } -#endif static int dhcp_if_up (const char* ifname) { - int flags; + int16_t flags; if (rtems_bsdnet_ifconfig (ifname, SIOCGIFFLAGS, &flags) < 0) { printf ("Can't get flags for %s: %s\n", ifname, strerror (errno)); return -1; @@ -161,7 +173,7 @@ dhcp_if_up (const char* ifname) static int set_static_address (struct rtems_bsdnet_ifconfig *ifp) { - short flags; + int16_t flags; struct sockaddr_in address; struct sockaddr_in netmask; struct sockaddr_in broadcast; @@ -255,10 +267,10 @@ set_static_address (struct rtems_bsdnet_ifconfig *ifp) static void do_dhcp_init (struct rtems_bsdnet_ifconfig *ifp) { -#if BROADCAST_DELAY - /* Wait before sending broadcast. */ - rtems_task_wake_after(RTEMS_MILLISECONDS_TO_TICKS(BROADCAST_DELAY * 1000)); -#endif + if (broadcast_delay) { + /* Wait before sending broadcast. */ + rtems_task_wake_after(RTEMS_MILLISECONDS_TO_TICKS(broadcast_delay * 1000)); + } printf ("starting dhcp client...\n"); @@ -278,7 +290,7 @@ static void dhcp_monitor_task (rtems_task_argument ifp_arg) struct rtems_bsdnet_ifconfig *ifp = (struct rtems_bsdnet_ifconfig *)ifp_arg; char *ifname = ifp->name; unsigned int downcount = 0; - int ifflags; + int16_t ifflags; int must_renew = FALSE; while (TRUE) { @@ -294,19 +306,17 @@ static void dhcp_monitor_task (rtems_task_argument ifp_arg) } downcount = 0; } else { - if (downcount < NETWORK_FAIL_TIMEOUT) { + if (downcount < network_fail_timeout) { downcount++; - if (downcount == NETWORK_FAIL_TIMEOUT) { + if (downcount == network_fail_timeout) { printf ("lost network connection...\n"); rtems_bsdnet_dhcp_down (); must_renew = TRUE; -#if NETWORK_DOWN_TIME dhcp_if_down(ifname); - rtems_task_wake_after(RTEMS_MILLISECONDS_TO_TICKS(NETWORK_DOWN_TIME * 1000)); + rtems_task_wake_after(RTEMS_MILLISECONDS_TO_TICKS(network_down_time * 1000)); dhcp_if_up(ifname); downcount = 0; -#endif } } } @@ -328,7 +338,7 @@ void rtems_bsdnet_do_dhcp_failsafe (void) rtems_status_code sc; rtems_id id; struct rtems_bsdnet_ifconfig *ifp; - int ifflags; + int16_t ifflags; /* Find a suitable interface */ for (ifp = rtems_bsdnet_config.ifconfig; ifp; ifp = ifp->next) { @@ -344,27 +354,27 @@ void rtems_bsdnet_do_dhcp_failsafe (void) printf("starting dhcp on interface %s\n", ifp->name); do_dhcp_init(ifp); -#if NETWORK_FAIL_TIMEOUT - sc = rtems_task_create (rtems_build_name ('d','h','c','m'), - DHCP_MONITOR_PRIORITY, - 2048, - RTEMS_PREEMPT | - RTEMS_NO_TIMESLICE | - RTEMS_NO_ASR | - RTEMS_INTERRUPT_LEVEL (0), - RTEMS_LOCAL, - &id); - - if (sc != RTEMS_SUCCESSFUL) { - printf ("Failed to create dhcp monitor task, code %d\n", sc); - return; - } + if (network_fail_timeout) { + sc = rtems_task_create (rtems_build_name ('d','h','c','m'), + dhcp_monitor_priority, + 2048, + RTEMS_PREEMPT | + RTEMS_NO_TIMESLICE | + RTEMS_NO_ASR | + RTEMS_INTERRUPT_LEVEL (0), + RTEMS_LOCAL, + &id); + + if (sc != RTEMS_SUCCESSFUL) { + printf ("Failed to create dhcp monitor task, code %d\n", sc); + return; + } - sc = rtems_task_start (id, dhcp_monitor_task, (rtems_task_argument) ifp); + sc = rtems_task_start (id, dhcp_monitor_task, (rtems_task_argument) ifp); - if (sc != RTEMS_SUCCESSFUL) { - printf ("Failed to start dhcp monitor task, code %d\n", sc); + if (sc != RTEMS_SUCCESSFUL) { + printf ("Failed to start dhcp monitor task, code %d\n", sc); + } } -#endif } diff --git a/cpukit/libnetworking/rtems/rtems_dhcp_failsafe.h b/cpukit/libnetworking/rtems/rtems_dhcp_failsafe.h index 7ed131aa77..3c5a59fcb0 100644 --- a/cpukit/libnetworking/rtems/rtems_dhcp_failsafe.h +++ b/cpukit/libnetworking/rtems/rtems_dhcp_failsafe.h @@ -18,8 +18,45 @@ extern "C" { #endif +/* Default settings for the DHCP failsafe. They can be overridden + * using rtems_bsdnet_dhcp_failsafe_config(); see that for descriptions. + */ +#ifndef RTEMS_DHCP_FAILSAFE_NETWORK_FAIL_TIMEOUT +#define RTEMS_DHCP_FAILSAFE_NETWORK_FAIL_TIMEOUT 5 +#endif + +#ifndef RTEMS_DHCP_FAILSAFE_NETWORK_DOWN_TIME +#define RTEMS_DHCP_FAILSAFE_NETWORK_DOWN_TIME 30 +#endif + +#ifndef RTEMS_DHCP_FAILSAFE_BROADCAST_DELAY +#define RTEMS_DHCP_FAILSAFE_BROADCAST_DELAY 0 +#endif + +#ifndef RTEMS_DHCP_FAILSAFE_DHCP_MONITOR_PRIORITY +#define RTEMS_DHCP_FAILSAFE_DHCP_MONITOR_PRIORITY 250 +#endif + + void rtems_bsdnet_do_dhcp_failsafe (void); +/** Set the DHCP fallback options. See the commentary at the top of the + * implementation. + @note Some of these options can be compile-time disabled - see the code. + */ +void rtems_bsdnet_dhcp_failsafe_config( + int network_fail_timeout, /**< The number of seconds before the interface is + * considered disconnected + */ + int network_down_time, /**< The number of seconds the interface + * remains down. + */ + int broadcast_delay, /**< The delay in seconds before broadcasts + * are sent. + */ + int dhcp_monitor_priority /**< The monitor priority.*/ +); + #ifdef __cplusplus } #endif |