Load-Based Handover =================== :author: :copyright: 2018 by Neels Hofmeyr (License: CC-BY-SA) :backend: slidy :max-width: 45em == slides http://people.osmocom.org/neels/2018 Copyright (c) 2018 by Neels Hofmeyr License: CC-BY-SA == handover, simplified image::ho101_1.svg[width="100%"] == handover, simplified image::ho101_2.svg[width="100%"] == handover, simplified image::ho101_3.svg[width="100%"] == handover, simplified image::ho101_4.svg[width="100%"] == handover, simplified image::ho101_5.svg[width="100%"] == handover, simplified image::ho101_6.svg[width="100%"] == handover, simplified * config: each BTS has a list of neighbors ** auto: all other BTS are neighbors * BSC gathers: ** RXLEV, RXQUAL, TA on current cell ** RXLEV on neighbors ** ... ** Prepares new lchan, instructs MS to Handover == handover decision algorithm * handover_decision.c ** RXLEV, RXQUAL, TA (distance) ** interference (good RXLEV, bad RXQUAL) * handover_decision_2.c ** RXLEV, RXQUAL, TA ** interference ** congestion (nr of free lchans) ** penalty time ** voice rate / codec == handover_decision_2.c * based on openbsc.git jolly/new_handover * forward-ported to osmo-bsc in winter 2017 == handover config OsmoBSC(config-net)# list ... handover (0|1|default) handover algorithm (1|2|default) == handover config OsmoBSC(config-net)# list ... handover (0|1|default) handover algorithm (1|2|default) Each item can be set globally and per-BTS OsmoBSC(config-net)# bts 0 OsmoBSC(config-net-bts)# list ... handover (0|1|default) handover algorithm (1|2|default) == handover1 config OsmoBSC(config-net)# list ... handover1 window rxlev averaging (<1-10>|default) handover1 window rxqual averaging (<1-10>|default) handover1 window rxlev neighbor averaging (<1-10>|default) handover1 power budget interval (<1-99>|default) handover1 power budget hysteresis (<0-999>|default) handover1 maximum distance (<0-9999>|default) == handover2 config s/handover1/handover2/ plus handover2 assignment (0|1|default) handover2 tdma-measurement (full|subset|default) handover2 min rxlev (<-110--50>|default) handover2 min rxqual (<0-7>|default) handover2 afs-bias rxlev (<0-20>|default) handover2 afs-bias rxqual (<0-7>|default) handover2 min-free-slots tch/f (<0-9999>|default) handover2 min-free-slots tch/h (<0-9999>|default) handover2 max-handovers (<1-9999>|default) handover2 penalty-time max-distance (<0-99999>|default) handover2 penalty-time failed-ho (<0-99999>|default) handover2 penalty-time failed-assignment (<0-99999>|default) handover2 retries (<0-9>|default) handover2 congestion-check (disabled|<1-999>|now) == handover2 config (in case of questions I can't answer, a listing of the online docs...) OsmoBSC(config-net)# handover algorithm ? 1 Algorithm 1: trigger handover based on comparing current cell and neighbor RxLev and RxQual, only. 2 Algorithm 2: trigger handover on RxLev/RxQual, and also to balance the load across several cells. Consider available codecs. Prevent repeated handover by penalty timers. default Use default (1), remove explicit setting on this node OsmoBSC(config-net)# handover1 window ? rxlev Received-Level averaging rxqual Received-Quality averaging OsmoBSC(config-net)# handover1 window rxlev ? averaging How many RxLev measurements are used for averaging neighbor How many Neighbor RxLev measurements are used for averaging OsmoBSC(config-net)# handover1 window rxlev averaging ? <1-10> RxLev averaging: Number of values to average over default Use default (10), remove explicit setting on this node OsmoBSC(config-net)# handover1 window rxlev neighbor ? averaging How many Neighbor RxLev measurements are used for averaging OsmoBSC(config-net)# handover1 window rxlev neighbor averaging ? <1-10> Neighbor RxLev averaging: Number of values to average over default Use default (10), remove explicit setting on this node OsmoBSC(config-net)# handover1 window rxqual ? averaging How many RxQual measurements are used for averaging OsmoBSC(config-net)# handover1 window rxqual averaging ? <1-10> RxQual averaging: Number of values to average over default Use default (1), remove explicit setting on this node OsmoBSC(config-net)# handover1 power ? budget Neighbor cell power triggering OsmoBSC(config-net)# handover1 power budget ? interval How often to check for a better cell (SACCH frames) hysteresis How many dBm stronger must a neighbor be to become a HO candidate OsmoBSC(config-net)# handover1 power budget interval ? <1-99> Check for stronger neighbor every N number of SACCH frames default Use default (6), remove explicit setting on this node OsmoBSC(config-net)# handover1 power budget hysteresis ? <0-999> Neighbor's strength difference in dBm default Use default (3), remove explicit setting on this node OsmoBSC(config-net)# handover1 maximum ? distance Maximum Timing-Advance value (i.e. MS distance) before triggering HO OsmoBSC(config-net)# handover1 maximum distance ? <0-9999> Maximum Timing-Advance value (i.e. MS distance) before triggering HO default Use default (9999), remove explicit setting on this node same again for handover2, plus: OsmoBSC(config-net)# handover2 assignment ? 0 Disable in-call assignment 1 Enable in-call assignment default Use default (0), remove explicit setting on this node OsmoBSC(config-net)# handover2 tdma-measurement ? full Full set of 102/104 TDMA frames subset Sub set of 4 TDMA frames (SACCH) default Use default (subset), remove explicit setting on this node OsmoBSC(config-net)# handover2 min ? rxlev How weak may RxLev of an MS become before triggering HO rxqual How bad may RxQual of an MS become before triggering HO OsmoBSC(config-net)# handover2 min rxlev ? <-110--50> minimum RxLev (dBm) default Use default (-100), remove explicit setting on this node OsmoBSC(config-net)# handover2 min rxqual ? <0-7> minimum RxQual (dBm) default Use default (5), remove explicit setting on this node OsmoBSC(config-net)# handover2 afs-bias ? rxlev RxLev improvement bias for AFS over other codecs rxqual RxQual improvement bias for AFS over other codecs OsmoBSC(config-net)# handover2 afs-bias rxlev ? <0-20> Virtual RxLev improvement (dBm) default Use default (0), remove explicit setting on this node OsmoBSC(config-net)# handover2 afs-bias rxqual ? <0-7> Virtual RxQual improvement (dBm) default Use default (0), remove explicit setting on this node OsmoBSC(config-net)# handover2 min-free-slots ? tch/f Minimum free TCH/F timeslots before cell is considered congested tch/h Minimum free TCH/H timeslots before cell is considered congested OsmoBSC(config-net)# handover2 min-free-slots tch/f ? <0-9999> Number of TCH/F slots default Use default (0), remove explicit setting on this node OsmoBSC(config-net)# handover2 min-free-slots TCH/F ? % There is no matched command. OsmoBSC(config-net)# handover2 min-free-slots tch/h ? <0-9999> Number of TCH/H slots default Use default (0), remove explicit setting on this node OsmoBSC(config-net)# handover2 max-handovers ? <1-9999> Number default Use default (9999), remove explicit setting on this node OsmoBSC(config-net)# handover2 penalty-time ? max-distance Time to suspend handovers after leaving this cell due to exceeding max distance failed-ho Time to suspend handovers after handover failure to this cell failed-assignment Time to suspend handovers after assignment failure in this cell OsmoBSC(config-net)# handover2 penalty-time max-distance ? <0-99999> Seconds default Use default (300), remove explicit setting on this node OsmoBSC(config-net)# handover2 penalty-time failed-ho ? <0-99999> Seconds default Use default (60), remove explicit setting on this node OsmoBSC(config-net)# handover2 penalty-time failed-assignment ? <0-99999> Seconds default Use default (60), remove explicit setting on this node OsmoBSC(config-net)# handover2 retries ? <0-9> Number of retries default Use default (0), remove explicit setting on this node OsmoBSC(config-net)# handover2 congestion-check ? disabled Disable congestion checking, do not handover based on cell overload <1-999> Congestion check interval in seconds (default 10) now Manually trigger a congestion check to run right now == handover_decision_2.c narrative handover_test.c test_case_23: /* meas-rep [ [...]] */ "Story: 'A neighbor is your friend'\n", "create-bts", "3", "print", "Andreas is driving along the coast, on a sunny june afternoon.\n" "Suddenly he is getting a call from his friend and neighbor Axel.\n" "\n" "What happens: Two MS are created, #0 for Axel, #1 for Andreas.", /* Axel */ "create-ms", "2", "TCH/F", "AMR", /* andreas */ "create-ms", "0", "TCH/F", "AMR", "meas-rep", "1", "40","0", "1","0","30", "expect-no-chan", "print", "Axel asks Andreas if he would like to join them for a barbecue.\n" "Axel's house is right in the neighborhood and the weather is fine.\n" "Andreas agrees, so he drives to a close store to buy some barbecue\n" "skewers.\n" "\n" "What happens: While driving, a different cell (mounted atop the\n" "store) becomes better.", /* drive to bts 1 */ "meas-rep", "1", "20","0", "1","0","35", "expect-chan", "1", "1", "ack-chan", "expect-ho", "0", "1", "ho-complete", "print", "While Andreas is walking into the store, Axel asks, if he could also\n" "bring some beer. Andreas has problems understanding him: \"I have a\n" "bad reception here. The cell tower is right atop the store, but poor\n" "coverage inside. Can you repeat please?\"\n" "\n" "What happens: Inside the store the close cell is so bad, that\n" "handover back to the previous cell is required.", /* bts 1 becomes bad, so bts 0 helps out */ "meas-rep", "1", "5","0", "1","0","20", "expect-chan", "0", "1", "ack-chan", "expect-ho", "1", "1", "ho-complete", "print", "After Andreas bought skewers and beer, he leaves the store.\n" "\n" "What happens: Outside the store the close cell is better again, so\n" "handover back to the that cell is performed.", /* bts 1 becomes better again */ "meas-rep", "1", "20","0", "1","0","35", "expect-chan", "1", "1", "ack-chan", "expect-ho", "0", "1", "ho-complete", "print", /* bts 2 becomes better */ "Andreas drives down to the lake where Axel's house is.\n" "\n" "What happens: There is a small cell at Axel's house, which becomes\n" "better, because the current cell has no good comverage at the lake.", "meas-rep", "1", "14","0", "2","0","2","1","63", "expect-chan", "2", "2", "ack-chan", "expect-ho", "1", "1", "ho-complete", "print", "Andreas wonders why he still has good radio coverage: \"Last time it\n" "was so bad\". Axel says: \"I installed a pico cell in my house,\n" "now we can use our mobile phones down here at the lake.\"", == handover_decision_2.c narrative test_case_5: "TCH/F keeping with FR codec\n\n" "The MS is using full rate V1 codec, but the better cell is congested\n" "at TCH/F slots. As the congestion is removed, the handover takes\n" "place.\n", "create-bts", "2", "set-min-free", "1", "TCH/F", "4", "create-ms", "0", "TCH/F", "FR", "meas-rep", "0", "20","0", "1","0","30", "expect-no-chan", "set-min-free", "1", "TCH/F", "3", "meas-rep", "0", "20","0", "1","0","30", "expect-chan", "1", "1", "ack-chan", "expect-ho", "0", "1", "ho-complete", == handover_decision_2.c narrative test_case_7: "TCH/F to TCH/H changing with AMR codec\n\n" "The MS is using AMR V3 codec, the better cell is congested at TCH/F\n" "slots. The handover is performed to non-congested TCH/H slots.\n", "create-bts", "2", "set-min-free", "1", "TCH/F", "4", "create-ms", "0", "TCH/F", "AMR", "meas-rep", "0", "20","0", "1","0","30", "expect-chan", "1", "5", "ack-chan", "expect-ho", "0", "1", "ho-complete", == todo * handover_decision_2.c and dynamic timeslots https://osmocom.org/issues/3002[OS#3002] * tests! ** ttcn3 ** osmo-gsm-tester Currently also implementing: * inter-BSC handover in osmo-bsc https://osmocom.org/issues/2283[OS#2283] == Measurement Report? [role="incremental"] * Handover Command * Handover Detected * Handover Complete