aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Couzens <lynxis@fe80.eu>2016-12-02 18:22:58 +0100
committerAlexander Couzens <lynxis@fe80.eu>2016-12-02 18:22:58 +0100
commit48dd4a591b6bcb1526dca34c6643e69641096425 (patch)
treec05d3088ba5ff16761a5f16d55ee6280d339a5c1
parent8491ded354fc033ae3d3c2677951d037c1fa3619 (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.h3
-rw-r--r--src/bts.cpp10
-rw-r--r--src/bts.h1
-rw-r--r--src/pcu_l1_if.cpp11
-rw-r--r--src/pcu_l1_if.h2
-rw-r--r--src/pcu_vty.c13
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);
diff --git a/src/bts.h b/src/bts.h
index e8118dd6..1074bc22 100644
--- a/src/bts.h
+++ b/src/bts.h
@@ -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);