From: Max msuraev@sysmocom.de
--- ggsn/ggsn.c | 1 - gtp/pdp.c | 11 ----------- gtp/pdp.h | 1 - 3 files changed, 13 deletions(-)
diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c index 7725016..6866901 100644 --- a/ggsn/ggsn.c +++ b/ggsn/ggsn.c @@ -154,7 +154,6 @@ int create_context_ind(struct pdp_t *pdp)
pdp->eua.l = 0; /* TODO: Indicates dynamic IP */
- /* ulcpy(&pdp->qos_neg, &pdp->qos_req, sizeof(pdp->qos_req.v)); */ memcpy(pdp->qos_neg0, pdp->qos_req0, sizeof(pdp->qos_req0)); memcpy(&pdp->pco_neg, &pco, sizeof(pdp->pco_neg));
diff --git a/gtp/pdp.c b/gtp/pdp.c index f0d6adf..f297af9 100644 --- a/gtp/pdp.c +++ b/gtp/pdp.c @@ -370,14 +370,3 @@ void pdp_set_imsi_nsapi(struct pdp_t *pdp, uint64_t teid) pdp->imsi = teid & 0x0fffffffffffffffull; pdp->nsapi = (teid & 0xf000000000000000ull) >> 60; } - -int ulcpy(void *dst, void *src, size_t size) -{ - if (((struct ul255_t *)src)->l <= size) { - ((struct ul255_t *)dst)->l = ((struct ul255_t *)src)->l; - memcpy(((struct ul255_t *)dst)->v, ((struct ul255_t *)src)->v, - ((struct ul255_t *)dst)->l); - return 0; - } else - return EOF; -} diff --git a/gtp/pdp.h b/gtp/pdp.h index 57af8b3..217b1d6 100644 --- a/gtp/pdp.h +++ b/gtp/pdp.h @@ -252,6 +252,5 @@ int pdp_ipget(struct pdp_t **pdp, void* ipif, struct ul66_t *eua); int pdp_ntoeua(struct in_addr *src, struct ul66_t *eua); int pdp_euaton(struct ul66_t *eua, struct in_addr *dst); uint64_t pdp_gettid(uint64_t imsi, uint8_t nsapi); -int ulcpy(void *dst, void *src, size_t size);
#endif /* !_PDP_H */
From: Max msuraev@sysmocom.de
Only generation of TRAP messages over Control Interface is supported so far.
Note: requires corresponding version of libosmoctrl.
Related: OS#1646 --- configure.ac | 1 + ggsn/Makefile.am | 6 +++--- ggsn/ggsn.c | 28 +++++++++++++++++++++++++++- gtp/gtp.h | 4 +++- 4 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/configure.ac b/configure.ac index 9b8d988..b11730b 100644 --- a/configure.ac +++ b/configure.ac @@ -117,6 +117,7 @@ AM_INIT_AUTOMAKE()
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.6.4) PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty >= 0.3.0) +PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl)
AC_CONFIG_FILES([Makefile doc/Makefile diff --git a/ggsn/Makefile.am b/ggsn/Makefile.am index c8868c1..3ad3a6e 100644 --- a/ggsn/Makefile.am +++ b/ggsn/Makefile.am @@ -2,13 +2,13 @@ bin_PROGRAMS = ggsn
AM_LDFLAGS = @EXEC_LDFLAGS@
-AM_CFLAGS = -O2 -D_GNU_SOURCE -fno-builtin -Wall -DSBINDIR='"$(sbindir)"' -ggdb $(LIBOSMOCORE_CFLAGS) +AM_CFLAGS = -O2 -D_GNU_SOURCE -fno-builtin -Wall -DSBINDIR='"$(sbindir)"' -ggdb $(LIBOSMOCORE_CFLAGS) $(LIBOSMOCTRL_CFLAGS)
if ENABLE_GTP_KERNEL AM_CFLAGS += -DGTP_KERNEL -ggsn_LDADD = @EXEC_LDADD@ -lgtp -lgtpnl -L../gtp ../lib/libmisc.a $(LIBOSMOCORE_LIBS) +ggsn_LDADD = @EXEC_LDADD@ -lgtp -lgtpnl -L../gtp ../lib/libmisc.a $(LIBOSMOCORE_LIBS) $(LIBOSMOCTRL_LIBS) else -ggsn_LDADD = @EXEC_LDADD@ -lgtp -L../gtp ../lib/libmisc.a $(LIBOSMOCORE_LIBS) +ggsn_LDADD = @EXEC_LDADD@ -lgtp -L../gtp ../lib/libmisc.a $(LIBOSMOCORE_LIBS) $(LIBOSMOCTRL_LIBS) endif
ggsn_DEPENDENCIES = ../gtp/libgtp.la ../lib/libmisc.a diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c index 6866901..9609d52 100644 --- a/ggsn/ggsn.c +++ b/ggsn/ggsn.c @@ -39,7 +39,7 @@ #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> - +#include <inttypes.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> @@ -48,6 +48,11 @@
#include <time.h>
+#include <osmocom/core/select.h> +#include <osmocom/ctrl/control_if.h> +#include <osmocom/ctrl/control_cmd.h> +#include <osmocom/ctrl/ports.h> + #include "../lib/tun.h" #include "../lib/ippool.h" #include "../lib/syserr.h" @@ -131,6 +136,9 @@ int daemon(int nochdir, int noclose) int delete_context(struct pdp_t *pdp) { DEBUGP(DGGSN, "Deleting PDP context\n"); + struct ippoolm_t *member = pdp->peer; + char v[NAMESIZE]; + snprintf(v, sizeof(v), "%" PRIu64 ",%s", pdp->imsi, inet_ntoa(member->addr)); if (pdp->peer) ippool_freeip(ippool, (struct ippoolm_t *)pdp->peer); else @@ -141,6 +149,9 @@ int delete_context(struct pdp_t *pdp) "Cannot delete tunnel from kernel: %s\n", strerror(errno)); } +/* FIXME: naming? */ + if (ctrl_cmd_send_trap(gsn->ctrl, "imsi-rem-ip", v) < 0) + LOGP(DGGSN, LOGL_ERROR, "Trap creation failed.\n");
return 0; } @@ -149,6 +160,7 @@ int create_context_ind(struct pdp_t *pdp) { struct in_addr addr; struct ippoolm_t *member; + char v[NAMESIZE];
DEBUGP(DGGSN, "Received create PDP context request\n");
@@ -178,6 +190,13 @@ int create_context_ind(struct pdp_t *pdp) SYS_ERR(DGGSN, LOGL_ERROR, 0, "Cannot add tunnel to kernel: %s\n", strerror(errno)); } +/* FIXME: naming? */ + snprintf(v, sizeof(v), "%" PRIu64 ",%s", pdp->imsi, inet_ntoa(member->addr)); + if (ctrl_cmd_send_trap(gsn->ctrl, "imsi-ass-ip", v) < 0) { + LOGP(DGGSN, LOGL_ERROR, "Trap creation failed.\n"); + gtp_create_context_resp(gsn, pdp, GTPCAUSE_NO_RESOURCES); + return 0; + }
gtp_create_context_resp(gsn, pdp, GTPCAUSE_ACC_REQ); return 0; /* Success */ @@ -526,6 +545,12 @@ int main(int argc, char **argv) gtp_set_cb_delete_context(gsn, delete_context); gtp_set_cb_create_context_ind(gsn, create_context_ind);
+ gsn->ctrl = ctrl_interface_setup(NULL, OSMO_CTRL_PORT_GGSN, NULL); + if (!gsn->ctrl) { + LOGP(DGGSN, LOGL_ERROR, "Failed to create CTRL interface.\n"); + exit(1); + } + /* skip the configuration of the tun0 if we're using the gtp0 device */ if (gtp_kernel_enabled()) goto skip_tun; @@ -597,6 +622,7 @@ skip_tun: if (FD_ISSET(gsn->fd1u, &fds)) gtp_decaps1u(gsn);
+ osmo_select_main(1); } err: gtp_kernel_stop(); diff --git a/gtp/gtp.h b/gtp/gtp.h index 539e255..fd138cc 100644 --- a/gtp/gtp.h +++ b/gtp/gtp.h @@ -12,6 +12,8 @@ #ifndef _GTP_H #define _GTP_H
+#include <osmocom/ctrl/control_if.h> + #define GTP_MODE_GGSN 1 #define GTP_MODE_SGSN 2
@@ -245,7 +247,7 @@ struct gsn_t {
unsigned char restart_counter; /* Increment on restart. Stored on disk */ char *statedir; /* Disk location for permanent storage */ - + struct ctrl_handle *ctrl; /* Control Interface */ struct queue_t *queue_req; /* Request queue */ struct queue_t *queue_resp; /* Response queue */
osmocom-net-gprs@lists.osmocom.org