Convert gprs_bssgp_pcu.cpp to C

There's no real use of C++ in that file, and it causes problems when
using llist_head entry macros in future patches adding initial support
for multiple BTS in PCU object, so let's move it to plain C.

Change-Id: Ic771a89fd78b5e66151a5384f0ff6a8895589466
This commit is contained in:
Pau Espin 2021-01-18 17:14:14 +01:00
parent 4a5209d8bc
commit 8a35e640a3
12 changed files with 91 additions and 59 deletions

View File

@ -42,7 +42,7 @@ libgprs_la_SOURCES = \
gprs_debug.cpp \
csn1.c \
gsm_rlcmac.c \
gprs_bssgp_pcu.cpp \
gprs_bssgp_pcu.c \
gprs_rlcmac.cpp \
gprs_rlcmac_sched.cpp \
gprs_rlcmac_meas.cpp \

View File

@ -291,7 +291,7 @@ int Decoding::rlc_data_from_ul_data(
return num_chunks;
}
uint8_t Decoding::get_ms_class_by_capability(MS_Radio_Access_capability_t *cap)
uint8_t get_ms_class_by_capability(MS_Radio_Access_capability_t *cap)
{
int i;
@ -306,7 +306,7 @@ uint8_t Decoding::get_ms_class_by_capability(MS_Radio_Access_capability_t *cap)
return 0;
}
uint8_t Decoding::get_egprs_ms_class_by_capability(MS_Radio_Access_capability_t *cap)
uint8_t get_egprs_ms_class_by_capability(MS_Radio_Access_capability_t *cap)
{
int i;

View File

@ -19,16 +19,23 @@
*/
#pragma once
#ifdef __cplusplus
extern "C" {
#include "gsm_rlcmac.h"
}
#endif
#include "rlc.h"
#include "gsm_rlcmac.h"
#include "coding_scheme.h"
#ifdef __cplusplus
}
#endif
#include <stdint.h>
struct bitvec;
#ifdef __cplusplus
class Decoding {
public:
/* represents (parts) LLC PDUs within one RLC Data block */
@ -42,8 +49,6 @@ public:
const struct gprs_rlc_data_block_info *rdbi,
enum CodingScheme cs, const uint8_t *data, RlcData *chunks,
unsigned int chunks_size, uint32_t *tlli);
static uint8_t get_ms_class_by_capability(MS_Radio_Access_capability_t *cap);
static uint8_t get_egprs_ms_class_by_capability(MS_Radio_Access_capability_t *cap);
static void extract_rbb(const uint8_t *rbb, char *extracted_rbb);
static void extract_rbb(const struct bitvec *rbb, char *show_rbb);
@ -82,3 +87,16 @@ public:
bitvec *bits, int *bsn_begin, int *bsn_end,
gprs_rlc_dl_window *window);
};
#endif /* #ifdef __cplusplus */
#ifdef __cplusplus
extern "C" {
#endif
uint8_t get_ms_class_by_capability(MS_Radio_Access_capability_t *cap);
uint8_t get_egprs_ms_class_by_capability(MS_Radio_Access_capability_t *cap);
#ifdef __cplusplus
}
#endif

View File

