forked from cellular-infrastructure/osmo-pcu
PTCCH: implement basic message codec and API
Change-Id: Id79e95aafdde4a71977c64385fce48b729a51ca9 Related: OS#1545
This commit is contained in:
parent
0bf622e057
commit
bd0dac3783
|
@ -252,6 +252,7 @@ BTS::BTS()
|
|||
|
||||
for (size_t ts_no = 0; ts_no < ARRAY_SIZE(trx->pdch); ++ts_no) {
|
||||
struct gprs_rlcmac_pdch *pdch = &trx->pdch[ts_no];
|
||||
pdch->init_ptcch_msg();
|
||||
pdch->ts_no = ts_no;
|
||||
pdch->trx = trx;
|
||||
}
|
||||
|
|
35
src/pdch.cpp
35
src/pdch.cpp
|
@ -48,6 +48,7 @@ extern "C" {
|
|||
}
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
extern void *tall_pcu_ctx;
|
||||
|
@ -961,3 +962,37 @@ inline gprs_rlcmac_bts *gprs_rlcmac_pdch::bts_data() const
|
|||
{
|
||||
return trx->bts->bts_data();
|
||||
}
|
||||
|
||||
/* PTCCH (Packet Timing Advance Control Channel) */
|
||||
void gprs_rlcmac_pdch::init_ptcch_msg(void)
|
||||
{
|
||||
memset(ptcch_msg, PTCCH_TAI_FREE, PTCCH_TAI_NUM);
|
||||
memset(ptcch_msg + PTCCH_TAI_NUM, PTCCH_PADDING, 7);
|
||||
}
|
||||
|
||||
uint8_t gprs_rlcmac_pdch::reserve_tai(uint8_t ta)
|
||||
{
|
||||
uint8_t tai;
|
||||
|
||||
for (tai = 0; tai < PTCCH_TAI_NUM; tai++) {
|
||||
if (ptcch_msg[tai] == PTCCH_TAI_FREE) {
|
||||
ptcch_msg[tai] = ta;
|
||||
return tai;
|
||||
}
|
||||
}
|
||||
|
||||
/* Special case: no free TAI available */
|
||||
return PTCCH_TAI_FREE;
|
||||
}
|
||||
|
||||
void gprs_rlcmac_pdch::release_tai(uint8_t tai)
|
||||
{
|
||||
OSMO_ASSERT(tai < PTCCH_TAI_NUM);
|
||||
ptcch_msg[tai] = PTCCH_TAI_FREE;
|
||||
}
|
||||
|
||||
void gprs_rlcmac_pdch::update_ta(uint8_t tai, uint8_t ta)
|
||||
{
|
||||
OSMO_ASSERT(tai < PTCCH_TAI_NUM);
|
||||
ptcch_msg[tai] = ta;
|
||||
}
|
||||
|
|
18
src/pdch.h
18
src/pdch.h
|
@ -35,6 +35,11 @@ extern "C" {
|
|||
|
||||
#include <stdint.h>
|
||||
|
||||
/* PTCCH (Packet Timing Advance Control Channel) */
|
||||
#define PTCCH_TAI_FREE 0x7f /*!< Special value for unused TA Indexes */
|
||||
#define PTCCH_TAI_NUM 16 /*!< Number of PTCCH/U slots and thus TA Indexes */
|
||||
#define PTCCH_PADDING 0x2b /*!< PTCCH/D messages need to be padded to 23 octets */
|
||||
|
||||
/*
|
||||
* PDCH instance
|
||||
*/
|
||||
|
@ -88,6 +93,19 @@ struct gprs_rlcmac_pdch {
|
|||
struct llist_head paging_list; /* list of paging messages */
|
||||
uint32_t last_rts_fn; /* store last frame number of RTS */
|
||||
|
||||
/* PTCCH (Packet Timing Advance Control Channel) */
|
||||
uint8_t ptcch_msg[GSM_MACBLOCK_LEN]; /* 'ready to use' PTCCH/D message */
|
||||
#ifdef __cplusplus
|
||||
/* Initialize the PTCCH/D message */
|
||||
void init_ptcch_msg(void);
|
||||
/* Obtain an unused TA Index for a TBF */
|
||||
uint8_t reserve_tai(uint8_t ta);
|
||||
/* Mark a given TA Index as free, so it can be used again */
|
||||
void release_tai(uint8_t tai);
|
||||
/* Update the actual Timing Advance value for a given TA Index */
|
||||
void update_ta(uint8_t tai, uint8_t ta);
|
||||
#endif
|
||||
|
||||
/* back pointers */
|
||||
struct gprs_rlcmac_trx *trx;
|
||||
uint8_t ts_no;
|
||||
|
|
Loading…
Reference in New Issue