<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/24756">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Support proto IPAC_PROTO_EXT_PCU BSC<->PCU<br><br>Related: SYS#5303<br>Change-Id: I633db291107883c2e370a9b56606d562a990b714<br>---<br>M src/osmobts_sock.c<br>M src/pcu_l1_if.cpp<br>M src/pcu_l1_if.h<br>M tests/app_info/AppInfoTest.cpp<br>4 files changed, 65 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/56/24756/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmobts_sock.c b/src/osmobts_sock.c</span><br><span>index 4e1171f..5c6415f 100644</span><br><span>--- a/src/osmobts_sock.c</span><br><span>+++ b/src/osmobts_sock.c</span><br><span>@@ -133,10 +133,12 @@</span><br><span> </span><br><span> static int pcu_sock_read(struct osmo_fd *bfd)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_pcu_if pcu_prim;</span><br><span style="color: hsl(120, 100%, 40%);">+   const size_t max_len = sizeof(struct gsm_pcu_if) + 1000;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t *buf = alloca(max_len);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_pcu_if *pcu_prim = (struct gsm_pcu_if *)buf;</span><br><span>      int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     rc = recv(bfd->fd, &pcu_prim, sizeof(pcu_prim), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = recv(bfd->fd, buf, max_len, 0);</span><br><span>      if (rc < 0 && errno == EAGAIN)</span><br><span>            return 0; /* Try again later */</span><br><span>      if (rc <= 0) {</span><br><span>@@ -144,7 +146,13 @@</span><br><span>             return -EIO;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return pcu_rx(pcu_prim.msg_type, &pcu_prim);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (rc < PCUIF_HDR_SIZE) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DL1IF, LOGL_ERROR, "Received %d bytes on PCU Socket, but primitive "</span><br><span style="color: hsl(120, 100%, 40%);">+                "hdr size is %zu, discarding\n", rc, PCUIF_HDR_SIZE);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return pcu_rx(pcu_prim, rc);</span><br><span> }</span><br><span> </span><br><span> static int pcu_sock_write(struct osmo_fd *bfd)</span><br><span>diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp</span><br><span>index b35c990..2373f60 100644</span><br><span>--- a/src/pcu_l1_if.cpp</span><br><span>+++ b/src/pcu_l1_if.cpp</span><br><span>@@ -951,9 +951,32 @@</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int pcu_rx(uint8_t msg_type, struct gsm_pcu_if *pcu_prim)</span><br><span style="color: hsl(120, 100%, 40%);">+static int pcu_rx_container(struct gprs_rlcmac_bts *bts, struct gsm_pcu_if_container *container)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (container->msg_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+     default:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DL1IF, LOGL_NOTICE, "(bts=%d) Rx unexpected msg type (%u) inside container!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     bts->nr, container->msg_type);</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = -1;</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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define CHECK_IF_MSG_SIZE(prim_len, prim_msg) \</span><br><span style="color: hsl(120, 100%, 40%);">+      do { \</span><br><span style="color: hsl(120, 100%, 40%);">+                size_t _len = PCUIF_HDR_SIZE + sizeof(prim_msg); \</span><br><span style="color: hsl(120, 100%, 40%);">+            if (prim_len < _len) { \</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGP(DL1IF, LOGL_ERROR, "Received %zu bytes on PCU Socket, but primitive %s " \</span><br><span style="color: hsl(120, 100%, 40%);">+                          "size is %zu, discarding\n", prim_len, #prim_msg, _len); \</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%);">+   } while(0);</span><br><span style="color: hsl(120, 100%, 40%);">+int pcu_rx(struct gsm_pcu_if *pcu_prim, size_t pcu_prim_length)</span><br><span> {</span><br><span>    int rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   size_t exp_len;</span><br><span>      struct gprs_rlcmac_bts *bts = gprs_pcu_get_bts_by_nr(the_pcu, pcu_prim->bts_nr);</span><br><span>  if (!bts) {</span><br><span>          LOGP(DL1IF, LOGL_NOTICE, "Received message for new BTS%d\n", pcu_prim->bts_nr);</span><br><span>@@ -964,40 +987,59 @@</span><br><span>                 }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   switch (msg_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (pcu_prim->msg_type) {</span><br><span>     case PCU_IF_MSG_DATA_IND:</span><br><span style="color: hsl(120, 100%, 40%);">+             CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.data_ind);</span><br><span>                 rc = pcu_rx_data_ind(bts, &pcu_prim->u.data_ind);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_DATA_CNF:</span><br><span style="color: hsl(120, 100%, 40%);">+             CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.data_cnf);</span><br><span>                 rc = pcu_rx_data_cnf(bts, &pcu_prim->u.data_cnf);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_RTS_REQ:</span><br><span style="color: hsl(120, 100%, 40%);">+              CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.rts_req);</span><br><span>          rc = pcu_rx_rts_req(bts, &pcu_prim->u.rts_req);</span><br><span>               break;</span><br><span>       case PCU_IF_MSG_RACH_IND:</span><br><span style="color: hsl(120, 100%, 40%);">+             CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.rach_ind);</span><br><span>                 rc = pcu_rx_rach_ind(bts, &pcu_prim->u.rach_ind);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_INFO_IND:</span><br><span style="color: hsl(120, 100%, 40%);">+             CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.info_ind);</span><br><span>                 rc = pcu_rx_info_ind(bts, &pcu_prim->u.info_ind);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_TIME_IND:</span><br><span style="color: hsl(120, 100%, 40%);">+             CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.time_ind);</span><br><span>                 rc = pcu_rx_time_ind(bts, &pcu_prim->u.time_ind);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_PAG_REQ:</span><br><span style="color: hsl(120, 100%, 40%);">+              CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.pag_req);</span><br><span>          rc = pcu_rx_pag_req(bts, &pcu_prim->u.pag_req);</span><br><span>               break;</span><br><span>       case PCU_IF_MSG_SUSP_REQ:</span><br><span style="color: hsl(120, 100%, 40%);">+             CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.susp_req);</span><br><span>                 rc = pcu_rx_susp_req(bts, &pcu_prim->u.susp_req);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_APP_INFO_REQ:</span><br><span style="color: hsl(120, 100%, 40%);">+         CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.app_info_req);</span><br><span>             rc = pcu_rx_app_info_req(bts, &pcu_prim->u.app_info_req);</span><br><span>             break;</span><br><span>       case PCU_IF_MSG_INTERF_IND:</span><br><span>          /* TODO: handle interference reports */</span><br><span>              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case PCU_IF_MSG_CONTAINER:</span><br><span style="color: hsl(120, 100%, 40%);">+            CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.container);</span><br><span style="color: hsl(120, 100%, 40%);">+         /* ^ check if we can access container fields, v check with container data length */</span><br><span style="color: hsl(120, 100%, 40%);">+           exp_len = PCUIF_HDR_SIZE + sizeof(pcu_prim->u.container) + osmo_load16be(&pcu_prim->u.container.length);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (pcu_prim_length < exp_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGP(DL1IF, LOGL_ERROR, "Received %zu bytes on PCU Socket, but primitive container size" \</span><br><span style="color: hsl(120, 100%, 40%);">+                       "is %zu, discarding\n", pcu_prim_length, exp_len);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = pcu_rx_container(bts, &pcu_prim->u.container);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span>       default:</span><br><span>             LOGP(DL1IF, LOGL_ERROR, "Received unknown PCU msg type %d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 msg_type);</span><br><span style="color: hsl(120, 100%, 40%);">+                    pcu_prim->msg_type);</span><br><span>              rc = -EINVAL;</span><br><span>        }</span><br><span> </span><br><span>diff --git a/src/pcu_l1_if.h b/src/pcu_l1_if.h</span><br><span>index 246444c..2a4f0ea 100644</span><br><span>--- a/src/pcu_l1_if.h</span><br><span>+++ b/src/pcu_l1_if.h</span><br><span>@@ -160,7 +160,7 @@</span><br><span> #endif</span><br><span> struct gprs_rlcmac_bts;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int pcu_rx(uint8_t msg_type, struct gsm_pcu_if *pcu_prim);</span><br><span style="color: hsl(120, 100%, 40%);">+int pcu_rx(struct gsm_pcu_if *pcu_prim, size_t pcu_prim_length);</span><br><span> int pcu_l1if_open(void);</span><br><span> void pcu_l1if_close(void);</span><br><span> int pcu_sock_send(struct msgb *msg);</span><br><span>@@ -178,6 +178,9 @@</span><br><span> </span><br><span> void pcu_rx_block_time(struct gprs_rlcmac_bts *bts, uint16_t arfcn, uint32_t fn, uint8_t ts_no);</span><br><span> uint16_t imsi2paging_group(const char* imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define PCUIF_HDR_SIZE ( sizeof(struct gsm_pcu_if) - sizeof(((struct gsm_pcu_if *)0)->u) )</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #ifdef __cplusplus</span><br><span> }</span><br><span> #endif</span><br><span>diff --git a/tests/app_info/AppInfoTest.cpp b/tests/app_info/AppInfoTest.cpp</span><br><span>index e89680b..d3a047e 100644</span><br><span>--- a/tests/app_info/AppInfoTest.cpp</span><br><span>+++ b/tests/app_info/AppInfoTest.cpp</span><br><span>@@ -72,7 +72,7 @@</span><br><span>  struct gsm_pcu_if pcu_prim = {PCU_IF_MSG_APP_INFO_REQ, };</span><br><span> </span><br><span>        fprintf(stderr, "--- %s ---\n",  __func__);</span><br><span style="color: hsl(0, 100%, 40%);">-   pcu_rx(PCU_IF_MSG_APP_INFO_REQ, &pcu_prim);</span><br><span style="color: hsl(120, 100%, 40%);">+       pcu_rx(&pcu_prim, sizeof(struct gsm_pcu_if));</span><br><span>    fprintf(stderr, "\n");</span><br><span> }</span><br><span> </span><br><span>@@ -106,7 +106,7 @@</span><br><span> </span><br><span>  fprintf(stderr, "--- %s ---\n",  __func__);</span><br><span>        pcu_prim.u.app_info_req = *req;</span><br><span style="color: hsl(0, 100%, 40%);">- pcu_rx(PCU_IF_MSG_APP_INFO_REQ, &pcu_prim);</span><br><span style="color: hsl(120, 100%, 40%);">+       pcu_rx(&pcu_prim, sizeof(struct gsm_pcu_if));</span><br><span> </span><br><span>        msg = sched_app_info(tbf1);</span><br><span>  assert(msg);</span><br><span>@@ -126,7 +126,7 @@</span><br><span> </span><br><span>       fprintf(stderr, "--- %s ---\n",  __func__);</span><br><span>        pcu_prim.u.app_info_req = *req;</span><br><span style="color: hsl(0, 100%, 40%);">- pcu_rx(PCU_IF_MSG_APP_INFO_REQ, &pcu_prim);</span><br><span style="color: hsl(120, 100%, 40%);">+       pcu_rx(&pcu_prim, sizeof(struct gsm_pcu_if));</span><br><span> </span><br><span>        msgb_free(bts->app_info);</span><br><span>         bts->app_info = NULL;</span><br><span>@@ -142,8 +142,8 @@</span><br><span> </span><br><span>   fprintf(stderr, "--- %s ---\n",  __func__);</span><br><span>        pcu_prim.u.app_info_req = *req;</span><br><span style="color: hsl(0, 100%, 40%);">- pcu_rx(PCU_IF_MSG_APP_INFO_REQ, &pcu_prim);</span><br><span style="color: hsl(0, 100%, 40%);">- pcu_rx(PCU_IF_MSG_APP_INFO_REQ, &pcu_prim);</span><br><span style="color: hsl(120, 100%, 40%);">+       pcu_rx(&pcu_prim, sizeof(struct gsm_pcu_if));</span><br><span style="color: hsl(120, 100%, 40%);">+     pcu_rx(&pcu_prim, sizeof(struct gsm_pcu_if));</span><br><span>    fprintf(stderr, "\n");</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/24756">change 24756</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/osmo-pcu/+/24756"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-pcu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I633db291107883c2e370a9b56606d562a990b714 </div>
<div style="display:none"> Gerrit-Change-Number: 24756 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>