diff options
author | Alexander Couzens <lynxis@fe80.eu> | 2016-12-02 18:22:58 +0100 |
---|---|---|
committer | Alexander Couzens <lynxis@fe80.eu> | 2016-12-02 18:22:58 +0100 |
commit | 48dd4a591b6bcb1526dca34c6643e69641096425 (patch) | |
tree | c05d3088ba5ff16761a5f16d55ee6280d339a5c1 | |
parent | 8491ded354fc033ae3d3c2677951d037c1fa3619 (diff) |
implement direct TLLI in immediate assignments over AGCH
Ericsson allows to attach a reference to immediate assignments. A
confirmation of the transmission is then sent back, but only containing
the reference, not the whole RLC packet.
Change-Id: I000984d92de2017bf2d1619b42a75e6f28388f87
-rw-r--r-- | include/osmocom/pcu/pcuif_proto.h | 3 | ||||
-rw-r--r-- | src/bts.cpp | 10 | ||||
-rw-r--r-- | src/bts.h | 1 | ||||
-rw-r--r-- | src/pcu_l1_if.cpp | 11 | ||||
-rw-r--r-- | src/pcu_l1_if.h | 2 | ||||
-rw-r--r-- | src/pcu_vty.c | 13 |
6 files changed, 37 insertions, 3 deletions
diff --git a/include/osmocom/pcu/pcuif_proto.h b/include/osmocom/pcu/pcuif_proto.h index f6e167af..f29e2b6e 100644 --- a/include/osmocom/pcu/pcuif_proto.h +++ b/include/osmocom/pcu/pcuif_proto.h @@ -3,7 +3,7 @@ #include <osmocom/gsm/l1sap.h> -#define PCU_IF_VERSION 0x07 +#define PCU_IF_VERSION 0x08 /* msg_type */ #define PCU_IF_MSG_DATA_REQ 0x00 /* send data to given channel */ @@ -25,6 +25,7 @@ #define PCU_IF_SAPI_PDTCH 0x05 /* packet data/control/ccch block */ #define PCU_IF_SAPI_PRACH 0x06 /* packet random access channel */ #define PCU_IF_SAPI_PTCCH 0x07 /* packet TA control channel */ +#define PCU_IF_SAPI_AGCH_DT 0x08 /* assignment on AGCH but with additional TLLI */ /* flags */ #define PCU_IF_FLAG_ACTIVE (1 << 0)/* BTS is active */ diff --git a/src/bts.cpp b/src/bts.cpp index 8e60a571..773b7a13 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -647,7 +647,10 @@ int BTS::rcv_rach(uint16_t ra, uint32_t Fn, int16_t qta, uint8_t is_11bit, if (plen >= 0) { immediate_assignment_ul_tbf(); - pcu_l1if_tx_agch(immediate_assignment, plen); + if (this->bts_data()->use_direct_tlli) + pcu_l1if_tx_agch_dt(tbf->tlli(), immediate_assignment, plen); + else + pcu_l1if_tx_agch(immediate_assignment, plen); } bitvec_free(immediate_assignment); @@ -778,7 +781,10 @@ void BTS::snd_dl_ass(gprs_rlcmac_tbf *tbf, uint8_t poll, const char *imsi) tbf->poll_fn, m_bts.alpha, m_bts.gamma, -1); if (plen >= 0) { immediate_assignment_dl_tbf(); - pcu_l1if_tx_agch(immediate_assignment, plen); + if (this->bts_data()->use_direct_tlli) + pcu_l1if_tx_agch_dt(tbf->tlli(), immediate_assignment, plen); + else + pcu_l1if_tx_agch(immediate_assignment, plen); } bitvec_free(immediate_assignment); @@ -158,6 +158,7 @@ void bts_update_tbf_ta(const char *p, uint32_t fn, uint8_t trx_no, uint8_t ts, */ struct gprs_rlcmac_bts { uint8_t bsic; + uint8_t use_direct_tlli; uint8_t fc_interval; uint16_t fc_bucket_time; uint32_t fc_bvc_bucket_size; diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp index a72c6b2c..1c5aa4b7 100644 --- a/src/pcu_l1_if.cpp +++ b/src/pcu_l1_if.cpp @@ -172,6 +172,17 @@ void pcu_l1if_tx_agch(bitvec * block, int plen) pcu_tx_data_req(0, 0, PCU_IF_SAPI_AGCH, 0, 0, 0, data, sizeof(data)); } +void pcu_l1if_tx_agch_dt(uint32_t tlli, bitvec * block, int plen) +{ + uint8_t data[27]; /* prefix tlli and PLEN */ + memcpy(data, &tlli, sizeof(uint32_t)); + + /* FIXME: why does OpenBTS has no PLEN and no fill in message? */ + bitvec_pack(block, data + 5); + data[4] = (plen << 2) | 0x01; + pcu_tx_data_req(0, 0, PCU_IF_SAPI_AGCH_DT, 0, 0, 0, data, sizeof(data)); +} + void pcu_l1if_tx_pch(bitvec * block, int plen, const char *imsi) { uint8_t data[23+3]; /* prefix PLEN */ diff --git a/src/pcu_l1_if.h b/src/pcu_l1_if.h index d9d970da..0826075f 100644 --- a/src/pcu_l1_if.h +++ b/src/pcu_l1_if.h @@ -120,6 +120,8 @@ void pcu_l1if_tx_pdtch(msgb *msg, uint8_t trx, uint8_t ts, uint16_t arfcn, void pcu_l1if_tx_ptcch(msgb *msg, uint8_t trx, uint8_t ts, uint16_t arfcn, uint32_t fn, uint8_t block_nr); void pcu_l1if_tx_agch(bitvec * block, int len); +/* same as agch but has tlli prefixed */ +void pcu_l1if_tx_agch_dt(uint32_t tlli, bitvec * block, int len); void pcu_l1if_tx_pch(bitvec * block, int plen, const char *imsi); diff --git a/src/pcu_vty.c b/src/pcu_vty.c index 535d512b..fa250d88 100644 --- a/src/pcu_vty.c +++ b/src/pcu_vty.c @@ -741,6 +741,18 @@ DEFUN(show_bts_stats, return CMD_SUCCESS; } +DEFUN(cfg_pcu_use_direct_tlli, + cfg_pcu_use_direct_tlli_cmd, + "use-direct-tlli <0-1>", + "use direct tlli message when sending AGCH message.\n") +{ + struct gprs_rlcmac_bts *bts = bts_main_data(); + + bts->use_direct_tlli = atoi(argv[0]); + + return CMD_SUCCESS; +} + #define IDLE_TIME_STR "keep an idle DL TBF alive for the time given\n" DEFUN(cfg_pcu_dl_tbf_idle_time, cfg_pcu_dl_tbf_idle_time_cmd, @@ -958,6 +970,7 @@ int pcu_vty_init(const struct log_info *cat) install_node(&pcu_node, config_write_pcu); install_element(CONFIG_NODE, &cfg_pcu_cmd); vty_install_default(PCU_NODE); + install_element(PCU_NODE, &cfg_pcu_use_direct_tlli_cmd); install_element(PCU_NODE, &cfg_pcu_egprs_cmd); install_element(PCU_NODE, &cfg_pcu_no_egprs_cmd); install_element(PCU_NODE, &cfg_pcu_no_two_phase_cmd); |