aboutsummaryrefslogtreecommitdiffstats
path: root/src/bts.h
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2021-01-14 16:48:38 +0100
committerPau Espin Pedrol <pespin@sysmocom.de>2021-01-19 16:28:10 +0100
commit2182e627cda3ada77a203f9549260046278caf0e (patch)
treef2f60225f1d1a037354dd6f946229bc7268433f0 /src/bts.h
parent793583ea2173c94b2dc779ab565fcf629a1d52b3 (diff)
Unify BTS into a C usable structure
Previous work on BTS class started to get stuff out of the C++ struct into a C struct (BTS -> struct gprs_glcmac_bts) so that some parts of it were accessible from C code. Doing so, however, ended up being messy too, since all code needs to be switching from one object to another, which actually refer to the same logical component. Let's instead rejoin the structures and make sure the struct is accessible and usable from both C and C++ code by rewriting all methods to be C compatible and converting 3 allocated suboject as pointers. This way BTS can internally still use those C++ objects while providing a clean APi to both C and C++ code. Change-Id: I7d12c896c5ded659ca9d3bff4cf3a3fc857db9dd
Diffstat (limited to 'src/bts.h')
-rw-r--r--src/bts.h324
1 files changed, 123 insertions, 201 deletions
diff --git a/src/bts.h b/src/bts.h
index b1f73b49..d3163700 100644
--- a/src/bts.h
+++ b/src/bts.h
@@ -20,11 +20,13 @@
#pragma once
+#include <pdch.h>
+#include <stdint.h>
+#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
-
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/rate_ctr.h>
#include <osmocom/core/stat_item.h>
@@ -40,21 +42,11 @@ extern "C" {
}
#endif
-#ifdef __cplusplus
-#include "poll_controller.h"
-#include "sba.h"
#include "tbf.h"
-#include "gprs_ms_storage.h"
#include "coding_scheme.h"
-#include <cxx_linuxlist.h>
-#endif
-
-#include <pdch.h>
-#include <stdint.h>
-#include <stdbool.h>
-struct BTS;
struct GprsMs;
+struct gprs_rlcmac_bts;
struct gprs_rlcmac_trx {
void *fl1h;
@@ -62,11 +54,12 @@ struct gprs_rlcmac_trx {
struct gprs_rlcmac_pdch pdch[8];
/* back pointers */
- struct BTS *bts;
+ struct gprs_rlcmac_bts *bts;
uint8_t trx_no;
};
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -78,48 +71,7 @@ void bts_update_tbf_ta(const char *p, uint32_t fn, uint8_t trx_no, uint8_t ts, i
}
#endif
-/**
- * This is the data from C. As soon as our minimal compiler is gcc 4.7
- * we can start to compile pcu_vty.c with c++ and remove the split.
- */
-struct gprs_rlcmac_bts {
- bool active;
- uint8_t bsic;
- uint8_t cs_mask; /* Allowed CS mask from BTS */
- uint16_t mcs_mask; /* Allowed MCS mask from BTS */
- struct { /* information stored from last received PCUIF info_ind message */
- uint8_t initial_cs;
- uint8_t initial_mcs;
- } pcuif_info_ind;
- uint8_t initial_cs_dl, initial_cs_ul;
- uint8_t initial_mcs_dl, initial_mcs_ul;
- /* Timer defintions */
- struct osmo_tdef *T_defs_bts; /* timers controlled by BTS, received through PCUIF */
- uint8_t n3101;
- uint8_t n3103;
- uint8_t n3105;
- struct gprs_rlcmac_trx trx[8];
-
- uint8_t si13[GSM_MACBLOCK_LEN];
- bool si13_is_set;
-
- /* State for dynamic algorithm selection */
- int multislot_disabled;
-
- /**
- * Point back to the C++ object. This is used during the transition
- * period.
- */
- struct BTS *bts;
-
- /* Packet Application Information (3GPP TS 44.060 11.2.47, usually ETWS primary message). We don't need to store
- * more than one message, because they get sent so rarely. */
- struct msgb *app_info;
- uint32_t app_info_pending; /* Count of MS with active TBF, to which we did not send app_info yet */
- /* main nsei */
- struct gprs_ns2_nse *nse;
-};
enum {
CTR_TBF_DL_ALLOCATED,
@@ -230,189 +182,159 @@ struct chan_req_params {
bool single_block;
};
-#ifdef __cplusplus
+struct PollController;
+struct SBAController;
+struct GprsMsStorage;
+struct pcu_l1_meas;
+
/**
* I represent a GSM BTS. I have one or more TRX, I know the current
* GSM time and I have controllers that help with allocating resources
* on my TRXs.
*/
-struct BTS {
-public:
- BTS(struct gprs_pcu *pcu);
- ~BTS();
- void cleanup();
-
- static BTS* main_bts();
-
- struct gprs_rlcmac_bts *bts_data();
- SBAController *sba();
-
- /** TODO: change the number to unsigned */
- void set_current_frame_number(int frame_number);
- void set_current_block_frame_number(int frame_number, unsigned max_delay);
- int current_frame_number() const;
-
- /** add paging to paging queue(s) */
- int add_paging(uint8_t chan_needed, const struct osmo_mobile_identity *mi);
-
- gprs_rlcmac_dl_tbf *dl_tbf_by_poll_fn(uint32_t fn, uint8_t trx, uint8_t ts);
- gprs_rlcmac_ul_tbf *ul_tbf_by_poll_fn(uint32_t fn, uint8_t trx, uint8_t ts);
- gprs_rlcmac_dl_tbf *dl_tbf_by_tfi(uint8_t tfi, uint8_t trx, uint8_t ts);
- gprs_rlcmac_ul_tbf *ul_tbf_by_tfi(uint8_t tfi, uint8_t trx, uint8_t ts);
-
- int tfi_find_free(enum gprs_rlcmac_tbf_direction dir, uint8_t *_trx, int8_t use_trx) const;
-
- int rcv_imm_ass_cnf(const uint8_t *data, uint32_t fn);
-
- uint32_t rfn_to_fn(int32_t rfn);
- int rcv_rach(const struct rach_ind_params *rip);
- int rcv_ptcch_rach(const struct rach_ind_params *rip);
-
- void snd_dl_ass(gprs_rlcmac_tbf *tbf, bool poll, uint16_t pgroup);
-
- uint8_t max_cs_dl(void) const;
- uint8_t max_cs_ul(void) const;
- uint8_t max_mcs_dl(void) const;
- uint8_t max_mcs_ul(void) const;
- void set_max_cs_dl(uint8_t cs_dl);
- void set_max_cs_ul(uint8_t cs_ul);
- void set_max_mcs_dl(uint8_t mcs_dl);
- void set_max_mcs_ul(uint8_t mcs_ul);
- bool cs_dl_is_supported(CodingScheme cs);
-
- GprsMsStorage &ms_store();
- GprsMs *ms_by_tlli(uint32_t tlli, uint32_t old_tlli = GSM_RESERVED_TMSI);
- GprsMs *ms_by_imsi(const char *imsi);
- GprsMs *ms_alloc(uint8_t ms_class, uint8_t egprs_ms_class = 0);
-
- void send_gsmtap(enum pcu_gsmtap_category categ, bool uplink, uint8_t trx_no,
- uint8_t ts_no, uint8_t channel, uint32_t fn,
- const uint8_t *data, unsigned int len);
- void send_gsmtap_meas(enum pcu_gsmtap_category categ, bool uplink, uint8_t trx_no,
- uint8_t ts_no, uint8_t channel, uint32_t fn,
- const uint8_t *data, unsigned int len, struct pcu_l1_meas *meas);
- void send_gsmtap_rach(enum pcu_gsmtap_category categ, uint8_t channel,
- const struct rach_ind_params *rip);
-
- /*
- * Below for C interface for the VTY
- */
- struct rate_ctr_group *rate_counters() const;
- struct osmo_stat_item_group *stat_items() const;
- void do_rate_ctr_inc(unsigned int ctr_id);
- void do_rate_ctr_add(unsigned int ctr_id, int inc);
- void stat_item_add(unsigned int stat_id, int inc);
-
- LListHead<gprs_rlcmac_tbf>& ul_tbfs();
- LListHead<gprs_rlcmac_tbf>& dl_tbfs();
-
- struct gprs_rlcmac_bts m_bts;
+struct gprs_rlcmac_bts {
+ bool active;
+ uint8_t bsic;
+ uint8_t cs_mask; /* Allowed CS mask from BTS */
+ uint16_t mcs_mask; /* Allowed MCS mask from BTS */
+ struct { /* information stored from last received PCUIF info_ind message */
+ uint8_t initial_cs;
+ uint8_t initial_mcs;
+ } pcuif_info_ind;
+ uint8_t initial_cs_dl, initial_cs_ul;
+ uint8_t initial_mcs_dl, initial_mcs_ul;
+ /* Timer defintions */
+ struct osmo_tdef *T_defs_bts; /* timers controlled by BTS, received through PCUIF */
+ uint8_t n3101;
+ uint8_t n3103;
+ uint8_t n3105;
+ struct gprs_rlcmac_trx trx[8];
+
+ uint8_t si13[GSM_MACBLOCK_LEN];
+ bool si13_is_set;
+
+ /* State for dynamic algorithm selection */
+ int multislot_disabled;
+
+ /* Packet Application Information (3GPP TS 44.060 11.2.47, usually ETWS primary message). We don't need to store
+ * more than one message, because they get sent so rarely. */
+ struct msgb *app_info;
+ uint32_t app_info_pending; /* Count of MS with active TBF, to which we did not send app_info yet */
+
+ /* main nsei */
+ struct gprs_ns2_nse *nse;
/* back pointer to PCU object */
struct gprs_pcu *pcu;
-private:
- int m_cur_fn;
- int m_cur_blk_fn;
- uint8_t m_max_cs_dl, m_max_cs_ul;
- uint8_t m_max_mcs_dl, m_max_mcs_ul;
- PollController m_pollController;
- SBAController m_sba;
- struct rate_ctr_group *m_ratectrs;
- struct osmo_stat_item_group *m_statg;
+ int cur_fn;
+ int cur_blk_fn;
+ uint8_t max_cs_dl, max_cs_ul;
+ uint8_t max_mcs_dl, max_mcs_ul;
+ struct PollController *pollController;
+ struct SBAController *sba;
+ struct rate_ctr_group *ratectrs;
+ struct osmo_stat_item_group *statg;
- GprsMsStorage m_ms_store;
+ struct GprsMsStorage *ms_store;
/* list of uplink TBFs */
- LListHead<gprs_rlcmac_tbf> m_ul_tbfs;
+ struct llist_head ul_tbfs; /* list of gprs_rlcmac_tbf */
/* list of downlink TBFs */
- LListHead<gprs_rlcmac_tbf> m_dl_tbfs;
-
- /* disable copying to avoid slicing */
- BTS(const BTS&);
- BTS& operator=(const BTS&);
+ struct llist_head dl_tbfs; /* list of gprs_rlcmac_tbf */
};
-inline int BTS::current_frame_number() const
-{
- return m_cur_fn;
-}
+#ifdef __cplusplus
+extern "C" {
+#endif
-inline SBAController *BTS::sba()
-{
- return &m_sba;
-}
+struct GprsMs *bts_alloc_ms(struct gprs_rlcmac_bts *bts, uint8_t ms_class, uint8_t egprs_ms_class);
+int bts_add_paging(struct gprs_rlcmac_bts *bts, uint8_t chan_needed, const struct osmo_mobile_identity *mi);
-inline GprsMsStorage &BTS::ms_store()
-{
- return m_ms_store;
-}
+uint32_t bts_rfn_to_fn(const struct gprs_rlcmac_bts *bts, int32_t rfn);
-inline GprsMs *BTS::ms_by_tlli(uint32_t tlli, uint32_t old_tlli)
-{
- return ms_store().get_ms(tlli, old_tlli);
-}
+struct gprs_rlcmac_dl_tbf *bts_dl_tbf_by_poll_fn(struct gprs_rlcmac_bts *bts, uint32_t fn, uint8_t trx, uint8_t ts);
+struct gprs_rlcmac_ul_tbf *bts_ul_tbf_by_poll_fn(struct gprs_rlcmac_bts *bts, uint32_t fn, uint8_t trx, uint8_t ts);
+struct gprs_rlcmac_dl_tbf *bts_dl_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts);
+struct gprs_rlcmac_ul_tbf *bts_ul_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts);
-inline GprsMs *BTS::ms_by_imsi(const char *imsi)
-{
- return ms_store().get_ms(0, 0, imsi);
-}
+void bts_snd_dl_ass(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf, bool poll, uint16_t pgroup);
-inline LListHead<gprs_rlcmac_tbf>& BTS::ul_tbfs()
+/** TODO: change the number to unsigned */
+void bts_set_current_frame_number(struct gprs_rlcmac_bts *bts, int frame_number);
+void bts_set_current_block_frame_number(struct gprs_rlcmac_bts *bts, int frame_number, unsigned max_delay);
+static inline int bts_current_frame_number(const struct gprs_rlcmac_bts *bts)
{
- return m_ul_tbfs;
+ return bts->cur_fn;
}
-inline LListHead<gprs_rlcmac_tbf>& BTS::dl_tbfs()
-{
- return m_dl_tbfs;
-}
+int bts_tfi_find_free(const struct gprs_rlcmac_bts *bts, enum gprs_rlcmac_tbf_direction dir,
+ uint8_t *_trx, int8_t use_trx);
+
+int bts_rcv_rach(struct gprs_rlcmac_bts *bts, const struct rach_ind_params *rip);
+int bts_rcv_ptcch_rach(struct gprs_rlcmac_bts *bts, const struct rach_ind_params *rip);
+int bts_rcv_imm_ass_cnf(struct gprs_rlcmac_bts *bts, const uint8_t *data, uint32_t fn);
+
+void bts_send_gsmtap(struct gprs_rlcmac_bts *bts,
+ enum pcu_gsmtap_category categ, bool uplink, uint8_t trx_no,
+ uint8_t ts_no, uint8_t channel, uint32_t fn,
+ const uint8_t *data, unsigned int len);
+void bts_send_gsmtap_meas(struct gprs_rlcmac_bts *bts,
+ enum pcu_gsmtap_category categ, bool uplink, uint8_t trx_no,
+ uint8_t ts_no, uint8_t channel, uint32_t fn,
+ const uint8_t *data, unsigned int len, struct pcu_l1_meas *meas);
+void bts_send_gsmtap_rach(struct gprs_rlcmac_bts *bts,
+ enum pcu_gsmtap_category categ, uint8_t channel,
+ const struct rach_ind_params *rip);
+
+struct SBAController *bts_sba(struct gprs_rlcmac_bts *bts);
+
+struct GprsMsStorage *bts_ms_store(struct gprs_rlcmac_bts *bts);
+
+struct GprsMs *bts_ms_by_tlli(struct gprs_rlcmac_bts *bts, uint32_t tlli, uint32_t old_tlli);
-inline struct rate_ctr_group *BTS::rate_counters() const
+static inline struct rate_ctr_group *bts_rate_counters(struct gprs_rlcmac_bts *bts)
{
- return m_ratectrs;
+ return bts->ratectrs;
}
-inline struct osmo_stat_item_group *BTS::stat_items() const
+static inline struct osmo_stat_item_group *bts_stat_items(struct gprs_rlcmac_bts *bts)
{
- return m_statg;
+ return bts->statg;
}
-inline void BTS::do_rate_ctr_inc(unsigned int ctr_id) {
- rate_ctr_inc(&m_ratectrs->ctr[ctr_id]);
+static inline void bts_do_rate_ctr_inc(struct gprs_rlcmac_bts *bts, unsigned int ctr_id) {
+ rate_ctr_inc(&bts->ratectrs->ctr[ctr_id]);
}
-inline void BTS::do_rate_ctr_add(unsigned int ctr_id, int inc) {
- rate_ctr_add(&m_ratectrs->ctr[ctr_id], inc);
+static inline void bts_do_rate_ctr_add(struct gprs_rlcmac_bts *bts, unsigned int ctr_id, int inc) {
+ rate_ctr_add(&bts->ratectrs->ctr[ctr_id], inc);
}
-inline void BTS::stat_item_add(unsigned int stat_id, int inc) {
- int32_t val = osmo_stat_item_get_last(m_statg->items[stat_id]);
- osmo_stat_item_set(m_statg->items[stat_id], val + inc);
+static inline void bts_stat_item_add(struct gprs_rlcmac_bts *bts, unsigned int stat_id, int inc) {
+ int32_t val = osmo_stat_item_get_last(bts->statg->items[stat_id]);
+ osmo_stat_item_set(bts->statg->items[stat_id], val + inc);
}
-struct gprs_pcu;
-struct BTS* bts_alloc(struct gprs_pcu *pcu);
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- void bts_cleanup();
- struct gprs_rlcmac_bts *bts_data(struct BTS *bts);
- struct gprs_rlcmac_bts *bts_main_data();
- struct rate_ctr_group *bts_main_data_stats();
- struct osmo_stat_item_group *bts_main_data_stat_items();
- void bts_recalc_initial_cs(struct gprs_rlcmac_bts *bts);
- void bts_recalc_initial_mcs(struct gprs_rlcmac_bts *bts);
- void bts_recalc_max_cs(struct gprs_rlcmac_bts *bts);
- void bts_recalc_max_mcs(struct gprs_rlcmac_bts *bts);
- struct GprsMs *bts_ms_by_imsi(struct BTS *bts, const char *imsi);
- uint8_t bts_max_cs_dl(const struct BTS *bts);
- uint8_t bts_max_cs_ul(const struct BTS *bts);
- uint8_t bts_max_mcs_dl(const struct BTS *bts);
- uint8_t bts_max_mcs_ul(const struct BTS *bts);
+struct gprs_rlcmac_bts *bts_alloc(struct gprs_pcu *pcu);
+
+struct gprs_rlcmac_bts *bts_main_data();
+struct rate_ctr_group *bts_main_data_stats();
+struct osmo_stat_item_group *bts_main_data_stat_items();
+void bts_recalc_initial_cs(struct gprs_rlcmac_bts *bts);
+void bts_recalc_initial_mcs(struct gprs_rlcmac_bts *bts);
+void bts_recalc_max_cs(struct gprs_rlcmac_bts *bts);
+void bts_recalc_max_mcs(struct gprs_rlcmac_bts *bts);
+struct GprsMs *bts_ms_by_imsi(struct gprs_rlcmac_bts *bts, const char *imsi);
+uint8_t bts_max_cs_dl(const struct gprs_rlcmac_bts *bts);
+uint8_t bts_max_cs_ul(const struct gprs_rlcmac_bts *bts);
+uint8_t bts_max_mcs_dl(const struct gprs_rlcmac_bts *bts);
+uint8_t bts_max_mcs_ul(const struct gprs_rlcmac_bts *bts);
+void bts_set_max_cs_dl(struct gprs_rlcmac_bts *bts, uint8_t cs_dl);
+void bts_set_max_cs_ul(struct gprs_rlcmac_bts *bts, uint8_t cs_ul);
+void bts_set_max_mcs_dl(struct gprs_rlcmac_bts *bts, uint8_t mcs_dl);
+void bts_set_max_mcs_ul(struct gprs_rlcmac_bts *bts, uint8_t mcs_ul);
+bool bts_cs_dl_is_supported(const struct gprs_rlcmac_bts *bts, enum CodingScheme cs);
#ifdef __cplusplus
}
-
#endif