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