From be80c3670ec03f9fd15a8a2b82b77398751910b1 Mon Sep 17 00:00:00 2001 From: Jacob Erlbeck Date: Mon, 1 Feb 2016 16:39:52 +0100 Subject: edge: Support EGPRS in IMM ASSIGNMENT Tell the MS to use EGPRS if EGPRS is enabled on the TBF. Note that only downlink TBF will be supported so far. Thus single-phase uplink assignments may not work properly. Sponsored-by: On-Waves ehf --- src/encoding.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/encoding.cpp b/src/encoding.cpp index 7cabb714..e3e1245e 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -72,6 +72,14 @@ static int write_ia_rest_downlink( bitvec_write_field(dest, wp,0x0,1); // P0 not present // bitvec_write_field(dest, wp,0x1,1); // P0 not present // bitvec_write_field(dest, wp,0xb,4); + if (tbf->is_egprs_enabled()) { + /* see GMS 44.018, 10.5.2.16 */ + unsigned int ws_enc = (tbf->m_window.ws() - 64) / 32; + bitvec_write_field_lh(dest, wp, 1, 1); // "H" + bitvec_write_field(dest, wp, ws_enc,5); // EGPRS Window Size + bitvec_write_field(dest, wp, 0x0,2); // LINK_QUALITY_MEASUREMENT_MODE + bitvec_write_field(dest, wp, 0,1); // BEP_PERIOD2 not present + } return 0; } @@ -82,6 +90,8 @@ static int write_ia_rest_uplink( uint8_t usf, uint32_t fn, uint8_t alpha, uint8_t gamma, int8_t ta_idx) { + OSMO_ASSERT(!tbf || !tbf->is_egprs_enabled()); + // GMS 04.08 10.5.2.37b 10.5.2.16 bitvec_write_field_lh(dest, wp, 3, 2); // "HH" bitvec_write_field(dest, wp, 0, 2); // "0" Packet Uplink Assignment @@ -126,6 +136,17 @@ static int write_ia_rest_uplink( return 0; } +static int write_ia_rest_egprs_uplink( + gprs_rlcmac_ul_tbf *tbf, + bitvec * dest, unsigned& wp, + uint8_t usf, uint32_t fn, + uint8_t alpha, uint8_t gamma, int8_t ta_idx) +{ + LOGP(DRLCMACUL, LOGL_ERROR, + "EGPRS Packet Uplink Assignment is not yet implemented\n"); + return -EINVAL; +} + /* * Immediate assignment, sent on the CCCH/AGCH * see GSM 04.08, 9.1.18 and GSM 44.018, 9.1.18 + 10.5.2.16 @@ -185,6 +206,10 @@ int Encoding::write_immediate_assignment( rc = write_ia_rest_downlink(as_dl_tbf(tbf), dest, wp, polling, fn, alpha, gamma, ta_idx); + else if (as_ul_tbf(tbf) && as_ul_tbf(tbf)->is_egprs_enabled()) + rc = write_ia_rest_egprs_uplink(as_ul_tbf(tbf), dest, wp, + usf, fn, + alpha, gamma, ta_idx); else rc = write_ia_rest_uplink(as_ul_tbf(tbf), dest, wp, usf, fn, -- cgit v1.2.3