<p>lynxis lazus has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/24582">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2_sns: refactor local and remote entries into a struct<br><br>The IPv4/IPv6 elemens are the same for local and remote.<br>Refactor the entries into a struct to use function to manipulate<br>them with a single function.<br><br>Related: OS#5036<br>Change-Id: I05e053a9eb3328655502dfe2981c8f402104e292<br>---<br>M src/gb/gprs_ns2_sns.c<br>1 file changed, 102 insertions(+), 105 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/82/24582/1</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 9865acd..66dd421 100644</span><br><span>--- a/src/gb/gprs_ns2_sns.c</span><br><span>+++ b/src/gb/gprs_ns2_sns.c</span><br><span>@@ -122,6 +122,13 @@</span><br><span> struct gprs_ns2_vc_bind *bind;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct ns2_sns_elems {</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%);">+ unsigned int num_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%);">+ unsigned int num_ip6;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct ns2_sns_state {</span><br><span> struct gprs_ns2_nse *nse;</span><br><span> </span><br><span>@@ -150,26 +157,16 @@</span><br><span> bool alive;</span><br><span> </span><br><span> /* local configuration to send to the remote end */</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_ns_ie_ip4_elem *ip4_local;</span><br><span style="color: hsl(0, 100%, 40%);">- size_t num_ip4_local;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ns2_sns_elems local;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* local configuration to send to the remote end */</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_ns_ie_ip6_elem *ip6_local;</span><br><span style="color: hsl(0, 100%, 40%);">- size_t num_ip6_local;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* remote configuration as received */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ns2_sns_elems remote;</span><br><span> </span><br><span> /* local configuration about our capabilities in terms of connections to</span><br><span> * remote (SGSN) side */</span><br><span> size_t num_max_nsvcs;</span><br><span> size_t num_max_ip4_remote;</span><br><span> size_t num_max_ip6_remote;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* remote configuration as received */</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_ns_ie_ip4_elem *ip4_remote;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int num_ip4_remote;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* remote configuration as received */</span><br><span style="color: hsl(0, 100%, 40%);">- struct gprs_ns_ie_ip6_elem *ip6_remote;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int num_ip6_remote;</span><br><span> };</span><br><span> </span><br><span> static inline struct gprs_ns2_nse *nse_inst_from_fi(struct osmo_fsm_inst *fi)</span><br><span>@@ -216,8 +213,8 @@</span><br><span> </span><br><span> static int nss_weight_sum(const struct ns2_sns_state *nss, bool data_weight)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return ip4_weight_sum(nss->ip4_remote, nss->num_ip4_remote, data_weight) +</span><br><span style="color: hsl(0, 100%, 40%);">- ip6_weight_sum(nss->ip6_remote, nss->num_ip6_remote, data_weight);</span><br><span style="color: hsl(120, 100%, 40%);">+ return ip4_weight_sum(nss->remote.ip4, nss->remote.num_ip4, data_weight) +</span><br><span style="color: hsl(120, 100%, 40%);">+ ip6_weight_sum(nss->remote.ip6, nss->remote.num_ip6, data_weight);</span><br><span> }</span><br><span> #define nss_weight_sum_data(nss) nss_weight_sum(nss, true)</span><br><span> #define nss_weight_sum_sig(nss) nss_weight_sum(nss, false)</span><br><span>@@ -300,20 +297,20 @@</span><br><span> </span><br><span> static void ns2_clear_ipv46_entries_local(struct ns2_sns_state *gss)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TALLOC_FREE(gss->ip4_local);</span><br><span style="color: hsl(0, 100%, 40%);">- TALLOC_FREE(gss->ip6_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ TALLOC_FREE(gss->local.ip4);</span><br><span style="color: hsl(120, 100%, 40%);">+ TALLOC_FREE(gss->local.ip6);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip4_local = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip6_local = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->local.num_ip4 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->local.num_ip6 = 0;</span><br><span> }</span><br><span> </span><br><span> static void ns2_clear_ipv46_entries_remote(struct ns2_sns_state *gss)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TALLOC_FREE(gss->ip4_remote);</span><br><span style="color: hsl(0, 100%, 40%);">- TALLOC_FREE(gss->ip6_remote);</span><br><span style="color: hsl(120, 100%, 40%);">+ TALLOC_FREE(gss->remote.ip4);</span><br><span style="color: hsl(120, 100%, 40%);">+ TALLOC_FREE(gss->remote.ip6);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip4_remote = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip6_remote = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip4 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip6 = 0;</span><br><span> }</span><br><span> </span><br><span> static void ns2_vc_create_ip(struct osmo_fsm_inst *fi, struct gprs_ns2_nse *nse, const struct osmo_sockaddr *remote,</span><br><span>@@ -393,8 +390,8 @@</span><br><span> unsigned int i;</span><br><span> </span><br><span> /* iterate over all remote IPv4 endpoints */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip4_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- const struct gprs_ns_ie_ip4_elem *ip4 = &gss->ip4_remote[i];</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> </span><br><span> remote.u.sin.sin_family = AF_INET;</span><br><span> remote.u.sin.sin_addr.s_addr = ip4->ip_addr;</span><br><span>@@ -425,8 +422,8 @@</span><br><span> }</span><br><span> </span><br><span> /* iterate over all remote IPv4 endpoints */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip6_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- const struct gprs_ns_ie_ip6_elem *ip6 = &gss->ip6_remote[i];</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> </span><br><span> remote.u.sin6.sin6_family = AF_INET6;</span><br><span> remote.u.sin6.sin6_addr = ip6->ip_addr;</span><br><span>@@ -465,21 +462,21 @@</span><br><span> {</span><br><span> unsigned int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (gss->num_ip4_remote >= gss->num_max_ip4_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->remote.num_ip4 >= gss->num_max_ip4_remote)</span><br><span> return -NS_CAUSE_INVAL_NR_NS_VC;</span><br><span> </span><br><span> /* check for duplicates */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip4_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (memcmp(&gss->ip4_remote[i], ip4, sizeof(*ip4)))</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%);">+ if (memcmp(&gss->remote.ip4[i], ip4, sizeof(*ip4)))</span><br><span> continue;</span><br><span> /* TODO: log message duplicate */</span><br><span> return -NS_CAUSE_PROTO_ERR_UNSPEC;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip4_remote = talloc_realloc(gss, gss->ip4_remote, struct gprs_ns_ie_ip4_elem,</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip4_remote+1);</span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip4_remote[gss->num_ip4_remote] = *ip4;</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip4_remote += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.ip4 = talloc_realloc(gss, gss->remote.ip4, struct gprs_ns_ie_ip4_elem,</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip4+1);</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.ip4[gss->remote.num_ip4] = *ip4;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip4 += 1;</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -488,12 +485,12 @@</span><br><span> {</span><br><span> unsigned int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip4_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (memcmp(&gss->ip4_remote[i], ip4, sizeof(*ip4)))</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%);">+ if (memcmp(&gss->remote.ip4[i], ip4, sizeof(*ip4)))</span><br><span> continue;</span><br><span> /* all array elements < i remain as they are; all > i are shifted left by one */</span><br><span style="color: hsl(0, 100%, 40%);">- memmove(&gss->ip4_remote[i], &gss->ip4_remote[i+1], gss->num_ip4_remote-i-1);</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip4_remote -= 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ memmove(&gss->remote.ip4[i], &gss->remote.ip4[i+1], gss->remote.num_ip4-i-1);</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip4 -= 1;</span><br><span> return 0;</span><br><span> }</span><br><span> return -1;</span><br><span>@@ -504,13 +501,13 @@</span><br><span> {</span><br><span> unsigned int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip4_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (gss->ip4_remote[i].ip_addr != ip4->ip_addr ||</span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip4_remote[i].udp_port != ip4->udp_port)</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%);">+ if (gss->remote.ip4[i].ip_addr != ip4->ip_addr ||</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.ip4[i].udp_port != ip4->udp_port)</span><br><span> continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip4_remote[i].sig_weight = ip4->sig_weight;</span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip4_remote[i].data_weight = ip4->data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.ip4[i].sig_weight = ip4->sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.ip4[i].data_weight = ip4->data_weight;</span><br><span> return 0;</span><br><span> }</span><br><span> return -1;</span><br><span>@@ -519,13 +516,13 @@</span><br><span> /* Add a given remote IPv6 element to gprs_sns_state */</span><br><span> static int add_remote_ip6_elem(struct ns2_sns_state *gss, const struct gprs_ns_ie_ip6_elem *ip6)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (gss->num_ip6_remote >= gss->num_max_ip6_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->remote.num_ip6 >= gss->num_max_ip6_remote)</span><br><span> return -NS_CAUSE_INVAL_NR_NS_VC;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip6_remote = talloc_realloc(gss, gss->ip6_remote, struct gprs_ns_ie_ip6_elem,</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip6_remote+1);</span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip6_remote[gss->num_ip6_remote] = *ip6;</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip6_remote += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.ip6 = talloc_realloc(gss, gss->remote.ip6, struct gprs_ns_ie_ip6_elem,</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip6+1);</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.ip6[gss->remote.num_ip6] = *ip6;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip6 += 1;</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -534,12 +531,12 @@</span><br><span> {</span><br><span> unsigned int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip6_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (memcmp(&gss->ip6_remote[i], ip6, sizeof(*ip6)))</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%);">+ if (memcmp(&gss->remote.ip6[i], ip6, sizeof(*ip6)))</span><br><span> continue;</span><br><span> /* all array elements < i remain as they are; all > i are shifted left by one */</span><br><span style="color: hsl(0, 100%, 40%);">- memmove(&gss->ip6_remote[i], &gss->ip6_remote[i+1], gss->num_ip6_remote-i-1);</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip6_remote -= 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ memmove(&gss->remote.ip6[i], &gss->remote.ip6[i+1], gss->remote.num_ip6-i-1);</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip6 -= 1;</span><br><span> return 0;</span><br><span> }</span><br><span> return -1;</span><br><span>@@ -550,12 +547,12 @@</span><br><span> {</span><br><span> unsigned int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip6_remote; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (memcmp(&gss->ip6_remote[i].ip_addr, &ip6->ip_addr, sizeof(ip6->ip_addr)) ||</span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip6_remote[i].udp_port != ip6->udp_port)</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%);">+ if (memcmp(&gss->remote.ip6[i].ip_addr, &ip6->ip_addr, sizeof(ip6->ip_addr)) ||</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.ip6[i].udp_port != ip6->udp_port)</span><br><span> continue;</span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip6_remote[i].sig_weight = ip6->sig_weight;</span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip6_remote[i].data_weight = ip6->data_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.ip6[i].sig_weight = ip6->sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.ip6[i].data_weight = ip6->data_weight;</span><br><span> return 0;</span><br><span> }</span><br><span> return -1;</span><br><span>@@ -811,11 +808,11 @@</span><br><span> </span><br><span> switch (gss->ip) {</span><br><span> case IPv4:</span><br><span style="color: hsl(0, 100%, 40%);">- ip4_elems = talloc_realloc(fi, gss->ip4_local, struct gprs_ns_ie_ip4_elem, count);</span><br><span style="color: hsl(120, 100%, 40%);">+ ip4_elems = talloc_realloc(fi, gss->local.ip4, struct gprs_ns_ie_ip4_elem, count);</span><br><span> if (!ip4_elems)</span><br><span> return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip4_local = ip4_elems;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->local.ip4 = ip4_elems;</span><br><span> llist_for_each_entry(sbind, &gss->binds, list) {</span><br><span> bind = sbind->bind;</span><br><span> sa = gprs_ns2_ip_bind_sockaddr(bind);</span><br><span>@@ -841,16 +838,16 @@</span><br><span> ip4_elems++;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip4_local = count;</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_max_nsvcs = OSMO_MAX(gss->num_max_ip4_remote * gss->num_ip4_local, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->local.num_ip4 = count;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->num_max_nsvcs = OSMO_MAX(gss->num_max_ip4_remote * gss->local.num_ip4, 8);</span><br><span> break;</span><br><span> case IPv6:</span><br><span> /* IPv6 */</span><br><span style="color: hsl(0, 100%, 40%);">- ip6_elems = talloc_realloc(fi, gss->ip6_local, struct gprs_ns_ie_ip6_elem, count);</span><br><span style="color: hsl(120, 100%, 40%);">+ ip6_elems = talloc_realloc(fi, gss->local.ip6, struct gprs_ns_ie_ip6_elem, count);</span><br><span> if (!ip6_elems)</span><br><span> return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip6_local = ip6_elems;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->local.ip6 = ip6_elems;</span><br><span> </span><br><span> llist_for_each_entry(sbind, &gss->binds, list) {</span><br><span> bind = sbind->bind;</span><br><span>@@ -877,8 +874,8 @@</span><br><span> </span><br><span> ip6_elems++;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip6_local = count;</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_max_nsvcs = OSMO_MAX(gss->num_max_ip6_remote * gss->num_ip6_local, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->local.num_ip6 = count;</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->num_max_nsvcs = OSMO_MAX(gss->num_max_ip6_remote * gss->local.num_ip6, 8);</span><br><span> break;</span><br><span> }</span><br><span> }</span><br><span>@@ -924,9 +921,9 @@</span><br><span> }</span><br><span> </span><br><span> if (gss->num_max_ip4_remote > 0)</span><br><span style="color: hsl(0, 100%, 40%);">- ns2_tx_sns_size(gss->sns_nsvc, true, gss->num_max_nsvcs, gss->num_ip4_local, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+ ns2_tx_sns_size(gss->sns_nsvc, true, gss->num_max_nsvcs, gss->local.num_ip4, -1);</span><br><span> else</span><br><span style="color: hsl(0, 100%, 40%);">- ns2_tx_sns_size(gss->sns_nsvc, true, gss->num_max_nsvcs, -1, gss->num_ip6_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ ns2_tx_sns_size(gss->sns_nsvc, true, gss->num_max_nsvcs, -1, gss->local.num_ip6);</span><br><span> }</span><br><span> </span><br><span> static void ns2_sns_st_bss_config_bss(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span>@@ -966,13 +963,13 @@</span><br><span> switch (gss->ip) {</span><br><span> case IPv4:</span><br><span> ns2_tx_sns_config(gss->sns_nsvc, true,</span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip4_local, gss->num_ip4_local,</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->local.ip4, gss->local.num_ip4,</span><br><span> NULL, 0);</span><br><span> break;</span><br><span> case IPv6:</span><br><span> ns2_tx_sns_config(gss->sns_nsvc, true,</span><br><span> NULL, 0,</span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip6_local, gss->num_ip6_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->local.ip6, gss->local.num_ip6);</span><br><span> break;</span><br><span> }</span><br><span> }</span><br><span>@@ -1001,19 +998,19 @@</span><br><span> v4_list = (const struct gprs_ns_ie_ip4_elem *) TLVP_VAL(tp, NS_IE_IPv4_LIST);</span><br><span> num_v4 = TLVP_LEN(tp, NS_IE_IPv4_LIST) / sizeof(*v4_list);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (num_v4 && gss->ip6_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (num_v4 && gss->remote.ip6)</span><br><span> return -NS_CAUSE_INVAL_NR_IPv4_EP;</span><br><span> </span><br><span> /* realloc to the new size */</span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip4_remote = talloc_realloc(gss, gss->ip4_remote,</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.ip4 = talloc_realloc(gss, gss->remote.ip4,</span><br><span> struct gprs_ns_ie_ip4_elem,</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip4_remote + num_v4);</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip4 + num_v4);</span><br><span> /* append the new entries to the end of the list */</span><br><span style="color: hsl(0, 100%, 40%);">- memcpy(&gss->ip4_remote[gss->num_ip4_remote], v4_list, num_v4*sizeof(*v4_list));</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip4_remote += num_v4;</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(&gss->remote.ip4[gss->remote.num_ip4], v4_list, num_v4*sizeof(*v4_list));</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip4 += num_v4;</span><br><span> </span><br><span> LOGPFSML(fi, LOGL_INFO, "Rx SNS-CONFIG: Remote IPv4 list now %u entries\n",</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip4_remote);</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip4);</span><br><span> }</span><br><span> </span><br><span> if (TLVP_PRESENT(tp, NS_IE_IPv6_LIST)) {</span><br><span>@@ -1022,19 +1019,19 @@</span><br><span> v6_list = (const struct gprs_ns_ie_ip6_elem *) TLVP_VAL(tp, NS_IE_IPv6_LIST);</span><br><span> num_v6 = TLVP_LEN(tp, NS_IE_IPv6_LIST) / sizeof(*v6_list);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (num_v6 && gss->ip4_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (num_v6 && gss->remote.ip4)</span><br><span> return -NS_CAUSE_INVAL_NR_IPv6_EP;</span><br><span> </span><br><span> /* realloc to the new size */</span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip6_remote = talloc_realloc(gss, gss->ip6_remote,</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.ip6 = talloc_realloc(gss, gss->remote.ip6,</span><br><span> struct gprs_ns_ie_ip6_elem,</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip6_remote + num_v6);</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip6 + num_v6);</span><br><span> /* append the new entries to the end of the list */</span><br><span style="color: hsl(0, 100%, 40%);">- memcpy(&gss->ip6_remote[gss->num_ip6_remote], v6_list, num_v6*sizeof(*v6_list));</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip6_remote += num_v6;</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(&gss->remote.ip6[gss->remote.num_ip6], v6_list, num_v6*sizeof(*v6_list));</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip6 += num_v6;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- LOGPFSML(fi, LOGL_INFO, "Rx SNS-CONFIG: Remote IPv6 list now %u entries\n",</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip6_remote);</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPFSML(fi, LOGL_INFO, "Rx SNS-CONFIG: Remote IPv6 list now %d entries\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip6);</span><br><span> }</span><br><span> </span><br><span> return 0;</span><br><span>@@ -1204,9 +1201,9 @@</span><br><span> return;</span><br><span> }</span><br><span> /* make a copy as do_sns_delete() will change the array underneath us */</span><br><span style="color: hsl(0, 100%, 40%);">- ip4_remote = talloc_memdup(fi, gss->ip4_remote,</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip4_remote * sizeof(*v4_list));</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip4_remote; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ip4_remote = talloc_memdup(fi, gss->remote.ip4,</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip4 * sizeof(*v4_list));</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < gss->remote.num_ip4; i++) {</span><br><span> if (ip4_remote[i].ip_addr == ip_addr) {</span><br><span> rc = do_sns_delete(fi, &ip4_remote[i], NULL);</span><br><span> if (rc < 0) {</span><br><span>@@ -1255,9 +1252,9 @@</span><br><span> }</span><br><span> memcpy(&ip6_addr, (ie+1), sizeof(struct in6_addr));</span><br><span> /* make a copy as do_sns_delete() will change the array underneath us */</span><br><span style="color: hsl(0, 100%, 40%);">- ip6_remote = talloc_memdup(fi, gss->ip6_remote,</span><br><span style="color: hsl(0, 100%, 40%);">- gss->num_ip6_remote * sizeof(*v4_list));</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip6_remote; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ip6_remote = talloc_memdup(fi, gss->remote.ip6,</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->remote.num_ip6 * sizeof(*v4_list));</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < gss->remote.num_ip6; i++) {</span><br><span> if (!memcmp(&ip6_remote[i].ip_addr, &ip6_addr, sizeof(struct in6_addr))) {</span><br><span> rc = do_sns_delete(fi, NULL, &ip6_remote[i]);</span><br><span> if (rc < 0) {</span><br><span>@@ -1774,24 +1771,24 @@</span><br><span> vty_out(vty, "%sMaximum number of remote NS-VCs: %zu, IPv4 Endpoints: %zu, IPv6 Endpoints: %zu%s",</span><br><span> prefix, gss->num_max_nsvcs, gss->num_max_ip4_remote, gss->num_max_ip6_remote, VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (gss->num_ip4_local && gss->num_ip4_remote) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->local.num_ip4 && gss->remote.num_ip4) {</span><br><span> vty_out(vty, "%sLocal IPv4 Endpoints:%s", prefix, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip4_local; i++)</span><br><span style="color: hsl(0, 100%, 40%);">- vty_dump_sns_ip4(vty, prefix, &gss->ip4_local[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < gss->local.num_ip4; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_dump_sns_ip4(vty, prefix, &gss->local.ip4[i]);</span><br><span> </span><br><span> vty_out(vty, "%sRemote IPv4 Endpoints:%s", prefix, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip4_remote; i++)</span><br><span style="color: hsl(0, 100%, 40%);">- vty_dump_sns_ip4(vty, prefix, &gss->ip4_remote[i]);</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%);">+ vty_dump_sns_ip4(vty, prefix, &gss->remote.ip4[i]);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (gss->num_ip6_local && gss->num_ip6_remote) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->local.num_ip6 && gss->remote.num_ip6) {</span><br><span> vty_out(vty, "%sLocal IPv6 Endpoints:%s", prefix, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip6_local; i++)</span><br><span style="color: hsl(0, 100%, 40%);">- vty_dump_sns_ip6(vty, prefix, &gss->ip6_local[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < gss->local.num_ip6; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_dump_sns_ip6(vty, prefix, &gss->local.ip6[i]);</span><br><span> </span><br><span> vty_out(vty, "%sRemote IPv6 Endpoints:%s", prefix, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < gss->num_ip6_remote; i++)</span><br><span style="color: hsl(0, 100%, 40%);">- vty_dump_sns_ip6(vty, prefix, &gss->ip6_remote[i]);</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%);">+ vty_dump_sns_ip6(vty, prefix, &gss->remote.ip6[i]);</span><br><span> }</span><br><span> }</span><br><span> </span><br><span>@@ -2052,8 +2049,8 @@</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Update SNS weights</span><br><span style="color: hsl(0, 100%, 40%);">- * \param[in] nsvc the NSVC which should be updated</span><br><span style="color: hsl(120, 100%, 40%);">+/* Update SNS weights for a bind (local endpoint).</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] bind the bind which has been updated</span><br><span> */</span><br><span> void ns2_sns_update_weights(struct gprs_ns2_vc_bind *bind)</span><br><span> {</span><br><span>@@ -2121,8 +2118,8 @@</span><br><span> OSMO_ASSERT(gss->role == GPRS_SNS_ROLE_SGSN);</span><br><span> </span><br><span> /* transmit SGSN-oriented SNS-CONFIG */</span><br><span style="color: hsl(0, 100%, 40%);">- ns2_tx_sns_config(gss->sns_nsvc, true, gss->ip4_local, gss->num_ip4_local,</span><br><span style="color: hsl(0, 100%, 40%);">- gss->ip6_local, gss->num_ip6_local);</span><br><span style="color: hsl(120, 100%, 40%);">+ ns2_tx_sns_config(gss->sns_nsvc, true, gss->local.ip4, gss->local.num_ip4,</span><br><span style="color: hsl(120, 100%, 40%);">+ gss->local.ip6, gss->local.num_ip6);</span><br><span> }</span><br><span> </span><br><span> /* We're waiting for SNS-CONFIG-ACK from the BSS (in response to our outbound SNS-CONFIG) */</span><br><span>@@ -2253,15 +2250,15 @@</span><br><span> if (gss->num_max_ip6_remote && ns2_sns_count_num_local_ep(fi, IPv6)) {</span><br><span> gss->ip = IPv6;</span><br><span> ns2_sns_compute_local_ep_from_binds(fi);</span><br><span style="color: hsl(0, 100%, 40%);">- num_local_eps = gss->num_ip6_local;</span><br><span style="color: hsl(120, 100%, 40%);">+ num_local_eps = gss->local.num_ip6;</span><br><span> num_remote_eps = gss->num_max_ip6_remote;</span><br><span> } else if (gss->num_max_ip4_remote && ns2_sns_count_num_local_ep(fi, IPv4)) {</span><br><span> gss->ip = IPv4;</span><br><span> ns2_sns_compute_local_ep_from_binds(fi);</span><br><span style="color: hsl(0, 100%, 40%);">- num_local_eps = gss->num_ip4_local;</span><br><span style="color: hsl(120, 100%, 40%);">+ num_local_eps = gss->local.num_ip4;</span><br><span> num_remote_eps = gss->num_max_ip4_remote;</span><br><span> } else {</span><br><span style="color: hsl(0, 100%, 40%);">- if (gss->num_ip4_local && !gss->num_max_ip4_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (gss->local.num_ip4 && !gss->num_max_ip4_remote)</span><br><span> cause = NS_CAUSE_INVAL_NR_IPv4_EP;</span><br><span> else</span><br><span> cause = NS_CAUSE_INVAL_NR_IPv6_EP;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/24582">change 24582</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/+/24582"/><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: I05e053a9eb3328655502dfe2981c8f402104e292 </div>
<div style="display:none"> Gerrit-Change-Number: 24582 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>