Add control interface
Only generation of TRAP messages over Control Interface is supported so far. Note: requires corresponding version of libosmoctrl. Change-Id: Ia76f841d2c9cd14394e9316fcd39f4060e23c898 Related: OS#1646
This commit is contained in:
parent
cd93f4f4be
commit
727417dd28
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
28
ggsn/ggsn.c
28
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();
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
Reference in New Issue