From cb1db8b6d5277a52ed553925d301bfdc514bb77c Mon Sep 17 00:00:00 2001 From: Jacob Erlbeck Date: Tue, 3 Feb 2015 13:47:53 +0100 Subject: sgsn: Add functions to handle APN contexts This commit adds the exported functions apn_ctx_find_alloc, apn_ctx_free, apn_ctx_by_name, and apn_ctx_match to manage and retrieve APN to GGSN mappings. The following VTY commands are added to 'config-sgsn': - apn APN ggsn <0-255> - apn APN imsi-prefix PREFIX ggsn <0-255> which maps an APN gateway string to an SGSN id. The SGSN must be configured in advance. When matching an APN string, entries with a leading '*' are used for suffix matching, otherwise an exact match is done. When a prefix is given, it is matched against the IMSI. If several entries match, a longer matching IMSI prefix has precedence. If there are several matching entries with the same PREFIX, the entry with longest matching APN is returned. Ticket: OW#1334 Sponsored-by: On-Waves ehf --- openbsc/tests/sgsn/sgsn_test.c | 93 ++++++++++++++++++++++++++++++++++++++++ openbsc/tests/sgsn/sgsn_test.ok | 1 + openbsc/tests/vty_test_runner.py | 21 +++++++++ 3 files changed, 115 insertions(+) (limited to 'openbsc/tests') diff --git a/openbsc/tests/sgsn/sgsn_test.c b/openbsc/tests/sgsn/sgsn_test.c index 7a14cdefa..5fa33a266 100644 --- a/openbsc/tests/sgsn/sgsn_test.c +++ b/openbsc/tests/sgsn/sgsn_test.c @@ -1784,6 +1784,98 @@ static void test_gmm_ptmsi_allocation(void) sgsn->cfg.auth_policy = saved_auth_policy; } +static void test_apn_matching(void) +{ + struct apn_ctx *actx, *actxs[9]; + + printf("Testing APN matching\n"); + + actxs[0] = sgsn_apn_ctx_find_alloc("*.test", ""); + actxs[1] = sgsn_apn_ctx_find_alloc("*.def.test", ""); + actxs[2] = sgsn_apn_ctx_find_alloc("abc.def.test", ""); + actxs[3] = NULL; + + actxs[4] = sgsn_apn_ctx_find_alloc("abc.def.test", "456"); + actxs[5] = sgsn_apn_ctx_find_alloc("abc.def.test", "456123"); + actxs[6] = sgsn_apn_ctx_find_alloc("*.def.test", "456"); + actxs[7] = sgsn_apn_ctx_find_alloc("*.def.test", "456123"); + + actxs[8] = sgsn_apn_ctx_find_alloc("ghi.def.test", "456"); + + actx = sgsn_apn_ctx_match("abc.def.test", "12345678"); + OSMO_ASSERT(actx == actxs[2]); + actx = sgsn_apn_ctx_match("aBc.dEf.test", "12345678"); + OSMO_ASSERT(actx == actxs[2]); + actx = sgsn_apn_ctx_match("xyz.def.test", "12345678"); + OSMO_ASSERT(actx == actxs[1]); + actx = sgsn_apn_ctx_match("xyz.dEf.test", "12345678"); + OSMO_ASSERT(actx == actxs[1]); + actx = sgsn_apn_ctx_match("xyz.uvw.test", "12345678"); + OSMO_ASSERT(actx == actxs[0]); + actx = sgsn_apn_ctx_match("xyz.uvw.foo", "12345678"); + OSMO_ASSERT(actx == NULL); + + actxs[3] = sgsn_apn_ctx_find_alloc("*", ""); + actx = sgsn_apn_ctx_match("xyz.uvw.foo", "12345678"); + OSMO_ASSERT(actx == actxs[3]); + + actx = sgsn_apn_ctx_match("abc.def.test", "45699900"); + OSMO_ASSERT(actx == actxs[4]); + + actx = sgsn_apn_ctx_match("xyz.def.test", "45699900"); + OSMO_ASSERT(actx == actxs[6]); + + actx = sgsn_apn_ctx_match("abc.def.test", "45612300"); + OSMO_ASSERT(actx == actxs[5]); + + actx = sgsn_apn_ctx_match("xyz.def.test", "45612300"); + OSMO_ASSERT(actx == actxs[7]); + + actx = sgsn_apn_ctx_match("ghi.def.test", "45699900"); + OSMO_ASSERT(actx == actxs[8]); + + actx = sgsn_apn_ctx_match("ghi.def.test", "45612300"); + OSMO_ASSERT(actx == actxs[7]); + + /* Free APN contexts and check how the matching changes */ + + sgsn_apn_ctx_free(actxs[7]); + actx = sgsn_apn_ctx_match("ghi.def.test", "45612300"); + OSMO_ASSERT(actx == actxs[8]); + + sgsn_apn_ctx_free(actxs[8]); + actx = sgsn_apn_ctx_match("ghi.def.test", "45612300"); + OSMO_ASSERT(actx == actxs[6]); + + sgsn_apn_ctx_free(actxs[6]); + actx = sgsn_apn_ctx_match("ghi.def.test", "45612300"); + OSMO_ASSERT(actx == actxs[1]); + + sgsn_apn_ctx_free(actxs[5]); + actx = sgsn_apn_ctx_match("abc.def.test", "45612300"); + OSMO_ASSERT(actx == actxs[4]); + + sgsn_apn_ctx_free(actxs[4]); + actx = sgsn_apn_ctx_match("abc.def.test", "45612300"); + OSMO_ASSERT(actx == actxs[2]); + + sgsn_apn_ctx_free(actxs[2]); + actx = sgsn_apn_ctx_match("abc.def.test", "12345678"); + OSMO_ASSERT(actx == actxs[1]); + + sgsn_apn_ctx_free(actxs[1]); + actx = sgsn_apn_ctx_match("abc.def.test", "12345678"); + OSMO_ASSERT(actx == actxs[0]); + + sgsn_apn_ctx_free(actxs[0]); + actx = sgsn_apn_ctx_match("abc.def.test", "12345678"); + OSMO_ASSERT(actx == actxs[3]); + + sgsn_apn_ctx_free(actxs[3]); + actx = sgsn_apn_ctx_match("abc.def.test", "12345678"); + OSMO_ASSERT(actx == NULL); +} + static struct log_info_cat gprs_categories[] = { [DMM] = { .name = "DMM", @@ -1871,6 +1963,7 @@ int main(int argc, char **argv) test_gmm_reject(); test_gmm_cancel(); test_gmm_ptmsi_allocation(); + test_apn_matching(); printf("Done\n"); talloc_report_full(osmo_sgsn_ctx, stderr); diff --git a/openbsc/tests/sgsn/sgsn_test.ok b/openbsc/tests/sgsn/sgsn_test.ok index e5df50482..9f14721af 100644 --- a/openbsc/tests/sgsn/sgsn_test.ok +++ b/openbsc/tests/sgsn/sgsn_test.ok @@ -26,4 +26,5 @@ Testing P-TMSI allocation - sgsn_alloc_ptmsi - Repeated Attach Request - Repeated RA Update Request +Testing APN matching Done diff --git a/openbsc/tests/vty_test_runner.py b/openbsc/tests/vty_test_runner.py index d87ebde0c..cae1c1414 100644 --- a/openbsc/tests/vty_test_runner.py +++ b/openbsc/tests/vty_test_runner.py @@ -794,6 +794,27 @@ class TestVTYSGSN(TestVTYGenericBSC): res = self.vty.command('show subscriber cache') self.assert_(res.find('1234567890') < 0) + def testVtyGgsn(self): + self.vty.enable() + self.assertTrue(self.vty.verify('configure terminal', [''])) + self.assertEquals(self.vty.node(), 'config') + self.assertTrue(self.vty.verify('sgsn', [''])) + self.assertEquals(self.vty.node(), 'config-sgsn') + self.assertTrue(self.vty.verify('ggsn 0 remote-ip 127.99.99.99', [''])) + self.assertTrue(self.vty.verify('ggsn 0 gtp-version 1', [''])) + self.assertTrue(self.vty.verify('apn * ggsn 0', [''])) + self.assertTrue(self.vty.verify('apn apn1.test ggsn 0', [''])) + self.assertTrue(self.vty.verify('apn apn1.test ggsn 1', ['% a GGSN with id 1 has not been defined'])) + self.assertTrue(self.vty.verify('apn apn1.test imsi-prefix 123456 ggsn 0', [''])) + self.assertTrue(self.vty.verify('apn apn2.test imsi-prefix 123456 ggsn 0', [''])) + res = self.vty.command("show running-config") + self.assert_(res.find('ggsn 0 remote-ip 127.99.99.99') >= 0) + self.assert_(res.find('ggsn 0 gtp-version 1') >= 0) + self.assert_(res.find('apn * ggsn 0') >= 0) + self.assert_(res.find('apn apn1.test ggsn 0') >= 0) + self.assert_(res.find('apn apn1.test imsi-prefix 123456 ggsn 0') >= 0) + self.assert_(res.find('apn apn2.test imsi-prefix 123456 ggsn 0') >= 0) + def add_nat_test(suite, workdir): if not os.path.isfile(os.path.join(workdir, "src/osmo-bsc_nat/osmo-bsc_nat")): print("Skipping the NAT test") -- cgit v1.2.3