path: root/src/libbsc/handover_logic.c
AgeCommit message (Collapse)AuthorFilesLines
2018-03-07use RR Assignment Command for intra-cell re-assignmentneels/assignmentNeels Hofmeyr1-2/+7
Change-Id: I26b62731f13cd7d4217b68eb76e298a6216af896
2018-02-19HO: cosmetic: getting a chan activ nack on a non-ho lchan is not an errorNeels Hofmeyr1-2/+2
Change-Id: I66c4f45afda614f874c9cdf0c22552f492315b71
2018-02-19HO: introduce ho decision callbacksNeels Hofmeyr1-35/+43
Instead of reacting on S_LCHAN* signals in the handover decision code, introduce callbacks for the handover decision to be invoked by handover_logic.c at the appropriate time. The rationale is explained in a comment to struct handover_decision_callbacks, quoting: " All events that are interesting for handover decision are actually communicated by S_LCHAN_* signals, so theoretically, each handover algorithm could evaluate those. However, handover_logic.c cleans up handover operation state upon receiving some of these signals. To allow a handover decision algorithm to take advantage of e.g. the struct bsc_handover before it is discarded, the handover decision event handler needs to be invoked before handover_logic.c discards the state. For example, if the handover decision wants to place a penalty timer upon a handover failure, it still needs to know which target cell the handover failed for; handover_logic.c erases that knowledge on handover failure, since it needs to clean up the lchan's handover state. The most explicit and safest way to ensure the correct order of event handling is to invoke the handover decision algorithm's actions from handover_logic.c itself, before cleaning up. This struct provides the callback functions for this purpose. For consistency, also handle signals in this way that aren't actually in danger of interference from handover_logic.c (which also saves repeated lookup of handover state for lchans). Thus, handover decision algorithms should not register any signal handler at all. " Also: - Publish struct bsc_handover to use it as argument to above callbacks. - Add enum hodec_id to struct bsc_handover, to be able to signal the appropriate hodec algorithm per event. - Add hodec_id argument to bsc_handover_start*() to be placed in the bsc_handover struct. - Publish the LOGPHO logging macros in handover.h along with struct bsc_handover, convenient for logging in callback implementations. Replace handover_decision.c's signal handler with a registered handover_decision_callbacks instance. (Upcoming handover_decision_2 will use all of the callbacks introduced here.) Change-Id: Id5b64504007fe03e0406a4b395cd0359232b77d2
2018-02-16HO: logging: more logs, and more concise loggingNeels Hofmeyr1-13/+39
Explicitly log "Handover" or "Assignment", add more info to existing log statements and add more log statements. Log ho failure both on RR and HO log categories: RR receives the HO failure message, while the HO failure is an important event to note when watching the HO category. Change-Id: Ia3999755cdd4e0c2861582b20e2dbb7e1538e074
2018-02-16HO: bsc_handover_start_lchan_change(): set MS to max power on handoverNeels Hofmeyr1-2/+9
For re-assignment within the same cell, keep the same MS power. But for handover to another cell, start off with that cell's configured maximum MS power. Change-Id: Ia91766d8bb8f543f514726ce9508b7747bb2bcb5
2018-02-16HO: always do async handoverNeels Hofmeyr1-4/+2
We're really only interested in async handover so far. Set ho->async to true always. Change-Id: I48715864d4b953987c86d93fe1b3a5456f0c4e0f
2018-02-16HO: cosmetic: bsc_handover_start_lchan_change(): tweak local varsNeels Hofmeyr1-3/+11
To keep this cosmetic change apart from subsequent functional changes: have a local do_assigment flag and a local network pointer. Change-Id: I09684dcf2a00e3d930e058cc1c925ad6e59b1468
2018-02-16HO: add new_lchan_type arg to bsc_handover_start()Neels Hofmeyr1-10/+12
Upcoming handover_decision_2 will want to be able to handover to a differing TCH type, hence add a parameter to bsc_handover_start(); adjust current callers to pass the old lchan type. Tweak the 'bts' argument to 'new_bts'. Change-Id: I4478ebcaada00897cc38c5a299e07661139ed3c5
2018-02-16HO: cosmetic: bsc_handover_start(): "fix" memcpy for AMR configNeels Hofmeyr1-2/+2
memcpy obviously needs the byte size, not the ARRAY_SIZE. For the uint8_t arrays, these are incidentally the same number, but semantically it should be sizeof. Change-Id: I97b6ac05192ad477b246a23ce00c5c91abfd938a
2018-02-16handover_logic.c: on HO command, send new lchan's MS powerNeels Hofmeyr1-1/+1
Change-Id: I90eda8405f2d2eddfb041ca38b34fe30c397e09d
2018-02-16handover_logic.c: always do inter-cell channel activationNeels Hofmeyr1-3/+1
In commit [1], the channel activation kind was modified out-of-context to use Immediate Assignment in case of intra-cell re-assignment. This so far hasn't worked out in tests, so instead stay with the strategy to use RSL_ACT_INTER_ASYNC also for re-assignment within the same cell. We may move to RSL_ACT_INTRA_IMM_ASS in a separate patch after proper testing. [1]: 5eaa4fb821751b70ad2b864d8765ff96bd301996, I2d91765c1f9719c64fd99426a872cecc724215db "HO: add indicators for inter-cell and async ho, use for chan act type", Note that so far, no re-assignment within cells is triggered by the current handover decision algorithm, so the effect will be really noticeable with handover decision 2 that is coming up. See feature OS#2949 which asks for implementing actual RR Assignment to handover within a cell. Related: OS#2949 Change-Id: Ia3d979094fa16620f1acc5933418797829710ba8
2018-01-28remove obsolete gsm_subscriber_connection.bts memberHarald Welte1-1/+0
This member was merely a cache for conn->lchan->ts->trx->bts, so let's avoid having to keep copies of the same data (which needs to be kept up to date). Change-Id: Id3bff8b18425ef5d45eb460ac9eb620023013ba0
2018-01-19cosmetic: explicitly init ho_ref start valueNeels Hofmeyr1-1/+1
The static ho_ref seems to be implicitly initialized to zero, but let's make it explicit for code readability. Change-Id: I00493bcb7ef3e38fb8e0077c60c5bac7199f1073
2018-01-19HO: Add function to count currently ongoing handovers to a given BTSAndreas Eversberg1-0/+18
In order to keep processing power at BTS at a defined level, the handover decision might want to limit maximum number of slots that require RACH detection. Change-Id: I8908e37fe0d8d2eda906cc6301ba0969b25a5575
2018-01-19HO: add indicators for inter-cell and async ho, use for chan act typeNeels Hofmeyr1-1/+12
Change-Id: I2d91765c1f9719c64fd99426a872cecc724215db
2018-01-19HO: fix recovery from failed handoverNeels Hofmeyr1-1/+5
Do not instruct the MGW to move the RTP to the new lchan before we have received a HANDOVER DETECT. Before: Chan Activ Chan Activ Ack IPACC-CRCX -ACK IPACC-MDCX -ACK MGCP MDCX --> MGW ... HANDOVER DETECT Call continues on new lchan In above sequence, if the HANDOVER DETECT times out, the MGW has moved to the new lchan which never becomes used and is released. Furthermore, from the IPACC MDCX until the HANDOVER DETECT, the RTP stream would break off momentarily. After: Chan Activ Chan Activ Ack IPACC-CRCX -ACK IPACC-MDCX -ACK ... HANDOVER DETECT MGCP MDCX --> MGW Call continues on new lchan If the HANDOVER DETECT times out, the call happily continues on the old lchan. This change is inspired by Ivan Kluchnikov's HO work, who implemented a similar fix in the openbsc.git codebase (branch fairwaves/master-rebase): his patch moves ipacc_mdcx() to connect RTP to the new lchan from switch_for_handover() (which triggered on S_ABISIP_CRCX_ACK, i.e. creation of the new lchan) to later on in ho_detect() a.k.a. the S_LCHAN_HANDOVER_DETECT signal handler: http://git.osmocom.org/openbsc/commit/?h=fairwaves/master-rebase&id=9507a7a1ea627e07370c9d264816bb190b3b91b8 This patch does essentially the same: remove the mgcp_handover() call from the MDCX-ACK handling (creation of the new lchan), and add a signal handler for S_LCHAN_HANDOVER_DETECT to osmo_bsc_mgcp.c to effect the MGW switchover. Note, it would have been possible to call mgcp_handover() directly from rx of the HANDOVER DETECT message, but that produces linking fallout in some utils/ projects, which then need to link the mgcp code as well. That is because those aren't properly separated from the more complex parts of libbsc. Using the signal is a bit bloaty, but saves the linking hell for now. I've faced a similar problem twice recently, it would pay off to separate out the simpler utils/ and ipaccess/ tools so that they don't need to link all of libbsc and osmo-bsc, at some point (TM). Change-Id: Iec58c5fcc5697f1775da7ec0111135108ed1fc8f
2017-12-19Remove dead code left over from NITB splitHarald Welte1-7/+0
There still is a lot of dead code that we inherited from the NITB days, let's remove more of it. libtrau will be re-introduced as part of osmo-mgw later. Change-Id: I8e0af56a158f25a4f1384d667c03eb20e72df5b8
2017-11-29cosmetic: handover.h: use "#pragma once", declare structs, commentsNeels Hofmeyr1-0/+2
Use new #pragma style instead of #ifndef dance. Forward-declare all structs we're using pointers of. Move function comments to their definitions in the .c file. Change-Id: I3d43ec01897c0ef9eaf506e68d5a1ec1977f70ea
2017-09-06move include/openbsc to include/osmocom/bscNeels Hofmeyr1-10/+10
Change-Id: I39e7b882caa98334636d19ccd104fd83d07d5055
2017-08-30split off osmo-bsc: remove files, apply buildNeels Hofmeyr1-3/+3
Change-Id: I64d84c52f6e38e98144eb9be8f0ab82e0e1f6cca
2017-08-30Implement AoIP, port to M3UA SIGTRAN (large addition and refactoring)Philipp Maier1-1/+2
This was originally a long series of commits converging to the final result seen in this patch. It does not make much sense to review the smaller steps' trial and error, we need to review this entire change as a whole. Implement AoIP in osmo-msc and osmo-bsc. Change over to the new libosmo-sigtran API with support for proper SCCP/M3UA/SCTP stacking, as mandated by 3GPP specifications for the IuCS and IuPS interfaces. From here on, a separate osmo-stp process is required for SCCP routing between OsmoBSC / OsmoHNBGW <-> OsmoMSC / OsmoSGSN jenkins.sh: build from libosmo-sccp and osmo-iuh master branches now for new M3UA SIGTRAN. Patch-by: pmaier, nhofmeyr, laforge Change-Id: I5ae4e05ee7c57cad341ea5e86af37c1f6b0ffa77
2017-08-27handover_logic: set correct link to bts for subscriber_connection in case of ↵Ivan Kluchnikov1-0/+1
moving this connection to another bts In case of successful completion of handover gsm_subscriber_connection could be moved from one bts to another, so connection link to bts should be replaced by link to bts, which owns new_lchan. This bug was detected, because conn->bts->nr is used in call control log messages and wrong number of bts was observed in these messages after handover. Change-Id: Idc7dd412b7580c451e716b73ef7549826c60b0d9
2017-08-27Use libvlr in libmsc (large refactoring)Harald Welte1-1/+2
Original libvlr code is by Harald Welte <laforge@gnumonks.org>, polished and tweaked by Neels Hofmeyr <nhofmeyr@sysmocom.de>. This is a long series of trial-and-error development collapsed in one patch. This may be split in smaller commits if reviewers prefer that. If we can keep it as one, we have saved ourselves the additional separation work. SMS: The SQL based lookup of SMS for attached subscribers no longer works since the SQL database no longer has the subscriber data. Replace with a round-robin on the SMS recipient MSISDNs paired with a VLR subscriber RAM lookup whether the subscriber is currently attached. If there are many SMS for not-attached subscribers in the SMS database, this will become inefficient: a DB hit returns a pending SMS, the RAM lookup will reveal that the subscriber is not attached, after which the DB is hit for the next SMS. It would become more efficient e.g. by having an MSISDN based hash list for the VLR subscribers and by marking non-attached SMS recipients in the SMS database so that they can be excluded with the SQL query already. There is a sanity limit to do at most 100 db hits per attempt to find a pending SMS. So if there are more than 100 stored SMS waiting for their recipients to actually attach to the MSC, it may take more than one SMS queue trigger to deliver SMS for subscribers that are actually attached. This is not very beautiful, but is merely intended to carry us over to a time when we have a proper separate SMSC entity. Introduce gsm_subscriber_connection ref-counting in libmsc. Remove/Disable VTY and CTRL commands to create subscribers, which is now a task of the OsmoHLR. Adjust the python tests accordingly. Remove VTY cmd subscriber-keep-in-ram. Use OSMO_GSUP_PORT = 4222 instead of 2222. See I4222e21686c823985be8ff1f16b1182be8ad6175. So far use the LAC from conn->bts, will be replaced by conn->lac in Id3705236350d5f69e447046b0a764bbabc3d493c. Related: OS#1592 OS#1974 Change-Id: I639544a6cdda77a3aafc4e3446a55393f60e4050
2017-08-27move openbsc/* to repos rootNeels Hofmeyr1-0/+378
This is the first step in creating this repository from the legacy openbsc.git. Like all other Osmocom repositories, keep the autoconf and automake files in the repository root. openbsc.git has been the sole exception, which ends now. Change-Id: I9c6f2a448d9cb1cc088cf1cf6918b69d7e69b4e7