diff options
-rw-r--r-- | src/bts.cpp | 2 | ||||
-rw-r--r-- | src/encoding.cpp | 85 | ||||
-rw-r--r-- | src/encoding.h | 10 |
3 files changed, 85 insertions, 12 deletions
diff --git a/src/bts.cpp b/src/bts.cpp index 015bf9f..73ec1f7 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -556,7 +556,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_type, sb); if (plen >= 0) { pcu_l1if_tx_agch(immediate_assignment, plen); diff --git a/src/encoding.cpp b/src/encoding.cpp index 41e0d10..7d3fa14 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -147,11 +147,71 @@ 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_type, uint16_t ra) { - LOGP(DRLCMACUL, LOGL_ERROR, - "EGPRS Packet Uplink Assignment is not yet implemented\n"); - return -EINVAL; + unsigned int ws_enc = 0; + uint8_t extended_ra = 0; + + extended_ra = (ra & 0x1F); + + bitvec_write_field(dest, wp, 1, 2); /* LH */ + bitvec_write_field(dest, wp, 0, 2); /* 0 EGPRS Uplink Assignment */ + bitvec_write_field(dest, wp, extended_ra, 5); /* Extended RA */ + bitvec_write_field(dest, wp, 0, 1); /* Access technology Request */ + + if (tbf == NULL) { + + bitvec_write_field(dest, wp, 0, 1); /* multiblock allocation */ + + if (alpha) { + bitvec_write_field(dest, wp, 0x1, 1); /* ALPHA =yes */ + bitvec_write_field(dest, wp, alpha, 4); /* ALPHA */ + } else { + bitvec_write_field(dest, wp, 0x0, 1); /* ALPHA = no */ + } + + bitvec_write_field(dest, wp, gamma, 5); /* GAMMA power contrl */ + bitvec_write_field(dest, wp, (fn / (26 * 51)) % 32, 5);/* T1' */ + bitvec_write_field(dest, wp, fn % 51, 6); /* T3 */ + bitvec_write_field(dest, wp, fn % 26, 5); /* T2 */ + bitvec_write_field(dest, wp, 0, 2); /* Radio block allocation */ + + bitvec_write_field(dest, wp, 0, 1); + + } else { + + 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, 0, 1); /* constant */ + 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 */ + /* MCS */ + bitvec_write_field(dest, wp, tbf->current_cs().to_num()-1, 4); + /* tlli channel block */ + bitvec_write_field(dest, wp, tbf->tlli(), 1); + 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 */ + } else { + bitvec_write_field(dest, wp, 0x0, 1); /* ALPHA = no */ + } + + bitvec_write_field(dest, wp, gamma, 5); /* GAMMA power contrl */ + 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; } /* @@ -160,10 +220,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_type, uint8_t sb) { unsigned wp = 0; int plen; @@ -189,7 +249,13 @@ int Encoding::write_immediate_assignment( bitvec_write_field(dest, wp,arfcn,10); // ARFCN //10.5.2.30 Request Reference - bitvec_write_field(dest, wp,ra,8); // RA + if (((burst_type == GSM_L1_BURST_TYPE_ACCESS_1) || + (burst_type == GSM_L1_BURST_TYPE_ACCESS_2))) { + bitvec_write_field(dest, wp, 0x7f, 8); /* RACH value */ + } else { + bitvec_write_field(dest, wp, ra, 8); /* RACH value */ + } + bitvec_write_field(dest, wp,(ref_fn / (26 * 51)) % 32,5); // T1' bitvec_write_field(dest, wp,ref_fn % 51,6); // T3 bitvec_write_field(dest, wp,ref_fn % 26,5); // T2 @@ -213,10 +279,11 @@ int Encoding::write_immediate_assignment( rc = write_ia_rest_downlink(as_dl_tbf(tbf), dest, wp, polling, gsm48_ta_is_valid(ta), fn, alpha, gamma, ta_idx); - else if (as_ul_tbf(tbf) && as_ul_tbf(tbf)->is_egprs_enabled()) + else if (((burst_type == GSM_L1_BURST_TYPE_ACCESS_1) || + (burst_type == GSM_L1_BURST_TYPE_ACCESS_2))) rc = write_ia_rest_egprs_uplink(as_ul_tbf(tbf), dest, wp, usf, fn, - alpha, gamma, ta_idx); + alpha, gamma, ta_idx, burst_type, ra); 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 710de78..69f8cdc 100644 --- a/src/encoding.h +++ b/src/encoding.h @@ -23,6 +23,9 @@ #include <stdint.h> #include <gsm_rlcmac.h> #include <gprs_coding_scheme.h> +extern "C" { +#include <osmocom/gsm/l1sap.h> +} struct gprs_rlcmac_bts; struct gprs_rlcmac_tbf; @@ -40,11 +43,14 @@ 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_type = + GSM_L1_BURST_TYPE_ACCESS_0, + uint8_t sb = 1); static void write_packet_uplink_assignment( struct gprs_rlcmac_bts *bts, |