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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">paging: add unit-test to check different bs_ag_blks_res settings<br><br>The parameter bs_ag_blks_res, which is loaded into the BTS via the SI3<br>setting, defines how many of the CCCH blocks shall be used for AGCH. The<br>remaining CCCH blocks will then be available as PCH for paging.<br>Unfortunately there is no unit-test yet that verifies that all of the 8<br>different settings for bs_ag_blks_res.<br><br>- Separate the the decision logic that checks if a given fn is part of<br>  an AGCH into a function to have it available in the unit-test.<br>- Add a test that checks all possible bs_ag_blks_res settings.<br><br>Change-Id: Ib9652f4013a4da3766852f8f03ce9ec5590f6989<br>Related: OS#1575<br>---<br>M include/osmo-bts/l1sap.h<br>M src/common/l1sap.c<br>M tests/paging/paging_test.c<br>M tests/paging/paging_test.ok<br>4 files changed, 91 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/l1sap.h b/include/osmo-bts/l1sap.h</span><br><span>index ad13145..4568b7e 100644</span><br><span>--- a/include/osmo-bts/l1sap.h</span><br><span>+++ b/include/osmo-bts/l1sap.h</span><br><span>@@ -93,4 +93,7 @@</span><br><span> </span><br><span> int bts_check_for_first_ciphrd(struct gsm_lchan *lchan,</span><br><span>                                 uint8_t *data, int len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int is_ccch_for_agch(struct gsm_bts_trx *trx, uint32_t fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif /* L1SAP_H */</span><br><span>diff --git a/src/common/l1sap.c b/src/common/l1sap.c</span><br><span>index b8cec0e..55b4a4b 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -666,6 +666,15 @@</span><br><span>        return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Check if given CCCH frame number is for a PCH or for an AGCH (this function is</span><br><span style="color: hsl(120, 100%, 40%);">+ * only used internally, it is public to call it from unit-tests) */</span><br><span style="color: hsl(120, 100%, 40%);">+int is_ccch_for_agch(struct gsm_bts_trx *trx, uint32_t fn) {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Note: The number of available access grant channels is set by the</span><br><span style="color: hsl(120, 100%, 40%);">+   * parameter BS_AG_BLKS_RES via system information type 3. This SI is</span><br><span style="color: hsl(120, 100%, 40%);">+  * transfered to osmo-bts via RSL */</span><br><span style="color: hsl(120, 100%, 40%);">+        return L1SAP_FN2CCCHBLOCK(fn) < num_agch(trx, "PH-RTS-IND");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* PH-RTS-IND prim received from bts model */</span><br><span> static int l1sap_ph_rts_ind(struct gsm_bts_trx *trx,</span><br><span>        struct osmo_phsap_prim *l1sap, struct ph_data_param *rts_ind)</span><br><span>@@ -681,6 +690,7 @@</span><br><span>  struct osmo_phsap_prim pp;</span><br><span>   bool dtxd_facch = false;</span><br><span>     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       int is_ag_res;</span><br><span> </span><br><span>   chan_nr = rts_ind->chan_nr;</span><br><span>       link_id = rts_ind->link_id;</span><br><span>@@ -783,9 +793,8 @@</span><br><span>                 }</span><br><span>    } else if (L1SAP_IS_CHAN_AGCH_PCH(chan_nr)) {</span><br><span>                p = msgb_put(msg, GSM_MACBLOCK_LEN);</span><br><span style="color: hsl(0, 100%, 40%);">-            rc = bts_ccch_copy_msg(trx->bts, p, &g_time,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    (L1SAP_FN2CCCHBLOCK(fn) <</span><br><span style="color: hsl(0, 100%, 40%);">-                                     num_agch(trx, "PH-RTS-IND")));</span><br><span style="color: hsl(120, 100%, 40%);">+              is_ag_res = is_ccch_for_agch(trx, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = bts_ccch_copy_msg(trx->bts, p, &g_time, is_ag_res);</span><br><span>              if (rc <= 0)</span><br><span>                      memcpy(p, fill_frame, GSM_MACBLOCK_LEN);</span><br><span>     }</span><br><span>diff --git a/tests/paging/paging_test.c b/tests/paging/paging_test.c</span><br><span>index 0accd0f..1fc7d92 100644</span><br><span>--- a/tests/paging/paging_test.c</span><br><span>+++ b/tests/paging/paging_test.c</span><br><span>@@ -25,6 +25,7 @@</span><br><span> #include <osmo-bts/logging.h></span><br><span> #include <osmo-bts/paging.h></span><br><span> #include <osmo-bts/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/l1sap.h></span><br><span> </span><br><span> #include <unistd.h></span><br><span> </span><br><span>@@ -110,6 +111,59 @@</span><br><span>       ASSERT_TRUE(paging_queue_length(bts->paging_state) == 0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Set up a dummy trx with a valid setting for bs_ag_blks_res in SI3 */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct gsm_bts_trx *test_is_ccch_for_agch_setup(uint8_t bs_ag_blks_res)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     static struct gsm_bts_trx trx;</span><br><span style="color: hsl(120, 100%, 40%);">+        static struct gsm_bts bts;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm48_system_information_type_3 si3;</span><br><span style="color: hsl(120, 100%, 40%);">+   si3.control_channel_desc.bs_ag_blks_res = bs_ag_blks_res;</span><br><span style="color: hsl(120, 100%, 40%);">+     trx.bts = &bts;</span><br><span style="color: hsl(120, 100%, 40%);">+   bts.si_valid |= 0x8;</span><br><span style="color: hsl(120, 100%, 40%);">+  memcpy(&bts.si_buf[SYSINFO_TYPE_3][0], &si3, sizeof(si3));</span><br><span style="color: hsl(120, 100%, 40%);">+    return &trx;</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%);">+/* Walk through all possible settings for bs_ag_blks_res for two</span><br><span style="color: hsl(120, 100%, 40%);">+ * multiframe 51. The patterns shown in 3GPP TS 05.02 Clause 7</span><br><span style="color: hsl(120, 100%, 40%);">+ * Table 5 of 9 must occur. */</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_is_ccch_for_agch(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   int is_ag_res;</span><br><span style="color: hsl(120, 100%, 40%);">+        int fn;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t bs_ag_blks_res;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("Fn:   AGCH: (bs_ag_blks_res=[0:7]\n");</span><br><span style="color: hsl(120, 100%, 40%);">+      for (fn = 0; fn < 102; fn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Note: the formula that computes the CCCH block number for a</span><br><span style="color: hsl(120, 100%, 40%);">+                 * given frame number is optimized to work on block boarders,</span><br><span style="color: hsl(120, 100%, 40%);">+          * for frame numbers that do not fall at the beginning of the</span><br><span style="color: hsl(120, 100%, 40%);">+          * related block this formula would produce wrong results, so</span><br><span style="color: hsl(120, 100%, 40%);">+          * we only check with frame numbers that mark the beginning</span><br><span style="color: hsl(120, 100%, 40%);">+            * of a new block. See also L1SAP_FN2CCCHBLOCK() in l1sap.h */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if (fn % 10 != 2 && fn % 10 != 6)</span><br><span style="color: hsl(120, 100%, 40%);">+                     continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           printf("%03u: ", fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             if (fn % 50 == 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   printf(" . . . . . . . . (BCCH)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                        continue;</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%);">+           /* Try allo possible settings for bs_ag_blks_res */</span><br><span style="color: hsl(120, 100%, 40%);">+           for (bs_ag_blks_res = 0; bs_ag_blks_res <= 7; bs_ag_blks_res++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  trx = test_is_ccch_for_agch_setup(bs_ag_blks_res);</span><br><span style="color: hsl(120, 100%, 40%);">+                    is_ag_res = is_ccch_for_agch(trx, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf(" %u", is_ag_res);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("\n");</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> int main(int argc, char **argv)</span><br><span> {</span><br><span>       tall_bts_ctx = talloc_named_const(NULL, 1, "OsmoBTS context");</span><br><span>@@ -125,6 +179,7 @@</span><br><span> </span><br><span>   test_paging_smoke();</span><br><span>         test_paging_sleep();</span><br><span style="color: hsl(120, 100%, 40%);">+  test_is_ccch_for_agch();</span><br><span>     printf("Success\n");</span><br><span> </span><br><span>   return 0;</span><br><span>diff --git a/tests/paging/paging_test.ok b/tests/paging/paging_test.ok</span><br><span>index 57565e2..50006ec 100644</span><br><span>--- a/tests/paging/paging_test.ok</span><br><span>+++ b/tests/paging/paging_test.ok</span><br><span>@@ -1,3 +1,24 @@</span><br><span> Testing that paging messages expire.</span><br><span> Testing that paging messages expire with sleep.</span><br><span style="color: hsl(120, 100%, 40%);">+Fn:   AGCH: (bs_ag_blks_res=[0:7]</span><br><span style="color: hsl(120, 100%, 40%);">+002:  . . . . . . . . (BCCH)</span><br><span style="color: hsl(120, 100%, 40%);">+006:  0 1 1 1 1 1 1 1</span><br><span style="color: hsl(120, 100%, 40%);">+012:  0 0 1 1 1 1 1 1</span><br><span style="color: hsl(120, 100%, 40%);">+016:  0 0 0 1 1 1 1 1</span><br><span style="color: hsl(120, 100%, 40%);">+022:  0 0 0 0 1 1 1 1</span><br><span style="color: hsl(120, 100%, 40%);">+026:  0 0 0 0 0 1 1 1</span><br><span style="color: hsl(120, 100%, 40%);">+032:  0 0 0 0 0 0 1 1</span><br><span style="color: hsl(120, 100%, 40%);">+036:  0 0 0 0 0 0 0 1</span><br><span style="color: hsl(120, 100%, 40%);">+042:  0 0 0 0 0 0 0 0</span><br><span style="color: hsl(120, 100%, 40%);">+046:  0 0 0 0 0 0 0 0</span><br><span style="color: hsl(120, 100%, 40%);">+052:  . . . . . . . . (BCCH)</span><br><span style="color: hsl(120, 100%, 40%);">+056:  0 1 1 1 1 1 1 1</span><br><span style="color: hsl(120, 100%, 40%);">+062:  0 0 1 1 1 1 1 1</span><br><span style="color: hsl(120, 100%, 40%);">+066:  0 0 0 1 1 1 1 1</span><br><span style="color: hsl(120, 100%, 40%);">+072:  0 0 0 0 1 1 1 1</span><br><span style="color: hsl(120, 100%, 40%);">+076:  0 0 0 0 0 1 1 1</span><br><span style="color: hsl(120, 100%, 40%);">+082:  0 0 0 0 0 0 1 1</span><br><span style="color: hsl(120, 100%, 40%);">+086:  0 0 0 0 0 0 0 1</span><br><span style="color: hsl(120, 100%, 40%);">+092:  0 0 0 0 0 0 0 0</span><br><span style="color: hsl(120, 100%, 40%);">+096:  0 0 0 0 0 0 0 0</span><br><span> Success</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10724">change 10724</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/10724"/><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: Ib9652f4013a4da3766852f8f03ce9ec5590f6989 </div>
<div style="display:none"> Gerrit-Change-Number: 10724 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>