<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-pcu/+/25047">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  pespin: Looks good to me, approved
  osmith: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Move RELEASING tbf_state transition to tbf_fsm<br><br>PdchUlcTest output changes because the original state NULL is not<br>expected when transactioning to RELEASING upon MAX N310* being hit. In<br>any case, none of those events should happen in NULL state, but we<br>don't really care about TBF states there so we are fine with whatever<br>the state is.<br><br>Related: OS#2709<br>Change-Id: I516b8d989a0d705e5664f8aeaf7d108e0105aa16<br>---<br>M src/tbf.cpp<br>M src/tbf.h<br>M src/tbf_dl.cpp<br>M src/tbf_fsm.c<br>M src/tbf_fsm.h<br>M src/tbf_ul.cpp<br>M tests/tbf/TbfTest.err<br>M tests/ulc/PdchUlcTest.err<br>8 files changed, 61 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/tbf.cpp b/src/tbf.cpp</span><br><span>index 7b5fce2..c68d505 100644</span><br><span>--- a/src/tbf.cpp</span><br><span>+++ b/src/tbf.cpp</span><br><span>@@ -640,7 +640,7 @@</span><br><span>                 if (state_is(TBF_ST_FINISHED)) {</span><br><span>                     if (ul_tbf->n_inc(N3103)) {</span><br><span>                               bts_do_rate_ctr_inc(bts, CTR_PUAN_POLL_FAILED);</span><br><span style="color: hsl(0, 100%, 40%);">-                         TBF_SET_STATE(ul_tbf, TBF_ST_RELEASING);</span><br><span style="color: hsl(120, 100%, 40%);">+                              osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_MAX_N3103, NULL);</span><br><span>                               T_START(ul_tbf, T3169, 3169, "MAX N3103 reached", false);</span><br><span>                          return;</span><br><span>                      }</span><br><span>@@ -659,7 +659,7 @@</span><br><span>              bts_do_rate_ctr_inc(bts, CTR_RLC_ASS_TIMEDOUT);</span><br><span>              bts_do_rate_ctr_inc(bts, CTR_PUA_POLL_TIMEDOUT);</span><br><span>             if (n_inc(N3105)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     TBF_SET_STATE(this, TBF_ST_RELEASING);</span><br><span style="color: hsl(120, 100%, 40%);">+                        osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_MAX_N3105, NULL);</span><br><span>                       T_START(this, T3195, 3195, "MAX N3105 reached", true);</span><br><span>                     bts_do_rate_ctr_inc(bts, CTR_RLC_ASS_FAILED);</span><br><span>                        bts_do_rate_ctr_inc(bts, CTR_PUA_POLL_FAILED);</span><br><span>@@ -678,7 +678,7 @@</span><br><span>                 bts_do_rate_ctr_inc(bts, CTR_RLC_ASS_TIMEDOUT);</span><br><span>              bts_do_rate_ctr_inc(bts, CTR_PDA_POLL_TIMEDOUT);</span><br><span>             if (n_inc(N3105)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     TBF_SET_STATE(this, TBF_ST_RELEASING);</span><br><span style="color: hsl(120, 100%, 40%);">+                        osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_MAX_N3105, NULL);</span><br><span>                       T_START(this, T3195, 3195, "MAX N3105 reached", true);</span><br><span>                     bts_do_rate_ctr_inc(bts, CTR_RLC_ASS_FAILED);</span><br><span>                        bts_do_rate_ctr_inc(bts, CTR_PDA_POLL_FAILED);</span><br><span>@@ -709,7 +709,7 @@</span><br><span>                 }</span><br><span> </span><br><span>                if (dl_tbf->n_inc(N3105)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  TBF_SET_STATE(dl_tbf, TBF_ST_RELEASING);</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_MAX_N3105, NULL);</span><br><span>                       T_START(dl_tbf, T3195, 3195, "MAX N3105 reached", true);</span><br><span>                   bts_do_rate_ctr_inc(bts, CTR_PDAN_POLL_FAILED);</span><br><span>                      bts_do_rate_ctr_inc(bts, CTR_RLC_ACK_FAILED);</span><br><span>diff --git a/src/tbf.h b/src/tbf.h</span><br><span>index adc648c..ded3a3c 100644</span><br><span>--- a/src/tbf.h</span><br><span>+++ b/src/tbf.h</span><br><span>@@ -158,7 +158,6 @@</span><br><span> </span><br><span> #define T_START(tbf, t, T, r, f) tbf->t_start(t, T, r, f, __FILE__, __LINE__)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define TBF_SET_STATE(t, st) do { tbf_fsm_state_chg(t->state_fsm.fi, st); } while(0)</span><br><span> #define TBF_SET_ASS_STATE_DL(t, st) do { t->set_ass_state_dl(st, __FILE__, __LINE__); } while(0)</span><br><span> #define TBF_SET_ASS_STATE_UL(t, st) do { t->set_ass_state_ul(st, __FILE__, __LINE__); } while(0)</span><br><span> #define TBF_SET_ACK_STATE(t, st) do { t->set_ack_state(st, __FILE__, __LINE__); } while(0)</span><br><span>diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp</span><br><span>index 6614366..f264cfc 100644</span><br><span>--- a/src/tbf_dl.cpp</span><br><span>+++ b/src/tbf_dl.cpp</span><br><span>@@ -1271,7 +1271,8 @@</span><br><span>           * (partly) encoded in chunk 1 of block V(A). (optional) */</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   TBF_SET_STATE(this, TBF_ST_RELEASING);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* This state change looks unneeded and can probably be dropped at some point: */</span><br><span style="color: hsl(120, 100%, 40%);">+     tbf_fsm_state_chg(this->state_fsm.fi, TBF_ST_RELEASING);</span><br><span> </span><br><span>      /* reset rlc states */</span><br><span>       m_window.reset();</span><br><span>diff --git a/src/tbf_fsm.c b/src/tbf_fsm.c</span><br><span>index d1b48d5..1ba1d61 100644</span><br><span>--- a/src/tbf_fsm.c</span><br><span>+++ b/src/tbf_fsm.c</span><br><span>@@ -49,6 +49,9 @@</span><br><span>       { TBF_EV_LAST_DL_DATA_SENT, "LAST_DL_DATA_SENT" },</span><br><span>         { TBF_EV_LAST_UL_DATA_RECVD, "LAST_UL_DATA_RECVD" },</span><br><span>       { TBF_EV_FINAL_ACK_RECVD, "FINAL_ACK_RECVD" },</span><br><span style="color: hsl(120, 100%, 40%);">+      { TBF_EV_MAX_N3101 , "MAX_N3101" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { TBF_EV_MAX_N3103 , "MAX_N3103" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { TBF_EV_MAX_N3105 , "MAX_N3105" },</span><br><span>        { 0, NULL }</span><br><span> };</span><br><span> </span><br><span>@@ -154,6 +157,10 @@</span><br><span>                    case we receive more DL data to tx */</span><br><span>             tbf_fsm_state_chg(fi, TBF_ST_WAIT_RELEASE);</span><br><span>          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TBF_EV_MAX_N3101:</span><br><span style="color: hsl(120, 100%, 40%);">+        case TBF_EV_MAX_N3105:</span><br><span style="color: hsl(120, 100%, 40%);">+                tbf_fsm_state_chg(fi, TBF_ST_RELEASING);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span>       default:</span><br><span>             OSMO_ASSERT(0);</span><br><span>      }</span><br><span>@@ -169,6 +176,27 @@</span><br><span>                case we receive more DL data to tx */</span><br><span>             tbf_fsm_state_chg(fi, TBF_ST_WAIT_RELEASE);</span><br><span>          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TBF_EV_MAX_N3103:</span><br><span style="color: hsl(120, 100%, 40%);">+                tbf_fsm_state_chg(fi, TBF_ST_RELEASING);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TBF_EV_MAX_N3105:</span><br><span style="color: hsl(120, 100%, 40%);">+                tbf_fsm_state_chg(fi, TBF_ST_RELEASING);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(0);</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 style="color: hsl(120, 100%, 40%);">+static void st_wait_release(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case TBF_EV_FINAL_ACK_RECVD:</span><br><span style="color: hsl(120, 100%, 40%);">+          /* ignore, duplicate ACK, we already know about since we are in WAIT_RELEASE */</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TBF_EV_MAX_N3101:</span><br><span style="color: hsl(120, 100%, 40%);">+        case TBF_EV_MAX_N3105:</span><br><span style="color: hsl(120, 100%, 40%);">+                tbf_fsm_state_chg(fi, TBF_ST_RELEASING);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span>       default:</span><br><span>             OSMO_ASSERT(0);</span><br><span>      }</span><br><span>@@ -219,7 +247,9 @@</span><br><span>              .in_event_mask =</span><br><span>                     X(TBF_EV_LAST_DL_DATA_SENT) |</span><br><span>                        X(TBF_EV_LAST_UL_DATA_RECVD) |</span><br><span style="color: hsl(0, 100%, 40%);">-                  X(TBF_EV_FINAL_ACK_RECVD),</span><br><span style="color: hsl(120, 100%, 40%);">+                    X(TBF_EV_FINAL_ACK_RECVD) |</span><br><span style="color: hsl(120, 100%, 40%);">+                   X(TBF_EV_MAX_N3101) |</span><br><span style="color: hsl(120, 100%, 40%);">+                 X(TBF_EV_MAX_N3105),</span><br><span>                 .out_state_mask =</span><br><span>                    X(TBF_ST_FINISHED) |</span><br><span>                         X(TBF_ST_WAIT_RELEASE) |</span><br><span>@@ -229,18 +259,24 @@</span><br><span>     },</span><br><span>   [TBF_ST_FINISHED] = {</span><br><span>                .in_event_mask =</span><br><span style="color: hsl(0, 100%, 40%);">-                        X(TBF_EV_FINAL_ACK_RECVD),</span><br><span style="color: hsl(120, 100%, 40%);">+                    X(TBF_EV_FINAL_ACK_RECVD) |</span><br><span style="color: hsl(120, 100%, 40%);">+                   X(TBF_EV_MAX_N3103) |</span><br><span style="color: hsl(120, 100%, 40%);">+                 X(TBF_EV_MAX_N3105),</span><br><span>                 .out_state_mask =</span><br><span style="color: hsl(0, 100%, 40%);">-                       X(TBF_ST_WAIT_RELEASE),</span><br><span style="color: hsl(120, 100%, 40%);">+                       X(TBF_ST_WAIT_RELEASE) |</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(TBF_ST_RELEASING),</span><br><span>                 .name = "FINISHED",</span><br><span>                .action = st_finished,</span><br><span>       },</span><br><span>   [TBF_ST_WAIT_RELEASE] = {</span><br><span>            .in_event_mask =</span><br><span style="color: hsl(0, 100%, 40%);">-                        0,</span><br><span style="color: hsl(120, 100%, 40%);">+                    X(TBF_EV_FINAL_ACK_RECVD) |</span><br><span style="color: hsl(120, 100%, 40%);">+                   X(TBF_EV_MAX_N3101) |</span><br><span style="color: hsl(120, 100%, 40%);">+                 X(TBF_EV_MAX_N3105),</span><br><span>                 .out_state_mask =</span><br><span>                    X(TBF_ST_RELEASING),</span><br><span>                 .name = "WAIT_RELEASE",</span><br><span style="color: hsl(120, 100%, 40%);">+             .action = st_wait_release,</span><br><span>   },</span><br><span>   [TBF_ST_RELEASING] = {</span><br><span>               .in_event_mask =</span><br><span>diff --git a/src/tbf_fsm.h b/src/tbf_fsm.h</span><br><span>index 1dba80f..ae0d6ae 100644</span><br><span>--- a/src/tbf_fsm.h</span><br><span>+++ b/src/tbf_fsm.h</span><br><span>@@ -35,6 +35,9 @@</span><br><span>        TBF_EV_LAST_DL_DATA_SENT, /* DL TBF sends RLCMAC block containing last DL avilable data buffered */</span><br><span>  TBF_EV_LAST_UL_DATA_RECVD, /* UL TBF sends RLCMAC block containing last UL data (cv=0) */</span><br><span>    TBF_EV_FINAL_ACK_RECVD, /* DL ACK/NACK with FINAL_ACK=1 received from MS */</span><br><span style="color: hsl(120, 100%, 40%);">+   TBF_EV_MAX_N3101, /* MAX N3101 (max usf timeout) reached (UL TBF) */</span><br><span style="color: hsl(120, 100%, 40%);">+  TBF_EV_MAX_N3103, /* MAX N3103 (max Pkt Ctrl Ack for last UL ACK/NACK timeout) reached (UL TBF) */</span><br><span style="color: hsl(120, 100%, 40%);">+    TBF_EV_MAX_N3105, /* MAX N3105 (max poll timeout) reached (UL/DL TBF) */</span><br><span> };</span><br><span> </span><br><span> enum tbf_fsm_states {</span><br><span>diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp</span><br><span>index 3eec555..a7a7c3e 100644</span><br><span>--- a/src/tbf_ul.cpp</span><br><span>+++ b/src/tbf_ul.cpp</span><br><span>@@ -817,7 +817,7 @@</span><br><span> void gprs_rlcmac_ul_tbf::usf_timeout()</span><br><span> {</span><br><span>        if (n_inc(N3101)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             TBF_SET_STATE(this, TBF_ST_RELEASING);</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_fsm_inst_dispatch(this->state_fsm.fi, TBF_EV_MAX_N3101, NULL);</span><br><span>               T_START(this, T3169, 3169, "MAX N3101 reached", false);</span><br><span>            return;</span><br><span>      }</span><br><span>diff --git a/tests/tbf/TbfTest.err b/tests/tbf/TbfTest.err</span><br><span>index c6cea78..62a3a51 100644</span><br><span>--- a/tests/tbf/TbfTest.err</span><br><span>+++ b/tests/tbf/TbfTest.err</span><br><span>@@ -3083,6 +3083,7 @@</span><br><span> PDCH(bts=0,trx=0,ts=7) Expiring FN=2654379 but previous FN=2654318 is still reserved!</span><br><span> PDCH(bts=0,trx=0,ts=7) Timeout for registered USF (FN=2654318): TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW)</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=FLOW) N3101 exceeded MAX (10)</span><br><span style="color: hsl(120, 100%, 40%);">+TBF(UL-TFI_0){FLOW}: Received Event MAX_N3101</span><br><span> TBF(UL-TFI_0){FLOW}: state_chg to RELEASING</span><br><span> TBF(TFI=0 TLLI=0xf1223344 DIR=UL STATE=RELEASING) starting timer T3169 [MAX N3101 reached] with 5 sec. 0 microsec, cur_fn=2654379</span><br><span> PDCH(bts=0,trx=0,ts=7) Expiring FN=2654379 but previous FN=2654322 is still reserved!</span><br><span>diff --git a/tests/ulc/PdchUlcTest.err b/tests/ulc/PdchUlcTest.err</span><br><span>index edc7a11..e72d59f 100644</span><br><span>--- a/tests/ulc/PdchUlcTest.err</span><br><span>+++ b/tests/ulc/PdchUlcTest.err</span><br><span>@@ -22,25 +22,25 @@</span><br><span> PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715639 is still reserved!</span><br><span> PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715639): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)</span><br><span> PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=2715643 is still reserved!</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715643): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=2715643): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)</span><br><span> PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=4 is still reserved!</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=4): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=4): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)</span><br><span> PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=8 is still reserved!</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=8): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=8): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)</span><br><span> PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=13 is still reserved!</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=13): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)</span><br><span> PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=17 is still reserved!</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=17): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=17): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)</span><br><span> PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=21 is still reserved!</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=21): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=21): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)</span><br><span> PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=26 is still reserved!</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=26): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=26): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)</span><br><span> PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=30 is still reserved!</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=30): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=30): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)</span><br><span> PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=34 is still reserved!</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=34): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=34): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)</span><br><span> PDCH(bts=0,trx=0,ts=0) Expiring FN=43 but previous FN=39 is still reserved!</span><br><span style="color: hsl(0, 100%, 40%);">-PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=39): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=RELEASING)</span><br><span style="color: hsl(120, 100%, 40%);">+PDCH(bts=0,trx=0,ts=0) Timeout for registered POLL (FN=39): TBF(TFI=0 TLLI=0x12345678 DIR=DL STATE=NULL)</span><br><span> PDCH(bts=0,trx=0,ts=0) POLL scheduled at FN 26 + 13 = 39</span><br><span> PDCH(bts=0,trx=0,ts=0) UL block already scheduled at FN 91 + 13 = 104</span><br><span> PDCH(bts=0,trx=0,ts=0) POLL scheduled at FN 91 + 17 = 108</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-pcu/+/25047">change 25047</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/+/25047"/><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: I516b8d989a0d705e5664f8aeaf7d108e0105aa16 </div>
<div style="display:none"> Gerrit-Change-Number: 25047 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>