osmocom-bb/src/host/trxcon/include/osmocom/bb/l1sched/prim.h

131 lines
3.4 KiB
C

#pragma once
#include <stdint.h>
#include <stdbool.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/prim.h>
#include <osmocom/core/utils.h>
#define l1sched_prim_from_msgb(msg) \
((struct l1sched_prim *)(msg)->l1h)
#define l1sched_prim_data_from_msgb(msg) \
((uint8_t *)msgb_l2(msg))
#define l1sched_prim_type_from_msgb(msg) \
l1sched_prim_from_msgb(msg)->oph.primitive
#define L1SCHED_PRIM_STR_FMT "%s.%s"
#define L1SCHED_PRIM_STR_ARGS(prim) \
l1sched_prim_type_name((prim)->oph.primitive), \
osmo_prim_operation_name((prim)->oph.operation)
enum l1sched_prim_type {
L1SCHED_PRIM_T_DATA, /* Req | Ind | Cnf */
L1SCHED_PRIM_T_RACH, /* Req | Cnf */
L1SCHED_PRIM_T_SCH, /* Ind */
L1SCHED_PRIM_T_PCHAN_COMB, /* Ind */
};
extern const struct value_string l1sched_prim_type_names[];
static inline const char *l1sched_prim_type_name(enum l1sched_prim_type val)
{
return get_value_string(l1sched_prim_type_names, val);
}
/*! Common header for L1SCHED_PRIM_T_{DATA,RACH} */
struct l1sched_prim_chdr {
/*! TDMA Frame Number */
uint32_t frame_nr;
/*! RSL Channel Number */
uint8_t chan_nr;
/*! RSL Link Identifier */
uint8_t link_id;
/*! Traffic or signalling */
bool traffic;
};
/*! Payload of L1SCHED_PRIM_T_DATA | Ind */
struct l1sched_prim_data_ind {
/*! Common sub-header */
struct l1sched_prim_chdr chdr;
int16_t toa256;
int8_t rssi;
int n_errors;
int n_bits_total;
};
/*! Payload of L1SCHED_PRIM_T_RACH | {Req,Cnf} */
struct l1sched_prim_rach {
/*! Common sub-header */
struct l1sched_prim_chdr chdr;
/*! Training Sequence (only for 11-bit RA) */
uint8_t synch_seq;
/*! Transmission offset (how many frames to skip) */
uint8_t offset;
/*! RA value is 11 bit */
bool is_11bit;
/*! RA value */
uint16_t ra;
};
struct l1sched_prim {
/*! Primitive header */
struct osmo_prim_hdr oph;
/*! Type specific header */
union {
/*! L1SCHED_PRIM_T_DATA | Req */
struct l1sched_prim_chdr data_req;
/*! L1SCHED_PRIM_T_DATA | Cnf */
struct l1sched_prim_chdr data_cnf;
/*! L1SCHED_PRIM_T_DATA | Ind */
struct l1sched_prim_data_ind data_ind;
/*! L1SCHED_PRIM_T_RACH | Req */
struct l1sched_prim_rach rach_req;
/*! L1SCHED_PRIM_T_RACH | Cnf */
struct l1sched_prim_rach rach_cnf;
/*! L1SCHED_PRIM_T_SCH | Ind */
struct {
/*! TDMA frame number */
uint32_t frame_nr;
/*! BSIC */
uint8_t bsic;
} sch_ind;
/*! L1SCHED_PRIM_T_PCHAN_COMB | Ind */
struct {
/*! Timeslot number */
uint8_t tn;
/*! Channel combination for a timeslot */
enum gsm_phys_chan_config pchan;
} pchan_comb_ind;
};
};
struct l1sched_state;
struct l1sched_lchan_state;
void l1sched_prim_init(struct msgb *msg,
enum l1sched_prim_type type,
enum osmo_prim_operation op);
struct msgb *l1sched_prim_alloc(enum l1sched_prim_type type,
enum osmo_prim_operation op,
size_t extra_size);
struct msgb *l1sched_lchan_prim_dequeue(struct l1sched_lchan_state *lchan, uint32_t fn);
void l1sched_lchan_prim_assign_dummy(struct l1sched_lchan_state *lchan);
void l1sched_lchan_prim_drop(struct l1sched_lchan_state *lchan);
int l1sched_lchan_emit_data_ind(struct l1sched_lchan_state *lchan,
const uint8_t *data, size_t data_len,
int n_errors, int n_bits_total, bool traffic);
int l1sched_lchan_emit_data_cnf(struct l1sched_lchan_state *lchan, uint32_t fn);
int l1sched_prim_from_user(struct l1sched_state *sched, struct msgb *msg);
int l1sched_prim_to_user(struct l1sched_state *sched, struct msgb *msg);