<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24361">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">assignment_fsm: tweak state transitions (prep for reassignment)<br><br>It is better design to take state change actions in the onenter<br>function, instead of triggering a state change and then calling<br>lchan_mode_modify() or lchan_activate(). The reason is that in<br>principle, any state change may cause error handling to abort and<br>deallocate FSMs.<br><br>This is also preparation for reassignment to a specific lchan in an<br>upcoming patch.<br><br>Related: SYS#5315 OS#4940 OS#3277<br>Change-Id: I9a2e7eefd4196b80671311e5dfd275893ec0e275<br>---<br>M src/osmo-bsc/assignment_fsm.c<br>1 file changed, 29 insertions(+), 16 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/61/24361/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/assignment_fsm.c b/src/osmo-bsc/assignment_fsm.c</span><br><span>index f294473..83d2917 100644</span><br><span>--- a/src/osmo-bsc/assignment_fsm.c</span><br><span>+++ b/src/osmo-bsc/assignment_fsm.c</span><br><span>@@ -447,8 +447,6 @@</span><br><span> [CH_RATE_FULL] = "FR",</span><br><span> };</span><br><span> struct osmo_fsm_inst *fi;</span><br><span style="color: hsl(0, 100%, 40%);">- struct lchan_activate_info activ_info;</span><br><span style="color: hsl(0, 100%, 40%);">- struct lchan_modify_info modif_info;</span><br><span> int i;</span><br><span> </span><br><span> OSMO_ASSERT(conn);</span><br><span>@@ -510,16 +508,7 @@</span><br><span> gsm48_chan_mode_name(conn->assignment.selected_ch_mode_rate.chan_mode),</span><br><span> gsm_lchan_name(conn->lchan));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- modif_info = (struct lchan_modify_info){</span><br><span style="color: hsl(0, 100%, 40%);">- .modify_for = MODIFY_FOR_ASSIGNMENT,</span><br><span style="color: hsl(0, 100%, 40%);">- .ch_mode_rate = conn->assignment.selected_ch_mode_rate,</span><br><span style="color: hsl(0, 100%, 40%);">- .requires_voice_stream = conn->assignment.requires_voice_stream,</span><br><span style="color: hsl(0, 100%, 40%);">- .msc_assigned_cic = req->msc_assigned_cic,</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%);">- if (assignment_fsm_state_chg(ASSIGNMENT_ST_WAIT_LCHAN_MODIFIED))</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan_mode_modify(conn->lchan, &modif_info);</span><br><span style="color: hsl(120, 100%, 40%);">+ assignment_fsm_state_chg(ASSIGNMENT_ST_WAIT_LCHAN_MODIFIED);</span><br><span> return;</span><br><span> }</span><br><span> </span><br><span>@@ -564,7 +553,13 @@</span><br><span> req->use_osmux ? "yes" : "no");</span><br><span> </span><br><span> assignment_fsm_state_chg(ASSIGNMENT_ST_WAIT_LCHAN_ACTIVE);</span><br><span style="color: hsl(0, 100%, 40%);">- activ_info = (struct lchan_activate_info){</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 assignment_fsm_wait_lchan_active_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_subscriber_connection *conn = assignment_fi_conn(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct assignment_request *req = &conn->assignment.req;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct lchan_activate_info activ_info = {</span><br><span> .activ_for = ACTIVATE_FOR_ASSIGNMENT,</span><br><span> .for_conn = conn,</span><br><span> .ch_mode_rate = conn->assignment.selected_ch_mode_rate,</span><br><span>@@ -578,14 +573,17 @@</span><br><span> lchan_activate(conn->assignment.new_lchan, &activ_info);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void assignment_fsm_wait_lchan(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+static void assignment_fsm_wait_lchan_active(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span> struct gsm_subscriber_connection *conn = assignment_fi_conn(fi);</span><br><span> switch (event) {</span><br><span> </span><br><span> case ASSIGNMENT_EV_LCHAN_ACTIVE:</span><br><span style="color: hsl(0, 100%, 40%);">- if (data != conn->assignment.new_lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (data != conn->assignment.new_lchan) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOG_ASSIGNMENT(conn, LOGL_ERROR, "Some unrelated lchan was activated, ignoring: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_lchan_name(data));</span><br><span> return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span> /* The TS may have changed its pchan_is */</span><br><span> assignment_fsm_update_id(conn);</span><br><span>@@ -736,6 +734,19 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void assignment_fsm_wait_lchan_modified_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_subscriber_connection *conn = assignment_fi_conn(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct assignment_request *req = &conn->assignment.req;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct lchan_modify_info modif_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .modify_for = MODIFY_FOR_ASSIGNMENT,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ch_mode_rate = conn->assignment.selected_ch_mode_rate,</span><br><span style="color: hsl(120, 100%, 40%);">+ .requires_voice_stream = conn->assignment.requires_voice_stream,</span><br><span style="color: hsl(120, 100%, 40%);">+ .msc_assigned_cic = req->msc_assigned_cic,</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan_mode_modify(conn->lchan, &modif_info);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void assignment_fsm_wait_lchan_modified(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span> switch (event) {</span><br><span>@@ -754,7 +765,8 @@</span><br><span> static const struct osmo_fsm_state assignment_fsm_states[] = {</span><br><span> [ASSIGNMENT_ST_WAIT_LCHAN_ACTIVE] = {</span><br><span> .name = "WAIT_LCHAN_ACTIVE",</span><br><span style="color: hsl(0, 100%, 40%);">- .action = assignment_fsm_wait_lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+ .onenter = assignment_fsm_wait_lchan_active_onenter,</span><br><span style="color: hsl(120, 100%, 40%);">+ .action = assignment_fsm_wait_lchan_active,</span><br><span> .in_event_mask = 0</span><br><span> | S(ASSIGNMENT_EV_LCHAN_ACTIVE)</span><br><span> ,</span><br><span>@@ -799,6 +811,7 @@</span><br><span> },</span><br><span> [ASSIGNMENT_ST_WAIT_LCHAN_MODIFIED] = {</span><br><span> .name = "WAIT_LCHAN_MODIFIED",</span><br><span style="color: hsl(120, 100%, 40%);">+ .onenter = assignment_fsm_wait_lchan_modified_onenter,</span><br><span> .action = assignment_fsm_wait_lchan_modified,</span><br><span> .in_event_mask = 0</span><br><span> | S(ASSIGNMENT_EV_LCHAN_MODIFIED)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24361">change 24361</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/+/24361"/><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: I9a2e7eefd4196b80671311e5dfd275893ec0e275 </div>
<div style="display:none"> Gerrit-Change-Number: 24361 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>