summaryrefslogtreecommitdiffstats
path: root/cpukit/libnetworking
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2010-12-08 10:30:27 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2010-12-08 10:30:27 +0000
commit6c6b2f13f405600a66a841897e438c52656749c9 (patch)
treeb003194dcb0da9e69277366ed09ea0e2da10fb11 /cpukit/libnetworking
parent2010-12-06 Joel Sherrill <joel.sherrilL@OARcorp.com> (diff)
downloadrtems-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.h15
-rw-r--r--cpukit/libnetworking/net/if_loop.c4
-rw-r--r--cpukit/libnetworking/rtems/rtems_glue.c179
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,