summaryrefslogtreecommitdiffstats
path: root/src/host/virt_phy/include/osmocom/bb/virtphy/virt_l1_model.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/host/virt_phy/include/osmocom/bb/virtphy/virt_l1_model.h')
-rw-r--r--src/host/virt_phy/include/osmocom/bb/virtphy/virt_l1_model.h119
1 files changed, 119 insertions, 0 deletions
diff --git a/src/host/virt_phy/include/osmocom/bb/virtphy/virt_l1_model.h b/src/host/virt_phy/include/osmocom/bb/virtphy/virt_l1_model.h
new file mode 100644
index 00000000..94581f61
--- /dev/null
+++ b/src/host/virt_phy/include/osmocom/bb/virtphy/virt_l1_model.h
@@ -0,0 +1,119 @@
+#pragma once
+
+/* Per-MS specific state, closely attached to the L1CTL user progran */
+
+#include <osmocom/gsm/gsm_utils.h>
+#include <osmocom/core/timer.h>
+
+#include <osmocom/bb/virtphy/virtual_um.h>
+#include <osmocom/bb/virtphy/l1ctl_sock.h>
+
+#define L1S_NUM_NEIGH_CELL 6
+#define A5_KEY_LEN 8
+
+enum ms_state {
+ MS_STATE_IDLE_SEARCHING = 0,
+ MS_STATE_IDLE_SYNCING,
+ MS_STATE_IDLE_CAMPING,
+ MS_STATE_DEDICATED,
+};
+
+
+/* structure representing L1 sync information about a cell */
+struct l1_cell_info {
+ /* on which ARFCN (+band) is the cell? */
+ uint16_t arfcn;
+ /* what's the BSIC of the cell (from SCH burst decoding) */
+ uint8_t bsic;
+ /* Combined or non-combined CCCH */
+ uint8_t ccch_mode; /* enum ccch_mode */
+ /* what's the delta of the cells current GSM frame number
+ * compared to our current local frame number */
+ int32_t fn_offset;
+ /* how much does the TPU need adjustment (delta) to synchronize
+ * with the cells burst */
+ uint32_t time_alignment;
+};
+
+struct crypto_info_ms {
+ /* key is expected in the same format as in RSL
+ * Encryption information IE. */
+ uint8_t key[A5_KEY_LEN];
+ uint8_t algo;
+};
+
+struct l1_state_ms {
+
+ struct gsm_time downlink_time; /* current GSM time received on downlink */
+ struct gsm_time current_time; /* GSM time used internally for scheduling */
+ struct {
+ uint32_t last_exec_fn;
+ struct llist_head mframe_items;
+ } sched;
+
+ enum ms_state state;
+
+ /* the cell on which we are camping right now */
+ struct l1_cell_info serving_cell;
+ /* neighbor cell sync info */
+ struct l1_cell_info neigh_cell[L1S_NUM_NEIGH_CELL];
+ struct crypto_info_ms crypto_inf;
+
+ /* TCH info */
+ uint8_t tch_mode; // see enum gsm48_chan_mode in gsm_04_08.h
+ uint8_t tch_sync; // needed for audio synchronization
+ uint8_t audio_mode; // see l1ctl_proto.h, e.g. AUDIO_TX_MICROPHONE
+
+ /* dedicated channel info */
+ struct {
+ uint8_t chan_type; // like rsl chantype 08.58 -> Chapter 9.3.1 */
+
+ uint16_t band_arfcn;
+ uint8_t tn; // timeslot number 1-7
+ uint8_t subslot; // subslot of the dedicated channel, SDCCH/4:[0-3], SDCCH/8:[0-7]
+
+ uint8_t scn; // single-hop cellular network? (unused in virtual um)
+ uint8_t tsc; // training sequence code (unused in virtual um)
+ uint8_t h; // hopping enabled flag (unused in virtual um)
+ } dedicated;
+
+ /* fbsb state */
+ struct {
+ uint32_t arfcn;
+ } fbsb;
+
+ /* power management state */
+ struct {
+ uint32_t timeout_us;
+ uint32_t timeout_s;
+ struct {
+ int16_t arfcn_sig_lev_dbm[1024];
+ uint8_t arfcn_sig_lev_red_dbm[1024];
+ struct osmo_timer_list arfcn_sig_lev_timers[1024];
+ } meas;
+ struct {
+ uint16_t band_arfcn_from;
+ uint16_t band_arfcn_to;
+ /* timer between receiving PM_REQ and responding with PM_CONF */
+ struct osmo_timer_list timer;
+ } req;
+ } pm;
+};
+
+struct l1_model_ms {
+ uint32_t nr;
+ /* pointer to the L1CTL socket client associated with this specific MS */
+ struct l1ctl_sock_client *lsc;
+ /* pointer to the (shared) GSMTAP/VirtUM socket to talk to BTS(s) */
+ struct virt_um_inst *vui;
+ /* GPRS state (MAC layer) */
+ struct l1gprs_state *gprs;
+ /* actual per-MS state */
+ struct l1_state_ms state;
+};
+
+
+struct l1_model_ms *l1_model_ms_init(void *ctx, struct l1ctl_sock_client *lsc, struct virt_um_inst *vui);
+
+void l1_model_ms_destroy(struct l1_model_ms *model);
+