[rtems-libbsd commit] net-setup: Add routing and old stack's configuration

Joel Sherrill joel at rtems.org
Fri Aug 3 13:36:46 UTC 2012


Module:    rtems-libbsd
Branch:    master
Commit:    bd6dd6e2337dc57406d5d40acb43fb09e9a12ff9
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=bd6dd6e2337dc57406d5d40acb43fb09e9a12ff9

Author:    Joel Sherrill <joel.sherrill at oarcorp.com>
Date:      Fri Jul 27 07:45:06 2012 -0500

net-setup: Add routing and old stack's configuration

This allows the old stack's configuration structures to be used
unchanged even though this code currently does not support all
of the options. It likely will never support all of the options
as some should eventually come through configuration files as
they would in a real FreeBSD system. Other configuration
parameters are likely configurable via "hints".

---

 freebsd-userspace/Makefile                  |    3 +
 freebsd-userspace/rtems/rtems-net-setup.c   |  132 ++++++++++++++++++--------
 rtemsbsd/freebsd/machine/rtems-bsd-config.h |    2 +-
 3 files changed, 95 insertions(+), 42 deletions(-)

diff --git a/freebsd-userspace/Makefile b/freebsd-userspace/Makefile
index f7a6390..f1e1a4a 100644
--- a/freebsd-userspace/Makefile
+++ b/freebsd-userspace/Makefile
@@ -7,6 +7,7 @@ include $(PROJECT_ROOT)/make/leaf.cfg
 CFLAGS += -I $(INSTALL_BASE)/include
 #CFLAGS += -ffreestanding 
 CFLAGS += -I include 
+CFLAGS += -I rtems/include 
 CFLAGS += -I lib/libc/include 
 CFLAGS += -I sys
 CFLAGS += -I local 
@@ -108,6 +109,8 @@ install: $(LIB)
 	install -d $(INSTALL_BASE)/include
 	cd include; for i in `find . -name '*.h'` ; do \
 	  install -c -m 644 -D "$$i" "$(INSTALL_BASE)/include/$$i" ; done
+	cd rtems/include; for i in `find . -name '*.h'` ; do \
+	  install -c -m 644 -D "$$i" "$(INSTALL_BASE)/include/$$i" ; done
 	install -c -m 644 $(LIB) $(INSTALL_BASE)
 
 clean:
diff --git a/freebsd-userspace/rtems/rtems-net-setup.c b/freebsd-userspace/rtems/rtems-net-setup.c
index d030f2c..7774cd2 100644
--- a/freebsd-userspace/rtems/rtems-net-setup.c
+++ b/freebsd-userspace/rtems/rtems-net-setup.c
@@ -9,6 +9,8 @@
 #include <net/if.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#include <net/route.h>
+#include <rtems/rtems_bsdnet.h>
 
 static const struct sockaddr_in address_template = {
   sizeof(address_template),
@@ -18,6 +20,30 @@ static const struct sockaddr_in address_template = {
   { 0, 0, 0, 0, 0, 0, 0, 0 }
 };
 
+/*
+ * Manipulate routing tables
+ */
+int rtems_bsdnet_rtrequest(
+  int              req,
+  struct sockaddr *dst,
+  struct sockaddr *gateway,
+  struct sockaddr *netmask,
+  int              flags,
+  struct rtentry **net_nrt
+)
+{
+  int error;
+
+  // rtems_bsdnet_semaphore_obtain();
+  error = rtrequest(req, dst, gateway, netmask, flags, net_nrt);
+  // rtems_bsdnet_semaphore_release();
+  if (error) {
+    errno = error;
+    return -1;
+  }
+  return 0;
+}
+
 static void
 rtems_bsdnet_initialize_sockaddr_in(struct sockaddr_in *addr)
 {
@@ -35,31 +61,31 @@ int rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)
   /*
    * Configure interfaces
    */
-  s = socket (AF_INET, SOCK_DGRAM, 0);
+  s = socket(AF_INET, SOCK_DGRAM, 0);
   if (s < 0)
     return -1;
 
-  strncpy (ifreq.ifr_name, ifname, IFNAMSIZ);
+  strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);
 
   switch (cmd) {
     case SIOCSIFADDR:
     case SIOCSIFNETMASK:
-      memcpy (&ifreq.ifr_addr, param, sizeof (struct sockaddr));
-      r = ioctl (s, cmd, &ifreq);
+      memcpy(&ifreq.ifr_addr, param, sizeof(struct sockaddr));
+      r = ioctl(s, cmd, &ifreq);
       break;
 
     case OSIOCGIFADDR:
     case SIOCGIFADDR:
     case OSIOCGIFNETMASK:
     case SIOCGIFNETMASK:
-      if ((r = ioctl (s, cmd, &ifreq)) < 0)
+      if ((r = ioctl(s, cmd, &ifreq)) < 0)
         break;
-      memcpy (param, &ifreq.ifr_addr, sizeof (struct sockaddr));
+      memcpy(param, &ifreq.ifr_addr, sizeof(struct sockaddr));
       break;
 
     case SIOCGIFFLAGS:
     case SIOCSIFFLAGS:
-      if ((r = ioctl (s, SIOCGIFFLAGS, &ifreq)) < 0)
+      if ((r = ioctl(s, SIOCGIFFLAGS, &ifreq)) < 0)
         break;
       if (cmd == SIOCGIFFLAGS) {
         *((short*) param) = ifreq.ifr_flags;
@@ -70,69 +96,69 @@ int rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)
           /* set the interface down */
           ifreq.ifr_flags &= ~(IFF_UP);
       }
