diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-12-08 10:30:27 +0000 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-12-08 10:30:27 +0000 |
commit | 6c6b2f13f405600a66a841897e438c52656749c9 (patch) | |
tree | b003194dcb0da9e69277366ed09ea0e2da10fb11 /cpukit/libnetworking | |
parent | 2010-12-06 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff) | |
download | rtems-6c6b2f13f405600a66a841897e438c52656749c9.tar.bz2 |
2010-12-08 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libnetworking/loop.h, libnetworking/net/if_loop.c,
libnetworking/rtems/rtems_glue.c, libmisc/dummy/dummy-networking.c:
Initialize loop back interface during normal initialization via
rtems_bsdnet_initialize_network().
Diffstat (limited to 'cpukit/libnetworking')
-rw-r--r-- | cpukit/libnetworking/loop.h | 15 | ||||
-rw-r--r-- | cpukit/libnetworking/net/if_loop.c | 4 | ||||
-rw-r--r-- | cpukit/libnetworking/rtems/rtems_glue.c | 179 |
3 files changed, 124 insertions, 74 deletions
diff --git a/cpukit/libnetworking/loop.h b/cpukit/libnetworking/loop.h index 34e0b828e4..4fd6b8e1ba 100644 --- a/cpukit/libnetworking/loop.h +++ b/cpukit/libnetworking/loop.h @@ -2,4 +2,19 @@ * $Id$ */ +#ifndef _RTEMS_BSDNET_LOOP_H +#define _RTEMS_BSDNET_LOOP_H + +#ifdef __cplusplus +extern "C" { +#endif + #define NLOOP 1 + +void rtems_bsdnet_initialize_loop(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _RTEMS_BSDNET_LOOP_H */ diff --git a/cpukit/libnetworking/net/if_loop.c b/cpukit/libnetworking/net/if_loop.c index e19240799b..ed8b309991 100644 --- a/cpukit/libnetworking/net/if_loop.c +++ b/cpukit/libnetworking/net/if_loop.c @@ -92,8 +92,6 @@ static int loioctl(struct ifnet *, ioctl_command_t, caddr_t); static void lortrequest(int, struct rtentry *, struct sockaddr *); -void rtems_bsdnet_loopattach(void *); - #ifdef TINY_LOMTU #define LOMTU (1024+512) #elif defined(LARGE_LOMTU) @@ -105,7 +103,7 @@ void rtems_bsdnet_loopattach(void *); struct ifnet loif[NLOOP]; void -rtems_bsdnet_loopattach(void *dummy) +rtems_bsdnet_initialize_loop(void) { register struct ifnet *ifp; register int i = 0; diff --git a/cpukit/libnetworking/rtems/rtems_glue.c b/cpukit/libnetworking/rtems/rtems_glue.c index f86e6e3a6e..088479cfb8 100644 --- a/cpukit/libnetworking/rtems/rtems_glue.c +++ b/cpukit/libnetworking/rtems/rtems_glue.c @@ -40,6 +40,8 @@ #include <net/netisr.h> #include <net/route.h> +#include "loop.h" + /* * Sysctl init all. */ @@ -99,6 +101,20 @@ struct in_addr *rtems_bsdnet_ntpserver = _rtems_bsdnet_ntpserver; int rtems_bsdnet_ntpserver_count = 0; int32_t rtems_bsdnet_timeoffset = 0; +static const struct sockaddr_in address_template = { + sizeof(address_template), + AF_INET, + 0, + { INADDR_ANY }, + { 0, 0, 0, 0, 0, 0, 0, 0 } +}; + +static void +rtems_bsdnet_initialize_sockaddr_in(struct sockaddr_in *addr) +{ + memcpy(addr, &address_template, sizeof(*addr)); +} + /* * Perform FreeBSD memory allocation. * FIXME: This should be modified to keep memory allocation statistics. @@ -315,6 +331,9 @@ rtems_bsdnet_initialize (void) * Let other network tasks begin */ rtems_bsdnet_semaphore_release (); + + rtems_bsdnet_initialize_loop(); + return 0; } @@ -822,17 +841,81 @@ int rtems_bsdnet_rtrequest ( return 0; } +static bool +rtems_bsdnet_setup_interface( + const char *name, + const char *ip_address, + const char *ip_netmask +) +{ + struct sockaddr_in address; + struct sockaddr_in netmask; + short flags; + + /* + * Bring interface up + */ + flags = IFF_UP; + if (rtems_bsdnet_ifconfig (name, SIOCSIFFLAGS, &flags) < 0) { + printf ("Can't bring %s up: %s\n", name, strerror (errno)); + return false; + } + + /* + * Set interface netmask + */ + rtems_bsdnet_initialize_sockaddr_in(&netmask); + netmask.sin_addr.s_addr = inet_addr (ip_netmask); + if (rtems_bsdnet_ifconfig (name, SIOCSIFNETMASK, &netmask) < 0) { + printf ("Can't set %s netmask: %s\n", name, strerror (errno)); + return false; + } + + /* + * Set interface address + */ + rtems_bsdnet_initialize_sockaddr_in(&address); + address.sin_addr.s_addr = inet_addr (ip_address); + if (rtems_bsdnet_ifconfig (name, SIOCSIFADDR, &address) < 0) { + printf ("Can't set %s address: %s\n", name, strerror (errno)); + return false; + } + + /* + * Set interface broadcast address if the interface has the + * broadcast flag set. + */ + if (rtems_bsdnet_ifconfig (name, SIOCGIFFLAGS, &flags) < 0) { + printf ("Can't read %s flags: %s\n", name, strerror (errno)); + return false; + } + + if (flags & IFF_BROADCAST) { + struct sockaddr_in broadcast; + + rtems_bsdnet_initialize_sockaddr_in(&broadcast); + broadcast.sin_addr.s_addr = + address.sin_addr.s_addr | ~netmask.sin_addr.s_addr; + if (rtems_bsdnet_ifconfig (name, SIOCSIFBRDADDR, &broadcast) < 0) { + struct in_addr in_addr; + char buf[20]; + in_addr.s_addr = broadcast.sin_addr.s_addr; + if (!inet_ntop(AF_INET, &in_addr, buf, sizeof(buf))) + strcpy(buf,"?.?.?.?"); + printf ("Can't set %s broadcast address %s: %s\n", + name, buf, strerror (errno)); + } + } + + return true; +} + static int rtems_bsdnet_setup (void) { struct rtems_bsdnet_ifconfig *ifp; - short flags; - struct sockaddr_in address; - struct sockaddr_in netmask; - struct sockaddr_in broadcast; - struct sockaddr_in gateway; int i; - int any_if_configured = 0; + bool any_if_configured = false; /* * Set local parameters @@ -864,82 +947,36 @@ rtems_bsdnet_setup (void) /* * Configure interfaces */ + any_if_configured |= rtems_bsdnet_setup_interface( + "lo0", + "127.0.0.1", + "255.0.0.0" + ); for (ifp = rtems_bsdnet_config.ifconfig ; ifp ; ifp = ifp->next) { if (ifp->ip_address == NULL) continue; - /* - * Bring interface up - */ - flags = IFF_UP; - if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFFLAGS, &flags) < 0) { - printf ("Can't bring %s up: %s\n", ifp->name, strerror (errno)); - continue; - } - - /* - * Set interface netmask - */ - memset (&netmask, '\0', sizeof netmask); - netmask.sin_len = sizeof netmask; - netmask.sin_family = AF_INET; - netmask.sin_addr.s_addr = inet_addr (ifp->ip_netmask); - if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFNETMASK, &netmask) < 0) { - printf ("Can't set %s netmask: %s\n", ifp->name, strerror (errno)); - continue; - } - - /* - * Set interface address - */ - memset (&address, '\0', sizeof address); - address.sin_len = sizeof address; - address.sin_family = AF_INET; - address.sin_addr.s_addr = inet_addr (ifp->ip_address); - if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFADDR, &address) < 0) { - printf ("Can't set %s address: %s\n", ifp->name, strerror (errno)); - continue; - } - - /* - * Set interface broadcast address if the interface has the - * broadcast flag set. - */ - if (rtems_bsdnet_ifconfig (ifp->name, SIOCGIFFLAGS, &flags) < 0) { - printf ("Can't read %s flags: %s\n", ifp->name, strerror (errno)); - continue; - } - - any_if_configured = 1; - - if (flags & IFF_BROADCAST) { - memset (&broadcast, '\0', sizeof broadcast); - broadcast.sin_len = sizeof broadcast; - broadcast.sin_family = AF_INET; - broadcast.sin_addr.s_addr = - address.sin_addr.s_addr | ~netmask.sin_addr.s_addr; - if (rtems_bsdnet_ifconfig (ifp->name, SIOCSIFBRDADDR, &broadcast) < 0) { - struct in_addr in_addr; - char buf[20]; - in_addr.s_addr = broadcast.sin_addr.s_addr; - if (!inet_ntop(AF_INET, &in_addr, buf, sizeof(buf))) - strcpy(buf,"?.?.?.?"); - printf ("Can't set %s broadcast address %s: %s\n", - ifp->name, buf, strerror (errno)); - } - } + any_if_configured |= rtems_bsdnet_setup_interface( + ifp->name, + ifp->ip_address, + ifp->ip_netmask + ); } /* * Set default route */ if (rtems_bsdnet_config.gateway && any_if_configured) { - address.sin_addr.s_addr = INADDR_ANY; - netmask.sin_addr.s_addr = INADDR_ANY; - memset (&gateway, '\0', sizeof gateway); - gateway.sin_len = sizeof gateway; - gateway.sin_family = AF_INET; + struct sockaddr_in address; + struct sockaddr_in netmask; + struct sockaddr_in gateway; + + rtems_bsdnet_initialize_sockaddr_in(&address); + rtems_bsdnet_initialize_sockaddr_in(&netmask); + rtems_bsdnet_initialize_sockaddr_in(&gateway); + gateway.sin_addr.s_addr = inet_addr (rtems_bsdnet_config.gateway); + if (rtems_bsdnet_rtrequest ( RTM_ADD, (struct sockaddr *)&address, |