From 0b39f2cf7bab5cf3924d8b0b753f41b5b0cabd25 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Tue, 18 Aug 2020 12:00:26 +0200 Subject: Introduce SS7 IPv6 support In osmo_ss7_vty_go_parent, "127.0.0.1" is changed to "localhost" to let local NSS decide whether to use IPv4 or IPv6. In newish systems, IPv6 ::1 will be selected since IPv6 takes precedence over IPv4. Similarly, the default source addr needs to be changed from NULL to "localhost" since for some yet unknwon reason, getaddrinfo(AF_UNSPEC, NULL) returns first IPv4 "0.0.0.0" and later "::", which is inconsistent with getaddrinfo("localhost") result, resulting in src=IPv4(0.0.0.0) and dst=IPv6(::1), which is incompatible and will fail. In any case, this change doesn't affect users of osmo_sccp_simple_client because the APIs set both src and dst addresses. Change-Id: I69c48819b70635c92fa404cafd917af7802d517c Depends: libosmo-netif.git Change-Id Ie6bb17a9af6ca21d5e350f9c9d2d74c97c5a00af --- doc/examples/osmo-stp-multihome.cfg | 1 + doc/manuals/vty/osmo-stp_vty_reference.xml | 15 +++++++++------ src/osmo_ss7_vty.c | 19 +++++++++++-------- tests/vty/ss7_asp_test.vty | 4 ++-- tests/vty/vty_test_runner.py | 17 +++++++++++++++-- 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/doc/examples/osmo-stp-multihome.cfg b/doc/examples/osmo-stp-multihome.cfg index 5b0c84f..64874da 100644 --- a/doc/examples/osmo-stp-multihome.cfg +++ b/doc/examples/osmo-stp-multihome.cfg @@ -20,3 +20,4 @@ cs7 instance 0 accept-asp-connections dynamic-permitted local-ip 127.0.0.2 local-ip 127.0.0.1 + local-ip ::1 diff --git a/doc/manuals/vty/osmo-stp_vty_reference.xml b/doc/manuals/vty/osmo-stp_vty_reference.xml index e904469..ff8103a 100644 --- a/doc/manuals/vty/osmo-stp_vty_reference.xml +++ b/doc/manuals/vty/osmo-stp_vty_reference.xml @@ -1741,16 +1741,18 @@ - + - + + - + - + + @@ -1787,10 +1789,11 @@ config-cs7-listen - + - + + diff --git a/src/osmo_ss7_vty.c b/src/osmo_ss7_vty.c index 9c31c00..fad93f5 100644 --- a/src/osmo_ss7_vty.c +++ b/src/osmo_ss7_vty.c @@ -470,9 +470,10 @@ DEFUN(no_cs7_xua, no_cs7_xua_cmd, } DEFUN(xua_local_ip, xua_local_ip_cmd, - "local-ip A.B.C.D", + "local-ip " VTY_IPV46_CMD, "Configure the Local IP Address for xUA\n" - "IP Address to use for XUA\n") + "IPv4 Address to use for XUA\n" + "IPv6 Address to use for XUA\n") { struct osmo_xua_server *xs = vty->index; @@ -623,9 +624,10 @@ DEFUN(no_cs7_asp, no_cs7_asp_cmd, } DEFUN(asp_local_ip, asp_local_ip_cmd, - "local-ip A.B.C.D", + "local-ip " VTY_IPV46_CMD, "Specify Local IP Address from which to contact ASP\n" - "Local IP Address from which to contact of ASP\n") + "Local IPv4 Address from which to contact of ASP\n" + "Local IPv6 Address from which to contact of ASP\n") { struct osmo_ss7_asp *asp = vty->index; osmo_ss7_asp_peer_add_host(&asp->cfg.local, asp, argv[0]); @@ -633,9 +635,10 @@ DEFUN(asp_local_ip, asp_local_ip_cmd, } DEFUN(asp_remote_ip, asp_remote_ip_cmd, - "remote-ip A.B.C.D", + "remote-ip " VTY_IPV46_CMD, "Specify Remote IP Address of ASP\n" - "Remote IP Address of ASP\n") + "Remote IPv4 Address of ASP\n" + "Remote IPv6 Address of ASP\n") { struct osmo_ss7_asp *asp = vty->index; osmo_ss7_asp_peer_add_host(&asp->cfg.remote, asp, argv[0]); @@ -1806,10 +1809,10 @@ int osmo_ss7_vty_go_parent(struct vty *vty) asp = vty->index; /* If no local addr was set */ if (!asp->cfg.local.host_cnt) - osmo_ss7_asp_peer_add_host(&asp->cfg.local, asp, NULL); + osmo_ss7_asp_peer_add_host(&asp->cfg.local, asp, "localhost"); /* If no remote addr was set */ if (!asp->cfg.remote.host_cnt) - osmo_ss7_asp_peer_add_host(&asp->cfg.remote, asp, "127.0.0.1"); + osmo_ss7_asp_peer_add_host(&asp->cfg.remote, asp, "localhost"); osmo_ss7_asp_restart(asp); vty->node = L_CS7_NODE; vty->index = asp->inst; diff --git a/tests/vty/ss7_asp_test.vty b/tests/vty/ss7_asp_test.vty index 7411b1f..ee1b3e5 100644 --- a/tests/vty/ss7_asp_test.vty +++ b/tests/vty/ss7_asp_test.vty @@ -215,8 +215,8 @@ ss7_asp_vty_test(config-cs7)# asp my-asp 12345 54321 m3ua ss7_asp_vty_test(config-cs7-asp)# list ... description .TEXT - remote-ip A.B.C.D - local-ip A.B.C.D + remote-ip (A.B.C.D|X:X::X:X) + local-ip (A.B.C.D|X:X::X:X) qos-class <0-255> role (sg|asp|ipsp) sctp-role (client|server) diff --git a/tests/vty/vty_test_runner.py b/tests/vty/vty_test_runner.py index 605bc93..dff26c3 100755 --- a/tests/vty/vty_test_runner.py +++ b/tests/vty/vty_test_runner.py @@ -111,7 +111,9 @@ class TestVTYSTP(TestVTYBase): # first check if STP is listening in required addresses: found = False for i in range(5): - if self.check_sctp_sock_local(['127.0.0.1', '127.0.0.2'], 2905): + if self.check_sctp_sock_local(['127.0.0.1', '127.0.0.2', + '0000:0000:0000:0000:0000:0000:0000:0001'], + 2905): found = True break else: @@ -122,6 +124,7 @@ class TestVTYSTP(TestVTYBase): proto = socket.IPPROTO_SCTP except AttributeError: # it seems to be not defined under python2? proto = 132 + # IPv4: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, proto) s.bind(('127.0.0.3', 0)) try: @@ -129,7 +132,17 @@ class TestVTYSTP(TestVTYBase): except socket.error as msg: s.close() self.assertTrue(False) - print("Connected to STP through SCTP") + print("Connected to STP through SCTP (IPv4)") + s.close() + # IPv6: + s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, proto) + s.bind(('::1', 0)) + try: + s.connect(('::1',2905)) + except socket.error as msg: + s.close() + self.assertTrue(False) + print("Connected to STP through SCTP (IPv6)") s.close() if __name__ == '__main__': -- cgit v1.2.3