pespin has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/libosmo-sccp/+/34611?usp=email )


Change subject: asp: Support adding new local addresses after the ASP was 
started
......................................................................

asp: Support adding new local addresses after the ASP was started

Related: OS#6077
Depends: libosmocore.git Change-Id Ifc6e7d643c2a0c53f479bfd0d5c36d08c0c01953
Change-Id: I8318d2693f3a9c479b18ab1d660431c1ec77c004
---
M TODO-RELEASE
M src/osmo_ss7_asp.c
M src/osmo_ss7_vty.c
M src/ss7_internal.h
4 files changed, 48 insertions(+), 1 deletion(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/11/34611/1

diff --git a/TODO-RELEASE b/TODO-RELEASE
index d0852fc..b1b533c 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -7,3 +7,4 @@
 # If any interfaces have been added since the last public release: c:r:a + 1.
 # If any interfaces have been removed or changed since the last public 
release: c:r:0.
 #library       what            description / commit summary line
+libosmocore >1.9.0  osmo_sock_multiaddr_add_local_addr()
\ No newline at end of file
diff --git a/src/osmo_ss7_asp.c b/src/osmo_ss7_asp.c
index f26e2e1..68bd0ca 100644
--- a/src/osmo_ss7_asp.c
+++ b/src/osmo_ss7_asp.c
@@ -168,6 +168,25 @@
 };
 static unsigned int g_ss7_asp_rcg_idx;

+int ss7_asp_apply_new_local_address(const struct osmo_ss7_asp *asp, unsigned 
int loc_idx)
+{
+       const char *new_loc_addr;
+       struct osmo_fd *ofd;
+
+       OSMO_ASSERT(loc_idx < asp->cfg.local.host_cnt);
+       new_loc_addr = asp->cfg.local.host[loc_idx];
+
+       LOGPASP(asp, DLSS7, LOGL_INFO, "Add local address %s\n",
+               new_loc_addr);
+
+       if (asp->cfg.is_server)
+               ofd = osmo_stream_srv_get_ofd(asp->server);
+       else
+               ofd = osmo_stream_cli_get_ofd(asp->client);
+
+       return osmo_sock_multiaddr_add_local_addr(ofd->fd, &new_loc_addr, 1);
+}
+
 int ss7_asp_apply_peer_primary_address(const struct osmo_ss7_asp *asp)
 {
        struct osmo_fd *ofd;
diff --git a/src/osmo_ss7_vty.c b/src/osmo_ss7_vty.c
index cdca10d..f9c1ada 100644
--- a/src/osmo_ss7_vty.c
+++ b/src/osmo_ss7_vty.c
@@ -715,6 +715,7 @@
        struct osmo_ss7_asp *asp = vty->index;
        bool is_primary = argc > 1;
        int old_idx_primary = asp->cfg.local.idx_primary;
+       int old_host_count = asp->cfg.local.host_cnt;
        int rc;

        if (osmo_ss7_asp_peer_add_host2(&asp->cfg.local, asp, argv[0], 
is_primary) != 0) {
@@ -726,8 +727,21 @@
                return CMD_SUCCESS;
        if (asp->cfg.proto == OSMO_SS7_ASP_PROT_IPA)
                return CMD_SUCCESS;
+       /* The SCTP socket is already created. */

-       /* The SCTP socket is already created, dynamically apply the new 
primary if it changed: */
+       /* dynamically apply the new address if it was added to the set: */
+       if (asp->cfg.local.host_cnt > old_host_count) {
+               if ((rc = ss7_asp_apply_new_local_address(asp, 
asp->cfg.local.host_cnt - 1)) < 0) {
+                       /* Failed, rollback changes: */
+                       TALLOC_FREE(asp->cfg.local.host[asp->cfg.local.host_cnt 
- 1]);
+                       asp->cfg.local.host_cnt--;
+                       vty_out(vty, "%% Failed adding new local address 
'%s'%s", argv[0], VTY_NEWLINE);
+                       return CMD_WARNING;
+               }
+               vty_out(vty, "%% Local address '%s' added to the active socket 
bind set%s", argv[0], VTY_NEWLINE);
+       }
+
+       /* dynamically apply the new primary if it changed: */
        if (is_primary && asp->cfg.local.idx_primary != old_idx_primary) {
                if ((rc = ss7_asp_apply_peer_primary_address(asp)) < 0) {
                        /* Failed, rollback changes: */
@@ -735,6 +749,7 @@
                        vty_out(vty, "%% Failed announcing primary '%s' to 
peer%s", argv[0], VTY_NEWLINE);
                        return CMD_WARNING;
                }
+               vty_out(vty, "%% Local address '%s' announced as primary to the 
peer on the active socket%s", argv[0], VTY_NEWLINE);
        }
        return CMD_SUCCESS;
 }
diff --git a/src/ss7_internal.h b/src/ss7_internal.h
index ad71e83..438fca9 100644
--- a/src/ss7_internal.h
+++ b/src/ss7_internal.h
@@ -27,6 +27,7 @@
 int ss7_asp_xua_srv_conn_closed_cb(struct osmo_stream_srv *srv);
 int ss7_asp_apply_peer_primary_address(const struct osmo_ss7_asp *asp);
 int ss7_asp_apply_primary_address(const struct osmo_ss7_asp *asp);
+int ss7_asp_apply_new_local_address(const struct osmo_ss7_asp *asp, unsigned 
int loc_idx);

 bool ss7_asp_peer_match_host(const struct osmo_ss7_asp_peer *peer, const char 
*host, bool host_is_v6);


--
To view, visit https://gerrit.osmocom.org/c/libosmo-sccp/+/34611?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: libosmo-sccp
Gerrit-Branch: master
Gerrit-Change-Id: I8318d2693f3a9c479b18ab1d660431c1ec77c004
Gerrit-Change-Number: 34611
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pes...@sysmocom.de>
Gerrit-MessageType: newchange

Reply via email to