sgsn: Add easy APN commands with just the name

For most configurations we don't address multiple GGSNs but
only want to enforce a list of APNs. In the future we might
add a special global GGSN context but not right now.

Fixes: SYS#593
diff --git a/openbsc/src/gprs/sgsn_vty.c b/openbsc/src/gprs/sgsn_vty.c
index d85ea01..684204a 100644
--- a/openbsc/src/gprs/sgsn_vty.c
+++ b/openbsc/src/gprs/sgsn_vty.c
@@ -784,6 +784,27 @@
 	return CMD_SUCCESS;
 }
 
+DEFUN(cfg_apn_name, cfg_apn_name_cmd,
+	"access-point-name NAME",
+	"Configure a global list of allowed APNs\n"
+	"Add this NAME to the list\n")
+{
+	return add_apn_ggsn_mapping(vty, argv[0], "", 0);
+}
+
+DEFUN(cfg_no_apn_name, cfg_no_apn_name_cmd,
+	"no access-point-name NAME",
+	NO_STR "Configure a global list of allowed APNs\n"
+	"Remove entry with NAME\n")
+{
+	struct apn_ctx *apn_ctx = sgsn_apn_ctx_by_name(argv[0], "");
+	if (!apn_ctx)
+		return CMD_SUCCESS;
+
+	sgsn_apn_ctx_free(apn_ctx);
+	return CMD_SUCCESS;
+}
+
 int sgsn_vty_init(void)
 {
 	install_element_ve(&show_sgsn_cmd);
@@ -813,6 +834,8 @@
 	install_element(SGSN_NODE, &cfg_gsup_remote_port_cmd);
 	install_element(SGSN_NODE, &cfg_apn_ggsn_cmd);
 	install_element(SGSN_NODE, &cfg_apn_imsi_ggsn_cmd);
+	install_element(SGSN_NODE, &cfg_apn_name_cmd);
+	install_element(SGSN_NODE, &cfg_no_apn_name_cmd);
 
 	return 0;
 }