<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/24581">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2_sns: bss: improve validation of configuration<br><br>Some combination of IPv4 and IPv6 result in incomplete<br>combination.<br>E.g. IPv6 binds, but only IPv4 endpoints and vice versa.<br><br>Related: OS#5036<br>Change-Id: I2fcf67bc2431ddac23c4ae23cebbb29771e573f1<br>---<br>M src/gb/gprs_ns2_sns.c<br>1 file changed, 49 insertions(+), 1 deletion(-)<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 5d85ec0..9865acd 100644</span><br><span>--- a/src/gb/gprs_ns2_sns.c</span><br><span>+++ b/src/gb/gprs_ns2_sns.c</span><br><span>@@ -1519,6 +1519,54 @@</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* validate the bss configuration (sns endpoint and binds)</span><br><span style="color: hsl(120, 100%, 40%);">+ * - no endpoints -> invalid</span><br><span style="color: hsl(120, 100%, 40%);">+ * - no binds -> invalid</span><br><span style="color: hsl(120, 100%, 40%);">+ * - only v4 sns endpoints, only v6 binds -> invalid</span><br><span style="color: hsl(120, 100%, 40%);">+ * - only v4 sns endpoints, but v4 sig weights == 0 -> invalid ...</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static int ns2_sns_bss_valid_configuration(struct ns2_sns_state *gss)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct ns2_sns_bind *sbind;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct sns_endpoint *endpoint;</span><br><span style="color: hsl(120, 100%, 40%);">+        const struct osmo_sockaddr *addr;</span><br><span style="color: hsl(120, 100%, 40%);">+     int v4_sig = 0, v4_data = 0, v6_sig = 0, v6_data = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool v4_endpoints = false;</span><br><span style="color: hsl(120, 100%, 40%);">+    bool v6_endpoints = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (llist_empty(&gss->sns_endpoints) || llist_empty(&gss->binds))</span><br><span style="color: hsl(120, 100%, 40%);">+               return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   llist_for_each_entry(sbind, &gss->binds, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+               addr = gprs_ns2_ip_bind_sockaddr(sbind->bind);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!addr)</span><br><span style="color: hsl(120, 100%, 40%);">+                    continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             switch (addr->u.sa.sa_family) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+                 v4_sig += sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+                  v4_data += 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%);">+                        v6_sig += sbind->bind->sns_sig_weight;</span><br><span style="color: hsl(120, 100%, 40%);">+                  v6_data += sbind->bind->sns_data_weight;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   llist_for_each_entry(endpoint, &gss->sns_endpoints, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+            switch (endpoint->saddr.u.sa.sa_family) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+                 v4_endpoints = true;</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%);">+                        v6_endpoints = true;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return (v4_endpoints && v4_sig && v4_data) || (v6_endpoints && v6_sig && v6_data);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* allstate-action for BSS role */</span><br><span> static void ns2_sns_st_all_action_bss(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>@@ -1544,7 +1592,7 @@</span><br><span>            ns2_clear_ipv46_entries_remote(gss);</span><br><span> </span><br><span>             /* Choose the next sns endpoint. */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (llist_empty(&gss->sns_endpoints) || llist_empty(&gss->binds)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!ns2_sns_bss_valid_configuration(gss)) {</span><br><span>                         gss->initial = NULL;</span><br><span>                      ns2_prim_status_ind(gss->nse, NULL, 0, GPRS_NS2_AFF_CAUSE_SNS_NO_ENDPOINTS);</span><br><span>                      osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_UNCONFIGURED, 0, 3);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/24581">change 24581</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/+/24581"/><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: I2fcf67bc2431ddac23c4ae23cebbb29771e573f1 </div>
<div style="display:none"> Gerrit-Change-Number: 24581 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </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: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>