<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/20856">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">tbf: Make window() available to tbf base class<br><br>Return an interface to the window base class so that the tbf base class<br>can access the common window methods, such as set_ws(). It will be used<br>in next commit to get rid of duplicated function enable_egprs in both<br>dl_tbf and ul_tbf subclasses.<br><br>The user of the function can then decide to access more specific<br>functionaltiites of the window class by static casting it to the<br>specific direction (which is known by the caller since it operates on a<br>ul_tbf or a dl_tbf).<br><br>Change-Id: Ia2e1decf91be1184668e28297c2126affb9c7ae4<br>---<br>M src/encoding.cpp<br>M src/gprs_rlcmac_sched.cpp<br>M src/pcu_vty_functions.cpp<br>M src/pdch.cpp<br>M src/tbf.h<br>M src/tbf_dl.cpp<br>M src/tbf_dl.h<br>M src/tbf_ul.cpp<br>M src/tbf_ul.h<br>M tests/tbf/TbfTest.cpp<br>M tests/types/TypesTest.cpp<br>11 files changed, 38 insertions(+), 27 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/20856/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/encoding.cpp b/src/encoding.cpp</span><br><span>index d581fe9..ecfca51 100644</span><br><span>--- a/src/encoding.cpp</span><br><span>+++ b/src/encoding.cpp</span><br><span>@@ -886,9 +886,10 @@</span><br><span>   bitvec * dest, unsigned& wp,</span><br><span>     struct gprs_rlcmac_ul_tbf *tbf, bool is_final)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   gprs_rlc_ul_window *window = static_cast<gprs_rlc_ul_window *>(tbf->window());</span><br><span> </span><br><span>  bitvec_write_field(dest, &wp, mcs_chan_code(tbf->current_cs()), 2); // CHANNEL_CODING_COMMAND</span><br><span style="color: hsl(0, 100%, 40%);">-    write_packet_ack_nack_desc_gprs(dest, wp, tbf->window(), is_final);</span><br><span style="color: hsl(120, 100%, 40%);">+        write_packet_ack_nack_desc_gprs(dest, wp, window, is_final);</span><br><span> </span><br><span>     bitvec_write_field(dest, &wp, 1, 1); // 1: have CONTENTION_RESOLUTION_TLLI</span><br><span>       bitvec_write_field(dest, &wp, tbf->tlli(), 32); // CONTENTION_RESOLUTION_TLLI</span><br><span>@@ -1061,6 +1062,8 @@</span><br><span>         bitvec * dest, unsigned& wp,</span><br><span>     struct gprs_rlcmac_ul_tbf *tbf, bool is_final)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   gprs_rlc_ul_window *window = static_cast<gprs_rlc_ul_window *>(tbf->window());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    bitvec_write_field(dest, &wp, 0, 2); // fixed 00</span><br><span>         /* CHANNEL_CODING_COMMAND */</span><br><span>         bitvec_write_field(dest, &wp,</span><br><span>@@ -1080,7 +1083,7 @@</span><br><span> </span><br><span>        /* -2 for last bit 0 mandatory and REL5 not supported */</span><br><span>     unsigned bits_ack_nack = dest->data_len * 8 - wp - 2;</span><br><span style="color: hsl(0, 100%, 40%);">-        write_packet_ack_nack_desc_egprs(dest, wp, tbf->window(), is_final, bits_ack_nack);</span><br><span style="color: hsl(120, 100%, 40%);">+        write_packet_ack_nack_desc_egprs(dest, wp, window, is_final, bits_ack_nack);</span><br><span> </span><br><span>     bitvec_write_field(dest, &wp, 0, 1); // fixed 0</span><br><span>  bitvec_write_field(dest, &wp, 0, 1); // 0: don't have REL 5</span><br><span>diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp</span><br><span>index 3db3365..40b2f91 100644</span><br><span>--- a/src/gprs_rlcmac_sched.cpp</span><br><span>+++ b/src/gprs_rlcmac_sched.cpp</span><br><span>@@ -247,7 +247,7 @@</span><br><span> static inline enum tbf_dl_prio tbf_compute_priority(const struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_dl_tbf *tbf,</span><br><span>                                                     uint8_t ts, uint32_t fn, int age)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      const gprs_rlc_dl_window *w = tbf->window();</span><br><span style="color: hsl(120, 100%, 40%);">+       const gprs_rlc_dl_window *w = static_cast<gprs_rlc_dl_window *>(tbf->window());</span><br><span>     unsigned long msecs_t3190 = osmo_tdef_get(bts->T_defs_pcu, 3190, OSMO_TDEF_MS, -1);</span><br><span>       unsigned long dl_tbf_idle_msec = osmo_tdef_get(bts->T_defs_pcu, -2031, OSMO_TDEF_MS, -1);</span><br><span>         int age_thresh1 = msecs_to_frames(200);</span><br><span>diff --git a/src/pcu_vty_functions.cpp b/src/pcu_vty_functions.cpp</span><br><span>index 33a4637..28a1559 100644</span><br><span>--- a/src/pcu_vty_functions.cpp</span><br><span>+++ b/src/pcu_vty_functions.cpp</span><br><span>@@ -74,7 +74,7 @@</span><br><span>         vty_out(vty, " CS=%s", mcs_name(tbf->current_cs()));</span><br><span> </span><br><span>        if (ul_tbf) {</span><br><span style="color: hsl(0, 100%, 40%);">-           gprs_rlc_ul_window *win = ul_tbf->window();</span><br><span style="color: hsl(120, 100%, 40%);">+                gprs_rlc_ul_window *win = static_cast<gprs_rlc_ul_window *>(ul_tbf->window());</span><br><span>              vty_out(vty, " WS=%u V(Q)=%d V(R)=%d",</span><br><span>                     ul_tbf->window_size(), win->v_q(), win->v_r());</span><br><span>             vty_out(vty, "%s", VTY_NEWLINE);</span><br><span>@@ -86,7 +86,7 @@</span><br><span>               }</span><br><span>    }</span><br><span>    if (dl_tbf) {</span><br><span style="color: hsl(0, 100%, 40%);">-           gprs_rlc_dl_window *win = dl_tbf->window();</span><br><span style="color: hsl(120, 100%, 40%);">+                gprs_rlc_dl_window *win = static_cast<gprs_rlc_dl_window *>(dl_tbf->window());</span><br><span>              vty_out(vty, " WS=%u V(A)=%d V(S)=%d nBSN=%d%s",</span><br><span>                   dl_tbf->window_size(), win->v_a(), win->v_s(), win->resend_needed(),</span><br><span>                     win->window_stalled() ? " STALLED" : "");</span><br><span>diff --git a/src/pdch.cpp b/src/pdch.cpp</span><br><span>index 7986373..26604bc 100644</span><br><span>--- a/src/pdch.cpp</span><br><span>+++ b/src/pdch.cpp</span><br><span>@@ -436,7 +436,7 @@</span><br><span> </span><br><span>      num_blocks = Decoding::decode_gprs_acknack_bits(</span><br><span>             &ack_nack->Ack_Nack_Description, &bits,</span><br><span style="color: hsl(0, 100%, 40%);">-              &bsn_begin, &bsn_end, tbf->window());</span><br><span style="color: hsl(120, 100%, 40%);">+              &bsn_begin, &bsn_end, static_cast<gprs_rlc_dl_window *>(tbf->window()));</span><br><span> </span><br><span>        LOGP(DRLCMAC, LOGL_DEBUG,</span><br><span>            "Got GPRS DL ACK bitmap: SSN: %d, BSN %d to %d - 1 (%d blocks), "</span><br><span>@@ -467,6 +467,7 @@</span><br><span> {</span><br><span>       int8_t tfi = 0; /* must be signed */</span><br><span>         struct gprs_rlcmac_dl_tbf *tbf;</span><br><span style="color: hsl(120, 100%, 40%);">+       gprs_rlc_dl_window *window;</span><br><span>  int rc;</span><br><span>      int num_blocks;</span><br><span>      uint8_t bits_data[RLC_EGPRS_MAX_WS/8];</span><br><span>@@ -497,6 +498,7 @@</span><br><span>         LOGPTBF(tbf, LOGL_DEBUG,</span><br><span>             "RX: [PCU <- BTS] EGPRS Packet Downlink Ack/Nack\n");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        window = static_cast<gprs_rlc_dl_window *>(tbf->window());</span><br><span>  LOGP(DRLCMAC, LOGL_DEBUG, "EGPRS ACK/NACK: "</span><br><span>               "ut: %d, final: %d, bow: %d, eow: %d, ssn: %d, have_crbb: %d, "</span><br><span>            "urbb_len:%d, %p, %p, %d, %d, win: %d-%d, urbb: %s\n",</span><br><span>@@ -511,8 +513,8 @@</span><br><span>               (void *)&ack_nack->EGPRS_AckNack.Desc,</span><br><span>                (int)offsetof(EGPRS_AckNack_t, Desc),</span><br><span>                (int)offsetof(EGPRS_AckNack_w_len_t, Desc),</span><br><span style="color: hsl(0, 100%, 40%);">-             tbf->window()->v_a(),</span><br><span style="color: hsl(0, 100%, 40%);">-             tbf->window()->v_s(),</span><br><span style="color: hsl(120, 100%, 40%);">+           window->v_a(),</span><br><span style="color: hsl(120, 100%, 40%);">+             window->v_s(),</span><br><span>            osmo_hexdump((const uint8_t *)&ack_nack->EGPRS_AckNack.Desc.URBB,</span><br><span>                     sizeof(ack_nack->EGPRS_AckNack.Desc.URBB)));</span><br><span> </span><br><span>@@ -522,7 +524,7 @@</span><br><span> </span><br><span>        num_blocks = Decoding::decode_egprs_acknack_bits(</span><br><span>            &ack_nack->EGPRS_AckNack.Desc, &bits,</span><br><span style="color: hsl(0, 100%, 40%);">-                &bsn_begin, &bsn_end, tbf->window());</span><br><span style="color: hsl(120, 100%, 40%);">+              &bsn_begin, &bsn_end, window);</span><br><span> </span><br><span>   LOGP(DRLCMAC, LOGL_DEBUG,</span><br><span>            "Got EGPRS DL ACK bitmap: SSN: %d, BSN %d to %d - 1 (%d blocks), "</span><br><span>diff --git a/src/tbf.h b/src/tbf.h</span><br><span>index 936ff65..bf51a8d 100644</span><br><span>--- a/src/tbf.h</span><br><span>+++ b/src/tbf.h</span><br><span>@@ -185,6 +185,8 @@</span><br><span>  static void free_all(struct gprs_rlcmac_trx *trx);</span><br><span>   static void free_all(struct gprs_rlcmac_pdch *pdch);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      virtual gprs_rlc_window *window() = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     bool state_is(enum gprs_rlcmac_tbf_state rhs) const;</span><br><span>         bool state_is_not(enum gprs_rlcmac_tbf_state rhs) const;</span><br><span>     bool dl_ass_state_is(enum gprs_rlcmac_tbf_dl_ass_state rhs) const;</span><br><span>diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp</span><br><span>index fc03c0b..cbefb1b 100644</span><br><span>--- a/src/tbf_dl.cpp</span><br><span>+++ b/src/tbf_dl.cpp</span><br><span>@@ -1000,7 +1000,7 @@</span><br><span>      return lost * 100 / (lost + received);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-gprs_rlc_dl_window *gprs_rlcmac_dl_tbf::window()</span><br><span style="color: hsl(120, 100%, 40%);">+gprs_rlc_window *gprs_rlcmac_dl_tbf::window()</span><br><span> {</span><br><span>  return &m_window;</span><br><span> }</span><br><span>diff --git a/src/tbf_dl.h b/src/tbf_dl.h</span><br><span>index bac524a..51e170a 100644</span><br><span>--- a/src/tbf_dl.h</span><br><span>+++ b/src/tbf_dl.h</span><br><span>@@ -40,7 +40,7 @@</span><br><span> </span><br><span> struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf {</span><br><span>      gprs_rlcmac_dl_tbf(BTS *bts);</span><br><span style="color: hsl(0, 100%, 40%);">-   gprs_rlc_dl_window *window();</span><br><span style="color: hsl(120, 100%, 40%);">+ gprs_rlc_window *window();</span><br><span>   void cleanup();</span><br><span>      void enable_egprs();</span><br><span>         /* dispatch Unitdata.DL messages */</span><br><span>diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp</span><br><span>index 39e4e95..c347885 100644</span><br><span>--- a/src/tbf_ul.cpp</span><br><span>+++ b/src/tbf_ul.cpp</span><br><span>@@ -615,7 +615,7 @@</span><br><span>       m_window.set_ws(ws);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-gprs_rlc_ul_window *gprs_rlcmac_ul_tbf::window()</span><br><span style="color: hsl(120, 100%, 40%);">+gprs_rlc_window *gprs_rlcmac_ul_tbf::window()</span><br><span> {</span><br><span>    return &m_window;</span><br><span> }</span><br><span>diff --git a/src/tbf_ul.h b/src/tbf_ul.h</span><br><span>index c6df0cd..cbaffa5 100644</span><br><span>--- a/src/tbf_ul.h</span><br><span>+++ b/src/tbf_ul.h</span><br><span>@@ -51,7 +51,7 @@</span><br><span> </span><br><span> struct gprs_rlcmac_ul_tbf : public gprs_rlcmac_tbf {</span><br><span>      gprs_rlcmac_ul_tbf(BTS *bts);</span><br><span style="color: hsl(0, 100%, 40%);">-   gprs_rlc_ul_window *window();</span><br><span style="color: hsl(120, 100%, 40%);">+ gprs_rlc_window *window();</span><br><span>   struct msgb *create_ul_ack(uint32_t fn, uint8_t ts);</span><br><span>         bool ctrl_ack_to_toggle();</span><br><span>   bool handle_ctrl_ack();</span><br><span>diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp</span><br><span>index 15a79d0..2b5bda5 100644</span><br><span>--- a/tests/tbf/TbfTest.cpp</span><br><span>+++ b/tests/tbf/TbfTest.cpp</span><br><span>@@ -322,10 +322,11 @@</span><br><span> }</span><br><span> </span><br><span> /* Receive an ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-#define RCV_ACK(fin, tbf, rbb) do {                                    \</span><br><span style="color: hsl(0, 100%, 40%);">-               tbf->rcvd_dl_ack(fin, tbf->window()->v_s(), rbb);      \</span><br><span style="color: hsl(120, 100%, 40%);">+#define RCV_ACK(fin, tbf, rbb) do { \</span><br><span style="color: hsl(120, 100%, 40%);">+              gprs_rlc_dl_window *w = static_cast<gprs_rlc_dl_window *>(tbf->window());      \</span><br><span style="color: hsl(120, 100%, 40%);">+             tbf->rcvd_dl_ack(fin, w->v_s(), rbb);     \</span><br><span>            if (!fin)                                               \</span><br><span style="color: hsl(0, 100%, 40%);">-                       OSMO_ASSERT(tbf->window()->window_empty());       \</span><br><span style="color: hsl(120, 100%, 40%);">+                     OSMO_ASSERT(w->window_empty());      \</span><br><span>    } while(0)</span><br><span> </span><br><span> static void test_tbf_delayed_release()</span><br><span>@@ -1748,7 +1749,7 @@</span><br><span>     print_ta_tlli(ul_tbf, true);</span><br><span>         send_dl_data(&the_bts, tlli, imsi, test_data, sizeof(test_data));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       ul_tbf->window()->reset_state();</span><br><span style="color: hsl(120, 100%, 40%);">+        static_cast<gprs_rlc_ul_window *>(ul_tbf->window())->reset_state();</span><br><span>      /* Function to generate URBB with length */</span><br><span>  ul_tbf = establish_ul_tbf_two_phase_puan_URBB_with_length(&the_bts, ts_no, tlli, &fn,</span><br><span>                qta, ms_class, egprs_ms_class, ul_tbf);</span><br><span>@@ -1756,7 +1757,7 @@</span><br><span>      print_ta_tlli(ul_tbf, true);</span><br><span>         send_dl_data(&the_bts, tlli, imsi, test_data, sizeof(test_data));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       ul_tbf->window()->reset_state();</span><br><span style="color: hsl(120, 100%, 40%);">+        static_cast<gprs_rlc_ul_window *>(ul_tbf->window())->reset_state();</span><br><span>      /* Function to generate CRBB */</span><br><span>      bts->ws_base = 128;</span><br><span>       bts->ws_pdch = 64;</span><br><span>@@ -2529,7 +2530,7 @@</span><br><span> </span><br><span>    dl_tbf = create_dl_tbf(&the_bts, ms_class, egprs_ms_class, &trx_no);</span><br><span>         dl_tbf->update_ms(tlli, GPRS_RLCMAC_DL_TBF);</span><br><span style="color: hsl(0, 100%, 40%);">- prlcdlwindow = dl_tbf->window();</span><br><span style="color: hsl(120, 100%, 40%);">+   prlcdlwindow = static_cast<gprs_rlc_dl_window *>(dl_tbf->window());</span><br><span>         prlcmvb = &prlcdlwindow->m_v_b;</span><br><span>       prlcdlwindow->m_v_s = 1288;</span><br><span>       prlcdlwindow->m_v_a = 1176;</span><br><span>@@ -2562,7 +2563,7 @@</span><br><span> </span><br><span>   Decoding::decode_egprs_acknack_bits(</span><br><span>                 &ack_nack->EGPRS_AckNack.Desc, &bits,</span><br><span style="color: hsl(0, 100%, 40%);">-                &bsn_begin, &bsn_end, dl_tbf->window());</span><br><span style="color: hsl(120, 100%, 40%);">+           &bsn_begin, &bsn_end, prlcdlwindow);</span><br><span> </span><br><span>     dl_tbf->rcvd_dl_ack(</span><br><span>              ack_nack->EGPRS_AckNack.Desc.FINAL_ACK_INDICATION,</span><br><span>@@ -2747,17 +2748,20 @@</span><br><span> }</span><br><span> </span><br><span> #define NACK(tbf, x) do {                                   \</span><br><span style="color: hsl(0, 100%, 40%);">-               tbf->window()->m_v_b.mark_nacked(x);              \</span><br><span style="color: hsl(0, 100%, 40%);">-               OSMO_ASSERT(tbf->window()->m_v_b.is_nacked(x));   \</span><br><span style="color: hsl(120, 100%, 40%);">+             gprs_rlc_dl_window *w = static_cast<gprs_rlc_dl_window *>(tbf->window());      \</span><br><span style="color: hsl(120, 100%, 40%);">+             w->m_v_b.mark_nacked(x);             \</span><br><span style="color: hsl(120, 100%, 40%);">+             OSMO_ASSERT(w->m_v_b.is_nacked(x));  \</span><br><span>    } while(0)</span><br><span> </span><br><span> #define CHECK_UNACKED(tbf, cs, bsn) do {                                           \</span><br><span style="color: hsl(0, 100%, 40%);">-          OSMO_ASSERT(tbf->window()->m_v_b.is_unacked(bsn));                     \</span><br><span style="color: hsl(120, 100%, 40%);">+                gprs_rlc_dl_window *w = static_cast<gprs_rlc_dl_window *>(tbf->window());      \</span><br><span style="color: hsl(120, 100%, 40%);">+             OSMO_ASSERT(w->m_v_b.is_unacked(bsn));                    \</span><br><span>               OSMO_ASSERT(mcs_chan_code(tbf->m_rlc.block(bsn)->cs_current_trans) == cs - 1); \</span><br><span>       } while(0)</span><br><span> </span><br><span> #define CHECK_NACKED(tbf, cs, bsn) do {                                                    \</span><br><span style="color: hsl(0, 100%, 40%);">-          OSMO_ASSERT(tbf->window()->m_v_b.is_nacked(bsn));              \</span><br><span style="color: hsl(120, 100%, 40%);">+                gprs_rlc_dl_window *w = static_cast<gprs_rlc_dl_window *>(tbf->window());      \</span><br><span style="color: hsl(120, 100%, 40%);">+             OSMO_ASSERT(w->m_v_b.is_nacked(bsn));                     \</span><br><span>               OSMO_ASSERT(mcs_chan_code(tbf->m_rlc.block(bsn)->cs_current_trans) == cs - 1); \</span><br><span>       } while(0)</span><br><span> </span><br><span>diff --git a/tests/types/TypesTest.cpp b/tests/types/TypesTest.cpp</span><br><span>index 353d821..1c846e1 100644</span><br><span>--- a/tests/types/TypesTest.cpp</span><br><span>+++ b/tests/types/TypesTest.cpp</span><br><span>@@ -559,7 +559,7 @@</span><br><span> </span><br><span>    *ssn = bitvec_get_uint(dest, 11);</span><br><span>    if (bow) {</span><br><span style="color: hsl(0, 100%, 40%);">-              OSMO_ASSERT(*ssn == tbf->window()->v_q() + 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          OSMO_ASSERT(*ssn == static_cast<gprs_rlc_ul_window *>(tbf->window())->v_q() + 1);</span><br><span>        }</span><br><span> </span><br><span>        crbb_test->has_crbb = bitvec_get_uint(dest, 1);</span><br><span>@@ -596,7 +596,7 @@</span><br><span> </span><br><span> static void check_egprs_bitmap(struct gprs_rlcmac_ul_tbf *tbf, uint16_t ssn, struct crbb_test *crbb_test, bitvec *urbb, unsigned int *rbb_size)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    gprs_rlc_ul_window *win = tbf->window();</span><br><span style="color: hsl(120, 100%, 40%);">+   gprs_rlc_ul_window *win = static_cast<gprs_rlc_ul_window *>(tbf->window());</span><br><span>         uint8_t rbb_should[RLC_EGPRS_MAX_WS] = {0};</span><br><span>  bitvec rbb_should_bv;</span><br><span>        rbb_should_bv.data = rbb_should;</span><br><span>@@ -680,7 +680,7 @@</span><br><span>       bitvec *rbb = NULL;</span><br><span>  unsigned int rbb_size;</span><br><span>       uint16_t ssn = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-       gprs_rlc_ul_window *win = tbf->window();</span><br><span style="color: hsl(120, 100%, 40%);">+   gprs_rlc_ul_window *win = static_cast<gprs_rlc_ul_window *>(tbf->window());</span><br><span> </span><br><span>     fprintf(stderr, "************** Test with empty window\n");</span><br><span>        win->reset_state();</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/20856">change 20856</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/+/20856"/><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: Ia2e1decf91be1184668e28297c2126affb9c7ae4 </div>
<div style="display:none"> Gerrit-Change-Number: 20856 </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>