summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--freebsd-userspace/Makefile3
-rw-r--r--freebsd-userspace/rtems/rtems-net-setup.c132
-rw-r--r--rtemsbsd/freebsd/machine/rtems-bsd-config.h2
3 files changed, 95 insertions, 42 deletions
diff --git a/freebsd-userspace/Makefile b/freebsd-userspace/Makefile
index f7a63904..f1e1a4a7 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 d030f2c0..7774cd26 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 b25d7ffe..735a8051 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 */