@ -28,14 +28,15 @@
#include <pdch.h>
#include <decoding.h>
extern "C" {
#include <osmocom/gsm/protocol/gsm_23_003.h>
#include <osmocom/gprs/protocol/gsm_08_16.h>
#include <osmocom/core/utils.h>
#include <osmocom/gsm/gsm48.h>
#include "coding_scheme.h"
#include "tbf_dl.h"
}
#include <osmocom/gprs/gprs_ns2.h>
#include <osmocom/gsm/protocol/gsm_23_003.h>
#include <osmocom/gprs/protocol/gsm_08_16.h>
#include <osmocom/core/utils.h>
#include <osmocom/gsm/gsm48.h>
#include "coding_scheme.h"
#include "tbf_dl.h"
#include "llc.h"
#include "gprs_rlcmac.h"
/* Tuning parameters for BSSGP flow control */
#define FC_DEFAULT_LIFE_TIME_SECS 10 /* experimental value, 10s */
@ -55,7 +56,7 @@ static void bvc_timeout(void *_priv);
static int parse_ra_cap(struct tlv_parsed *tp, MS_Radio_Access_capability_t *rac)
{
bitvec *block;
struct bitvec *block;
uint8_t cap_len;
uint8_t *cap;
@ -132,9 +133,8 @@ static int gprs_bssgp_pcu_rx_dl_ud(struct msgb *msg, struct tlv_parsed *tp)
/* parse ms radio access capability */
if (parse_ra_cap(tp, &rac) >= 0) {
/* Get the EGPRS class from the RA capability */
ms_class = Decoding::get_ms_class_by_capability(&rac);
egprs_ms_class =
Decoding::get_egprs_ms_class_by_capability(&rac);
ms_class = get_ms_class_by_capability(&rac);
egprs_ms_class = get_egprs_ms_class_by_capability(&rac);
LOGP(DBSSGP, LOGL_DEBUG, "Got downlink MS class %d/%d\n",
ms_class, egprs_ms_class);
}
@ -166,7 +166,7 @@ static int gprs_bssgp_pcu_rx_dl_ud(struct msgb *msg, struct tlv_parsed *tp)
LOGP(DBSSGP, LOGL_INFO, "LLC [SGSN -> PCU] = TLLI: 0x%08x IMSI: %s len: %d\n", tlli, mi_imsi.imsi, len);
return gprs_rlcmac_dl_tbf::handle(the_pcu->bssgp.bts, tlli, tlli_old, mi_imsi.imsi,
return dl_tbf_handle(the_pcu->bssgp.bts, tlli, tlli_old, mi_imsi.imsi,
ms_class, egprs_ms_class, delay_csec, data, len);
}
@ -620,7 +620,7 @@ int gprs_ns_prim_cb(struct osmo_prim_hdr *oph, void *ctx)
LOGP(DPCU, LOGL_DEBUG,
"NS: %s Unknown prim %s / %d from NS\n",
get_value_string(osmo_prim_op_names, oph->operation),
gprs_ns2_prim_str((gprs_ns2_prim) oph->primitive), oph->primitive);
gprs_ns2_prim_str((enum gprs_ns2_prim) oph->primitive), oph->primitive);
break;
}
@ -654,7 +654,7 @@ static unsigned count_pdch(const struct gprs_rlcmac_bts *bts)
for (ts_no = 0; ts_no < ARRAY_SIZE(trx->pdch); ++ts_no) {
const struct gprs_rlcmac_pdch *pdch = &trx->pdch[ts_no];
if (pdch->is_enabled())
if (pdch->m_is_enabled)
num_pdch += 1;
}
}
@ -853,7 +853,7 @@ static int gprs_bssgp_tx_fc_bvc(void)
if (ms_leak_rate == 0) {
int ms_num_pdch;
int max_pdch = gprs_alloc_max_dl_slots_per_ms(bts);
int max_pdch = gprs_alloc_max_dl_slots_per_ms(bts, 0);
if (num_pdch < 0)
num_pdch = count_pdch(bts);
@ -1029,8 +1029,9 @@ struct nsvc_cb {
static int ns_conf_vc_cb(struct gprs_ns2_vc *nsvc, void *ctx)
{
struct nsvc_cb *data = (struct nsvc_cb *) ctx;
unsigned int i;
for (unsigned int i = 0; i < PCU_IF_NUM_NSVC; i++) {
for (i = 0; i < PCU_IF_NUM_NSVC; i++) {
if (!(data->valid & (1 << i)))
continue;
if (data->found & (1 << i))
@ -1070,7 +1071,8 @@ int gprs_ns_config(struct gprs_rlcmac_bts *bts, uint16_t nsei,
} else if (the_pcu->vty.ns_dialect == NS2_DIALECT_SNS) {
/* SNS: check if the initial nsvc is the same, if not recreate it */
const struct osmo_sockaddr *initial = gprs_ns2_nse_sns_remote(bts->nse);
for (unsigned int i = 0; i < PCU_IF_NUM_NSVC; i++) {
unsigned int i;
for (i = 0; i < PCU_IF_NUM_NSVC; i++) {
if (!(valid & (1 << i)))
continue;

View File

@ -21,7 +21,6 @@
#ifndef GPRS_BSSGP_PCU_H
#define GPRS_BSSGP_PCU_H
#ifdef __cplusplus
extern "C" {
#endif
@ -40,6 +39,7 @@ struct bssgp_bvc_ctx *btsctx_alloc(uint16_t bvci, uint16_t nsei);
#include <gprs_debug.h>
#include <time.h>
#include <unistd.h>
#define QOS_PROFILE 4
#define BSSGP_HDR_LEN 53

View File

@ -22,16 +22,20 @@
#define GPRS_RLCMAC_H
#include <stdbool.h>
#include <stdint.h>
#ifdef __cplusplus
#include <pcu_l1_if.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/timer.h>
#include <osmocom/core/bitvec.h>
#include <osmocom/gsm/gsm48.h>
#include <osmocom/pcu/pcuif_proto.h>
#include "gsm_rlcmac.h"
#ifdef __cplusplus
}
#endif
@ -92,17 +96,12 @@ enum gprs_rlcmac_block_type {
int gprs_rlcmac_tx_ul_ud(gprs_rlcmac_tbf *tbf);
int gprs_rlcmac_paging_request(const struct osmo_mobile_identity *mi, uint16_t pgroup);
struct msgb *gprs_rlcmac_app_info_msg(const struct gsm_pcu_if_app_info_req *req);
int gprs_rlcmac_rcv_rts_block(struct gprs_rlcmac_bts *bts,
uint8_t trx, uint8_t ts,
uint32_t fn, uint8_t block_nr);
int gprs_alloc_max_dl_slots_per_ms(const struct gprs_rlcmac_bts *bts,
uint8_t ms_class = 0);
extern "C" {
#endif
int alloc_algorithm_a(struct gprs_rlcmac_bts *bts, struct GprsMs *ms, struct gprs_rlcmac_tbf *tbf, bool single,
@ -113,8 +112,12 @@ int alloc_algorithm_b(struct gprs_rlcmac_bts *bts, struct GprsMs *ms, struct gpr
int alloc_algorithm_dynamic(struct gprs_rlcmac_bts *bts, struct GprsMs *ms, struct gprs_rlcmac_tbf *tbf, bool single,
int8_t use_trx);
int gprs_rlcmac_paging_request(const struct osmo_mobile_identity *mi, uint16_t pgroup);
int gprs_alloc_max_dl_slots_per_ms(const struct gprs_rlcmac_bts *bts, uint8_t ms_class);
#ifdef __cplusplus
}
#endif
#endif // GPRS_RLCMAC_H

View File

@ -596,8 +596,8 @@ void gprs_rlcmac_pdch::rcv_resource_request(Packet_Resource_Request_t *request,
if (request->Exist_MS_Radio_Access_capability2) {
uint8_t ms_class, egprs_ms_class;
ms_class = Decoding::get_ms_class_by_capability(&request->MS_Radio_Access_capability2);
egprs_ms_class = Decoding::get_egprs_ms_class_by_capability(&request->MS_Radio_Access_capability2);
ms_class = get_ms_class_by_capability(&request->MS_Radio_Access_capability2);
egprs_ms_class = get_egprs_ms_class_by_capability(&request->MS_Radio_Access_capability2);
if (ms_class)
ms_set_ms_class(ms, ms_class);
if (egprs_ms_class)

View File

@ -18,13 +18,17 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#pragma once
#ifdef __cplusplus
extern "C" {
#include "coding_scheme.h"
}
#endif
#include "coding_scheme.h"
#include <osmocom/core/endian.h>
#ifdef __cplusplus
}
#endif
#include <stdint.h>
#include <string.h>

View File

@ -278,11 +278,11 @@ static int tbf_new_dl_assignment(struct gprs_rlcmac_bts *bts, GprsMs *ms,
/**
* TODO: split into unit test-able parts...
*/
int gprs_rlcmac_dl_tbf::handle(struct gprs_rlcmac_bts *bts,
const uint32_t tlli, const uint32_t tlli_old, const char *imsi,
uint8_t ms_class, uint8_t egprs_ms_class,
const uint16_t delay_csec,
const uint8_t *data, const uint16_t len)
int dl_tbf_handle(struct gprs_rlcmac_bts *bts,
const uint32_t tlli, const uint32_t tlli_old, const char *imsi,
uint8_t ms_class, uint8_t egprs_ms_class,
const uint16_t delay_csec,
const uint8_t *data, const uint16_t len)
{
struct gprs_rlcmac_dl_tbf *dl_tbf = NULL;
int rc;

View File

@ -23,6 +23,8 @@
#include "tbf.h"
#include <stdint.h>
/*
* TBF instance
*/
@ -42,12 +44,6 @@ struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf {
gprs_rlcmac_dl_tbf(struct gprs_rlcmac_bts *bts, GprsMs *ms);
gprs_rlc_window *window();
void cleanup();
/* dispatch Unitdata.DL messages */
static int handle(struct gprs_rlcmac_bts *bts,
const uint32_t tlli, const uint32_t old_tlli,
const char *imsi, const uint8_t ms_class,
const uint8_t egprs_ms_class, const uint16_t delay_csec,
const uint8_t *data, const uint16_t len);
int append_data(uint16_t pdu_delay_csec,
const uint8_t *data, uint16_t len);
@ -151,7 +147,16 @@ struct gprs_rlcmac_dl_tbf;
#ifdef __cplusplus
extern "C" {
#endif
struct gprs_rlcmac_bts;
struct gprs_rlcmac_dl_tbf *as_dl_tbf(struct gprs_rlcmac_tbf *tbf);
/* dispatch Unitdata.DL messages */
int dl_tbf_handle(struct gprs_rlcmac_bts *bts,
const uint32_t tlli, const uint32_t old_tlli,
const char *imsi, const uint8_t ms_class,
const uint8_t egprs_ms_class, const uint16_t delay_csec,
const uint8_t *data, const uint16_t len);
#ifdef __cplusplus
}
#endif

View File

@ -259,8 +259,8 @@ MS RA capability 1
OSMO_ASSERT(data.Count_MS_RA_capability_value == 1);
/* Make sure GPRS / EGPRS multislot class is parsed correctly */
printf("GPRS multislot class = %u\n", Decoding::get_ms_class_by_capability(&data));
printf("EGPRS multislot class = %u\n", Decoding::get_egprs_ms_class_by_capability(&data));
printf("GPRS multislot class = %u\n", get_ms_class_by_capability(&data));
printf("EGPRS multislot class = %u\n", get_egprs_ms_class_by_capability(&data));
/* Test encoding of decoded MS RA Capability */
printf("=== Test encoding of MS RA Capability ===\n");
@ -466,8 +466,8 @@ MS Radio Access Capability
OSMO_ASSERT(data.Count_MS_RA_capability_value == 3);
/* Make sure GPRS / EGPRS multislot class is parsed correctly */
printf("GPRS multislot class = %u\n", Decoding::get_ms_class_by_capability(&data));
printf("EGPRS multislot class = %u\n", Decoding::get_egprs_ms_class_by_capability(&data));
printf("GPRS multislot class = %u\n", get_ms_class_by_capability(&data));
printf("EGPRS multislot class = %u\n", get_egprs_ms_class_by_capability(&data));
bitvec_free(bv_dec);
}

View File

@ -500,7 +500,7 @@ static void test_tbf_exhaustion()
snprintf(imsi, sizeof(imsi), "001001%09d", i);
rc = gprs_rlcmac_dl_tbf::handle(bts, tlli, 0, imsi, ms_class, 0,
rc = dl_tbf_handle(bts, tlli, 0, imsi, ms_class, 0,
delay_csec, buf, sizeof(buf));
if (rc < 0)
@ -545,7 +545,7 @@ static void test_tbf_dl_llc_loss()
/* Handle LLC frame 1 */
memset(buf, 1, sizeof(buf));
rc = gprs_rlcmac_dl_tbf::handle(bts, tlli, 0, imsi, ms_class, 0,
rc = dl_tbf_handle(bts, tlli, 0, imsi, ms_class, 0,
delay_csec, buf, sizeof(buf));
OSMO_ASSERT(rc >= 0);
@ -556,7 +556,7 @@ static void test_tbf_dl_llc_loss()
/* Handle LLC frame 2 */
memset(buf, 2, sizeof(buf));
rc = gprs_rlcmac_dl_tbf::handle(bts, tlli, 0, imsi, ms_class, 0,
rc = dl_tbf_handle(bts, tlli, 0, imsi, ms_class, 0,
delay_csec, buf, sizeof(buf));
OSMO_ASSERT(rc >= 0);
@ -565,7 +565,7 @@ static void test_tbf_dl_llc_loss()
/* Handle LLC frame 3 */
memset(buf, 3, sizeof(buf));
rc = gprs_rlcmac_dl_tbf::handle(bts, tlli, 0, imsi, ms_class, 0,
rc = dl_tbf_handle(bts, tlli, 0, imsi, ms_class, 0,
delay_csec, buf, sizeof(buf));
OSMO_ASSERT(rc >= 0);
@ -1651,7 +1651,7 @@ static void send_dl_data(struct gprs_rlcmac_bts *bts, uint32_t tlli, const char
ms = bts_ms_store(bts)->get_ms(tlli, 0, imsi);
gprs_rlcmac_dl_tbf::handle(bts, tlli, 0, imsi, 0, 0,
dl_tbf_handle(bts, tlli, 0, imsi, 0, 0,
1000, data, data_size);
ms = bts_ms_by_imsi(bts, imsi);
@ -2206,7 +2206,7 @@ static void test_tbf_gprs_egprs()
gprs_bssgp_init(bts, 3234, 3234, 1, 1, false, 0, 0, 0);
/* Does not support EGPRS */
rc = gprs_rlcmac_dl_tbf::handle(bts, tlli, 0, imsi, ms_class, 0,
rc = dl_tbf_handle(bts, tlli, 0, imsi, ms_class, 0,
delay_csec, buf, sizeof(buf));
OSMO_ASSERT(rc == 0);