Change in osmo-ggsn[master]: Add default APN for each EUA Type

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/.

keith gerrit-no-reply at lists.osmocom.org
Sat Apr 25 03:44:27 UTC 2020


keith has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ggsn/+/17941 )


Change subject: Add default APN for each EUA Type
......................................................................

Add default APN for each EUA Type

MS may request an unknown APN. In this case we will use
the APN configured in the vty as default-apn but if
the type support does not match the request we will fail.

The commit adds two more vty commands to configure a default
vpn for v6 and for v4v6

Change-Id: I03fcf8a1532bd9988ea99a6afd3dc325174ce9d6
Fixes: OS#4511
---
M ggsn/ggsn.c
M ggsn/ggsn.h
M ggsn/ggsn_vty.c
3 files changed, 80 insertions(+), 4 deletions(-)



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

diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c
index 159362f..816a496 100644
--- a/ggsn/ggsn.c
+++ b/ggsn/ggsn.c
@@ -452,10 +452,22 @@
 	/* ignore if the APN has not been started */
 	if (apn && !apn->started)
 		apn = NULL;
-
 	/* then try default (if any) */
-	if (!apn)
-		apn = ggsn->cfg.default_apn;
+	if (!apn) {
+		switch (pdp->eua.v[1]) {
+		case PDP_EUA_TYPE_v6:
+			if (ggsn->cfg.default_apnv6)
+				apn = ggsn->cfg.default_apnv6;
+			break;
+		case PDP_EUA_TYPE_v4v6:
+			if (ggsn->cfg.default_apnv4v6)
+				apn = ggsn->cfg.default_apnv4v6;
+			break;
+		default:
+			apn = ggsn->cfg.default_apn;
+			break;
+		}
+	}
 	/* ignore if the APN has not been started */
 	if (apn && !apn->started)
 		apn = NULL;
diff --git a/ggsn/ggsn.h b/ggsn/ggsn.h
index 82984a0..887c743 100644
--- a/ggsn/ggsn.h
+++ b/ggsn/ggsn.h
@@ -115,8 +115,10 @@
 		char *name;
 		/* Description string */
 		char *description;
-		/* an APN that shall be used as default for any non-matching APN */
+		/* APNs that shall be used as default for any non-matching APN */
 		struct apn_ctx *default_apn;
+		struct apn_ctx *default_apnv6;
+		struct apn_ctx *default_apnv4v6;
 		/* ADdress to which we listen for GTP */
 		struct in46_addr listen_addr;
 		/* Local GTP-C address advertised in GTP */
diff --git a/ggsn/ggsn_vty.c b/ggsn/ggsn_vty.c
index cb92a8a..9e643f0 100644
--- a/ggsn/ggsn_vty.c
+++ b/ggsn/ggsn_vty.c
@@ -296,6 +296,60 @@
 	return CMD_SUCCESS;
 }
 
+DEFUN(cfg_ggsn_default_apnv6, cfg_ggsn_default_apnv6_cmd,
+	"default-apnv6 NAME",
+	"Set a default-APN to be used if no other APN v6 matches\n"
+	"APN Name\n")
+{
+	struct ggsn_ctx *ggsn = (struct ggsn_ctx *) vty->index;
+	struct apn_ctx *apn;
+
+	apn = ggsn_find_apn(ggsn, argv[0]);
+	if (!apn) {
+		vty_out(vty, "%% No APN of name '%s' found%s", argv[0], VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	ggsn->cfg.default_apnv6 = apn;
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_ggsn_no_default_apnv6, cfg_ggsn_no_default_apnv6_cmd,
+	"no default-apnv6",
+	NO_STR "Remove default-APN to be used if no other APN matches\n")
+{
+	struct ggsn_ctx *ggsn = (struct ggsn_ctx *) vty->index;
+	ggsn->cfg.default_apnv6 = NULL;
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_ggsn_default_apnv4v6, cfg_ggsn_default_apnv4v6_cmd,
+	"default-apnv4v6 NAME",
+	"Set a default-APN to be used if no other APN v4v6 matches\n"
+	"APN Name\n")
+{
+	struct ggsn_ctx *ggsn = (struct ggsn_ctx *) vty->index;
+	struct apn_ctx *apn;
+
+	apn = ggsn_find_apn(ggsn, argv[0]);
+	if (!apn) {
+		vty_out(vty, "%% No APN of name '%s' found%s", argv[0], VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	ggsn->cfg.default_apnv4v6 = apn;
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_ggsn_no_default_apnv4v6, cfg_ggsn_no_default_apnv4v6_cmd,
+	"no default-apnv4v6",
+	NO_STR "Remove default-APN to be used if no other APN v4v6 matches\n")
+{
+	struct ggsn_ctx *ggsn = (struct ggsn_ctx *) vty->index;
+	ggsn->cfg.default_apn = NULL;
+	return CMD_SUCCESS;
+}
+
 DEFUN(cfg_ggsn_shutdown, cfg_ggsn_shutdown_cmd,
 	"shutdown ggsn",
 	"Put the GGSN in administrative shut-down\n" GGSN_STR)
@@ -792,6 +846,10 @@
 			config_write_apn(vty, apn);
 		if (ggsn->cfg.default_apn)
 			vty_out(vty, " default-apn %s%s", ggsn->cfg.default_apn->cfg.name, VTY_NEWLINE);
+		if (ggsn->cfg.default_apnv6)
+			vty_out(vty, " default-apnv6 %s%s", ggsn->cfg.default_apnv6->cfg.name, VTY_NEWLINE);
+		if (ggsn->cfg.default_apnv4v6)
+			vty_out(vty, " default-apnv4v6 %s%s", ggsn->cfg.default_apnv4v6->cfg.name, VTY_NEWLINE);
 		if (ggsn->cfg.echo_interval)
 			vty_out(vty, " echo-interval %u%s", ggsn->cfg.echo_interval, VTY_NEWLINE);
 		/* must be last */
@@ -1097,6 +1155,10 @@
 	install_element(GGSN_NODE, &cfg_ggsn_no_apn_cmd);
 	install_element(GGSN_NODE, &cfg_ggsn_default_apn_cmd);
 	install_element(GGSN_NODE, &cfg_ggsn_no_default_apn_cmd);
+	install_element(GGSN_NODE, &cfg_ggsn_default_apnv6_cmd);
+	install_element(GGSN_NODE, &cfg_ggsn_no_default_apnv6_cmd);
+	install_element(GGSN_NODE, &cfg_ggsn_default_apnv4v6_cmd);
+	install_element(GGSN_NODE, &cfg_ggsn_no_default_apnv4v6_cmd);
 	install_element(GGSN_NODE, &cfg_ggsn_show_sgsn_cmd);
 	install_element(GGSN_NODE, &cfg_ggsn_echo_interval_cmd);
 	install_element(GGSN_NODE, &cfg_ggsn_no_echo_interval_cmd);

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-ggsn/+/17941
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ggsn
Gerrit-Branch: master
Gerrit-Change-Id: I03fcf8a1532bd9988ea99a6afd3dc325174ce9d6
Gerrit-Change-Number: 17941
Gerrit-PatchSet: 1
Gerrit-Owner: keith <keith at rhizomatica.org>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200425/72fcfbcd/attachment.htm>


More information about the gerrit-log mailing list