<p>lynxis lazus has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/20912">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">libosmocore: change the memory management of NS2<br><br>Until now NS2 always free'd it's own memory. Even when the msg<br>was sent as primitive to the upper layer.<br>Change the memory ownership when sending a primitive to the upper layer.<br>The upper layer has to free the msg buffer.<br><br>Merge together with: I180433735bfbb3375c41318d7a7709d5845199ba (osmo-pcu)<br>Change-Id: If6f432ec29daa3e1833f62b5f4d29db3e1eb7cc0<br><br>Change-Id: Id844d7acbcab102a7dc472d608a5e97a748ecb43<br>---<br>M src/gb/gprs_ns2_vc_fsm.c<br>1 file changed, 30 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/12/20912/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gb/gprs_ns2_vc_fsm.c b/src/gb/gprs_ns2_vc_fsm.c</span><br><span>index d13f1ce..bbe6661 100644</span><br><span>--- a/src/gb/gprs_ns2_vc_fsm.c</span><br><span>+++ b/src/gb/gprs_ns2_vc_fsm.c</span><br><span>@@ -459,8 +459,10 @@</span><br><span>        struct osmo_gprs_ns2_prim nsp = {};</span><br><span>  uint16_t bvci;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (msgb_l2len(msg) < sizeof(*nsh) + 3)</span><br><span style="color: hsl(120, 100%, 40%);">+    if (msgb_l2len(msg) < sizeof(*nsh) + 3) {</span><br><span style="color: hsl(120, 100%, 40%);">+          msgb_free(msg);</span><br><span>              return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        /* TODO: 7.1: For an IP sub-network, an NS-UNITDATA PDU</span><br><span>       * for a PTP BVC may indicate a request to change the IP endpoint</span><br><span>@@ -488,6 +490,7 @@</span><br><span> {</span><br><span>         struct gprs_ns2_vc_priv *priv = fi->priv;</span><br><span>         struct gprs_ns2_inst *nsi = ns_inst_from_fi(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+      struct msgb *msg = data;</span><br><span> </span><br><span>         switch (event) {</span><br><span>     case GPRS_NS2_EV_RESET:</span><br><span>@@ -520,22 +523,31 @@</span><br><span>                      recv_test_procedure(fi);</span><br><span>             break;</span><br><span>       case GPRS_NS2_EV_UNITDATA:</span><br><span style="color: hsl(120, 100%, 40%);">+            /* UNITDATA has to handle the release of msg.</span><br><span style="color: hsl(120, 100%, 40%);">+          * If send upwards (gprs_ns2_recv_unitdata) it must NOT free</span><br><span style="color: hsl(120, 100%, 40%);">+           * the msg, the upper layer has to do it.</span><br><span style="color: hsl(120, 100%, 40%);">+              * Otherwise the msg must be freed.</span><br><span style="color: hsl(120, 100%, 40%);">+            */</span><br><span>          switch (fi->state) {</span><br><span>              case GPRS_NS2_ST_BLOCKED:</span><br><span>                    /* 7.2.1: the BLOCKED_ACK might be lost */</span><br><span style="color: hsl(0, 100%, 40%);">-                      if (priv->initiater)</span><br><span style="color: hsl(0, 100%, 40%);">-                         gprs_ns2_recv_unitdata(fi, data);</span><br><span style="color: hsl(0, 100%, 40%);">-                       else</span><br><span style="color: hsl(0, 100%, 40%);">-                            ns2_tx_status(priv->nsvc,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          NS_CAUSE_NSVC_BLOCKED,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          0, data);</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (priv->initiater) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             gprs_ns2_recv_unitdata(fi, msg);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   ns2_tx_status(priv->nsvc,</span><br><span style="color: hsl(120, 100%, 40%);">+                                NS_CAUSE_NSVC_BLOCKED,</span><br><span style="color: hsl(120, 100%, 40%);">+                                0, msg);</span><br><span>                       break;</span><br><span>               /* ALIVE can receive UNITDATA if the ALIVE_ACK is lost */</span><br><span>            case GPRS_NS2_ST_ALIVE:</span><br><span>              case GPRS_NS2_ST_UNBLOCKED:</span><br><span style="color: hsl(0, 100%, 40%);">-                     gprs_ns2_recv_unitdata(fi, data);</span><br><span style="color: hsl(0, 100%, 40%);">-                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                        gprs_ns2_recv_unitdata(fi, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                      return;</span><br><span>              }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           msgb_free(msg);</span><br><span>              break;</span><br><span>       }</span><br><span> }</span><br><span>@@ -605,6 +617,7 @@</span><br><span> {</span><br><span>    struct gprs_ns_hdr *nsh = (struct gprs_ns_hdr *) msg->l2h;</span><br><span>        struct osmo_fsm_inst *fi = nsvc->fi;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc = 0;</span><br><span>  uint8_t cause;</span><br><span> </span><br><span>   /* TODO: 7.2: on UNBLOCK/BLOCK: check if NS-VCI is correct,</span><br><span>@@ -614,7 +627,8 @@</span><br><span> </span><br><span>        if (gprs_ns2_validate(nsvc, nsh->pdu_type, msg, tp, &cause)) {</span><br><span>                if (nsh->pdu_type != NS_PDUT_STATUS) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       return ns2_tx_status(nsvc, cause, 0, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                    rc = ns2_tx_status(nsvc, cause, 0, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                      goto out;</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span>@@ -644,15 +658,19 @@</span><br><span>                osmo_fsm_inst_dispatch(fi, GPRS_NS2_EV_ALIVE_ACK, tp);</span><br><span>               break;</span><br><span>       case NS_PDUT_UNITDATA:</span><br><span style="color: hsl(120, 100%, 40%);">+                /* UNITDATA have to free msg because it might send the msg layer upwards */</span><br><span>          osmo_fsm_inst_dispatch(fi, GPRS_NS2_EV_UNITDATA, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(120, 100%, 40%);">+                return 0;</span><br><span>    default:</span><br><span>             LOGP(DLNS, LOGL_ERROR, "NSEI=%u Rx unknown NS PDU type %s\n", nsvc->nse->nsei,</span><br><span>                       get_value_string(gprs_ns_pdu_strings, nsh->pdu_type));</span><br><span>            return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+out:</span><br><span style="color: hsl(120, 100%, 40%);">+       msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     return rc;</span><br><span> }</span><br><span> </span><br><span> /*! is the given NS-VC unblocked? */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/20912">change 20912</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/+/20912"/><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: Id844d7acbcab102a7dc472d608a5e97a748ecb43 </div>
<div style="display:none"> Gerrit-Change-Number: 20912 </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>