This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/osmocom-net-gprs@lists.osmocom.org/.
Bhargava Abhyankar Bhargava.Abhyankar at radisys.comEncode the EGPRS immediate assignment message in uplink when EGPRS is enabled. --- src/bts.cpp | 2 +- src/encoding.cpp | 53 +++++++++++++++++++++++++++++++++++++++++-------- src/encoding.h | 5 +++-- tests/edge/EdgeTest.cpp | 3 ++- 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/bts.cpp b/src/bts.cpp index 2166132..2c23192 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -536,7 +536,7 @@ int BTS::rcv_rach(uint16_t ra, uint32_t Fn, int16_t qta, uint8_t is_11bit, plen = Encoding::write_immediate_assignment( tbf, immediate_assignment, 0, ra, Fn, ta, m_bts.trx[trx_no].arfcn, ts_no, tsc, usf, 0, sb_fn, - m_bts.alpha, m_bts.gamma, -1); + m_bts.alpha, m_bts.gamma, -1, burst); if (plen >= 0) { pcu_l1if_tx_agch(immediate_assignment, plen); diff --git a/src/encoding.cpp b/src/encoding.cpp index 6c50abe..3292c2a 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -19,9 +19,9 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include <bts.h> #include <encoding.h> #include <gprs_rlcmac.h> -#include <bts.h> #include <tbf.h> #include <gprs_debug.h> @@ -140,11 +140,48 @@ 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) + uint8_t alpha, uint8_t gamma, int8_t ta_idx, + enum ph_burst_type burst) { - LOGP(DRLCMACUL, LOGL_ERROR, - "EGPRS Packet Uplink Assignment is not yet implemented\n"); - return -EINVAL; + bitvec_write_field(dest, wp, 1, 2); /* LH */ + bitvec_write_field(dest, wp, 0, 2); /* 0 EGPRS Uplink Assignment */ + bitvec_write_field(dest, wp, 0, 5); /* Extended RA **todo** */ + bitvec_write_field(dest, wp, 0, 1); /* Access technology Request */ + + unsigned int ws_enc = (tbf->m_window.ws() - 64) / 32; + + bitvec_write_field(dest, wp, 1, 1); /* single block alloc */ + bitvec_write_field(dest, wp, tbf->tfi(), 5);/* TFI assignment */ + bitvec_write_field(dest, wp, 0, 1); /* polling bit */ + bitvec_write_field(dest, wp, usf, 3); /* USF bit */ + bitvec_write_field(dest, wp, 0, 1); /* USF granularity */ + bitvec_write_field(dest, wp, 0, 1); /* P0 */ + + if (burst == GSM_L1_BURST_TYPE_ACCESS_1) { /* 8-PSK RACH*/ + bitvec_write_field(dest, wp, tbf->current_cs(). + to_num()-1, 4); /*mcs*/ + } else { + bitvec_write_field(dest, wp, GprsCodingScheme::MCS1, 4); /*mcs*/ + } + + bitvec_write_field(dest, wp, tbf->tlli(), 1); /* tlli channel block */ + bitvec_write_field(dest, wp, 0, 1); /* BEP period present */ + bitvec_write_field(dest, wp, 0, 1); /* resegmentation */ + bitvec_write_field(dest, wp, ws_enc, 5);/* egprs window_size */ + + if (alpha) { + bitvec_write_field(dest, wp, 0x1, 1); /* ALPHA =yes */ + bitvec_write_field(dest, wp, alpha, 4); /* ALPHA */ + bitvec_write_field(dest, wp, gamma, 5); /* GAMMA power contrl */ + } else { + bitvec_write_field(dest, wp, 0x0, 1); /* ALPHA = no */ + } + + bitvec_write_field(dest, wp, 0, 1); /* TIMING_ADVANCE_INDEX */ + bitvec_write_field(dest, wp, 0, 1); /* TBF_STARTING_TIME_FLAG */ + bitvec_write_field(dest, wp, 0, 1); /* NULL */ + + return 0; } /* @@ -153,10 +190,10 @@ static int write_ia_rest_egprs_uplink( */ int Encoding::write_immediate_assignment( struct gprs_rlcmac_tbf *tbf, - bitvec * dest, uint8_t downlink, uint8_t ra, + bitvec * dest, uint8_t downlink, uint16_t ra, uint32_t ref_fn, uint8_t ta, uint16_t arfcn, uint8_t ts, uint8_t tsc, uint8_t usf, uint8_t polling, uint32_t fn, uint8_t alpha, - uint8_t gamma, int8_t ta_idx) + uint8_t gamma, int8_t ta_idx, enum ph_burst_type burst) { unsigned wp = 0; int plen; @@ -209,7 +246,7 @@ int Encoding::write_immediate_assignment( 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); + alpha, gamma, ta_idx, burst); else rc = write_ia_rest_uplink(as_ul_tbf(tbf), dest, wp, usf, fn, diff --git a/src/encoding.h b/src/encoding.h index 94e9a02..079332d 100644 --- a/src/encoding.h +++ b/src/encoding.h @@ -40,11 +40,12 @@ class Encoding { public: static int write_immediate_assignment( struct gprs_rlcmac_tbf *tbf, - bitvec * dest, uint8_t downlink, uint8_t ra, + bitvec * dest, uint8_t downlink, uint16_t ra, uint32_t ref_fn, uint8_t ta, uint16_t arfcn, uint8_t ts, uint8_t tsc, uint8_t usf, uint8_t polling, uint32_t fn, uint8_t alpha, uint8_t gamma, - int8_t ta_idx); + int8_t ta_idx, + enum ph_burst_type burst = GSM_L1_BURST_TYPE_ACCESS_0); static void write_packet_uplink_assignment( struct gprs_rlcmac_bts *bts, diff --git a/tests/edge/EdgeTest.cpp b/tests/edge/EdgeTest.cpp index 96ea0c1..9138ae7 100644 --- a/tests/edge/EdgeTest.cpp +++ b/tests/edge/EdgeTest.cpp @@ -23,7 +23,6 @@ #include "gprs_debug.h" #include "gprs_coding_scheme.h" #include "decoding.h" -#include "encoding.h" #include "rlc.h" #include "llc.h" @@ -35,10 +34,12 @@ extern "C" { #include <osmocom/core/talloc.h> #include <osmocom/core/utils.h> #include <osmocom/vty/vty.h> +#include <osmocom/gsm/l1sap.h> } #include <errno.h> #include <string.h> +#include "encoding.h" void *tall_pcu_ctx; int16_t spoof_mnc = 0, spoof_mcc = 0; -- 2.5.0