diff options
author | jjako <jjako> | 2004-01-28 09:27:34 +0000 |
---|---|---|
committer | jjako <jjako> | 2004-01-28 09:27:34 +0000 |
commit | 1ea66348518ad1d438ea14bc7a16244bbb49b9a0 (patch) | |
tree | 7811c242f39999321b4efd8c0fcacbda8bc511f3 | |
parent | 3eaf453e06109e6117ce95dfb3c0fd37f5dc0471 (diff) |
Added FreeBSD route capability
-rw-r--r-- | doc/Makefile | 18 | ||||
-rw-r--r-- | ggsn/tun.c | 100 | ||||
-rw-r--r-- | gtp/gtp.c | 2 | ||||
-rw-r--r-- | gtp/pdp.c | 4 | ||||
-rw-r--r-- | sgsnemu/tun.c | 65 |
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) @@ -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; @@ -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++; @@ -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; |