From a40d1dd2afc4f0793e4cce54b315c7b4f1bcdcb9 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Sun, 21 Jul 2019 20:06:08 +0900 Subject: [PATCH] [#231] sgsap configuration is changed sgsap: addr: 127.0.0.2 map: tai: plmn_id: mcc: 001 mnc: 01 tac: 4131 lai: plmn_id: mcc: 001 mnc: 01 lac: 43691 --- src/app/context.c | 2 + src/app/context.h | 1 + src/mme/mme-context.c | 364 ++++++++++++++++++++++++--------- src/mme/mme-context.h | 19 +- support/config/nextepc.conf.in | 92 ++++++--- tests/sample-csfb.conf.in | 32 ++- 6 files changed, 372 insertions(+), 138 deletions(-) diff --git a/src/app/context.c b/src/app/context.c index 1a068ff81..2aa22427e 100644 --- a/src/app/context.c +++ b/src/app/context.c @@ -165,11 +165,13 @@ static int context_prepare() #define MAX_NUM_OF_SGW 32 /* Num of SGW per MME */ #define MAX_NUM_OF_PGW 32 /* Num of PGW per MME */ #define MAX_NUM_OF_VLR 32 /* Num of VLR per MME */ +#define MAX_NUM_OF_CSMAP 128 /* Num of TAI-LAI MAP per MME */ #define MAX_NUM_OF_ENB 32 /* Num of eNodeB per MME */ #define MAX_NUM_OF_UE 128 /* Num of UE per eNodeB */ self.config.max.sgw = MAX_NUM_OF_SGW; self.config.max.pgw = MAX_NUM_OF_PGW; self.config.max.vlr = MAX_NUM_OF_VLR; + self.config.max.csmap = MAX_NUM_OF_CSMAP; self.config.max.enb = MAX_NUM_OF_ENB; self.config.max.ue = MAX_NUM_OF_UE; diff --git a/src/app/context.h b/src/app/context.h index f371c953b..b11310c10 100644 --- a/src/app/context.h +++ b/src/app/context.h @@ -62,6 +62,7 @@ typedef struct _config_t { int sgw; int pgw; int vlr; + int csmap; int enb; int ue; struct { diff --git a/src/mme/mme-context.c b/src/mme/mme-context.c index 0056bb0cd..0a5e11dc2 100644 --- a/src/mme/mme-context.c +++ b/src/mme/mme-context.c @@ -50,6 +50,7 @@ int __esm_log_domain; static OGS_POOL(mme_sgw_pool, mme_sgw_t); static OGS_POOL(mme_pgw_pool, mme_pgw_t); static OGS_POOL(mme_vlr_pool, mme_vlr_t); +static OGS_POOL(mme_csmap_pool, mme_csmap_t); static OGS_POOL(mme_enb_pool, mme_enb_t); static OGS_POOL(mme_ue_pool, mme_ue_t); @@ -85,10 +86,12 @@ void mme_context_init() ogs_list_init(&self.pgw_list); ogs_list_init(&self.enb_list); ogs_list_init(&self.vlr_list); + ogs_list_init(&self.csmap_list); ogs_pool_init(&mme_sgw_pool, context_self()->config.max.sgw); ogs_pool_init(&mme_pgw_pool, context_self()->config.max.pgw); ogs_pool_init(&mme_vlr_pool, context_self()->config.max.vlr); + ogs_pool_init(&mme_csmap_pool, context_self()->config.max.csmap); ogs_pool_init(&mme_enb_pool, context_self()->config.max.enb); @@ -118,6 +121,7 @@ void mme_context_final() mme_sgw_remove_all(); mme_pgw_remove_all(); + mme_csmap_remove_all(); mme_vlr_remove_all(); ogs_assert(self.enb_addr_hash); @@ -142,6 +146,7 @@ void mme_context_final() ogs_pool_final(&mme_sgw_pool); ogs_pool_final(&mme_pgw_pool); + ogs_pool_final(&mme_csmap_pool); ogs_pool_final(&mme_vlr_pool); gtp_node_final(); @@ -1075,12 +1080,16 @@ int mme_context_parse_config() do { mme_vlr_t *vlr = NULL; plmn_id_t plmn_id; - const char *tai_mcc = NULL, *tai_mnc = NULL; - const char *lai_mcc = NULL, *lai_mnc = NULL; - const char *tac = NULL, *lac = NULL; +#define MAX_NUM_OF_CSMAP 128 /* Num of TAI-LAI MAP per MME */ + struct { + const char *tai_mcc, *tai_mnc; + const char *lai_mcc, *lai_mnc; + const char *tac, *lac; + } map[MAX_NUM_OF_CSMAP]; + int map_num = 0; ogs_sockaddr_t *addr = NULL; int family = AF_UNSPEC; - int i, num = 0; + int i, hostname_num = 0; const char *hostname[MAX_NUM_OF_HOSTNAME]; uint16_t port = self.sgsap_port; @@ -1129,8 +1138,9 @@ int mme_context_parse_config() break; } - ogs_assert(num <= MAX_NUM_OF_HOSTNAME); - hostname[num++] = + ogs_assert(hostname_num <= + MAX_NUM_OF_HOSTNAME); + hostname[hostname_num++] = ogs_yaml_iter_value(&hostname_iter); } while ( ogs_yaml_iter_type(&hostname_iter) == @@ -1142,95 +1152,194 @@ int mme_context_parse_config() port = atoi(v); self.sgsap_port = port; } + } else if (!strcmp(sgsap_key, "map")) { + ogs_yaml_iter_t map_iter; + ogs_yaml_iter_recurse(&sgsap_iter, &map_iter); + + map[map_num].tai_mcc = NULL; + map[map_num].tai_mnc = NULL; + map[map_num].tac = NULL; + map[map_num].lai_mcc = NULL; + map[map_num].lai_mnc = NULL; + map[map_num].lac = NULL; + + while (ogs_yaml_iter_next(&map_iter)) { + const char *map_key = + ogs_yaml_iter_key(&map_iter); + ogs_assert(map_key); + if (!strcmp(map_key, "tai")) { + ogs_yaml_iter_t tai_iter; + ogs_yaml_iter_recurse(&map_iter, + &tai_iter); + + while (ogs_yaml_iter_next(&tai_iter)) { + const char *tai_key = + ogs_yaml_iter_key(&tai_iter); + ogs_assert(tai_key); + + if (!strcmp(tai_key, "plmn_id")) { + ogs_yaml_iter_t plmn_id_iter; + ogs_yaml_iter_recurse(&tai_iter, + &plmn_id_iter); + + while (ogs_yaml_iter_next( + &plmn_id_iter)) { + const char *plmn_id_key = + ogs_yaml_iter_key( + &plmn_id_iter); + ogs_assert(plmn_id_key); + + if (!strcmp(plmn_id_key, + "mcc")) { + map[map_num].tai_mcc = + ogs_yaml_iter_value( + &plmn_id_iter); + } else if (!strcmp( + plmn_id_key, "mnc")) { + map[map_num].tai_mnc = + ogs_yaml_iter_value( + &plmn_id_iter); + } else + ogs_warn( + "unknown key `%s`", + plmn_id_key); + } + } else if (!strcmp(tai_key, "tac")) { + map[map_num].tac = + ogs_yaml_iter_value( + &tai_iter); + } else + ogs_warn("unknown key `%s`", + tai_key); + } + } else if (!strcmp(map_key, "lai")) { + ogs_yaml_iter_t lai_iter; + ogs_yaml_iter_recurse(&map_iter, + &lai_iter); + + while (ogs_yaml_iter_next(&lai_iter)) { + const char *lai_key = + ogs_yaml_iter_key(&lai_iter); + ogs_assert(lai_key); + + if (!strcmp(lai_key, "plmn_id")) { + ogs_yaml_iter_t plmn_id_iter; + ogs_yaml_iter_recurse(&lai_iter, + &plmn_id_iter); + + while (ogs_yaml_iter_next( + &plmn_id_iter)) { + const char *plmn_id_key = + ogs_yaml_iter_key( + &plmn_id_iter); + ogs_assert(plmn_id_key); + + if (!strcmp(plmn_id_key, + "mcc")) { + map[map_num].lai_mcc = + ogs_yaml_iter_value( + &plmn_id_iter); + } else if (!strcmp( + plmn_id_key, "mnc")) { + map[map_num].lai_mnc = + ogs_yaml_iter_value( + &plmn_id_iter); + } else + ogs_warn( + "unknown key `%s`", + plmn_id_key); + } + } else if (!strcmp(lai_key, "lac")) { + map[map_num].lac = + ogs_yaml_iter_value( + &lai_iter); + } else + ogs_warn("unknown key `%s`", + lai_key); + } + } else + ogs_warn("unknown key `%s`", map_key); + } + + if (!map[map_num].tai_mcc) { + ogs_error("No map.tai.plmn_id.mcc " + "in configuration file"); + return OGS_ERROR; + } + if (!map[map_num].tai_mnc) { + ogs_error("No map.tai.plmn_id.mnc " + "in configuration file"); + return OGS_ERROR; + } + if (!map[map_num].tac) { + ogs_error("No map.tai.tac " + "in configuration file"); + return OGS_ERROR; + } + if (!map[map_num].lai_mcc) { + ogs_error("No map.lai.plmn_id.mcc " + "in configuration file"); + return OGS_ERROR; + } + if (!map[map_num].lai_mnc) { + ogs_error("No map.lai.plmn_id.mnc " + "in configuration file"); + return OGS_ERROR; + } + if (!map[map_num].lac) { + ogs_error("No map.lai.lac " + "in configuration file"); + return OGS_ERROR; + } + + map_num++; + } else if (!strcmp(sgsap_key, "tai")) { - ogs_yaml_iter_t tai_iter; - ogs_yaml_iter_recurse(&sgsap_iter, &tai_iter); - - while (ogs_yaml_iter_next(&tai_iter)) { - const char *tai_id_key = - ogs_yaml_iter_key(&tai_iter); - ogs_assert(tai_id_key); - - if (!strcmp(tai_id_key, "plmn_id")) { - ogs_yaml_iter_t plmn_id_iter; - ogs_yaml_iter_recurse(&tai_iter, - &plmn_id_iter); - - while (ogs_yaml_iter_next( - &plmn_id_iter)) { - const char *plmn_id_key = - ogs_yaml_iter_key(&plmn_id_iter); - ogs_assert(plmn_id_key); - - if (!strcmp(plmn_id_key, "mcc")) { - tai_mcc = ogs_yaml_iter_value( - &plmn_id_iter); - } else if (!strcmp(plmn_id_key, - "mnc")) { - tai_mnc = ogs_yaml_iter_value( - &plmn_id_iter); - } else - ogs_warn("unknown key `%s`", - plmn_id_key); - } - } else if (!strcmp(tai_id_key, "tac")) { - tac = ogs_yaml_iter_value(&tai_iter); - } else - ogs_warn("unknown key `%s`", - tai_id_key); - } + ogs_error("tai/lai configuraton changed to " + "map.tai/map.lai"); + printf("sgsap:\n" + " addr: 127.0.0.2\n" + " map:\n" + " tai:\n" + " plmn_id:\n" + " mcc: 001\n" + " mnc: 01\n" + " tac: 4131\n" + " lai:\n" + " plmn_id:\n" + " mcc: 001\n" + " mnc: 01\n" + " lac: 43691\n"); + return OGS_ERROR; } else if (!strcmp(sgsap_key, "lai")) { - ogs_yaml_iter_t lai_iter; - ogs_yaml_iter_recurse(&sgsap_iter, &lai_iter); - - while (ogs_yaml_iter_next(&lai_iter)) { - const char *lai_id_key = - ogs_yaml_iter_key(&lai_iter); - ogs_assert(lai_id_key); - - if (!strcmp(lai_id_key, "plmn_id")) { - ogs_yaml_iter_t plmn_id_iter; - ogs_yaml_iter_recurse(&lai_iter, - &plmn_id_iter); - - while (ogs_yaml_iter_next( - &plmn_id_iter)) { - const char *plmn_id_key = - ogs_yaml_iter_key(&plmn_id_iter); - ogs_assert(plmn_id_key); - - if (!strcmp(plmn_id_key, "mcc")) { - lai_mcc = ogs_yaml_iter_value( - &plmn_id_iter); - } else if (!strcmp(plmn_id_key, - "mnc")) { - lai_mnc = ogs_yaml_iter_value( - &plmn_id_iter); - } else - ogs_warn("unknown key `%s`", - plmn_id_key); - } - } else if (!strcmp(lai_id_key, "lac")) { - lac = ogs_yaml_iter_value(&lai_iter); - } else - ogs_warn("unknown key `%s`", - lai_id_key); - } + ogs_error("tai/lai configuraton changed to " + "map.tai/map.lai"); + printf("sgsap:\n" + " addr: 127.0.0.2\n" + " map:\n" + " tai:\n" + " plmn_id:\n" + " mcc: 001\n" + " mnc: 01\n" + " tac: 4131\n" + " lai:\n" + " plmn_id:\n" + " mcc: 001\n" + " mnc: 01\n" + " lac: 43691\n"); + return OGS_ERROR; } else ogs_warn("unknown key `%s`", sgsap_key); + } - if (!tai_mcc || !tai_mnc || !tac || - !lai_mcc || !lai_mnc || !lac) { - ogs_error("sgsap.tai configuration failed" - " - (tai_mcc:%p, tai_mnc:%p, tac:%p)" - " - (lai_mcc:%p, lai_mnc:%p, lac:%p)", - tai_mcc, tai_mnc, tac, lai_mcc, lai_mnc, lac); + if (map_num == 0) { + ogs_error("No TAI-LAI Map"); return OGS_ERROR; } addr = NULL; - for (i = 0; i < num; i++) { + for (i = 0; i < hostname_num; i++) { rv = ogs_addaddrinfo(&addr, family, hostname[i], port, 0); ogs_assert(rv == OGS_OK); @@ -1244,15 +1353,19 @@ int mme_context_parse_config() vlr = mme_vlr_add(addr); ogs_assert(vlr); - plmn_id_build(&plmn_id, - atoi(tai_mcc), atoi(tai_mnc), strlen(tai_mnc)); - nas_from_plmn_id(&vlr->tai.nas_plmn_id, &plmn_id); - vlr->tai.tac = atoi(tac); - - plmn_id_build(&plmn_id, - atoi(lai_mcc), atoi(lai_mnc), strlen(lai_mnc)); - nas_from_plmn_id(&vlr->lai.nas_plmn_id, &plmn_id); - vlr->lai.lac = atoi(lac); + for (i = 0; i < map_num; i++) { + mme_csmap_t *csmap = mme_csmap_add(vlr); + ogs_assert(csmap); + + plmn_id_build(&plmn_id, atoi(map[i].tai_mcc), + atoi(map[i].tai_mnc), strlen(map[i].tai_mnc)); + nas_from_plmn_id(&csmap->tai.nas_plmn_id, &plmn_id); + csmap->tai.tac = atoi(map[i].tac); + plmn_id_build(&plmn_id, atoi(map[i].lai_mcc), + atoi(map[i].lai_mnc), strlen(map[i].lai_mnc)); + nas_from_plmn_id(&csmap->lai.nas_plmn_id, &plmn_id); + csmap->lai.lac = atoi(map[i].lac); + } } while (ogs_yaml_iter_type(&sgsap_array) == YAML_SEQUENCE_NODE); } else @@ -1699,6 +1812,69 @@ mme_vlr_t *mme_vlr_find_by_nas_lai(nas_lai_t *lai) return NULL; } +mme_csmap_t *mme_csmap_add(mme_vlr_t *vlr) +{ + mme_csmap_t *csmap = NULL; + + ogs_assert(vlr); + + ogs_pool_alloc(&mme_csmap_pool, &csmap); + ogs_assert(csmap); + memset(csmap, 0, sizeof *csmap); + + csmap->vlr = vlr; + + ogs_list_add(&self.csmap_list, csmap); + + return csmap; +} + +void mme_csmap_remove(mme_csmap_t *csmap) +{ + ogs_assert(csmap); + + ogs_list_remove(&self.csmap_list, csmap); + + ogs_pool_free(&mme_csmap_pool, csmap); +} + +void mme_csmap_remove_all(void) +{ + mme_csmap_t *csmap = NULL, *next_csmap = NULL; + + ogs_list_for_each_safe(&self.csmap_list, next_csmap, csmap) + mme_csmap_remove(csmap); +} + +mme_csmap_t *mme_csmap_find_by_tai(tai_t *tai) +{ + mme_csmap_t *csmap = NULL; + ogs_assert(tai); + + ogs_list_for_each(&self.csmap_list, csmap) { + nas_tai_t nas_tai; + nas_from_plmn_id(&nas_tai.nas_plmn_id, &tai->plmn_id); + nas_tai.tac = tai->tac; + if (memcmp(&csmap->tai, &nas_tai, sizeof(nas_tai_t)) == 0) + return csmap; + } + + return NULL; +} + +mme_csmap_t *mme_csmap_find_by_nas_lai(nas_lai_t *lai) +{ + mme_csmap_t *csmap = NULL; + ogs_assert(lai); + + ogs_list_for_each(&self.csmap_list, csmap) { + if (memcmp(&csmap->lai, lai, sizeof *lai) == 0) + return csmap; + } + + return NULL; +} + mme_enb_t *mme_enb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr) { mme_enb_t *enb = NULL; diff --git a/src/mme/mme-context.h b/src/mme/mme-context.h index abc345663..61826c165 100644 --- a/src/mme/mme-context.h +++ b/src/mme/mme-context.h @@ -55,6 +55,7 @@ extern int __esm_log_domain; typedef struct mme_sgw_s mme_sgw_t; typedef struct mme_pgw_s mme_pgw_t; typedef struct mme_vlr_s mme_vlr_t; +typedef struct mme_csmap_s mme_csmap_t; typedef struct enb_ue_s enb_ue_t; typedef struct mme_ue_s mme_ue_t; @@ -110,7 +111,7 @@ typedef struct mme_context_s { ogs_list_t enb_list; /* ENB S1AP Client List */ ogs_list_t vlr_list; /* VLR SGsAP Client List */ - mme_vlr_t *vlr; /* Iterator for VLR */ + ogs_list_t csmap_list; /* TAI-LAI Map List */ /* Served GUMME */ uint8_t max_num_of_served_gummei; @@ -210,6 +211,15 @@ typedef struct mme_vlr_s { ogs_sockaddr_t *addr; /* VLR SGsAP Connected Socket Address */ } mme_vlr_t; +typedef struct mme_csmap_s { + ogs_lnode_t lnode; + + nas_tai_t tai; + nas_lai_t lai; + + mme_vlr_t *vlr; +} mme_csmap_t; + typedef struct mme_enb_s { ogs_lnode_t lnode; @@ -660,6 +670,13 @@ mme_vlr_t *mme_vlr_find_by_addr(ogs_sockaddr_t *addr); mme_vlr_t *mme_vlr_find_by_tai(tai_t *tai); mme_vlr_t *mme_vlr_find_by_nas_lai(nas_lai_t *lai); +mme_csmap_t *mme_csmap_add(mme_vlr_t *vlr); +void mme_csmap_remove(mme_csmap_t *csmap); +void mme_csmap_remove_all(void); + +mme_csmap_t *mme_csmap_find_by_tai(tai_t *tai); +mme_csmap_t *mme_csmap_find_by_nas_lai(nas_lai_t *lai); + mme_enb_t *mme_enb_add(ogs_sock_t *sock, ogs_sockaddr_t *addr); int mme_enb_remove(mme_enb_t *enb); int mme_enb_remove_all(void); diff --git a/support/config/nextepc.conf.in b/support/config/nextepc.conf.in index 916647713..ff6522376 100644 --- a/support/config/nextepc.conf.in +++ b/support/config/nextepc.conf.in @@ -126,58 +126,84 @@ mme: # # # -# o Single MSC/VLR(127.0.0.2:29119) +# o Single MSC/VLR(127.0.0.2) # sgsap: # addr: 127.0.0.2 -# port: 29119 -# tai: -# plmn_id: -# mcc: 001 -# mnc: 01 -# tac: 4130 -# lai: -# plmn_id: -# mcc: 001 -# mnc: 01 -# lac: 43690 -# -# o Multiple MSC/VLR -# sgsap: -# - addr: 127.0.0.2 +# map: # tai: # plmn_id: # mcc: 001 # mnc: 01 -# tac: 4131 +# tac: 4130 # lai: # plmn_id: # mcc: 001 # mnc: 01 -# lac: 43691 -# - addr -# - 127.0.0.3 -# - fe80::2%lo0 +# lac: 43690 +# map: # tai: # plmn_id: -# mcc: 001 -# mnc: 01 +# mcc: 002 +# mnc: 02 # tac: 4132 # lai: # plmn_id: # mcc: 002 # mnc: 02 # lac: 43692 +# +# o Multiple MSC/VLR +# sgsap: +# - addr: 127.0.0.2 +# port: 29119 +# map: +# tai: +# plmn_id: +# mcc: 001 +# mnc: 01 +# tac: 4131 +# lai: +# plmn_id: +# mcc: 001 +# mnc: 01 +# lac: 43691 +# map: +# tai: +# plmn_id: +# mcc: 002 +# mnc: 02 +# tac: 4132 +# lai: +# plmn_id: +# mcc: 002 +# mnc: 02 +# lac: 43692 +# - addr +# - 127.0.0.3 +# - fe80::2%lo0 +# map: +# tai: +# plmn_id: +# mcc: 001 +# mnc: 01 +# tac: 4132 +# lai: +# plmn_id: +# mcc: 002 +# mnc: 02 +# lac: 43692 # - name: msc.open5gs.org -# tai: -# plmn_id: -# mcc: 001 -# mnc: 01 -# tac: 4133 -# lai: -# plmn_id: -# mcc: 002 -# mnc: 02 -# lac: 43693 +# map: +# tai: +# plmn_id: +# mcc: 001 +# mnc: 01 +# tac: 4133 +# lai: +# plmn_id: +# mcc: 002 +# mnc: 02 +# lac: 43693 # sgsap: diff --git a/tests/sample-csfb.conf.in b/tests/sample-csfb.conf.in index f2e185a32..a0c4b805e 100644 --- a/tests/sample-csfb.conf.in +++ b/tests/sample-csfb.conf.in @@ -31,16 +31,28 @@ mme: addr: 127.0.0.1 sgsap: - addr: 127.0.0.2 - tai: - plmn_id: - mcc: 901 - mnc: 70 - tac: 7 - lai: - plmn_id: - mcc: 901 - mnc: 70 - lac: 2342 + map: + tai: + plmn_id: + mcc: 901 + mnc: 70 + tac: 7 + lai: + plmn_id: + mcc: 901 + mnc: 70 + lac: 2342 + map: + tai: + plmn_id: + mcc: 724 + mnc: 21 + tac: 12345 + lai: + plmn_id: + mcc: 724 + mnc: 21 + lac: 2342 gummei: plmn_id: mcc: 901