aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
2016-08-27Adding LLC-XID encoder / decoder and unit testPhilipp11-3/+526
The lle-xid encoder/decoder is needed to encode and decode llc xid parameter messages. We need this to exchange sndcp-parameters (SNDCP-XID) and also simple parameters such as encryption IOVs Change-Id: Ia06e4cb08bf9b48c2a4682606d1b1a91d19a9d37
2016-08-27log: rsl notice: tiny tweak for readabilityNeels Hofmeyr1-1/+1
Change-Id: I57c3b7d27d857c96e3fa3dacf7b766bc43100fc3
2016-08-27log: improve for rsl_lchan_mark_broken()Neels Hofmeyr1-9/+3
In rsl_lchan_mark_broken(), call rsl_lchan_set_state() so the state transition gets logged in the debug log. Remove logging for the broken channel at the callers, instead log the error actually in rsl_lchan_mark_broken() itself, with the reason message passed by the caller anyway. (Removes code dup and ensures it's always logged.) Change-Id: I54ae9bbd3f193bae7b1bda1fef3e33e62b353bf5
2016-08-27dyn TS: debug log: if still in use, also log lchan type and stateNeels Hofmeyr1-3/+5
Change-Id: Ifbf31cde24b2d1022b7a472966c17959c96e6dda
2016-08-27dyn TS: debug log 'switchover complete' only when there was a switchoverNeels Hofmeyr1-2/+3
Change-Id: I7ddcb41edce1cd7b22fe91e33bdcaedb21856222
2016-08-27dyn TS: fix OS#1798: on late RF CHAN REL ACK, activate PDCHNeels Hofmeyr1-0/+2
Tested by hacking a REL ACK delay of a couple of seconds into osmo-bts' rsl.c for the first TCH_H lchan: [[[ diff --git a/include/osmo-bts/rsl.h b/include/osmo-bts/rsl.h index 093e9cb..b35c3bb 100644 --- a/include/osmo-bts/rsl.h +++ b/include/osmo-bts/rsl.h @@ -22,6 +22,7 @@ int rsl_tx_est_ind(struct gsm_lchan *lchan, uint8_t link_id, uint8_t *data, int int rsl_tx_chan_act_acknack(struct gsm_lchan *lchan, uint8_t cause); int rsl_tx_conn_fail(struct gsm_lchan *lchan, uint8_t cause); int rsl_tx_rf_rel_ack(struct gsm_lchan *lchan); +int rsl_tx_rf_rel_ack_later(struct gsm_lchan *lchan); int rsl_tx_hando_det(struct gsm_lchan *lchan, uint8_t *ho_delay); /* call-back for LAPDm code, called when it wants to send msgs UP */ diff --git a/src/common/l1sap.c b/src/common/l1sap.c index 3802e25..1f92b0d 100644 --- a/src/common/l1sap.c +++ b/src/common/l1sap.c @@ -491,7 +491,16 @@ static int l1sap_info_rel_cnf(struct gsm_bts_trx *trx, lchan = get_lchan_by_chan_nr(trx, info_act_cnf->chan_nr); - rsl_tx_rf_rel_ack(lchan); + static int yyy = 0; + + DEBUGP(DRSL, "%s YYYYYYYYYYYYYYYYYYYYY %d %s\n", + gsm_lchan_name(lchan), yyy, gsm_lchant_name(lchan->type)); + + if (lchan->type == GSM_LCHAN_TCH_H && !yyy) { + yyy ++; + rsl_tx_rf_rel_ack_later(lchan); + } else + rsl_tx_rf_rel_ack(lchan); /* During PDCH DEACT, this marks the deactivation of the PDTCH as * requested by the PCU. Next up, we disconnect the TS completely and diff --git a/src/common/rsl.c b/src/common/rsl.c index 3c97af9..7926f21 100644 --- a/src/common/rsl.c +++ b/src/common/rsl.c @@ -534,6 +534,22 @@ int rsl_tx_rf_rel_ack(struct gsm_lchan *lchan) return abis_bts_rsl_sendmsg(msg); } +struct osmo_timer_list yyy_timer; + +static void yyy_timer_cb(void *data) +{ + rsl_tx_rf_rel_ack(data); +} + +int rsl_tx_rf_rel_ack_later(struct gsm_lchan *lchan) +{ + yyy_timer.cb = yyy_timer_cb; + yyy_timer.data = lchan; + osmo_timer_schedule(&yyy_timer, 10, 0); + return 0; +} + + /* 8.4.2 sending CHANnel ACTIVation ACKnowledge */ static int rsl_tx_chan_act_ack(struct gsm_lchan *lchan) { ]]] Change-Id: I87e07e1d54882f8f3d667fa300c6e3679f5c920d Fixes: OS#1798
2016-08-27dyn TS: fix: properly run an lchan activation timeoutNeels Hofmeyr1-0/+7
Actually schedule an activation timer for the activation part of a dyn TS switchover. It needs to be restarted because the channel release procedure in the first part of a switchover actually removes the activation timer. Change-Id: Ibf50d13ba10298464a8b07e34716763161438990
2016-08-27dyn TS: clearly use lchan[0], fixing minor confusionNeels Hofmeyr3-42/+56
The dyn_ts_switchover_*() functions made the impression that they act on a specific lchan of a timeslot. The assumption that we would remember to use e.g. lchan[1] across a PDCH deactivation is brain damaged to begin with; and factually we always use lchan[0] anyway (the only case for using lchan[1] would be when switching to TCH/H, but the channel allocator will always return lchan[0] for that). Instead of the brain damaged lchan args, use a ts arg across all dyn_ts_switchover_*() functions, with one exception: The dyn_ts_switchover_complete() actually receives an RSL activation ack message on a specific lchan and needs to evaluate its lchan type. This will always be lchan[0] as it is now, but we should stick with the lchan the message was sent for. For PDCH, a check to use lchan[0] already existed, when composing the ACT message in rsl_chan_activate_lchan_as_pdch(). Replace with an assertion. Adjust all callers to pass ts instead of lchan. In dyn_ts_switchover_start(), there was a dead code check that jumps to switchover_complete() in case the pchan already matches. This never hits, because we only call dyn_ts_switchover_start() when pchans mismatch. So avoid guessing at passing lchan[0] to dyn_ts_switchover_complete() by not calling it at all but logging an error instead. In rsl_chan_activate_lchan(), we remember some values before going into switchover from PDCH. Explicitly store them in lchan[0], because after a PDCH release we have always and will activate no other than lchan[0]. In dyn_ts_switchover_continue(), move the check for any existing lchan->rqd_ref further above, and more correctly check all lchans that were so far valid on the TS, instead of just one. This partly prepares for a subsequent commit to fix the act_timer use for dyn TS: with the old lchan arg, we might schedule an activation timer on lchan[1] but receive an ack on lchan[0] (for PDCH), leading to an act_timer expiry. Change-Id: I3f5d48a9bdaa49a42a1908d4a03744638c59796a
2016-08-27dyn TS: fix error recovery: switch to PDCH after lchan error stateNeels Hofmeyr1-0/+3
Tested by hacking a CHAN ACT ACK delay of a couple of seconds into osmo-bts' rsl.c for the first TCH_H lchan: [[[ diff --git a/src/common/rsl.c b/src/common/rsl.c index 3c97af9..4bfd27a 100644 --- a/src/common/rsl.c +++ b/src/common/rsl.c @@ -559,6 +559,22 @@ static int rsl_tx_chan_act_ack(struct gsm_lchan *lchan) return abis_bts_rsl_sendmsg(msg); } +struct osmo_timer_list xxx_timer; + +static void xxx_timer_cb(void *data) +{ + rsl_tx_chan_act_ack(data); +} + +static int rsl_tx_chan_act_ack_later(struct gsm_lchan *lchan) +{ + xxx_timer.cb = xxx_timer_cb; + xxx_timer.data = lchan; + osmo_timer_schedule(&xxx_timer, 10, 0); + return 0; +} + + /* 8.4.7 sending HANDOver DETection */ int rsl_tx_hando_det(struct gsm_lchan *lchan, uint8_t *ho_delay) { @@ -614,6 +630,18 @@ int rsl_tx_chan_act_acknack(struct gsm_lchan *lchan, uint8_t cause) if (cause) return rsl_tx_chan_act_nack(lchan, cause); + + static int xxx = 0; + + DEBUGP(DRSL, "%s XXXXXXXXXXXXXXXXXXXXX %d %s\n", + gsm_lchan_name(lchan), xxx, gsm_lchant_name(lchan->type)); + + if (lchan->type == GSM_LCHAN_TCH_H) { + if (!xxx) { + xxx ++; + return rsl_tx_chan_act_ack_later(lchan); + } + } return rsl_tx_chan_act_ack(lchan); } ]]] Change-Id: Ie82dec9c9fefc476fdf5b5afdad2246b9d6fe304
2016-08-27dyn TS: move check whether to switch to PDCH to separate functionNeels Hofmeyr1-17/+33
Prepares for an upcoming commit using the same check in error_timeout_cb(). Change-Id: I8abfa964631040f798212cc3e360f67f9e09b7c5
2016-08-27libmsc: add missing count of sms no receiver when using smpp_firstAlexander Couzens1-1/+3
Change-Id: I20ecb3299d67dbaa7b016620685997db49970ffb
2016-08-27libbsc/libmsc: convert old osmo counter into rate_ctrgsAlexander Couzens11-140/+152
rate counters support the export to statsd and can have a delta value. Change-Id: Ie749cebd53a0bb618d0e23d375885712078bf8dd
2016-08-27sgsn: add statistics counter for LLC packetsAlexander Couzens3-0/+15
new counters are: llc.dl_bytes llc.ul_bytes llc.dl_packets llc.ul_packets The ip payload bytes are waiting for payload compression because those data are known then. Change-Id: I068376d35e84283cb98523cd3097a12c55cdb709
2016-08-27move ts_sublots() to gsm_data_shared.c, it will be used by osmo-btsNeels Hofmeyr4-27/+27
Change-Id: I8ba06d7dd6e0ceab3d8d18bb565354d6ed461f7e
2016-08-27chan_alloc.c: use ts_subslots() instead of subslots_per_pchan[]Neels Hofmeyr1-2/+2
The array will move to gsm_data_shared.c; to prepare, use the function instead. Change-Id: Icbea7dbd78abf6144e5291f531a97f96507d8cbf
2016-08-27dyn TS: bts_chan_load: use correct nr of subslots for dyn tsNeels Hofmeyr1-1/+3
For TCH/F_TCH/H_PDCH dynamic timeslots, the ts->pchan does not lead to a meaningful value from the subslots_per_pchan[] array. Use the ts_subslots() function instead, which checks for dyn pchan. Change-Id: I659acebca82dfb3e305433471be64e9d27439af8
2016-08-22comment: gsm48_gmm_sendmsg(): add spec reference on encryptableNeels Hofmeyr1-1/+3
Change-Id: I54a3bc518bc38e38b78f6e9ea3705e4fbd5ffb98
2016-08-15ci: Attempt to disable doxygen warnings of dependenciesHolger Hans Peter Freyther1-2/+3
We do not want to see doxygen warnings when building the libosmocore dependency. Change-Id: I4640cb5b91d54641e8e5b2f096c3bca49bfff60e
2016-08-11Add web proxy for control interfaceMax1-0/+147
Add web application exposing Control Interface over web. All of SET, GET and TRAP are fully supported. Notice: TRAP is converted into 'Server-sent events' according to RFC 6202, see also https://www.w3.org/TR/eventsource/ - this requires corresponding client. Due to use of special prefix modified version of python eventsource-client is necessary ATM. Change-Id: I87d40c80061f8b3d02d656ab8cadabbfb871b461 Related: OS#1646
2016-08-11Add python functions to get/set ctrl variablesMax1-4/+27
Add get_var and set_var functions which handle requested variable while checking for proper response and id. Split header handling into separate function. Change-Id: I08705963c277bd93a011193dd7451a626d606c21 Related: OS#1646
2016-08-11Use random operation idMax1-8/+10
According to documentation for Control Interface Protocol <id> is "A numeric identifier, uniquely identifying this particular operation", hence it's best to be illustrated with random integer - use it as default. Fix override of id with previously used python-specific objects' id. Change-Id: I32236c067360526f4e7ee4bbdba64c5137de696d Related: OS#1646
2016-08-10gsm_pchan2chan_nr(): fix uninitialized cbitsNeels Hofmeyr1-6/+5
Commit ec1b5a0e9e2b6549e0ede48e803095e569997355 introduced an unset cbits value for the 'special hack for BCCH', where I break out of the switch without setting cbits. Fix that. Also remove the comment part that says 'return 0', because I don't return 0. Change-Id: I54129d921807971eeafc23f80c57666c67b71377
2016-08-10gsm_pchan2chan_nr: disable a chan_nr assert in BTS, to not break octphyNeels Hofmeyr1-0/+10
In https://gerrit.osmocom.org/589 , msuraev reports an assertion on octphy. So disable this recently added assertion until we clarify the invocation in question. Change-Id: Ia0f7ae5b114e179ab56b98adbae9810e81b4b88f
2016-08-08add .mailmap file for mapping git author name/mail in shortlogHarald Welte1-0/+12
Change-Id: I7ed97fb897895935f942e3eb4fd87a8c138417be
2016-08-08add example config for sysmobtsHarald Welte1-0/+77
Many years ago, there was no difference between the libbsc support for nanobts and sysmobts. However, this is not the case for a long time anymore, and there are some specifics in OsmoNITB when it comes to sysmobts. Let's have an example config file Change-Id: I94ae57c9a3cb497ca39d56270fa15ed65d7f147e
2016-07-29Improve code re-useMax1-58/+59
Introduce explicit __main__ function to facilitate re-use of defined python functions for ctrl interface. Change-Id: I9bad8f0dd1d69bd28816bf047d85840e3411bb9c Related: OS#1646
2016-07-28dyn TS: OS#1778 workaround: disable TCH/F on dyn TS for nitbNeels Hofmeyr4-1/+21
To avoid two phones picking mismatching TCH pchans, never pick TCH/F on dynamic TS in osmo-nitb. Add gsm_network flag dyn_ts_allow_tch_f, set to true by default in gsm_network_init(). Set this flag to false in osmo-nitb's main(). See http://osmocom.org/issues/1778 Reasoning about ways to solve this: * a compile time switch doesn't work because libbsc is first compiled and then linked to both osmo-nitb and osmo-bsc. * we could test net->bsc_api == msc_bsc_api(), but I have the so-called MSC split waiting on branch sysmocom/cscn, which will result in msc_bsc_api() not being linked in the osmo-bsc binary. * have a function am_i_nitb() with different implementations in osmo-nitb and osmo-bsc, but then we'd need to add implementations to all tests and other binaries linking lchan_alloc(). * have a flag in struct bsc_api, but so far there are only function pointers there. Having a "global" flag in gsm_network allows to add a VTY command in case we decide to keep this feature (#1781), has no linking implications and is nicely explicit. Tested that osmo-bsc still picks TCH/F on dyn TS indirectly, since I have no standalone MSC available: when compiling osmo-nitb with the line that sets dyn_ts_allow_tch_f = false commented out, TCH/F is picked as described in OS#1778; and by printf-verifying that dyn_ts_allow_tch_f == true in osmo-bsc main(), only osmo-nitb should have TCH/F disabled. Related: OS#1778, OS#1781 Change-Id: If7e4797a72815fc6e2bbef27756ea5df69f4bde7
2016-07-28dyn TS: Rename bsc_dyn_pdch.c to bsc_dyn_ts.cNeels Hofmeyr2-1/+1
It's no longer just for IPAC style TCH/F_PDCH, but also contains code for TCH/F_TCH/H_PDCH, so pick a more general name. Change-Id: Ic19db81eca03fd72738839ee3686b6b4c8b6b437
2016-07-28dyn TS: split dyn_pdch_init() for new dyn type and renameNeels Hofmeyr4-14/+41
Init both TCH/F_PDCH and TCH/F_TCH/H_PDCH via dyn_ts_init(), which refactors dyn_pdch_init(). Make dyn_ts_switchover_start from abis_rsl.c public in abis_rsl.h, so we can start the initial switchover to PDCH from dyn_ts_init(); in abis_rsl.h include gsm_utils.h for enum gsm_phys_chan_config. Change-Id: I5c0b257ba8ff0e9c9a2268681a84b0681a778368
2016-07-28dyn TS: implement pchan switchover logicNeels Hofmeyr4-1/+351
In struct gsm_lchan, add dyn.rqd_ref and dyn.rqd_ta. These save the Channel Requested details across the PDCH deactivation dance. abis_rsl.c: add static functions: * dyn_ts_switchover*() for the various stages of switchover between pchans. * pchan_for_lchant() to derive the desired pchan from the lchan type that was set during lchan_alloc(). * rsl_chan_activate_lchan_as_pdch() to compose the simpler RSL CHAN ACT message without introducing numerous special cases to the normal RSL CHAN ACT code. In rsl_chan_activate_lchan(), detect and initiate required pchan switchovers if requested pchan on a dyn TS differs. In rsl_rx_rf_chan_rel_ack(), initiate or continue pchan switchovers after a channel was released. In rsl_rx_chan_act_ack(), notice that a switchover is complete. In chan_alloc.c, add ts_subslots(): abis_rsl.c will need to know the number of subslots per pchan, to verify that all lchans are free before dyn TS switchover. The subslots_per_pchan[] array is static to lchan_alloc.c, and since we need a non-trivial check for dyn TS anyway, add public ts_subslots() to lchan_alloc.c, which also checks the current dyn pchan type. Change-Id: I5c6bce13092a10204113d84678c587c65e35e4fd
2016-07-28dyn TS: chan act: set chan_nr according to dyn pchan typeNeels Hofmeyr1-2/+6
Change-Id: Ica5ef2197b3e97d5e895f3e3221295d5d0ef8908
2016-07-28dyn TS: enhance channel allocator for dynamic TSNeels Hofmeyr1-7/+120
Change _lc_find_bts() to _lc_dyn_find_bts() with added dyn_as_pchan arg to pass exactly as which pchan we'd like to allocate on a dynamic TS. Add _lc_find_bts() as wrapper so non-dynamic-TS callers remain unchanged. Also add dyn_as_pchan arg to _lc_find_trx() (not renaming to dyn and wrapping because there is only one caller). Implement dynamic allocator logic in _lc_find_trx() and lchan_alloc(). A returned dynamic channel still needs to be switched to the proper mode, which will follow in another commit. Replace a fixme comment with a normal comment in subslots_per_pchan[], because handling of dynamic TS is now defined. Change-Id: I18da7679300c43220d9baa6a304e8df74d366249
2016-07-28dyn TS: rsl_lchan_lookup(): add dyn PCHANNeels Hofmeyr1-2/+12
Accept GSM_PCHAN_TCH_F_TCH_H_PDCH for TCH/F and TCH/H if in matching pchan mode or switching to matching pchan. Accept RSL_CHAN_OSMO_PDCH chan_nr cbits for GSM_PCHAN_TCH_F_TCH_H_PDCH pchan. Change-Id: If8f7c118f69e5a9f370bfe25f82f3d5a8de75b51
2016-07-28dyn TS: verify_chan_comb(): handle new dyn TS NM_CHANC_*Neels Hofmeyr1-0/+3
Change-Id: I7ce754a48c7f492e921a4450745383bb8dd7225c
2016-07-28dyn TS: rsl *2chan_nr(): handle TCH/F_TCH/H_PDCHNeels Hofmeyr1-0/+7
In gsm_lchan2chan_nr() use the current pchan type. In gsm_lchan_as_pchan2chan_nr(), add the special case of non-standard cbits for activating PDCH on a TCH/F_TCH/H_PDCH dyn TS. This way, gsm_pchan2chan_nr() conforms to the standard and does not need access to a ts struct. Change-Id: If248b9073b9f397110a2003d8e1a04afdc1c0e20
2016-07-28dyn TS: gsm_lchan2chan_nr(): decouple from ts->pchanNeels Hofmeyr3-6/+16
For upcoming dynamic TS, the pchan choice for RSL De-/Activation is not trivial. So in order to pass the desired pchan to generate the RSL chan_nr, introduce gsm_lchan_as_pchan2chan_nr(). To avoid code dup, this requires decoupling the gsm_ts2chan_nr() pchan from the actual ts struct, so refactor gsm_ts2chan_nr() to gsm_pchan2chan_nr() with explicit pchan, ts_nr and lchan_nr arguments. Change-Id: I1a40e8452fe8120d350a27973e56be0b8c8c517f
2016-07-28dyn TS: rename lchan->dyn_pdch to lchan->dynNeels Hofmeyr2-5/+5
This will also be used by the new dynamic TS type, so make the name more general. Change-Id: I2451b10519dff3e5cdf503b430574c0984d19000
2016-07-28prepare dyn TS: act lchan: fetch the channel mode a bit laterNeels Hofmeyr1-8/+8
Dyn TS will add a new type of chan activation, which does not need a Channel Mode IE. Incidentally, the dyn PDCH also doesn't need this IE if it opts for sending a PDCH ACT instead. So it makes sense to compose the Channel Mode IE only after the dynamic decisions are done. Change-Id: I66d88ad6a4ae7bee1e552960fd4e92aff953125c
2016-07-28error log: rsl_chan_activate_lchan: log channel mode errorNeels Hofmeyr1-1/+5
Change-Id: I0f403b13ff9897770c0b855bf57a9440717b46e8
2016-07-28cosmetic: dyn_pdch_init(): debug log: use new gsm_ts_and_pchan_name()Neels Hofmeyr1-4/+4
Change-Id: I396c2696bdbedb41a1f1fe2183f8eada57dc3413
2016-07-28gsm_ts2chan_nr(): add assertions for lchan_nrNeels Hofmeyr1-0/+14
Change-Id: Ibfdef347c85d4a145645a7325cd193ea1b475a54
2016-07-28Modify SI 13 field to support 11 bit RACHbhargava5-1/+43
System Information 13 field EGPRS PACKET CHANNEL REQUEST is modified to support 11 bit RACH. Further VTY configuration is added to enable/disable 11 bit RACH support in EGPRS. By default 11 bit RACH support is disabled. Change-Id: I51357bec936c28a26ab9ff5d59e0e30ca3363297
2016-07-28debug log: fix line endings for abis_rsl_rx_rll loggingNeels Hofmeyr1-0/+3
This function outputs a debug log without line ending, which should be completed by a subsequent DEBUGPC(), so complete the started log line where missing in three of the switch cases. The three cases do print another log message, but since these don't start on a new line when RLL is in debug level, the log output for these is hard(er) to read without this patch. Change-Id: I355647e77e1b2d8e75ae1a167fe87a507a38d82d
2016-07-27Fix default subscriber regexpMax1-1/+1
Incorrect regular expression used by default to authorize all subscribers to implement authorization policy 'accept-all' prevented MS from camping on the open network. Change-Id: I20284b3d40ecf4ca1e67d8cd25afb8d5e4ae3025
2016-07-25log lchan_alloc() resultNeels Hofmeyr1-0/+8
It is particularly interesting to see whether a given lchan type is allocated on a dynamic timeslot. Change-Id: I8a0bca6d9cd583a0988e5ee8f4e6f74f218f4185
2016-07-25error log: abis_rsl.c: log errors in channel_mode_from_lchan()Neels Hofmeyr1-0/+12
Change-Id: Ifa416eab76e6c26dc83e979d815ae778d0d7133b
2016-07-25code dup: join [rsl_]lchan_lookup() from libbsc and osmo-btsNeels Hofmeyr3-42/+61
lchan_lookup in abis_rsl.c and rsl_lchan_lookup() from osmo-bts rsl.c are the same code, except for the log context, which is only set in abis_rsl.c. Factor out the common code to rsl_lchan_lookup() in gsm_data_shared.c. Openbsc and osmo-bts each define their own DRSL log constant, so add an int *rc return code argument and keep the logging part in abis_rsl.c's thin lchan_lookup() wrapper. Incidentally, this also removes code dup for logging. To avoid duplicate symbols, the rsl_lchan_lookup() implementation needs to be removed from osmo-bts, so older osmo-bts git revisions will not build with this. Change-Id: Ie89bc5bb9110a0e539d37991dedac6f913211b48
2016-07-25gsm_data_shared: add gsm_ts_and_pchan_name() for dyn ts loggingNeels Hofmeyr2-0/+50
Change-Id: I9b6be77c9e5fb9dffa2021a2da72293af15a03a0
2016-07-25dyn TS: add ts->dyn stateNeels Hofmeyr2-0/+8
Add state fields osmo_bts_trx_ts->dyn.* to record dynamic timeslot state. Initialize in gsm_bts_trx_alloc(). Change-Id: I0a4049df8500b4f7c864f1355c4e9238932d1b8f
2016-07-25cosmetic: rsl_rx_chan_act_ack(): use local lchan var in 14 instancesNeels Hofmeyr1-14/+15
In preparation for an upcoming change. Change-Id: I9ce71fd7dde42ad7d20f806ac70c150d11450efa