aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libbsc
AgeCommit message (Collapse)AuthorFilesLines
2016-09-26mscsplit: move subscriber conns list into struct gsm_networkNeels Hofmeyr2-7/+4
Replace the global sub_connections llist with gsm_network.subscr_conns. Initialize and apply where applicable. Remove bsc_api_sub_connections(), callers now access gsm_network->subscr_conns directly. This allows using the subscr_conns from libmsc without having to link libbsc. Change-Id: Ice2a7ca04910bcfaaff22539abe68a6349e8631c
2016-09-26mscsplit: bsc_init: don't pass telnet dummy connNeels Hofmeyr1-4/+1
We want to create the telnet for VTY only after reading the config file, and the dummy_conn was a workaround to be able to do so, but is not needed: gsmnet_from_vty() used to expect vty->priv to point to a gsm_network struct, but that is not actually the case anymore. It is using a static pointer to store the gsm_network struct instead. Change-Id: I51e7224c5a4cd5baf564bee871cf2fa6e885cda7
2016-09-23bts: extend bts_chan_load to allow counting tch onlyAlexander Couzens4-6/+29
Change-Id: I86f1d502649747b6b9aefcb39081b14110e8f494
2016-09-18cosmetic: various comment, whitespace tweaksNeels Hofmeyr1-1/+0
Change-Id: I131939cfba4d67d7e2c935341deeb14d09523fee
2016-09-18remove unused bsc_copyright from bsc_vty.cNeels Hofmeyr1-1/+0
Change-Id: I281791c0f57ca75ffe14431a3030811b2d224f0b
2016-09-17Modify SI 13 field for control_ack_typeMax3-2/+44
Add vty function to explicitly set use of 4xRACH type of ack message for PACKET CONTROL ACKNOWLEDGMENT. Previous hardcoded value (use RLC/MAC control block) is used as a default. This is handy for debugging issues related to Timing Advance in context of GPRS. Change-Id: Ie869ac0a82055110f1e3b875e246750c4e113336 Related: OS#1526
2016-09-17log causing rx event for lchan_lookup errorsNeels Hofmeyr1-8/+14
Add log_name to lchan_lookup() and pass such from the various RSL rx events that call it to validate the RSL chan_nr. Change-Id: Id81e7b8b9c27831923f050a78dfc7d650e687033
2016-09-17log: abis_rsl: don't log 'error' when there is no errorNeels Hofmeyr1-1/+5
The message 'RF Channel Release due error 0' keeps catching my eye because it says 'error' even though the error code is zero, i.e. no error. This shall end now. Change-Id: Ie0b9d62e8ce85a096c963931e0ae5527b8dc490a
2016-09-15Consistenly format variables in */Makefile.am filesAlexander Huemer1-25/+50
Change-Id: Ifa21513c007072314097b7bec188579972dc1694
2016-08-30bsc/netinit: correct mistyped rate counterAlexander Couzens1-1/+1
Introduced by b847a21fa48158b17c4f84c1ceeb3d143cffed8c Change-Id: I57c41f98e3826951a5071b005cb640c23d466477
2016-08-29libmsc/bsc: split rate counters into bsc and msc groupAlexander Couzens7-25/+26
Tweaked-By: Neels Hofmeyr <nhofmeyr@sysmocom.de> Change-Id: I7361033cd1eb919ec3c2ea2652f40ab8c75b2f99
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 Hofmeyr2-41/+55
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-27libbsc/libmsc: convert old osmo counter into rate_ctrgsAlexander Couzens7-54/+30
rate counters support the export to statsd and can have a delta value. Change-Id: Ie749cebd53a0bb618d0e23d375885712078bf8dd
2016-08-27move ts_sublots() to gsm_data_shared.c, it will be used by osmo-btsNeels Hofmeyr1-25/+0
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-07-28dyn TS: OS#1778 workaround: disable TCH/F on dyn TS for nitbNeels Hofmeyr2-1/+4
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 Hofmeyr3-13/+37
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 Hofmeyr2-1/+347
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: verify_chan_comb(): handle new dyn TS NM_CHANC_*Neels Hofmeyr1-0/+3
Change-Id: I7ce754a48c7f492e921a4450745383bb8dd7225c
2016-07-28dyn TS: gsm_lchan2chan_nr(): decouple from ts->pchanNeels Hofmeyr1-1/+1
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 Hofmeyr1-4/+4
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-28Modify SI 13 field to support 11 bit RACHbhargava3-1/+41
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 Hofmeyr1-42/+10
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-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
2016-07-25cosmetic: act lchan type: use constant instead of 0x00Neels Hofmeyr1-1/+1
Change-Id: Idc8afc4e52e189f474077899eef896381ce238f7
2016-07-25cosmetic: rsl_rx_rf_chan_rel_ack(): use local ts var for brevityNeels Hofmeyr1-5/+5
In preparation for an upcoming change. Change-Id: I11bd59492fa8d5b9392d9f2b511c8fa9585afe6c
2016-07-25comments: clarify some dynamic TS commentsNeels Hofmeyr2-6/+9
A new type of dynamic channel will be introduced soon, so prepare some comments to name the dynamic TS kind more specifically. Change-Id: I51fa8c2ebba507299e55a5cb7e67e48a6c8471f7
2016-07-17dyn pdch: don't PDCH ACT if gprs mode is noneNeels Hofmeyr2-2/+16
Skip PDCH activation if the GPRS mode is 'none' at: * TCH/F_PDCH init after OML Enable (dyn_pdch_init()) * after TCH/F_PDCH is released, in TCH/F mode * in the T3111 error timer callback after a TCH/F_PDCH was released in error state Assert the GPRS mode in rsl_ipacc_pdch_activate() to make sure all callers check the GPRS mode. Closes: OS#1765 Change-Id: I970e5f9dbcb1c625209e914a4c7696294ed34e62
2016-07-17cosmetic: dyn_pdch_init(): flatten if-logic, add commentsNeels Hofmeyr1-12/+12
Prepare for upcoming addition of heeding gprs mode == none. Change-Id: Id0fe6f762ac863c4d4053841c7732d011aa8c561
2016-07-09Make random MSISDN assignment optionalMax2-1/+13
Previously if subscriber was automatically created it got assigned random MSISDN number. Make it optional (defaulting to previous behavior) by adding following: * new optional no-extension argument for subscriber-create-on-demand vty command * db unit tests * vty test Note: using the db made with new code might result in subscribers with empty extension. Such subscribers cannot be deleted using old code. Make sure not to mix db versions or manually fix it by editing sqlite with external program. Fixes: OS#1658 Change-Id: Ibbc2e88e4722b08854ebc631485f19ed56443cbb
2016-07-09libbsc: skip channel state LCHAN_S_INACTIVE while handoverAlexander Couzens1-1/+0
The state is directly overwritten by the next function. Because there isn't any state transition, remove this state. Change-Id: I7f287692dbd559268fb5e61d81ac19e5dd4827eb