Hi,
for ipaccess based BTS, like osmo-bts, we don't really care about the scenario you mention since the BTS is expected to lock the transceiver and reset state whenever it detects the underlaying tcp/ipa connections is closed, so that next time it re-conencts to BSC it should be in a "safe" state.
As per E1 BTS, I was not even aware of such a feature/requirement. I did a quick investigation. Shutdown in essence happens through signal_handler(), which will essentially do: 1- "bsc_shutdown_net(bsc_gsmnet);" sends signal S_GLOBAL_BTS_CLOSE_OM to each BTS, which is case of nokia calls shutdown_om() which should do whatever you want there. 2 - "osmo_signal_dispatch(SS_L_GLOBAL, S_L_GLOBAL_SHUTDOWN, NULL);" This actually does nothing afaiu because osmo-bsc nor libosmocore do any handling of this signal. 3- osmo_select_shutdown_request() This tells libosmocore main loop that we desire to shutdown. main() in osmo-bsc_main.c iterates on the mainloop based on condition osmo_select_shutdown_done().
Now, let's look further at point 3, see libosmocore select.c. Calling osmo_select_shutdown_request() (read the documentation on top of it) sets _osmo_select_shutdown_requested global variable.osmo_select_shutdown_done() checks _osmo_select_shutdown_done global variable. The logic for those variables is enclosed in poll_disp_fds(), one would probably need to debug over there after you send CTRL+C to figure out why isn't the message being sent.
Regards, Pau