<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/14098">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">cbch: Refactor get_smscb_block() / remove smscb_msg.next_seg<br><br>There's no need to keep around a pointer to the next segment<br>in a SMSCB message.  The way how the multiframe structure is<br>laid out (and how the tb number works), we can use the result<br>of a modulo-division on the frame number to determine which<br>of the segments/blocks inside a SMSCB message (page) we have<br>to transmit.<br><br>This also acts as a simplification in preparation of support<br>for the SMSCB DEFAULT type.<br><br>Change-Id: I48faa19fec4a0852e6112ca2faa98960c678d4c5<br>Related: OS#4013<br>---<br>M src/common/cbch.c<br>1 file changed, 25 insertions(+), 19 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/common/cbch.c b/src/common/cbch.c</span><br><span>index cde1a0c..c253805 100644</span><br><span>--- a/src/common/cbch.c</span><br><span>+++ b/src/common/cbch.c</span><br><span>@@ -28,15 +28,16 @@</span><br><span> #include <osmo-bts/cbch.h></span><br><span> #include <osmo-bts/logging.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* internal representation of one SMS-CB message (e.g. in the pending queue */</span><br><span> struct smscb_msg {</span><br><span>      struct llist_head list;         /* list in smscb_state.queue */</span><br><span> </span><br><span>  bool is_schedule;               /* is this a schedule message? */</span><br><span>    uint8_t msg[GSM412_MSG_LEN];    /* message buffer */</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t next_seg;               /* next segment number */</span><br><span>    uint8_t num_segs;               /* total number of segments */</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* construct a SMSCB NULL block in the user-provided output buffer at 'out' */</span><br><span> static int get_smscb_null_block(uint8_t *out)</span><br><span> {</span><br><span>       struct gsm412_block_type *block_type = (struct gsm412_block_type *) out;</span><br><span>@@ -51,17 +52,26 @@</span><br><span> }</span><br><span> </span><br><span> /* get the next block of the current CB message */</span><br><span style="color: hsl(0, 100%, 40%);">-static int get_smscb_block(struct gsm_bts *bts, uint8_t *out)</span><br><span style="color: hsl(120, 100%, 40%);">+static int get_smscb_block(struct gsm_bts *bts, uint8_t *out, uint8_t block_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+                      const struct gsm_time *g_time)</span><br><span> {</span><br><span>       int to_copy;</span><br><span>         struct gsm412_block_type *block_type;</span><br><span>        struct smscb_msg *msg = bts->smscb_state.cur_msg;</span><br><span> </span><br><span>     if (!msg) {</span><br><span style="color: hsl(0, 100%, 40%);">-             /* No message: Send NULL mesage */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* No message: Send NULL block */</span><br><span style="color: hsl(120, 100%, 40%);">+             DEBUGPGT(DLSMS, g_time, "No cur_msg; requesting NULL block\n");</span><br><span>            return get_smscb_null_block(out);</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(msg->next_seg < 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(block_nr < 4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (block_nr >= msg->num_segs) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Higher block number than this message has blocks: Send NULL block */</span><br><span style="color: hsl(120, 100%, 40%);">+               DEBUGPGT(DLSMS, g_time, "cur_msg has only %u blocks; requesting NULL block\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                       msg->num_segs);</span><br><span style="color: hsl(120, 100%, 40%);">+           return get_smscb_null_block(out);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span>        block_type = (struct gsm412_block_type *) out++;</span><br><span> </span><br><span>@@ -70,29 +80,28 @@</span><br><span>   block_type->lpd = 1;</span><br><span> </span><br><span>  /* determine how much data to copy */</span><br><span style="color: hsl(0, 100%, 40%);">-   to_copy = GSM412_MSG_LEN - (msg->next_seg * GSM412_BLOCK_LEN);</span><br><span style="color: hsl(120, 100%, 40%);">+     to_copy = GSM412_MSG_LEN - (block_nr * GSM412_BLOCK_LEN);</span><br><span>    if (to_copy > GSM412_BLOCK_LEN)</span><br><span style="color: hsl(0, 100%, 40%);">-              to_copy = GSM412_BLOCK_LEN;</span><br><span style="color: hsl(120, 100%, 40%);">+   to_copy = GSM412_BLOCK_LEN;</span><br><span>  OSMO_ASSERT(to_copy >= 0);</span><br><span> </span><br><span>    /* copy data and increment index */</span><br><span style="color: hsl(0, 100%, 40%);">-     memcpy(out, &msg->msg[msg->next_seg * GSM412_BLOCK_LEN], to_copy);</span><br><span style="color: hsl(120, 100%, 40%);">+  memcpy(out, &msg->msg[block_nr * GSM412_BLOCK_LEN], to_copy);</span><br><span> </span><br><span>     /* set + increment sequence number */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (msg->next_seg == 0 && msg->is_schedule) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (block_nr == 0 && msg->is_schedule)</span><br><span>            block_type->seq_nr = 8;      /* first schedule block */</span><br><span style="color: hsl(0, 100%, 40%);">-              msg->next_seg++;</span><br><span style="color: hsl(0, 100%, 40%);">-     } else</span><br><span style="color: hsl(0, 100%, 40%);">-          block_type->seq_nr = msg->next_seg++;</span><br><span style="color: hsl(120, 100%, 40%);">+   else</span><br><span style="color: hsl(120, 100%, 40%);">+          block_type->seq_nr = block_nr;</span><br><span> </span><br><span>        /* determine if this is the last block */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (block_type->seq_nr + 1 == msg->num_segs)</span><br><span style="color: hsl(120, 100%, 40%);">+    if (block_nr + 1 == msg->num_segs)</span><br><span>                block_type->lb = 1;</span><br><span>       else</span><br><span>                 block_type->lb = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (block_type->lb == 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-           /* remove/release the message memory */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (block_nr == 4) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* delete any fully-transmitted normal message (or superseded default) */</span><br><span>            talloc_free(bts->smscb_state.cur_msg);</span><br><span>            bts->smscb_state.cur_msg = NULL;</span><br><span>  }</span><br><span>@@ -128,8 +137,6 @@</span><br><span> </span><br><span>  /* initialize entire message with default padding */</span><br><span>         memset(scm->msg, GSM_MACBLOCK_PADDING, sizeof(scm->msg));</span><br><span style="color: hsl(0, 100%, 40%);">- /* next segment is first segment */</span><br><span style="color: hsl(0, 100%, 40%);">-     scm->next_seg = 0;</span><br><span> </span><br><span>    if (cmd_type.command == RSL_CB_CMD_TYPE_SCHEDULE)</span><br><span>            scm->is_schedule = true;</span><br><span>@@ -165,7 +172,6 @@</span><br><span>    }</span><br><span> </span><br><span>        llist_del(&msg->list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>        return msg;</span><br><span> }</span><br><span> </span><br><span>@@ -191,10 +197,10 @@</span><br><span>         case 0:</span><br><span>              /* select a new SMSCB message */</span><br><span>             bts->smscb_state.cur_msg = select_next_smscb(bts);</span><br><span style="color: hsl(0, 100%, 40%);">-           rc = get_smscb_block(bts, outbuf);</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = get_smscb_block(bts, outbuf, tb, g_time);</span><br><span>               break;</span><br><span>       case 1: case 2: case 3:</span><br><span style="color: hsl(0, 100%, 40%);">-         rc = get_smscb_block(bts, outbuf);</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = get_smscb_block(bts, outbuf, tb, g_time);</span><br><span>               break;</span><br><span>       case 4: case 5: case 6: case 7:</span><br><span>              /* always send NULL frame in extended CBCH for now */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/14098">change 14098</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/14098"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I48faa19fec4a0852e6112ca2faa98960c678d4c5 </div>
<div style="display:none"> Gerrit-Change-Number: 14098 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>