lynxis lazus has submitted this change. ( https://gerrit.osmocom.org/c/osmo-sgsn/+/39294?usp=email )
Change subject: Assign MME GroupId/Code to remote MMEs ......................................................................
Assign MME GroupId/Code to remote MMEs
In preparation to route SGSN Context Req/Resp/Ack the SGSN need to route GTP messages based on the MME GroupId and MME Code.
Change-Id: I881aeba904fb6ca815842d36e466a2459ad81913 --- M include/osmocom/sgsn/gtp_mme.h M src/sgsn/gtp_mme.c M src/sgsn/sgsn_vty.c 3 files changed, 61 insertions(+), 0 deletions(-)
Approvals: fixeria: Looks good to me, but someone else must approve Jenkins Builder: Verified daniel: Looks good to me, approved laforge: Looks good to me, approved
diff --git a/include/osmocom/sgsn/gtp_mme.h b/include/osmocom/sgsn/gtp_mme.h index ceea405..8cc8e89 100644 --- a/include/osmocom/sgsn/gtp_mme.h +++ b/include/osmocom/sgsn/gtp_mme.h @@ -5,6 +5,7 @@ #include <osmocom/core/linuxlist.h> #include <osmocom/core/timer.h> #include <osmocom/gprs/protocol/gsm_24_301.h> +#include <osmocom/gsm/gsm23003.h>
struct gsn_t;
@@ -20,6 +21,9 @@ char *name; struct in_addr remote_addr;
+ struct osmo_gummei gummei; + bool gummei_valid; + /* is it the default route for outgoing message? are all incoming messages accepted? */ bool default_route; }; @@ -30,6 +34,7 @@ struct sgsn_mme_ctx *sgsn_mme_ctx_by_name(const struct sgsn_instance *sgsn, const char *name); struct sgsn_mme_ctx *sgsn_mme_ctx_by_addr(const struct sgsn_instance *sgsn, const struct in_addr *addr); struct sgsn_mme_ctx *sgsn_mme_ctx_by_route(const struct sgsn_instance *sgsn, const struct osmo_eutran_tai *tai); +struct sgsn_mme_ctx *sgsn_mme_ctx_by_gummei(const struct sgsn_instance *sgsn, const struct osmo_gummei *gummei); struct sgsn_mme_ctx *sgsn_mme_ctx_by_default_route(const struct sgsn_instance *sgsn);
void sgsn_mme_ctx_route_add(struct sgsn_mme_ctx *mme, const struct osmo_eutran_tai *tai); diff --git a/src/sgsn/gtp_mme.c b/src/sgsn/gtp_mme.c index 3d7ec76..966b6d7 100644 --- a/src/sgsn/gtp_mme.c +++ b/src/sgsn/gtp_mme.c @@ -131,6 +131,16 @@ return NULL; }
+struct sgsn_mme_ctx *sgsn_mme_ctx_by_gummei(const struct sgsn_instance *sgsn, const struct osmo_gummei *gummei) +{ + struct sgsn_mme_ctx *mme; + llist_for_each_entry(mme, &sgsn->mme_list, list) { + if (mme->gummei_valid && !osmo_gummei_cmp(&mme->gummei, gummei)) + return mme; + } + return NULL; +} + struct sgsn_mme_ctx *sgsn_mme_ctx_by_default_route(const struct sgsn_instance *sgsn) { struct sgsn_mme_ctx *mme; diff --git a/src/sgsn/sgsn_vty.c b/src/sgsn/sgsn_vty.c index 42e91e9..7279167 100644 --- a/src/sgsn/sgsn_vty.c +++ b/src/sgsn/sgsn_vty.c @@ -235,6 +235,12 @@ osmo_mcc_name(rt->tai.mcc), osmo_mnc_name(rt->tai.mnc, rt->tai.mnc_3_digits), rt->tai.tac, VTY_NEWLINE); } + if (mme->gummei_valid) + vty_out(vty, "%s gummei %s %s %d %d%s", + prefix, + osmo_mcc_name(mme->gummei.plmn.mcc), + osmo_mnc_name(mme->gummei.plmn.mnc, mme->gummei.plmn.mnc_3_digits), + mme->gummei.mme.group_id, mme->gummei.mme.code, VTY_NEWLINE); }
static int config_write_sgsn(struct vty *vty) @@ -1781,6 +1787,44 @@ return CMD_SUCCESS; }
+DEFUN(cfg_mme_mmei, cfg_mme_mmei_cmd, + "gummei <0-999> <0-999> <0-65535> <0-254>", + "Configure the mme\n" "MCC\n" "MNC\n" "MME GroupId\n" "MME Code") +{ + struct sgsn_mme_ctx *mme = (struct sgsn_mme_ctx *) vty->index; + + const char *mcc = argv[0]; + const char *mnc = argv[1]; + const char *group_id = argv[2]; + const char *code = argv[3]; + + if (osmo_mcc_from_str(mcc, &mme->gummei.plmn.mcc)) { + vty_out(vty, "%% Error decoding MCC: %s%s", mcc, VTY_NEWLINE); + return CMD_WARNING; + } + + if (osmo_mnc_from_str(mnc, &mme->gummei.plmn.mnc, &mme->gummei.plmn.mnc_3_digits)) { + vty_out(vty, "%% Error decoding MNC: %s%s", mnc, VTY_NEWLINE); + return CMD_WARNING; + } + + mme->gummei.mme.code = atoi(code); + mme->gummei.mme.group_id = atoi(group_id); + mme->gummei_valid = true; + + return CMD_SUCCESS; +} + +DEFUN(cfg_no_mme_mmei, cfg_no_mme_mmei_cmd, + "no gummei", + NO_STR "Remove gummei") +{ + struct sgsn_mme_ctx *mme = (struct sgsn_mme_ctx *) vty->index; + mme->gummei_valid = false; + + return CMD_SUCCESS; +} + int sgsn_vty_init(struct sgsn_config *cfg) { g_cfg = cfg; @@ -1857,6 +1901,8 @@ install_element(MME_NODE, &cfg_mme_remote_ip_cmd); install_element(MME_NODE, &cfg_mme_ran_info_relay_default_cmd); install_element(MME_NODE, &cfg_mme_no_ran_info_relay_default_cmd); + install_element(MME_NODE, &cfg_mme_mmei_cmd); + install_element(MME_NODE, &cfg_no_mme_mmei_cmd); install_element(MME_NODE, &cfg_mme_ran_info_relay_tai_cmd); install_element(MME_NODE, &cfg_mme_no_ran_info_relay_tai_cmd);