mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-06-30 13:56:15 +08:00
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".
This commit is contained in:
parent
4a3e48913b
commit
bd6dd6e233
@ -7,6 +7,7 @@ include $(PROJECT_ROOT)/make/leaf.cfg
|
|||||||
CFLAGS += -I $(INSTALL_BASE)/include
|
CFLAGS += -I $(INSTALL_BASE)/include
|
||||||
#CFLAGS += -ffreestanding
|
#CFLAGS += -ffreestanding
|
||||||
CFLAGS += -I include
|
CFLAGS += -I include
|
||||||
|
CFLAGS += -I rtems/include
|
||||||
CFLAGS += -I lib/libc/include
|
CFLAGS += -I lib/libc/include
|
||||||
CFLAGS += -I sys
|
CFLAGS += -I sys
|
||||||
CFLAGS += -I local
|
CFLAGS += -I local
|
||||||
@ -108,6 +109,8 @@ install: $(LIB)
|
|||||||
install -d $(INSTALL_BASE)/include
|
install -d $(INSTALL_BASE)/include
|
||||||
cd include; for i in `find . -name '*.h'` ; do \
|
cd include; for i in `find . -name '*.h'` ; do \
|
||||||
install -c -m 644 -D "$$i" "$(INSTALL_BASE)/include/$$i" ; done
|
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)
|
install -c -m 644 $(LIB) $(INSTALL_BASE)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
#include <net/route.h>
|
||||||
|
#include <rtems/rtems_bsdnet.h>
|
||||||
|
|
||||||
static const struct sockaddr_in address_template = {
|
static const struct sockaddr_in address_template = {
|
||||||
sizeof(address_template),
|
sizeof(address_template),
|
||||||
@ -18,6 +20,30 @@ static const struct sockaddr_in address_template = {
|
|||||||
{ 0, 0, 0, 0, 0, 0, 0, 0 }
|
{ 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
|
static void
|
||||||
rtems_bsdnet_initialize_sockaddr_in(struct sockaddr_in *addr)
|
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
|
* Configure interfaces
|
||||||
*/
|
*/
|
||||||
s = socket (AF_INET, SOCK_DGRAM, 0);
|
s = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
if (s < 0)
|
if (s < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
strncpy (ifreq.ifr_name, ifname, IFNAMSIZ);
|
strncpy(ifreq.ifr_name, ifname, IFNAMSIZ);
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SIOCSIFADDR:
|
case SIOCSIFADDR:
|
||||||
case SIOCSIFNETMASK:
|
case SIOCSIFNETMASK:
|
||||||
memcpy (&ifreq.ifr_addr, param, sizeof (struct sockaddr));
|
memcpy(&ifreq.ifr_addr, param, sizeof(struct sockaddr));
|
||||||
r = ioctl (s, cmd, &ifreq);
|
r = ioctl(s, cmd, &ifreq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OSIOCGIFADDR:
|
case OSIOCGIFADDR:
|
||||||
case SIOCGIFADDR:
|
case SIOCGIFADDR:
|
||||||
case OSIOCGIFNETMASK:
|
case OSIOCGIFNETMASK:
|
||||||
case SIOCGIFNETMASK:
|
case SIOCGIFNETMASK:
|
||||||
if ((r = ioctl (s, cmd, &ifreq)) < 0)
|
if ((r = ioctl(s, cmd, &ifreq)) < 0)
|
||||||
break;
|
break;
|
||||||
memcpy (param, &ifreq.ifr_addr, sizeof (struct sockaddr));
|
memcpy(param, &ifreq.ifr_addr, sizeof(struct sockaddr));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCGIFFLAGS:
|
case SIOCGIFFLAGS:
|
||||||
case SIOCSIFFLAGS:
|
case SIOCSIFFLAGS:
|
||||||
if ((r = ioctl (s, SIOCGIFFLAGS, &ifreq)) < 0)
|
if ((r = ioctl(s, SIOCGIFFLAGS, &ifreq)) < 0)
|
||||||
break;
|
break;
|
||||||
if (cmd == SIOCGIFFLAGS) {
|
if (cmd == SIOCGIFFLAGS) {
|
||||||
*((short*) param) = ifreq.ifr_flags;
|
*((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 */
|
/* set the interface down */
|
||||||
ifreq.ifr_flags &= ~(IFF_UP);
|
ifreq.ifr_flags &= ~(IFF_UP);
|
||||||
}
|
}
|
||||||
r = ioctl (s, SIOCSIFFLAGS, &ifreq);
|
r = ioctl(s, SIOCSIFFLAGS, &ifreq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCSIFDSTADDR:
|
case SIOCSIFDSTADDR:
|
||||||
memcpy (&ifreq.ifr_dstaddr, param, sizeof (struct sockaddr));
|
memcpy(&ifreq.ifr_dstaddr, param, sizeof(struct sockaddr));
|
||||||
r = ioctl (s, cmd, &ifreq);
|
r = ioctl(s, cmd, &ifreq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OSIOCGIFDSTADDR:
|
case OSIOCGIFDSTADDR:
|
||||||
case SIOCGIFDSTADDR:
|
case SIOCGIFDSTADDR:
|
||||||
if ((r = ioctl (s, cmd, &ifreq)) < 0)
|
if ((r = ioctl(s, cmd, &ifreq)) < 0)
|
||||||
break;
|
break;
|
||||||
memcpy (param, &ifreq.ifr_dstaddr, sizeof (struct sockaddr));
|
memcpy(param, &ifreq.ifr_dstaddr, sizeof(struct sockaddr));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCSIFBRDADDR:
|
case SIOCSIFBRDADDR:
|
||||||
memcpy (&ifreq.ifr_broadaddr, param, sizeof (struct sockaddr));
|
memcpy(&ifreq.ifr_broadaddr, param, sizeof(struct sockaddr));
|
||||||
r = ioctl (s, cmd, &ifreq);
|
r = ioctl(s, cmd, &ifreq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OSIOCGIFBRDADDR:
|
case OSIOCGIFBRDADDR:
|
||||||
case SIOCGIFBRDADDR:
|
case SIOCGIFBRDADDR:
|
||||||
if ((r = ioctl (s, cmd, &ifreq)) < 0)
|
if ((r = ioctl(s, cmd, &ifreq)) < 0)
|
||||||
break;
|
break;
|
||||||
memcpy (param, &ifreq.ifr_broadaddr, sizeof (struct sockaddr));
|
memcpy(param, &ifreq.ifr_broadaddr, sizeof(struct sockaddr));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCSIFMETRIC:
|
case SIOCSIFMETRIC:
|
||||||
ifreq.ifr_metric = *((int*) param);
|
ifreq.ifr_metric = *((int*) param);
|
||||||
r = ioctl (s, cmd, &ifreq);
|
r = ioctl(s, cmd, &ifreq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCGIFMETRIC:
|
case SIOCGIFMETRIC:
|
||||||
if ((r = ioctl (s, cmd, &ifreq)) < 0)
|
if ((r = ioctl(s, cmd, &ifreq)) < 0)
|
||||||
break;
|
break;
|
||||||
*((int*) param) = ifreq.ifr_metric;
|
*((int*) param) = ifreq.ifr_metric;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCSIFMTU:
|
case SIOCSIFMTU:
|
||||||
ifreq.ifr_mtu = *((int*) param);
|
ifreq.ifr_mtu = *((int*) param);
|
||||||
r = ioctl (s, cmd, &ifreq);
|
r = ioctl(s, cmd, &ifreq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCGIFMTU:
|
case SIOCGIFMTU:
|
||||||
if ((r = ioctl (s, cmd, &ifreq)) < 0)
|
if ((r = ioctl(s, cmd, &ifreq)) < 0)
|
||||||
break;
|
break;
|
||||||
*((int*) param) = ifreq.ifr_mtu;
|
*((int*) param) = ifreq.ifr_mtu;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCSIFPHYS:
|
case SIOCSIFPHYS:
|
||||||
ifreq.ifr_phys = *((int*) param);
|
ifreq.ifr_phys = *((int*) param);
|
||||||
r = ioctl (s, cmd, &ifreq);
|
r = ioctl(s, cmd, &ifreq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCGIFPHYS:
|
case SIOCGIFPHYS:
|
||||||
if ((r = ioctl (s, cmd, &ifreq)) < 0)
|
if ((r = ioctl(s, cmd, &ifreq)) < 0)
|
||||||
break;
|
break;
|
||||||
*((int*) param) = ifreq.ifr_phys;
|
*((int*) param) = ifreq.ifr_phys;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCSIFMEDIA:
|
case SIOCSIFMEDIA:
|
||||||
ifreq.ifr_media = *((int*) param);
|
ifreq.ifr_media = *((int*) param);
|
||||||
r = ioctl (s, cmd, &ifreq);
|
r = ioctl(s, cmd, &ifreq);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SIOCGIFMEDIA:
|
case SIOCGIFMEDIA:
|
||||||
@ -140,7 +166,7 @@ int rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)
|
|||||||
* look at...
|
* look at...
|
||||||
*/
|
*/
|
||||||
ifreq.ifr_media = *((int*) param);
|
ifreq.ifr_media = *((int*) param);
|
||||||
if ((r = ioctl (s, cmd, &ifreq)) < 0)
|
if ((r = ioctl(s, cmd, &ifreq)) < 0)
|
||||||
break;
|
break;
|
||||||
*((int*) param) = ifreq.ifr_media;
|
*((int*) param) = ifreq.ifr_media;
|
||||||
break;
|
break;
|
||||||
@ -156,7 +182,7 @@ int rtems_bsdnet_ifconfig(const char *ifname, uint32_t cmd, void *param)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
close (s);
|
close(s);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,8 +202,8 @@ static bool rtems_bsdnet_setup_interface(
|
|||||||
* Bring interface up
|
* Bring interface up
|
||||||
*/
|
*/
|
||||||
flags = IFF_UP;
|
flags = IFF_UP;
|
||||||
if (rtems_bsdnet_ifconfig (name, SIOCSIFFLAGS, &flags) < 0) {
|
if (rtems_bsdnet_ifconfig(name, SIOCSIFFLAGS, &flags) < 0) {
|
||||||
printf ("Can't bring %s up: %s\n", name, strerror (errno));
|
printf("Can't bring %s up: %s\n", name, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,9 +211,9 @@ static bool rtems_bsdnet_setup_interface(
|
|||||||
* Set interface netmask
|
* Set interface netmask
|
||||||
*/
|
*/
|
||||||
rtems_bsdnet_initialize_sockaddr_in(&netmask);
|
rtems_bsdnet_initialize_sockaddr_in(&netmask);
|
||||||
netmask.sin_addr.s_addr = inet_addr (ip_netmask);
|
netmask.sin_addr.s_addr = inet_addr(ip_netmask);
|
||||||
if (rtems_bsdnet_ifconfig (name, SIOCSIFNETMASK, &netmask) < 0) {
|
if (rtems_bsdnet_ifconfig(name, SIOCSIFNETMASK, &netmask) < 0) {
|
||||||
printf ("Can't set %s netmask: %s\n", name, strerror (errno));
|
printf("Can't set %s netmask: %s\n", name, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,9 +221,9 @@ static bool rtems_bsdnet_setup_interface(
|
|||||||
* Set interface address
|
* Set interface address
|
||||||
*/
|
*/
|
||||||
rtems_bsdnet_initialize_sockaddr_in(&address);
|
rtems_bsdnet_initialize_sockaddr_in(&address);
|
||||||
address.sin_addr.s_addr = inet_addr (ip_address);
|
address.sin_addr.s_addr = inet_addr(ip_address);
|
||||||
if (rtems_bsdnet_ifconfig (name, SIOCSIFADDR, &address) < 0) {
|
if (rtems_bsdnet_ifconfig(name, SIOCSIFADDR, &address) < 0) {
|
||||||
printf ("Can't set %s address: %s\n", name, strerror (errno));
|
printf("Can't set %s address: %s\n", name, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,8 +231,8 @@ static bool rtems_bsdnet_setup_interface(
|
|||||||
* Set interface broadcast address if the interface has the
|
* Set interface broadcast address if the interface has the
|
||||||
* broadcast flag set.
|
* broadcast flag set.
|
||||||
*/
|
*/
|
||||||
if (rtems_bsdnet_ifconfig (name, SIOCGIFFLAGS, &flags) < 0) {
|
if (rtems_bsdnet_ifconfig(name, SIOCGIFFLAGS, &flags) < 0) {
|
||||||
printf ("Can't read %s flags: %s\n", name, strerror (errno));
|
printf("Can't read %s flags: %s\n", name, strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -216,14 +242,14 @@ static bool rtems_bsdnet_setup_interface(
|
|||||||
rtems_bsdnet_initialize_sockaddr_in(&broadcast);
|
rtems_bsdnet_initialize_sockaddr_in(&broadcast);
|
||||||
broadcast.sin_addr.s_addr =
|
broadcast.sin_addr.s_addr =
|
||||||
address.sin_addr.s_addr | ~netmask.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;
|
struct in_addr in_addr;
|
||||||
char buf[20];
|
char buf[20];
|
||||||
in_addr.s_addr = broadcast.sin_addr.s_addr;
|
in_addr.s_addr = broadcast.sin_addr.s_addr;
|
||||||
if (!inet_ntop(AF_INET, &in_addr, buf, sizeof(buf)))
|
if (!inet_ntop(AF_INET, &in_addr, buf, sizeof(buf)))
|
||||||
strcpy(buf,"?.?.?.?");
|
strcpy(buf,"?.?.?.?");
|
||||||
printf ("Can't set %s broadcast address %s: %s\n",
|
printf("Can't set %s broadcast address %s: %s\n",
|
||||||
name, buf, strerror (errno));
|
name, buf, strerror(errno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,6 +261,7 @@ static bool rtems_bsdnet_setup_interface(
|
|||||||
void rtems_initialize_interfaces(void)
|
void rtems_initialize_interfaces(void)
|
||||||
{
|
{
|
||||||
bool any_if_configured;
|
bool any_if_configured;
|
||||||
|
struct rtems_bsdnet_ifconfig *ifp;
|
||||||
|
|
||||||
any_if_configured = false;
|
any_if_configured = false;
|
||||||
|
|
||||||
@ -244,7 +271,6 @@ void rtems_initialize_interfaces(void)
|
|||||||
"255.0.0.0"
|
"255.0.0.0"
|
||||||
);
|
);
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
for (ifp = rtems_bsdnet_config.ifconfig ; ifp ; ifp = ifp->next) {
|
for (ifp = rtems_bsdnet_config.ifconfig ; ifp ; ifp = ifp->next) {
|
||||||
if (ifp->ip_address == NULL)
|
if (ifp->ip_address == NULL)
|
||||||
@ -256,6 +282,30 @@ void rtems_initialize_interfaces(void)
|
|||||||
ifp->ip_netmask
|
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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@
|
|||||||
/* Networking */
|
/* Networking */
|
||||||
#define IPSEC 1
|
#define IPSEC 1
|
||||||
#define INET 1
|
#define INET 1
|
||||||
#define INET6 1
|
// #define INET6 1
|
||||||
#define TCP_SIGNATURE 1
|
#define TCP_SIGNATURE 1
|
||||||
|
|
||||||
/* Integer type definitions */
|
/* Integer type definitions */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user