<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>