-      r = ioctl (s, SIOCSIFFLAGS, &ifreq);
+      r = ioctl(s, SIOCSIFFLAGS, &ifreq);
       break;
 
     case SIOCSIFDSTADDR:
-      memcpy (&ifreq.ifr_dstaddr, param, sizeof (struct sockaddr));
-      r = ioctl (s, cmd, &ifreq);
+      memcpy(&ifreq.ifr_dstaddr, param, sizeof(struct sockaddr));
+      r = ioctl(s, cmd, &ifreq);
       break;
 
     case OSIOCGIFDSTADDR:
     case SIOCGIFDSTADDR:
-      if ((r = ioctl (s, cmd, &ifreq)) < 0)
+      if ((r = ioctl(s, cmd, &ifreq)) < 0)
         break;
-      memcpy (param, &ifreq.ifr_dstaddr, sizeof (struct sockaddr));
+      memcpy(param, &ifreq.ifr_dstaddr, sizeof(struct sockaddr));
       break;
 
     case SIOCSIFBRDADDR:
-      memcpy (&ifreq.ifr_broadaddr, param, sizeof (struct sockaddr));
-      r = ioctl (s, cmd, &ifreq);
+      memcpy(&ifreq.ifr_broadaddr, param, sizeof(struct sockaddr));
+      r = ioctl(s, cmd, &ifreq);
       break;
 
     case OSIOCGIFBRDADDR:
     case SIOCGIFBRDADDR:
-      if ((r = ioctl (s, cmd, &ifreq)) < 0)
+      if ((r = ioctl(s, cmd, &ifreq)) < 0)
         break;
-      memcpy (param, &ifreq.ifr_broadaddr, sizeof (struct sockaddr));
+      memcpy(param, &ifreq.ifr_broadaddr, sizeof(struct sockaddr));
       break;
 
     case SIOCSIFMETRIC:
       ifreq.ifr_metric = *((int*) param);
-      r = ioctl (s, cmd, &ifreq);
+      r = ioctl(s, cmd, &ifreq);
       break;
 
     case SIOCGIFMETRIC:
-      if ((r = ioctl (s, cmd, &ifreq)) < 0)
+      if ((r = ioctl(s, cmd, &ifreq)) < 0)
         break;
       *((int*) param) = ifreq.ifr_metric;
       break;
 
     case SIOCSIFMTU:
       ifreq.ifr_mtu = *((int*) param);
-      r = ioctl (s, cmd, &ifreq);
+      r = ioctl(s, cmd, &ifreq);
       break;
 
     case SIOCGIFMTU:
-      if ((r = ioctl (s, cmd, &ifreq)) < 0)
+      if ((r = ioctl(s, cmd, &ifreq)) < 0)
         break;
       *((int*) param) = ifreq.ifr_mtu;
       break;
 
     case SIOCSIFPHYS:
       ifreq.ifr_phys = *((int*) param);
