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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">lchan_rtp_fsm: Deferr IPACC MDCX after BTS side MGCP MDCX<br><br>This is needed to be able to force MGW to provide an IPv4 address during<br>MDCX, since IPACC protocol on the BTS side only supports IPv4, but one<br>may need IPv6 side at the same time on the core side.<br>By moving the IPACC MDCX request to a later step, the BSC gains<br>knowledge of the local address on each side (BTS, MGW), and if they<br>don't match (ie. BTS uses IPv4 and MGW uses IPv6), it can then get MGW<br>to offer an IPv4 address during MGCP MDCX containing the BTS IPv4<br>address. At that point, the MGW can see the mismatch and provide an IPv4<br>address in the MGCP MDCX ACK, which can then finally be communicated to<br>the BTS during IPACC MDCX phase.<br><br>Previous order:<br>BSC -> MGW: CRCX<br>BSC <- MGW: CRCX ACK               (get MGW local IP addr)<br>BSC -> BTS: IPACC CRCX<br>BSC <- BTS: IPACC CRCX ACK       (get BTS local IP addr)<br>BSC -> BTS: IPACC MDCX              (set MGW IP addr)<br>BSC <- BTS: IPACC MDCX ACK<br>BSC -> MGW: MDCX           (set BTS IP addr)<br>BSC <- MGW: MDCX ACK<br><br>New order:<br>BSC -> MGW: CRCX<br>BSC <- MGW: CRCX ACK          (get MGCP local IPv6 addr)<br>BSC -> BTS: IPACC CRCX<br>BSC <- BTS: IPACC CRCX ACK    (get BTS local IPv4 addr)<br>BSC -> MGW: MDCX          (set BTS IPv4 addr)<br>BSC <- MGW: MDCX ACK            (here MGW changes its local addr to IPv4)<br>BSC -> BTS: IPACC MDCX            (set MGW IPv4 addr)<br>BSC <- BTS: IPACC MDCX ACK<br><br>Change-Id: I4de5ea5c94c1482c9cb0b6386997a942edc60e32<br>---<br>M doc/lchan-rtp-fsm.dot<br>M doc/lchan.msc<br>M src/osmo-bsc/lchan_rtp_fsm.c<br>3 files changed, 36 insertions(+), 35 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/lchan-rtp-fsm.dot b/doc/lchan-rtp-fsm.dot</span><br><span>index d5df643..4c2dd31 100644</span><br><span>--- a/doc/lchan-rtp-fsm.dot</span><br><span>+++ b/doc/lchan-rtp-fsm.dot</span><br><span>@@ -1,7 +1,7 @@</span><br><span> digraph G {</span><br><span> rankdir=TB</span><br><span> labelloc=t; label="lchan RTP FSM"</span><br><span style="color: hsl(0, 100%, 40%);">-     </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   lchan [label="lchan\nFSM",shape=box3d]</span><br><span>     lchan2 [label="lchan\nFSM",shape=box3d]</span><br><span>    ho_as [label="Handover or Assignment FSM",shape=box3d]</span><br><span>@@ -23,14 +23,15 @@</span><br><span>       lchan -> WAIT_LCHAN_READY [label="LCHAN_RTP_EV_LCHAN_READY",style=dashed]</span><br><span>       WAIT_LCHAN_READY -> WAIT_IPACC_CRCX_ACK [label="IPACC BTS"]</span><br><span>     WAIT_LCHAN_READY -> WAIT_READY_TO_SWITCH_RTP</span><br><span style="color: hsl(0, 100%, 40%);">- WAIT_IPACC_CRCX_ACK -> WAIT_IPACC_MDCX_ACK</span><br><span style="color: hsl(0, 100%, 40%);">-   WAIT_IPACC_MDCX_ACK -> WAIT_READY_TO_SWITCH_RTP</span><br><span style="color: hsl(120, 100%, 40%);">+    WAIT_IPACC_CRCX_ACK -> WAIT_READY_TO_SWITCH_RTP</span><br><span>   invisible -> ho [label="HO DETECT",style=dashed]</span><br><span>        ho -> WAIT_READY_TO_SWITCH_RTP [label="LCHAN_RTP_EV_READY_TO_SWITCH",style=dashed]</span><br><span>      WAIT_READY_TO_SWITCH_RTP -> WAIT_MGW_ENDPOINT_CONFIGURED</span><br><span>  WAIT_MGW_ENDPOINT_CONFIGURED -> mgwep [label="MDCX",style=dashed]</span><br><span>       mgwep -> WAIT_MGW_ENDPOINT_CONFIGURED [label="LCHAN_RTP_EV_\nMGW_ENDPOINT_\nCONFIGURED",style=dashed]</span><br><span style="color: hsl(120, 100%, 40%);">+    WAIT_MGW_ENDPOINT_CONFIGURED -> WAIT_IPACC_MDCX_ACK [label="IPACC BTS"]</span><br><span>         WAIT_MGW_ENDPOINT_CONFIGURED -> RTP_READY</span><br><span style="color: hsl(120, 100%, 40%);">+  WAIT_IPACC_MDCX_ACK -> RTP_READY</span><br><span>  RTP_READY -> lchan2 [label="LCHAN_EV_\nRTP_READY",style=dashed]</span><br><span>         RTP_READY -> RTP_ESTABLISHED</span><br><span>      lchan2 -> RTP_ESTABLISHED [label="LCHAN_RTP_EV_\nRELEASE",style=dashed]</span><br><span>diff --git a/doc/lchan.msc b/doc/lchan.msc</span><br><span>index b0e32d6..9962c77 100644</span><br><span>--- a/doc/lchan.msc</span><br><span>+++ b/doc/lchan.msc</span><br><span>@@ -68,10 +68,6 @@</span><br><span>   ms <= rtp [label="IPACC CRCX"];</span><br><span>         ...;</span><br><span>         ms => rtp [label="IPACC CRCX ACK (BTS RTP port info)"];</span><br><span style="color: hsl(0, 100%, 40%);">-    rtp abox rtp [label="LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK"];</span><br><span style="color: hsl(0, 100%, 40%);">-      ms <= rtp [label="IPACC MDCX (MGW RTP port info)"];</span><br><span style="color: hsl(0, 100%, 40%);">-        ...;</span><br><span style="color: hsl(0, 100%, 40%);">-    ms => rtp [label="IPACC MDCX ACK"];</span><br><span>     --- [label="END ip.access style BTS"];</span><br><span>     |||;</span><br><span>         rtp box rtp [label="lchan_rtp_fsm_switch_rtp()"];</span><br><span>@@ -91,6 +87,12 @@</span><br><span>     ...;</span><br><span>         mgwep rbox mgwep [label="MGCP: MDCX OK"];</span><br><span>  rtp <- mgwep [label="LCHAN_RTP_EV_MGW_ENDPOINT_CONFIGURED"];</span><br><span style="color: hsl(120, 100%, 40%);">+     --- [label="IF ip.access style BTS"];</span><br><span style="color: hsl(120, 100%, 40%);">+       rtp abox rtp [label="LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK"];</span><br><span style="color: hsl(120, 100%, 40%);">+    ms <= rtp [label="IPACC MDCX (MGW RTP port info)"];</span><br><span style="color: hsl(120, 100%, 40%);">+      ...;</span><br><span style="color: hsl(120, 100%, 40%);">+  ms => rtp [label="IPACC MDCX ACK"];</span><br><span style="color: hsl(120, 100%, 40%);">+      --- [label="END ip.access style BTS"];</span><br><span>     rtp abox rtp [label="LCHAN_RTP_ST_READY"];</span><br><span>         lchan <- rtp [label="LCHAN_EV_RTP_READY"];</span><br><span>      rtp note rtp [label="RTP FSM stays ready for Rollback until final establish event"];</span><br><span>diff --git a/src/osmo-bsc/lchan_rtp_fsm.c b/src/osmo-bsc/lchan_rtp_fsm.c</span><br><span>index 1dd31b1..5de2967 100644</span><br><span>--- a/src/osmo-bsc/lchan_rtp_fsm.c</span><br><span>+++ b/src/osmo-bsc/lchan_rtp_fsm.c</span><br><span>@@ -301,10 +301,7 @@</span><br><span>   switch (event) {</span><br><span> </span><br><span>         case LCHAN_RTP_EV_IPACC_CRCX_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-               /* the CRCX ACK parsing has already noted the RTP port information at</span><br><span style="color: hsl(0, 100%, 40%);">-            * lchan->abis_ip.bound_*, see ipac_parse_rtp(). We'll use that in</span><br><span style="color: hsl(0, 100%, 40%);">-                * lchan_rtp_fsm_wait_mgw_endpoint_configured_onenter(). */</span><br><span style="color: hsl(0, 100%, 40%);">-             lchan_rtp_fsm_state_chg(LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK);</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan_rtp_fsm_switch_rtp(fi);</span><br><span>                return;</span><br><span> </span><br><span>  case LCHAN_RTP_EV_IPACC_CRCX_NACK:</span><br><span>@@ -366,21 +363,16 @@</span><br><span> </span><br><span> static void lchan_rtp_fsm_wait_ipacc_mdcx_ack(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_lchan *lchan = lchan_rtp_fi_lchan(fi);</span><br><span>    switch (event) {</span><br><span> </span><br><span>         case LCHAN_RTP_EV_IPACC_MDCX_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-               lchan_rtp_fsm_switch_rtp(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+         lchan_rtp_fsm_state_chg(LCHAN_RTP_ST_READY);</span><br><span>                 return;</span><br><span> </span><br><span>  case LCHAN_RTP_EV_IPACC_MDCX_NACK:</span><br><span>           lchan_rtp_fail("Received NACK on IPACC MDCX");</span><br><span>             return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     case LCHAN_RTP_EV_READY_TO_SWITCH_RTP:</span><br><span style="color: hsl(0, 100%, 40%);">-          lchan->activate.info.wait_before_switching_rtp = false;</span><br><span style="color: hsl(0, 100%, 40%);">-              return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>      case LCHAN_RTP_EV_RELEASE:</span><br><span>   case LCHAN_RTP_EV_ROLLBACK:</span><br><span>          osmo_fsm_inst_term(fi, OSMO_FSM_TERM_REQUEST, 0);</span><br><span>@@ -480,10 +472,15 @@</span><br><span> </span><br><span> static void lchan_rtp_fsm_wait_mgw_endpoint_configured(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_lchan *lchan = lchan_rtp_fi_lchan(fi);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ switch (event) {</span><br><span>     case LCHAN_RTP_EV_MGW_ENDPOINT_CONFIGURED:</span><br><span style="color: hsl(0, 100%, 40%);">-              lchan_rtp_fsm_state_chg(LCHAN_RTP_ST_READY);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (is_ipaccess_bts(lchan->ts->trx->bts))</span><br><span style="color: hsl(120, 100%, 40%);">+                    lchan_rtp_fsm_state_chg(LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK);</span><br><span style="color: hsl(120, 100%, 40%);">+            else {</span><br><span style="color: hsl(120, 100%, 40%);">+                        lchan_rtp_fsm_state_chg(LCHAN_RTP_ST_READY);</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span>            return;</span><br><span> </span><br><span>  case LCHAN_RTP_EV_MGW_ENDPOINT_ERROR:</span><br><span>@@ -652,23 +649,8 @@</span><br><span>                         | S(LCHAN_RTP_EV_ROLLBACK)</span><br><span>                   ,</span><br><span>            .out_state_mask = 0</span><br><span style="color: hsl(0, 100%, 40%);">-                     | S(LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK)</span><br><span style="color: hsl(0, 100%, 40%);">-                   ,</span><br><span style="color: hsl(0, 100%, 40%);">-       },</span><br><span style="color: hsl(0, 100%, 40%);">-      [LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK] = {</span><br><span style="color: hsl(0, 100%, 40%);">-          .name = "WAIT_IPACC_MDCX_ACK",</span><br><span style="color: hsl(0, 100%, 40%);">-                .onenter = lchan_rtp_fsm_wait_ipacc_mdcx_ack_onenter,</span><br><span style="color: hsl(0, 100%, 40%);">-           .action = lchan_rtp_fsm_wait_ipacc_mdcx_ack,</span><br><span style="color: hsl(0, 100%, 40%);">-            .in_event_mask = 0</span><br><span style="color: hsl(0, 100%, 40%);">-                      | S(LCHAN_RTP_EV_READY_TO_SWITCH_RTP)</span><br><span style="color: hsl(0, 100%, 40%);">-                   | S(LCHAN_RTP_EV_IPACC_MDCX_ACK)</span><br><span style="color: hsl(0, 100%, 40%);">-                        | S(LCHAN_RTP_EV_IPACC_MDCX_NACK)</span><br><span style="color: hsl(0, 100%, 40%);">-                       | S(LCHAN_RTP_EV_RELEASE)</span><br><span style="color: hsl(0, 100%, 40%);">-                       | S(LCHAN_RTP_EV_ROLLBACK)</span><br><span style="color: hsl(0, 100%, 40%);">-                      ,</span><br><span style="color: hsl(0, 100%, 40%);">-               .out_state_mask = 0</span><br><span>                  | S(LCHAN_RTP_ST_WAIT_READY_TO_SWITCH_RTP)</span><br><span style="color: hsl(0, 100%, 40%);">-                      | S(LCHAN_RTP_ST_WAIT_MGW_ENDPOINT_CONFIGURED)</span><br><span style="color: hsl(120, 100%, 40%);">+                        | S(LCHAN_RTP_ST_WAIT_MGW_ENDPOINT_CONFIGURED) /*old: LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK*/</span><br><span>                     ,</span><br><span>    },</span><br><span>   [LCHAN_RTP_ST_WAIT_READY_TO_SWITCH_RTP] = {</span><br><span>@@ -694,6 +676,22 @@</span><br><span>                   | S(LCHAN_RTP_EV_ROLLBACK)</span><br><span>                   ,</span><br><span>            .out_state_mask = 0</span><br><span style="color: hsl(120, 100%, 40%);">+                   | S(LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK)</span><br><span style="color: hsl(120, 100%, 40%);">+                 | S(LCHAN_RTP_ST_READY)</span><br><span style="color: hsl(120, 100%, 40%);">+                       | S(LCHAN_RTP_ST_ROLLBACK)</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%);">+    [LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                .name = "WAIT_IPACC_MDCX_ACK",</span><br><span style="color: hsl(120, 100%, 40%);">+              .onenter = lchan_rtp_fsm_wait_ipacc_mdcx_ack_onenter,</span><br><span style="color: hsl(120, 100%, 40%);">+         .action = lchan_rtp_fsm_wait_ipacc_mdcx_ack,</span><br><span style="color: hsl(120, 100%, 40%);">+          .in_event_mask = 0</span><br><span style="color: hsl(120, 100%, 40%);">+                    | S(LCHAN_RTP_EV_IPACC_MDCX_ACK)</span><br><span style="color: hsl(120, 100%, 40%);">+                      | S(LCHAN_RTP_EV_IPACC_MDCX_NACK)</span><br><span style="color: hsl(120, 100%, 40%);">+                     | S(LCHAN_RTP_EV_RELEASE)</span><br><span style="color: hsl(120, 100%, 40%);">+                     | S(LCHAN_RTP_EV_ROLLBACK)</span><br><span style="color: hsl(120, 100%, 40%);">+                    ,</span><br><span style="color: hsl(120, 100%, 40%);">+             .out_state_mask = 0</span><br><span>                  | S(LCHAN_RTP_ST_READY)</span><br><span>                      | S(LCHAN_RTP_ST_ROLLBACK)</span><br><span>                   ,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19954">change 19954</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-bsc/+/19954"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I4de5ea5c94c1482c9cb0b6386997a942edc60e32 </div>
<div style="display:none"> Gerrit-Change-Number: 19954 </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-Assignee: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>