aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjjako <jjako>2004-01-28 09:27:34 +0000
committerjjako <jjako>2004-01-28 09:27:34 +0000
commit1ea66348518ad1d438ea14bc7a16244bbb49b9a0 (patch)
tree7811c242f39999321b4efd8c0fcacbda8bc511f3
parent3eaf453e06109e6117ce95dfb3c0fd37f5dc0471 (diff)
Added FreeBSD route capability
-rw-r--r--doc/Makefile18
-rw-r--r--ggsn/tun.c100
-rw-r--r--gtp/gtp.c2
-rw-r--r--gtp/pdp.c4
-rw-r--r--sgsnemu/tun.c65
5 files changed, 124 insertions, 65 deletions
diff --git a/doc/Makefile b/doc/Makefile
index 62a896d..8db62bd 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -13,7 +13,7 @@
# PARTICULAR PURPOSE.
-SHELL = /bin/sh
+SHELL = /usr/local/bin/bash
srcdir = .
top_srcdir = ..
@@ -38,10 +38,10 @@ pkglibdir = $(libdir)/openggsn
pkgincludedir = $(includedir)/openggsn
top_builddir = ..
-ACLOCAL = ${SHELL} /home/jj/openggsn/missing --run aclocal-1.6
-AUTOCONF = ${SHELL} /home/jj/openggsn/missing --run autoconf
-AUTOMAKE = ${SHELL} /home/jj/openggsn/missing --run automake-1.6
-AUTOHEADER = ${SHELL} /home/jj/openggsn/missing --run autoheader
+ACLOCAL = ${SHELL} /usr/home/jj/openggsn/missing --run aclocal-1.6
+AUTOCONF = ${SHELL} /usr/home/jj/openggsn/missing --run autoconf
+AUTOMAKE = ${SHELL} /usr/home/jj/openggsn/missing --run automake-1.6
+AUTOHEADER = ${SHELL} /usr/home/jj/openggsn/missing --run autoheader
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = /usr/bin/install -c
@@ -60,14 +60,14 @@ NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
host_alias =
-host_triplet = i686-pc-linux-gnu
+host_triplet = i386-unknown-freebsd5.2
EXEEXT =
OBJEXT = o
PATH_SEPARATOR = :
-AMTAR = ${SHELL} /home/jj/openggsn/missing --run tar
+AMTAR = ${SHELL} /usr/home/jj/openggsn/missing --run tar
AS = @AS@
-AWK = gawk
+AWK = nawk
CC = gcc
CPP = gcc -E
CXX = g++
@@ -85,7 +85,7 @@ STRIP = strip
VERSION = 0.81
am__include = include
am__quote =
-install_sh = /home/jj/openggsn/install-sh
+install_sh = /usr/home/jj/openggsn/install-sh
man_MANS = ggsn.8 sgsnemu.8
man_aux = $(man_MANS:.1=.x)
EXTRA_DIST = $(man_MANS)
diff --git a/ggsn/tun.c b/ggsn/tun.c
index 66ba4c4..a19fd5b 100644
--- a/ggsn/tun.c
+++ b/ggsn/tun.c
@@ -421,7 +421,17 @@ int tun_setaddr(struct tun_t *this,
close(fd);
this->addrs++;
- return tun_sifflags(this, IFF_UP | IFF_RUNNING);
+
+ /* On linux the route to the interface is set automatically
+ on FreeBSD we have to do this manually */
+
+#if defined(__FreeBSD__)
+ tun_sifflags(this, IFF_UP | IFF_RUNNING); /* TODO */
+ return tun_addroute(this, addr, addr, netmask);
+#else
+ return tun_sifflags(this, IFF_UP | IFF_RUNNING);
+#endif
+
}
int tun_addroute(struct tun_t *this,
@@ -430,7 +440,8 @@ int tun_addroute(struct tun_t *this,
struct in_addr *mask)
{
- /* TODO: Learn how to set routing table on sun and FreeBSD */
+
+ /* TODO: Learn how to set routing table on sun */
#ifdef __linux__
struct rtentry r;
@@ -463,67 +474,53 @@ int tun_addroute(struct tun_t *this,
#elif defined(__FreeBSD__)
-struct my_rt
-{
- struct rt_msghdr rt;
- struct sockaddr_in dst;
- struct sockaddr_in gate;
- struct sockaddr_in mask;
-} my_rt;
+struct {
+ struct rt_msghdr rt;
+ struct sockaddr_in dst;
+ struct sockaddr_in gate;
+ struct sockaddr_in mask;
+} req;
- int s;
+ int fd;
struct rt_msghdr *rtm;
- struct sockaddr_in *dst, *gate, *mask;
-
- if((s = socket(AF_ROUTE, SOCK_RAW, 0)) == -1)
- {
- sys_err(LOG_ERR, __FILE__, __LINE__, errno,
- "socket() failed");
- return -1;
- }
- memset(&my_rt, 0x00, sizeof(my_rt));
+ if((fd = socket(AF_ROUTE, SOCK_RAW, 0)) == -1) {
+ sys_err(LOG_ERR, __FILE__, __LINE__, errno,
+ "socket() failed");
+ return -1;
+ }
- rtm = &my_rt.rt;
+ memset(&req, 0x00, sizeof(req));
- dst = &my_rt.dst;
- gate = &my_rt.gate;
- mask = &my_rt.mask;
+ rtm = &req.rt;
+ rtm->rtm_msglen = sizeof(req);
+ rtm->rtm_version = RTM_VERSION;
rtm->rtm_type = RTM_ADD;
rtm->rtm_flags = RTF_UP | RTF_GATEWAY | RTF_STATIC; /* TODO */
- rtm->rtm_msglen = sizeof(my_rt);
- rtm->rtm_version = RTM_VERSION;
- rtm->rtm_seq = 1234; /* TODO */
rtm->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
rtm->rtm_pid = getpid();
+ rtm->rtm_seq = 0044; /* TODO */
- dst->sin_family = AF_INET;
- dst->sin_len = sizeof(*dst);
- dst->sin_addr.s_addr = dst->s_addr;
-
- mask->sin_family = AF_INET;
- mask->sin_len = sizeof(*mask);
- mask->sin_addr.s_addr = mask->s_addr;
-
- gate->sin_family = AF_INET;
- gate->sin_len = sizeof(*gate);
- gate->sin_addr.s_addr = gateway->s_addr;
-
- AGAIN:
- if(write(s, rtm, rtm->rtm_msglen) < 0)
- {
- if(errno == EEXIST && rtm->rtm_type == RTM_ADD)
- {
- rtm->rtm_type = RTM_CHANGE;
- goto AGAIN;
- }
- sys_err(LOG_ERR, __FILE__, __LINE__, errno,
- "write() failed");
- return -1;
- }
- return 0;
+ req.dst.sin_family = AF_INET;
+ req.dst.sin_len = sizeof(req.dst);
+ req.mask.sin_family = AF_INET;
+ req.mask.sin_len = sizeof(req.mask);
+ req.gate.sin_family = AF_INET;
+ req.gate.sin_len = sizeof(req.gate);
+
+ req.dst.sin_addr.s_addr = dst->s_addr;
+ req.mask.sin_addr.s_addr = mask->s_addr;
+ req.gate.sin_addr.s_addr = gateway->s_addr;
+ if(write(fd, rtm, rtm->rtm_msglen) < 0) {
+ sys_err(LOG_ERR, __FILE__, __LINE__, errno,
+ "write() failed");
+ close(fd);
+ return -1;
+ }
+ close(fd);
+
#endif
return 0;
@@ -636,6 +633,7 @@ int tun_new(struct tun_t **tun)
snprintf((*tun)->devname, sizeof((*tun)->devname), "tun%d", devnum);
(*tun)->devname[sizeof((*tun)->devname)] = 0;
+
#endif
return 0;
diff --git a/gtp/gtp.c b/gtp/gtp.c
index 9b1c5ad..af4bdba 100644
--- a/gtp/gtp.c
+++ b/gtp/gtp.c
@@ -2960,7 +2960,7 @@ int gtp_data_req(struct gsn_t *gsn, struct pdp_t* pdp,
packet.gtp0.h.length = hton16(len);
packet.gtp0.h.seq = hton16(pdp->gtpsntx++);
packet.gtp0.h.flow = hton16(pdp->flru);
- packet.gtp0.h.tid = (pdp->imsi & 0x0fffffffffffffff) + ((uint64_t)pdp->nsapi << 60);
+ packet.gtp0.h.tid = (pdp->imsi & 0x0fffffffffffffffull) + ((uint64_t)pdp->nsapi << 60);
if (len > sizeof (union gtp_packet) - sizeof(struct gtp0_header)) {
gsn->err_memcpy++;
diff --git a/gtp/pdp.c b/gtp/pdp.c
index 130ba44..3a652b8 100644
--- a/gtp/pdp.c
+++ b/gtp/pdp.c
@@ -243,7 +243,7 @@ int pdp_tidget(struct pdp_t **pdp, uint64_t tid) {
int pdp_getimsi(struct pdp_t **pdp, uint64_t imsi, uint8_t nsapi) {
return pdp_tidget(pdp,
- (imsi & 0x0fffffffffffffff) + ((uint64_t)nsapi << 60));
+ (imsi & 0x0fffffffffffffffull) + ((uint64_t)nsapi << 60));
}
/*
@@ -336,7 +336,7 @@ int pdp_euaton(struct ul66_t *eua, struct in_addr *dst) {
}
uint64_t pdp_gettid(uint64_t imsi, uint8_t nsapi) {
- return (imsi & 0x0fffffffffffffff) + ((uint64_t)nsapi << 60);
+ return (imsi & 0x0fffffffffffffffull) + ((uint64_t)nsapi << 60);
}
int ulcpy(void* dst, void* src, size_t size) {
diff --git a/sgsnemu/tun.c b/sgsnemu/tun.c
index 06397d1..a19fd5b 100644
--- a/sgsnemu/tun.c
+++ b/sgsnemu/tun.c
@@ -421,7 +421,17 @@ int tun_setaddr(struct tun_t *this,
close(fd);
this->addrs++;
- return tun_sifflags(this, IFF_UP | IFF_RUNNING);
+
+ /* On linux the route to the interface is set automatically
+ on FreeBSD we have to do this manually */
+
+#if defined(__FreeBSD__)
+ tun_sifflags(this, IFF_UP | IFF_RUNNING); /* TODO */
+ return tun_addroute(this, addr, addr, netmask);
+#else
+ return tun_sifflags(this, IFF_UP | IFF_RUNNING);
+#endif
+
}
int tun_addroute(struct tun_t *this,
@@ -430,7 +440,8 @@ int tun_addroute(struct tun_t *this,
struct in_addr *mask)
{
- /* TODO: Learn how to set routing table on sun and FreeBSD */
+
+ /* TODO: Learn how to set routing table on sun */
#ifdef __linux__
struct rtentry r;
@@ -461,6 +472,55 @@ int tun_addroute(struct tun_t *this,
}
close(fd);
+#elif defined(__FreeBSD__)
+
+struct {
+ struct rt_msghdr rt;
+ struct sockaddr_in dst;
+ struct sockaddr_in gate;
+ struct sockaddr_in mask;
+} req;
+
+ int fd;
+ struct rt_msghdr *rtm;
+
+ if((fd = socket(AF_ROUTE, SOCK_RAW, 0)) == -1) {
+ sys_err(LOG_ERR, __FILE__, __LINE__, errno,
+ "socket() failed");
+ return -1;
+ }
+
+ memset(&req, 0x00, sizeof(req));
+
+ rtm = &req.rt;
+
+ rtm->rtm_msglen = sizeof(req);
+ rtm->rtm_version = RTM_VERSION;
+ rtm->rtm_type = RTM_ADD;
+ rtm->rtm_flags = RTF_UP | RTF_GATEWAY | RTF_STATIC; /* TODO */
+ rtm->rtm_addrs = RTA_DST | RTA_GATEWAY | RTA_NETMASK;
+ rtm->rtm_pid = getpid();
+ rtm->rtm_seq = 0044; /* TODO */
+
+ req.dst.sin_family = AF_INET;
+ req.dst.sin_len = sizeof(req.dst);
+ req.mask.sin_family = AF_INET;
+ req.mask.sin_len = sizeof(req.mask);
+ req.gate.sin_family = AF_INET;
+ req.gate.sin_len = sizeof(req.gate);
+
+ req.dst.sin_addr.s_addr = dst->s_addr;
+ req.mask.sin_addr.s_addr = mask->s_addr;
+ req.gate.sin_addr.s_addr = gateway->s_addr;
+
+ if(write(fd, rtm, rtm->rtm_msglen) < 0) {
+ sys_err(LOG_ERR, __FILE__, __LINE__, errno,
+ "write() failed");
+ close(fd);
+ return -1;
+ }
+ close(fd);
+
#endif
return 0;
@@ -573,6 +633,7 @@ int tun_new(struct tun_t **tun)
snprintf((*tun)->devname, sizeof((*tun)->devname), "tun%d", devnum);
(*tun)->devname[sizeof((*tun)->devname)] = 0;
+
#endif
return 0;