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