[PATCH] osmo-ggsn[master]: Get rid of hard-coded kernel GTP device name

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Sun Nov 12 22:13:55 UTC 2017


Review at  https://gerrit.osmocom.org/4813

Get rid of hard-coded kernel GTP device name

The existing kernel GTP support code inherited from OpenGGSN was overly
simplistic and didn't support multiple GTP devices or user-defined GTP
device names.  Let's remove that restriction in this patch

Change-Id: I51df223788fd5b7cf8099463b8aa0ca4a4fd1c96
---
M ggsn/ggsn.c
M ggsn/gtp-kernel.c
M ggsn/gtp-kernel.h
3 files changed, 25 insertions(+), 27 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-ggsn refs/changes/13/4813/1

diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c
index 9d55ffb..2785c2c 100644
--- a/ggsn/ggsn.c
+++ b/ggsn/ggsn.c
@@ -262,7 +262,8 @@
 		}
 		LOGPAPN(LOGL_ERROR, apn, "Setting up Kernel GTP\n");
 		/* use GTP kernel module for data packet encapsulation */
-		if (gtp_kernel_init(apn->ggsn->gsn, &apn->v4.cfg.ifconfig_prefix, apn->tun.cfg.ipup_script) < 0) {
+		if (gtp_kernel_init(apn->ggsn->gsn, apn->tun.cfg.dev_name,
+				    &apn->v4.cfg.ifconfig_prefix, apn->tun.cfg.ipup_script) < 0) {
 			return -1;
 		}
 		break;
@@ -330,6 +331,7 @@
 {
 	struct gsn_t *gsn = pdp->gsn;
 	struct ippoolm_t *ipp = (struct ippoolm_t *)pdp->peer;
+	struct apn_ctx *apn = pdp->priv;
 
 	LOGPPDP(LOGL_INFO, pdp, "Deleting PDP context\n");
 	struct ippoolm_t *member = pdp->peer;
@@ -340,7 +342,7 @@
 	} else
 		LOGPPDP(LOGL_ERROR, pdp, "Cannot find/free IP Pool member\n");
 
-	if (gtp_kernel_tunnel_del(pdp)) {
+	if (gtp_kernel_tunnel_del(pdp, apn->tun.cfg.dev_name)) {
 		LOGPPDP(LOGL_ERROR, pdp, "Cannot delete tunnel from kernel:%s\n",
 			strerror(errno));
 	}
@@ -563,7 +565,7 @@
 		in46a_to_eua(&member->addr, &pdp->eua);
 
 		/* TODO: In IPv6, EUA doesn't contain the actual IP addr/prefix! */
-		if (gtp_kernel_tunnel_add(pdp) < 0) {
+		if (gtp_kernel_tunnel_add(pdp, apn->tun.cfg.dev_name) < 0) {
 			LOGPPDP(LOGL_ERROR, pdp, "Cannot add tunnel to kernel: %s\n", strerror(errno));
 			gtp_create_context_resp(gsn, pdp, GTPCAUSE_SYS_FAIL);
 			return 0;
@@ -592,6 +594,7 @@
 
 	pdp->peer = member;
 	pdp->ipif = apn->tun.tun;	/* TODO */
+	pdp->priv = apn;
 	member->peer = pdp;
 
 	if (!send_trap(gsn, pdp, member, "imsi-ass-ip")) { /* TRAP with IP assignment */
diff --git a/ggsn/gtp-kernel.c b/ggsn/gtp-kernel.c
index a5708fc..102f0f7 100644
--- a/ggsn/gtp-kernel.c
+++ b/ggsn/gtp-kernel.c
@@ -54,10 +54,7 @@
 	bool			enabled;
 } gtp_nl;
 
-/* Always forces the kernel to allocate gtp0. If it exists it hits EEXIST */
-#define GTP_DEVNAME	"gtp0"
-
-int gtp_kernel_init(struct gsn_t *gsn, struct in46_prefix *prefix, const char *ipup)
+int gtp_kernel_init(struct gsn_t *gsn, const char *devname, struct in46_prefix *prefix, const char *ipup)
 {
 	struct in_addr net;
 	const char *net_arg;
@@ -69,7 +66,7 @@
 	}
 	net = prefix->addr.v4;
 
-	if (gtp_dev_create(-1, GTP_DEVNAME, gsn->fd0, gsn->fd1u) < 0) {
+	if (gtp_dev_create(-1, devname, gsn->fd0, gsn->fd1u) < 0) {
 		SYS_ERR(DGGSN, LOGL_ERROR, 0,
 			"cannot create GTP tunnel device: %s\n",
 			strerror(errno));
@@ -94,10 +91,9 @@
 
 	net_arg = in46p_ntoa(prefix);
 
-	DEBUGP(DGGSN, "Setting route to reach %s via %s\n",
-	       net_arg, GTP_DEVNAME);
+	DEBUGP(DGGSN, "Setting route to reach %s via %s\n", net_arg, devname);
 
-	if (gtp_dev_config(GTP_DEVNAME, &net, prefix->prefixlen) < 0) {
+	if (gtp_dev_config(devname, &net, prefix->prefixlen) < 0) {
 		SYS_ERR(DGGSN, LOGL_ERROR, 0,
 			"Cannot add route to reach network %s\n",
 			net_arg);
@@ -113,8 +109,7 @@
 		int err;
 
 		/* eg. /home/ggsn/ipup gtp0 10.0.0.0/8 */
-		snprintf(cmd, sizeof(cmd), "%s %s %s",
-			 ipup, GTP_DEVNAME, net_arg);
+		snprintf(cmd, sizeof(cmd), "%s %s %s", ipup, devname, net_arg);
 		cmd[sizeof(cmd)-1] = '\0';
 
 		err = system(cmd);
@@ -129,15 +124,15 @@
 	return 0;
 }
 
-void gtp_kernel_stop(void)
+void gtp_kernel_stop(const char *devname)
 {
 	if (!gtp_nl.enabled)
 		return;
 
-	gtp_dev_destroy(GTP_DEVNAME);
+	gtp_dev_destroy(devname);
 }
 
-int gtp_kernel_tunnel_add(struct pdp_t *pdp)
+int gtp_kernel_tunnel_add(struct pdp_t *pdp, const char *devname)
 {
 	struct in_addr ms, sgsn;
 	struct gtp_tunnel *t;
@@ -155,7 +150,7 @@
 	memcpy(&ms, &pdp->eua.v[2], sizeof(struct in_addr));
 	memcpy(&sgsn, &pdp->gsnrc.v[0], sizeof(struct in_addr));
 
-	gtp_tunnel_set_ifidx(t, if_nametoindex(GTP_DEVNAME));
+	gtp_tunnel_set_ifidx(t, if_nametoindex(devname));
 	gtp_tunnel_set_version(t, pdp->version);
 	gtp_tunnel_set_ms_ip4(t, &ms);
 	gtp_tunnel_set_sgsn_ip4(t, &sgsn);
@@ -175,7 +170,7 @@
 	return ret;
 }
 
-int gtp_kernel_tunnel_del(struct pdp_t *pdp)
+int gtp_kernel_tunnel_del(struct pdp_t *pdp, const char *devname)
 {
 	struct gtp_tunnel *t;
 	int ret;
@@ -189,7 +184,7 @@
 	if (t == NULL)
 		return -1;
 
-	gtp_tunnel_set_ifidx(t, if_nametoindex(GTP_DEVNAME));
+	gtp_tunnel_set_ifidx(t, if_nametoindex(devname));
 	gtp_tunnel_set_version(t, pdp->version);
 	if (pdp->version == 0) {
 		gtp_tunnel_set_tid(t, pdp_gettid(pdp->imsi, pdp->nsapi));
diff --git a/ggsn/gtp-kernel.h b/ggsn/gtp-kernel.h
index ce57994..79cdae7 100644
--- a/ggsn/gtp-kernel.h
+++ b/ggsn/gtp-kernel.h
@@ -7,29 +7,29 @@
 extern char *ipup;
 
 #ifdef GTP_KERNEL
-int gtp_kernel_init(struct gsn_t *gsn, struct in46_prefix *prefix, const char *ipup);
-void gtp_kernel_stop(void);
+int gtp_kernel_init(struct gsn_t *gsn, const char *devname, struct in46_prefix *prefix, const char *ipup);
+void gtp_kernel_stop(const char *devname);
 
-int gtp_kernel_tunnel_add(struct pdp_t *pdp);
-int gtp_kernel_tunnel_del(struct pdp_t *pdp);
+int gtp_kernel_tunnel_add(struct pdp_t *pdp, const char *devname);
+int gtp_kernel_tunnel_del(struct pdp_t *pdp, const char *devname);
 
 int gtp_kernel_enabled(void);
 
 #else
-static inline int gtp_kernel_init(struct gsn_t *gsn, struct in46_prefix *prefix, const char *ipup)
+static inline int gtp_kernel_init(struct gsn_t *gsn, const char *devname, struct in46_prefix *prefix, const char *ipup)
 {
 	SYS_ERR(DGGSN, LOGL_ERROR, 0, "ggsn compiled without GTP kernel support!\n");
 	return -1;
 }
 
-static inline void gtp_kernel_stop(void) {}
+static inline void gtp_kernel_stop(const char *devname) {}
 
-static inline int gtp_kernel_tunnel_add(struct pdp_t *pdp)
+static inline int gtp_kernel_tunnel_add(struct pdp_t *pdp, const char *devname);
 {
 	return 0;
 }
 
-static inline int gtp_kernel_tunnel_del(struct pdp_t *pdp)
+static inline int gtp_kernel_tunnel_del(struct pdp_t *pdp, const char *devname);
 {
 	return 0;
 }

-- 
To view, visit https://gerrit.osmocom.org/4813
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I51df223788fd5b7cf8099463b8aa0ca4a4fd1c96
Gerrit-PatchSet: 1
Gerrit-Project: osmo-ggsn
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>



More information about the gerrit-log mailing list