<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19954">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP: 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 i                (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 IPv6<br>BSC -> BTS: IPACC MDCX             (set MGW IPv6 addr)<br>BSC <- BTS: IPACC MDCX ACK<br><br>TODO: Probably need to update some ladder diagrams<br><br>Change-Id: I4de5ea5c94c1482c9cb0b6386997a942edc60e32<br>---<br>M src/osmo-bsc/lchan_rtp_fsm.c<br>1 file changed, 26 insertions(+), 28 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/54/19954/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><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: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>