osmo-bsc doesn't perform RSL MODE MODIFY on ASSIGNMENT if channel is compatible.
The current master branch code does not ever perform a Chan Mode Modify, so neither does this refactored code. It is relatively trivial to add it, but I decided to not add more to this refactoring. For example: we gave an MS a TCH/F lchan for initial Channel Request. Now a BSSMAP Assignment Command tells us to assign a TCH/F to the MS. We don't need to find a new unused lchan, we can just use the assigned one. All that's needed is to send a Chan Mode Modify to the BTS and go through the FSM states that set up the RTP stream. But we don't do that yet; so far, instead we look for a completely new lchan. (If the lchan mode already matches, we do use the current lchan. See assignment_fsm_start() in assignment_fsm.c )
We should start by creating a BSC_Tests.ttcn test case for this specific behavior. It would then fail until we fixed our BSC.
The easy way of testing: merely send two distinct Assignment Commands from the MSC,
which cause a different chan_mode, like go from SPEEC_V1 to SPEECH_AMR.
Then it would also be good to model a congestion scenario, where no SDCCH are available and TCH/* need to help out.
osmo-bsc is fairly strictly giving out only SDCCH channels for Immediate Assignment,
it will initially only give an MS a TCH/F if all SDCCH are occupied.
So a congestion test would first need to occupy all SDCCH, e.g. with a series of "dummy" Chan Requests,
then send one more Chan Request, to get a TCH/* lchan in mode = SIGN;
and would then send an Assignment Command from the MSC, expecting a Chan Mode Modify, and not a new Chan Activ.