<p>lynxis lazus has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/23186">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2: add functions for SNS add/del/change-weight messages<br><br>Change-Id: Ib9492e213e82c18c7dcce6ba7d64e897b4c74796<br>---<br>M src/gb/gprs_ns2_internal.h<br>M src/gb/gprs_ns2_message.c<br>2 files changed, 135 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/86/23186/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h</span><br><span>index 7e235be..1bef753 100644</span><br><span>--- a/src/gb/gprs_ns2_internal.h</span><br><span>+++ b/src/gb/gprs_ns2_internal.h</span><br><span>@@ -329,6 +329,25 @@</span><br><span>                          int ip4_ep_nr, int ip6_ep_nr);</span><br><span> int ns2_tx_sns_size_ack(struct gprs_ns2_vc *nsvc, uint8_t *cause);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_tx_sns_add(struct gprs_ns2_vc *nsvc,</span><br><span style="color: hsl(120, 100%, 40%);">+                  uint8_t trans_id,</span><br><span style="color: hsl(120, 100%, 40%);">+             const struct gprs_ns_ie_ip4_elem *ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                  unsigned int num_ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                   const struct gprs_ns_ie_ip6_elem *ip6_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                  unsigned int num_ip6_elems);</span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_tx_sns_change_weight(struct gprs_ns2_vc *nsvc,</span><br><span style="color: hsl(120, 100%, 40%);">+                            uint8_t trans_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                             const struct gprs_ns_ie_ip4_elem *ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                          unsigned int num_ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                           const struct gprs_ns_ie_ip6_elem *ip6_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                          unsigned int num_ip6_elems);</span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_tx_sns_del(struct gprs_ns2_vc *nsvc,</span><br><span style="color: hsl(120, 100%, 40%);">+                  uint8_t trans_id,</span><br><span style="color: hsl(120, 100%, 40%);">+             const struct gprs_ns_ie_ip4_elem *ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                  unsigned int num_ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                   const struct gprs_ns_ie_ip6_elem *ip6_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                  unsigned int num_ip6_elems);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* transmit message over a VC */</span><br><span> int ns2_tx_block(struct gprs_ns2_vc *nsvc, uint8_t cause);</span><br><span> int ns2_tx_block_ack(struct gprs_ns2_vc *nsvc);</span><br><span>diff --git a/src/gb/gprs_ns2_message.c b/src/gb/gprs_ns2_message.c</span><br><span>index ddf7285..ca764a4 100644</span><br><span>--- a/src/gb/gprs_ns2_message.c</span><br><span>+++ b/src/gb/gprs_ns2_message.c</span><br><span>@@ -481,6 +481,122 @@</span><br><span>      return ns_vc_tx(nsvc, msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Encode + Transmit a SNS-ADD/SNS-CHANGE-WEIGHT as per Section 9.3.2/9.3.3.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] nsvc NS-VC through which to transmit the SNS-CONFIG</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] pdu The PDU type to send out</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] trans_id The transaction id</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ip4_elems Array of IPv4 Elements</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] num_ip4_elems number of ip4_elems</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ip6_elems Array of IPv6 Elements</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] num_ip6_elems number of ip6_elems</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns 0 on success; negative in case of error */</span><br><span style="color: hsl(120, 100%, 40%);">+static int ns2_tx_sns_procedure(struct gprs_ns2_vc *nsvc,</span><br><span style="color: hsl(120, 100%, 40%);">+                            enum ns_pdu_type pdu,</span><br><span style="color: hsl(120, 100%, 40%);">+                         uint8_t trans_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                             const struct gprs_ns_ie_ip4_elem *ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                          unsigned int num_ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                           const struct gprs_ns_ie_ip6_elem *ip6_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                          unsigned int num_ip6_elems)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gprs_ns_hdr *nsh;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint16_t nsei;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!nsvc)</span><br><span style="color: hsl(120, 100%, 40%);">+            return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!ip4_elems && !ip6_elems)</span><br><span style="color: hsl(120, 100%, 40%);">+         return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     msg = ns2_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     log_set_context(LOG_CTX_GB_NSE, nsvc->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+        log_set_context(LOG_CTX_GB_NSVC, nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!msg)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!nsvc->nse->bss_sns_fi) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGNSVC(nsvc, LOGL_ERROR, "Cannot transmit SNS on NSVC without SNS active\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+               return -EIO;</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%);">+   nsei = osmo_htons(nsvc->nse->nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   msg->l2h = msgb_put(msg, sizeof(*nsh));</span><br><span style="color: hsl(120, 100%, 40%);">+    nsh = (struct gprs_ns_hdr *) msg->l2h;</span><br><span style="color: hsl(120, 100%, 40%);">+     nsh->pdu_type = pdu;</span><br><span style="color: hsl(120, 100%, 40%);">+       msgb_tvlv_put(msg, NS_IE_NSEI, 2, (uint8_t *)&nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+      msgb_v_put(msg, trans_id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* List of IP4 Elements 10.3.2c */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (ip4_elems) {</span><br><span style="color: hsl(120, 100%, 40%);">+              msgb_tvlv_put(msg, NS_IE_IPv4_LIST, num_ip4_elems*sizeof(struct gprs_ns_ie_ip4_elem),</span><br><span style="color: hsl(120, 100%, 40%);">+                       (const uint8_t *)ip4_elems);</span><br><span style="color: hsl(120, 100%, 40%);">+    } else if (ip6_elems) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* List of IP6 elements 10.3.2d */</span><br><span style="color: hsl(120, 100%, 40%);">+            msgb_tvlv_put(msg, NS_IE_IPv6_LIST, num_ip6_elems*sizeof(struct gprs_ns_ie_ip6_elem),</span><br><span style="color: hsl(120, 100%, 40%);">+                       (const uint8_t *)ip6_elems);</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 ns_vc_tx(nsvc, msg);</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%);">+/*! Encode + Transmit a SNS-ADD as per Section 9.3.2.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] nsvc NS-VC through which to transmit the SNS-CONFIG</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] trans_id The transaction id</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ip4_elems Array of IPv4 Elements</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] num_ip4_elems number of ip4_elems</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ip6_elems Array of IPv6 Elements</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] num_ip6_elems number of ip6_elems</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns 0 on success; negative in case of error */</span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_tx_sns_add(struct gprs_ns2_vc *nsvc,</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t trans_id,</span><br><span style="color: hsl(120, 100%, 40%);">+             const struct gprs_ns_ie_ip4_elem *ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                  unsigned int num_ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                   const struct gprs_ns_ie_ip6_elem *ip6_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                  unsigned int num_ip6_elems)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     return ns2_tx_sns_procedure(nsvc, SNS_PDUT_ADD, trans_id, ip4_elems, num_ip4_elems, ip6_elems, num_ip6_elems);</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%);">+/*! Encode + Transmit a SNS-CHANGE-WEIGHT as per Section 9.3.3.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] nsvc NS-VC through which to transmit the SNS-CONFIG</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] trans_id The transaction id</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ip4_elems Array of IPv4 Elements</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] num_ip4_elems number of ip4_elems</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ip6_elems Array of IPv6 Elements</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] num_ip6_elems number of ip6_elems</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns 0 on success; negative in case of error */</span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_tx_sns_change_weight(struct gprs_ns2_vc *nsvc,</span><br><span style="color: hsl(120, 100%, 40%);">+                        uint8_t trans_id,</span><br><span style="color: hsl(120, 100%, 40%);">+                             const struct gprs_ns_ie_ip4_elem *ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                          unsigned int num_ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                           const struct gprs_ns_ie_ip6_elem *ip6_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                          unsigned int num_ip6_elems)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   return ns2_tx_sns_procedure(nsvc, SNS_PDUT_CHANGE_WEIGHT, trans_id, ip4_elems, num_ip4_elems, ip6_elems, num_ip6_elems);</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%);">+/*! Encode + Transmit a SNS-DEL as per Section 9.3.6.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] nsvc NS-VC through which to transmit the SNS-CONFIG</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] trans_id The transaction id</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ip4_elems Array of IPv4 Elements</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] num_ip4_elems number of ip4_elems</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ip6_elems Array of IPv6 Elements</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] num_ip6_elems number of ip6_elems</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns 0 on success; negative in case of error */</span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_tx_sns_del(struct gprs_ns2_vc *nsvc,</span><br><span style="color: hsl(120, 100%, 40%);">+                uint8_t trans_id,</span><br><span style="color: hsl(120, 100%, 40%);">+             const struct gprs_ns_ie_ip4_elem *ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                  unsigned int num_ip4_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                   const struct gprs_ns_ie_ip6_elem *ip6_elems,</span><br><span style="color: hsl(120, 100%, 40%);">+                  unsigned int num_ip6_elems)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     /* TODO: IP Address field */</span><br><span style="color: hsl(120, 100%, 40%);">+  return ns2_tx_sns_procedure(nsvc, SNS_PDUT_DELETE, trans_id, ip4_elems, num_ip4_elems, ip6_elems, num_ip6_elems);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> /*! Encode + Transmit a SNS-ACK as per Section 9.3.1.</span><br><span>  *  \param[in] nsvc NS-VC through which to transmit the ACK</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/23186">change 23186</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/+/23186"/><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: Ib9492e213e82c18c7dcce6ba7d64e897b4c74796 </div>
<div style="display:none"> Gerrit-Change-Number: 23186 </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>