diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2021-04-14 19:39:01 +0200 |
---|---|---|
committer | Neels Hofmeyr <neels@hofmeyr.de> | 2021-05-21 15:43:30 +0200 |
commit | d5cb0eb8fda3ade89c7b2e23a626b68dfda96f46 (patch) | |
tree | bfb8e62bd885a7117ffc7744a6d2717100bb6dc9 /include/osmocom | |
parent | 9607d09203c5b03f18b384b39570d9cefe9a8dfc (diff) |
lchan and assignment FSMs: make Channel Mode Modify more sane
The Channel Mode Modify procedure is currently implemented for changing
a TCH lchan from signalling to voice mode. For that, however, it is
re-using (abusing) the channel activation structs and state transitions,
and thus always implies activating a voice stream when the mode
modification is done.
I will add a Channel Mode Modify to enable VAMOS mode soon, so I require
separate structs and state transitions which also work on an lchan that
already has a voice stream established: a struct lchan_modify_info and
LCHAN_EV_REQUEST_MODE_MODIFY, and dedicated assignment FSM state
ASSIGNMENT_ST_WAIT_LCHAN_MODIFIED.
For the part where a Channel Mode Modify enables a voice stream after
switching from signalling to speech mode, still use the channel
activation code path, but only once the mode modification is done.
General improvements:
- To ask for a mode modification, emit an FSM event that ensures a mode
modify only happens when the lchan state allows it.
- The new lchan_modify_info struct reflects only those parts that have
an effect during a mode modification (before the lchan_activate_info
was fully populated, many values not having an effect).
- More accurate logging, indicating "Mode Modify" instead of "Channel
Activation"
A TTCN3 test for the Channel Mode Modify procedure is added in
Idf4efaed986de0bbd2b663313e837352cc139f0f, and the test passes both
before and after this patch is applied.
Related: SYS#4895
Change-Id: I4986844f839b1c9672c61d916eb3d33d0042d747
Diffstat (limited to 'include/osmocom')
-rw-r--r-- | include/osmocom/bsc/assignment_fsm.h | 2 | ||||
-rw-r--r-- | include/osmocom/bsc/gsm_data.h | 25 | ||||
-rw-r--r-- | include/osmocom/bsc/lchan_fsm.h | 1 |
3 files changed, 28 insertions, 0 deletions
diff --git a/include/osmocom/bsc/assignment_fsm.h b/include/osmocom/bsc/assignment_fsm.h index 156da42fa..b4af335d1 100644 --- a/include/osmocom/bsc/assignment_fsm.h +++ b/include/osmocom/bsc/assignment_fsm.h @@ -24,11 +24,13 @@ enum assignment_fsm_state { ASSIGNMENT_ST_WAIT_RR_ASS_COMPLETE, ASSIGNMENT_ST_WAIT_LCHAN_ESTABLISHED, ASSIGNMENT_ST_WAIT_MGW_ENDPOINT_TO_MSC, + ASSIGNMENT_ST_WAIT_LCHAN_MODIFIED, }; enum assignment_fsm_event { ASSIGNMENT_EV_LCHAN_ACTIVE, ASSIGNMENT_EV_LCHAN_ESTABLISHED, + ASSIGNMENT_EV_LCHAN_MODIFIED, ASSIGNMENT_EV_LCHAN_ERROR, ASSIGNMENT_EV_MSC_MGW_OK, ASSIGNMENT_EV_MSC_MGW_FAIL, diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h index bd83ea004..5a202bf4e 100644 --- a/include/osmocom/bsc/gsm_data.h +++ b/include/osmocom/bsc/gsm_data.h @@ -564,6 +564,7 @@ enum lchan_activate_for { ACTIVATE_FOR_ASSIGNMENT, ACTIVATE_FOR_HANDOVER, ACTIVATE_FOR_VTY, + ACTIVATE_FOR_MODE_MODIFY_RTP, }; extern const struct value_string lchan_activate_mode_names[]; @@ -589,6 +590,25 @@ struct lchan_activate_info { uint8_t ta; }; +enum lchan_modify_for { + MODIFY_FOR_NONE, + MODIFY_FOR_ASSIGNMENT, + MODIFY_FOR_VTY, +}; + +extern const struct value_string lchan_modify_for_names[]; +static inline const char *lchan_modify_for_name(enum lchan_modify_for modify_for) +{ return get_value_string(lchan_modify_for_names, modify_for); } + +struct lchan_modify_info { + enum lchan_modify_for modify_for; + enum gsm48_chan_mode chan_mode; + bool requires_voice_stream; + uint16_t msc_assigned_cic; + /* AMR config */ + uint16_t s15_s0; +}; + struct gsm_lchan { /* The TS that we're part of */ struct gsm_bts_trx_ts *ts; @@ -614,6 +634,11 @@ struct gsm_lchan { } activate; struct { + struct lchan_modify_info info; + bool concluded; + } modify; + + struct { /* If an event to release the lchan comes in while still waiting for responses, just mark this * flag, so that the lchan will gracefully release at the next sensible junction. */ bool requested; diff --git a/include/osmocom/bsc/lchan_fsm.h b/include/osmocom/bsc/lchan_fsm.h index 99964a417..74e2a9668 100644 --- a/include/osmocom/bsc/lchan_fsm.h +++ b/include/osmocom/bsc/lchan_fsm.h @@ -65,6 +65,7 @@ void lchan_release(struct gsm_lchan *lchan, bool do_rr_release, void lchan_activate(struct gsm_lchan *lchan, struct lchan_activate_info *info); void lchan_ready_to_switch_rtp(struct gsm_lchan *lchan); +void lchan_mode_modify(struct gsm_lchan *lchan, struct lchan_modify_info *info); static inline const char *lchan_state_name(struct gsm_lchan *lchan) { |