-      r = ioctl (s, cmd, &ifreq);
+      r = ioctl(s, cmd, &ifreq);
       break;
 
     case SIOCGIFPHYS:
-      if ((r = ioctl (s, cmd, &ifreq)) < 0)
+      if ((r = ioctl(s, cmd, &ifreq)) < 0)
         break;
       *((int*) param) = ifreq.ifr_phys;
       break;
 
     case SIOCSIFMEDIA:
       ifreq.ifr_media = *((int*) param);
-      r = ioctl (s, cmd, &ifreq);
+      r = ioctl(s, cmd, &ifreq);
       break;
 
     case SIOCGIFMEDIA:
@@ -140,7 +166,7 @@ int rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)
        * look at...
        */
       ifreq.ifr_media = *((int*) param);
-      if ((r = ioctl (s, cmd, &ifreq)) < 0)
+      if ((r = ioctl(s, cmd, &ifreq)) < 0)
         break;
       *((int*) param) = ifreq.ifr_media;
       break;
@@ -156,7 +182,7 @@ int rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)
       break;
   }
 
-  close (s);
+  close(s);
   return r;
 }
 
@@ -176,8 +202,8 @@ static bool rtems_bsdnet_setup_interface(
    * 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));
+  if (rtems_bsdnet_ifconfig(name, SIOCSIFFLAGS, &flags) < 0) {
+    printf("Can't bring %s up: %s\n", name, strerror(errno));
     return false;
   }
 
@@ -185,9 +211,9 @@ static bool rtems_bsdnet_setup_interface(
    * 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));
+  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;
   }
 
@@ -195,9 +221,9 @@ static bool rtems_bsdnet_setup_interface(
    * 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));
+  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;
   }
 
@@ -205,8 +231,8 @@ static bool rtems_bsdnet_setup_interface(
    * 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));
+  if (rtems_bsdnet_ifconfig(name, SIOCGIFFLAGS, &flags) < 0) {
+    printf("Can't read %s flags: %s\n", name, strerror(errno));
     return false;
   }
 
@@ -216,14 +242,14 @@ static bool rtems_bsdnet_setup_interface(
     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) {
+    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));
+      printf("Can't set %s broadcast address %s: %s\n",
+        name, buf, strerror(errno));
     }
   }
 
@@ -234,7 +260,8 @@ static bool rtems_bsdnet_setup_interface(
 
 void rtems_initialize_interfaces(void)
 {
-  bool any_if_configured;
+  bool                          any_if_configured;
+  struct rtems_bsdnet_ifconfig *ifp;
 
   any_if_configured = false;
 
@@ -244,7 +271,6 @@ void rtems_initialize_interfaces(void)
     "255.0.0.0"
   );
 
-#if 0
 
   for (ifp = rtems_bsdnet_config.ifconfig ; ifp ; ifp = ifp->next) {
     if (ifp->ip_address == NULL)
@@ -256,6 +282,30 @@ void rtems_initialize_interfaces(void)
       ifp->ip_netmask
     );
   }
-#endif
+  /*
+   * Set default route
+   */
+  if (rtems_bsdnet_config.gateway && any_if_configured) {
+    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,
+        (struct sockaddr *)&gateway,
+        (struct sockaddr *)&netmask,
+        (RTF_UP | RTF_GATEWAY | RTF_STATIC), NULL) < 0) {
+      printf ("Can't set default route: %s\n", strerror (errno));
+      return -1;
+    }
+  }
+  return 0;
 
 }
diff --git a/rtemsbsd/freebsd/machine/rtems-bsd-config.h b/rtemsbsd/freebsd/machine/rtems-bsd-config.h
index b25d7ff..735a805 100644
--- a/rtemsbsd/freebsd/machine/rtems-bsd-config.h
+++ b/rtemsbsd/freebsd/machine/rtems-bsd-config.h
@@ -88,7 +88,7 @@
 /* Networking */
 #define IPSEC 1
 #define INET  1
-#define INET6 1
+// #define INET6 1
 #define TCP_SIGNATURE 1
 
 /* Integer type definitions */




More information about the vc mailing list