<p>lynxis lazus <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/24123">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
laforge: Looks good to me, approved
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2_sns: implement outbound SNS ADD procedures<br><br>When adding a bind, the remote side needs to be<br>informed via the SNS ADD procedure.<br><br>Related: OS#5036<br>Change-Id: I71c33200bd1f0307ceb943ee958db5ebe3623d36<br>---<br>M src/gb/gprs_ns2_sns.c<br>1 file changed, 193 insertions(+), 36 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gb/gprs_ns2_sns.c b/src/gb/gprs_ns2_sns.c</span><br><span>index 9e30f62..0cb24c5 100644</span><br><span>--- a/src/gb/gprs_ns2_sns.c</span><br><span>+++ b/src/gb/gprs_ns2_sns.c</span><br><span>@@ -93,6 +93,8 @@</span><br><span> { 0, NULL }</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define GPRS_SNS_FLAG_KEEP_SELECT_ENDPOINT_ORDER (void *) 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum sns_procedure {</span><br><span> SNS_PROC_NONE, /*!< used as invalid/idle value */</span><br><span> SNS_PROC_ADD,</span><br><span>@@ -1473,6 +1475,12 @@</span><br><span> </span><br><span> /* also takes care of retransmitting */</span><br><span> switch (gss->current_procedure->procedure) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case SNS_PROC_ADD:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->family == AF_INET)</span><br><span style="color: hsl(120, 100%, 40%);">+ ns2_tx_sns_add(gss->sns_nsvc, gss->current_procedure->trans_id, &gss->current_procedure->ip4, 1, NULL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ ns2_tx_sns_add(gss->sns_nsvc, gss->current_procedure->trans_id, NULL, 0, &gss->current_procedure->ip6, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> case SNS_PROC_CHANGE_WEIGHT:</span><br><span> if (gss->family == AF_INET)</span><br><span> ns2_tx_sns_change_weight(gss->sns_nsvc, gss->current_procedure->trans_id, &gss->current_procedure->ip4, 1, NULL, 0);</span><br><span>@@ -1484,6 +1492,65 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void create_nsvc_for_new_sbind(struct ns2_sns_state *gss, struct ns2_sns_bind *sbind)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_ns2_nse *nse = gss->nse;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_ns2_vc_bind *bind = sbind->bind;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_ns2_vc *nsvc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_sockaddr remote = { };</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* iterate over all remote IPv4 endpoints */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < gss->remote.num_ip4; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gprs_ns_ie_ip4_elem *ip4 = &gss->remote.ip4[i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ remote.u.sin.sin_family = AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+ remote.u.sin.sin_addr.s_addr = ip4->ip_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+ remote.u.sin.sin_port = ip4->udp_port;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* we only care about UDP binds */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bind->ll != GPRS_NS2_LL_UDP)</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc = nsvc_for_bind_and_remote(nse, bind, &remote);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!nsvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc = gprs_ns2_ip_connect_inactive(bind, &remote, nse, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!nsvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: add to a list to send back a NS-STATUS */</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* update data / signalling weight */</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc->data_weight = ip4->data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc->sig_weight = ip4->sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc->sns_only = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* iterate over all remote IPv4 endpoints */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < gss->remote.num_ip6; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gprs_ns_ie_ip6_elem *ip6 = &gss->remote.ip6[i];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ remote.u.sin6.sin6_family = AF_INET6;</span><br><span style="color: hsl(120, 100%, 40%);">+ remote.u.sin6.sin6_addr = ip6->ip_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+ remote.u.sin6.sin6_port = ip6->udp_port;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* we only care about UDP binds */</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc = nsvc_for_bind_and_remote(nse, bind, &remote);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!nsvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc = gprs_ns2_ip_connect_inactive(bind, &remote, nse, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!nsvc) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: add to a list to send back a NS-STATUS */</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* update data / signalling weight */</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc->data_weight = ip6->data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc->sig_weight = ip6->sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc->sns_only = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void ns2_sns_st_local_procedure(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span> struct ns2_sns_state *gss = (struct ns2_sns_state *) fi->priv;</span><br><span>@@ -1523,6 +1590,18 @@</span><br><span> }</span><br><span> </span><br><span> switch (gss->current_procedure->procedure) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case SNS_PROC_ADD:</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (gss->family) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+ add_ip4_elem(gss, &gss->local, &gss->current_procedure->ip4);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+ add_ip6_elem(gss, &gss->local, &gss->current_procedure->ip6);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ create_nsvc_for_new_sbind(gss, gss->current_procedure->sbind);</span><br><span style="color: hsl(120, 100%, 40%);">+ gprs_ns2_start_alive_all_nsvcs(nse);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> case SNS_PROC_CHANGE_WEIGHT:</span><br><span> switch (gss->family) {</span><br><span> case AF_INET:</span><br><span>@@ -1758,7 +1837,6 @@</span><br><span> OSMO_ASSERT(0);</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void ns2_add_procedure(struct ns2_sns_state *gss, struct ns2_sns_bind *sbind,</span><br><span> enum sns_procedure procedure_type)</span><br><span> {</span><br><span>@@ -1766,10 +1844,11 @@</span><br><span> const struct osmo_sockaddr *saddr;</span><br><span> saddr = gprs_ns2_ip_bind_sockaddr(sbind->bind);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (saddr->u.sa.sa_family != gss->family)</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(saddr->u.sa.sa_family == gss->family);</span><br><span> </span><br><span> switch (procedure_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case SNS_PROC_ADD:</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> case SNS_PROC_CHANGE_WEIGHT:</span><br><span> llist_for_each_entry(procedure, &gss->procedures, list) {</span><br><span> if (procedure->sbind == sbind && procedure->procedure == procedure_type &&</span><br><span>@@ -1791,47 +1870,76 @@</span><br><span> return;</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- procedure = talloc_zero(gss, struct ns2_sns_procedure);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!procedure)</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- procedure->sbind = sbind;</span><br><span style="color: hsl(0, 100%, 40%);">- procedure->procedure = procedure_type;</span><br><span style="color: hsl(0, 100%, 40%);">- procedure->sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(0, 100%, 40%);">- procedure->data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch(gss->family) {</span><br><span style="color: hsl(0, 100%, 40%);">- case AF_INET:</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- procedure->ip4.ip_addr = saddr->u.sin.sin_addr.s_addr;</span><br><span style="color: hsl(0, 100%, 40%);">- procedure->ip4.udp_port = saddr->u.sin.sin_port;</span><br><span style="color: hsl(0, 100%, 40%);">- procedure->ip4.sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(0, 100%, 40%);">- procedure->ip4.data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case AF_INET6:</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- memcpy(&procedure->ip6.ip_addr, &saddr->u.sin6.sin6_addr, sizeof(struct in6_addr));</span><br><span style="color: hsl(0, 100%, 40%);">- procedure->ip6.udp_port = saddr->u.sin.sin_port;</span><br><span style="color: hsl(0, 100%, 40%);">- procedure->ip6.sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(0, 100%, 40%);">- procedure->ip6.data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(0);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_add_tail(&procedure->list, &gss->procedures);</span><br><span> break;</span><br><span> default:</span><br><span> return;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ procedure = talloc_zero(gss, struct ns2_sns_procedure);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!procedure)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_add_tail(&procedure->list, &gss->procedures);</span><br><span style="color: hsl(120, 100%, 40%);">+ procedure->sbind = sbind;</span><br><span style="color: hsl(120, 100%, 40%);">+ procedure->procedure = procedure_type;</span><br><span style="color: hsl(120, 100%, 40%);">+ procedure->sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ procedure->data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch(gss->family) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+ procedure->ip4.ip_addr = saddr->u.sin.sin_addr.s_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+ procedure->ip4.udp_port = saddr->u.sin.sin_port;</span><br><span style="color: hsl(120, 100%, 40%);">+ procedure->ip4.sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ procedure->ip4.data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(&procedure->ip6.ip_addr, &saddr->u.sin6.sin6_addr, sizeof(struct in6_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+ procedure->ip6.udp_port = saddr->u.sin.sin_port;</span><br><span style="color: hsl(120, 100%, 40%);">+ procedure->ip6.sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ procedure->ip6.data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (gss->nse->bss_sns_fi->state == GPRS_SNS_ST_CONFIGURED) {</span><br><span> osmo_fsm_inst_state_chg(gss->nse->bss_sns_fi, GPRS_SNS_ST_LOCAL_PROCEDURE,</span><br><span> gss->nse->nsi->timeout[NS_TOUT_TSNS_PROV], 5);</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* add an entrypoint to sns_endpoints */</span><br><span style="color: hsl(120, 100%, 40%);">+static int ns2_sns_add_elements(struct ns2_sns_state *gss, struct ns2_sns_bind *sbind,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ns2_sns_elems *elems)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct osmo_sockaddr *saddr;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_ns_ie_ip4_elem ip4;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gprs_ns_ie_ip6_elem ip6;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ saddr = gprs_ns2_ip_bind_sockaddr(sbind->bind);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(saddr->u.sa.sa_family == gss->family);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (gss->family) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+ ip4.ip_addr = saddr->u.sin.sin_addr.s_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+ ip4.udp_port= saddr->u.sin.sin_port;</span><br><span style="color: hsl(120, 100%, 40%);">+ ip4.sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ ip4.data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = add_ip4_elem(gss, elems, &ip4);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(&ip6.ip_addr, &saddr->u.sin6.sin6_addr, sizeof(struct in6_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+ ip6.udp_port= saddr->u.sin.sin_port;</span><br><span style="color: hsl(120, 100%, 40%);">+ ip6.sig_weight = sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ ip6.data_weight = sbind->bind->sns_data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = add_ip6_elem(gss, elems, &ip6);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /* common allstate-action for both roles */</span><br><span> static void ns2_sns_st_all_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span>@@ -1846,15 +1954,63 @@</span><br><span> sbind = data;</span><br><span> switch (fi->state) {</span><br><span> case GPRS_SNS_ST_UNCONFIGURED:</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_dispatch(nse->bss_sns_fi, NS2_SNS_EV_REQ_SELECT_ENDPOINT, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->role == GPRS_SNS_ROLE_BSS)</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(nse->bss_sns_fi, NS2_SNS_EV_REQ_SELECT_ENDPOINT, NULL);</span><br><span> break;</span><br><span> case GPRS_SNS_ST_BSS_SIZE:</span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO: add the ip4 element to the list */</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (gss->family) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->num_max_ip4_remote <= gss->local.num_ip4 ||</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->num_max_ip4_remote * (gss->local.num_ip4 + 1) > gss->num_max_nsvcs) {</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(nse->bss_sns_fi, NS2_SNS_EV_REQ_SELECT_ENDPOINT, GPRS_SNS_FLAG_KEEP_SELECT_ENDPOINT_ORDER);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->num_max_ip6_remote <= gss->local.num_ip6 ||</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->num_max_ip6_remote * (gss->local.num_ip6 + 1) > gss->num_max_nsvcs) {</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(nse->bss_sns_fi, NS2_SNS_EV_REQ_SELECT_ENDPOINT, GPRS_SNS_FLAG_KEEP_SELECT_ENDPOINT_ORDER);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ ns2_sns_add_elements(gss, sbind, &gss->local);</span><br><span> break;</span><br><span> case GPRS_SNS_ST_BSS_CONFIG_BSS:</span><br><span> case GPRS_SNS_ST_BSS_CONFIG_SGSN:</span><br><span> case GPRS_SNS_ST_CONFIGURED:</span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO: add to SNS-IP procedure queue & add nsvc() */</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (gss->family) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->num_max_ip4_remote <= gss->local.num_ip4) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSML(fi, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+ "NSE %d: ignoring bind %s because there are too many endpoints for the SNS.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ nse->nsei, sbind->bind->name);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->remote.num_ip4 * (gss->local.num_ip4 + 1) > gss->num_max_nsvcs) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSML(fi, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+ "NSE %d: ignoring bind %s because there are too many endpoints for the SNS.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ nse->nsei, sbind->bind->name);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->num_max_ip6_remote <= gss->local.num_ip6) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSML(fi, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+ "NSE %d: ignoring bind %s because there are too many endpoints for the SNS.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ nse->nsei, sbind->bind->name);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->remote.num_ip6 * (gss->local.num_ip6 + 1) > gss->num_max_nsvcs) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSML(fi, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+ "NSE %d: ignoring bind %s because there are too many endpoints for the SNS.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ nse->nsei, sbind->bind->name);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ ns2_sns_add_elements(gss, sbind, &gss->local_procedure);</span><br><span style="color: hsl(120, 100%, 40%);">+ ns2_add_procedure(gss, sbind, SNS_PROC_ADD);</span><br><span> break;</span><br><span> }</span><br><span> break;</span><br><span>@@ -1975,6 +2131,7 @@</span><br><span> break;</span><br><span> case NS2_SNS_EV_REQ_FREE_NSVCS:</span><br><span> case NS2_SNS_EV_REQ_SELECT_ENDPOINT:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: keep the order of binds when data == GPRS_SNS_FLAG_KEEP_SELECT_ENDPOINT_ORDER */</span><br><span> /* tear down previous state</span><br><span> * gprs_ns2_free_nsvcs() will trigger NO_NSVC, prevent this from triggering a reselection */</span><br><span> gss->reselection_running = true;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/24123">change 24123</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/libosmocore/+/24123"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I71c33200bd1f0307ceb943ee958db5ebe3623d36 </div>
<div style="display:none"> Gerrit-Change-Number: 24123 </div>
<div style="display:none"> Gerrit-PatchSet: 14 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>