libosmogsm 1.11.1
Osmocom GSM library
Loading...
Searching...
No Matches

GSM LAPDm (TS 04.06) implementation. More...

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <string.h>
#include <errno.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/timer.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/utils.h>
#include <osmocom/gsm/tlv.h>
#include <osmocom/gsm/rsl.h>
#include <osmocom/gsm/prim.h>
#include <osmocom/gsm/gsm_utils.h>
#include <osmocom/gsm/lapdm.h>
#include <osmocom/gsm/protocol/gsm_04_08.h>
#include <osmocom/gsm/protocol/gsm_08_58.h>

Macros

#define LAPD_U_SABM   0x7
#define LAPDm_LPD_NORMAL   0
#define LAPDm_LPD_SMSCB   1
#define LAPDm_SAPI_NORMAL   0
#define LAPDm_SAPI_SMS   3
#define LAPDm_ADDR(lpd, sapi, cr)
#define LAPDm_ADDR_LPD(addr)
#define LAPDm_ADDR_SAPI(addr)
#define LAPDm_ADDR_CR(addr)
#define LAPDm_ADDR_EA(addr)
#define LAPDm_ADDR_SHORT_L2(addr)
#define LAPDm_CTRL_I(nr, ns, p)
#define LAPDm_CTRL_S(nr, s, p)
#define LAPDm_CTRL_U(u, p)
#define LAPDm_CTRL_is_I(ctrl)
#define LAPDm_CTRL_is_S(ctrl)
#define LAPDm_CTRL_is_U(ctrl)
#define LAPDm_CTRL_U_BITS(ctrl)
#define LAPDm_CTRL_PF_BIT(ctrl)
#define LAPDm_CTRL_S_BITS(ctrl)
#define LAPDm_CTRL_I_Ns(ctrl)
#define LAPDm_CTRL_Nr(ctrl)
#define LAPDm_LEN(len)
#define LAPDm_MORE   0x2
#define LAPDm_EL   0x1
#define LAPDm_U_UI   0x0
#define N201_AB_SACCH   18
#define N201_AB_SDCCH   20
#define N201_AB_FACCH   20
#define N201_Bbis   23
#define N201_Bter_SACCH   21
#define N201_Bter_SDCCH   23
#define N201_Bter_FACCH   23
#define N201_B4   19
#define N200_EST_REL   5
#define N200_TR_SACCH   5
#define N200_TR_SDCCH   23
#define N200_TR_FACCH_FR   34
#define N200_TR_EFACCH_FR   48
#define N200_TR_FACCH_HR   29
#define N200   N200_TR_SDCCH

Enumerations

enum  lapdm_format {
  LAPDm_FMT_A ,
  LAPDm_FMT_B ,
  LAPDm_FMT_Bbis ,
  LAPDm_FMT_Bter ,
  LAPDm_FMT_B4
}

Functions

static int lapdm_send_ph_data_req (struct lapd_msg_ctx *lctx, struct msgb *msg)
static int send_rslms_dlsap (struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx)
static int update_pending_frames (struct lapd_msg_ctx *lctx)
static void lapdm_dl_init (struct lapdm_datalink *dl, struct lapdm_entity *entity, int t200_ms, uint32_t n200, const char *name)
void lapdm_entity_init (struct lapdm_entity *le, enum lapdm_mode mode, int t200)
 initialize a LAPDm entity and all datalinks inside
void lapdm_entity_init2 (struct lapdm_entity *le, enum lapdm_mode mode, const int *t200_ms, int n200)
 initialize a LAPDm entity and all datalinks inside
void lapdm_entity_init3 (struct lapdm_entity *le, enum lapdm_mode mode, const int *t200_ms, int n200, const char *name_pfx)
 initialize a LAPDm entity and all datalinks inside
static int get_n200_dcch (enum gsm_chan_t chan_t)
void lapdm_channel_init (struct lapdm_channel *lc, enum lapdm_mode mode)
 initialize a LAPDm channel and all its channels
int lapdm_channel_init2 (struct lapdm_channel *lc, enum lapdm_mode mode, const int *t200_ms_dcch, const int *t200_ms_acch, enum gsm_chan_t chan_t)
 initialize a LAPDm channel and all its channels
int lapdm_channel_init3 (struct lapdm_channel *lc, enum lapdm_mode mode, const int *t200_ms_dcch, const int *t200_ms_acch, enum gsm_chan_t chan_t, const char *name_pfx)
 initialize a LAPDm channel and all its channels
void lapdm_entity_exit (struct lapdm_entity *le)
 flush and release all resoures in LAPDm entity
void lapdm_channel_exit (struct lapdm_channel *lc)
struct lapdm_datalinklapdm_datalink_for_sapi (struct lapdm_entity *le, uint8_t sapi)
static void lapdm_pad_msgb (struct msgb *msg, uint8_t n201)
static int rslms_sendmsg (struct msgb *msg, struct lapdm_entity *le)
static int tx_ph_data_enqueue (struct lapdm_datalink *dl, struct msgb *msg, uint8_t chan_nr, uint8_t link_id, uint8_t pad)
static int tx_ph_data_enqueue_ui (struct lapdm_datalink *dl, struct msgb *msg, uint8_t chan_nr, uint8_t link_id, uint8_t pad)
static struct msgbtx_dequeue_msgb (struct lapdm_datalink *dl, uint32_t fn)
static struct msgbtx_dequeue_dcch_msgb (struct lapdm_entity *le, uint32_t fn)
static struct msgbtx_dequeue_acch_msgb (struct lapdm_entity *le, uint32_t fn)
int lapdm_phsap_dequeue_prim_fn (struct lapdm_entity *le, struct osmo_phsap_prim *pp, uint32_t fn)
 dequeue a msg that's pending transmission via L1 and wrap it into a osmo_phsap_prim
static void lapdm_t200_fn_dl (struct lapdm_datalink *dl, uint32_t fn)
void lapdm_t200_fn (struct lapdm_entity *le, uint32_t fn)
 Get receive frame number from L1.
int lapdm_phsap_dequeue_prim (struct lapdm_entity *le, struct osmo_phsap_prim *pp)
 dequeue a msg that's pending transmission via L1 and wrap it into a osmo_phsap_prim
static int l2_ph_data_conf (struct msgb *msg, struct lapdm_entity *le)
static int rsl_is_transparent (uint8_t msg_type)
static int send_rslms_rll_l3 (uint8_t msg_type, struct lapdm_msg_ctx *mctx, struct msgb *msg)
static int send_rslms_rll_l3_ui (struct lapdm_msg_ctx *mctx, struct msgb *msg)
static int send_rll_simple (uint8_t msg_type, struct lapdm_msg_ctx *mctx)
static int rsl_rll_error (uint8_t cause, struct lapdm_msg_ctx *mctx)
static int lapdm_rx_not_permitted (const struct lapdm_entity *le, const struct lapd_msg_ctx *lctx)
static int l2_ph_data_ind (struct msgb *msg, struct lapdm_entity *le, uint8_t chan_nr, uint8_t link_id, uint32_t fn)
static int l2_ph_rach_ind (struct lapdm_entity *le, uint8_t ra, uint32_t fn, uint8_t acc_delay)
static int l2_ph_chan_conf (struct msgb *msg, struct lapdm_entity *le, uint32_t frame_nr)
int lapdm_phsap_up (struct osmo_prim_hdr *oph, struct lapdm_entity *le)
 Receive a PH-SAP primitive from L1.
static int set_lapdm_context (struct lapdm_datalink *dl, uint8_t chan_nr, uint8_t link_id, int n201, uint8_t sapi)
static int rslms_rx_rll_est_req (struct msgb *msg, struct lapdm_datalink *dl)
static int rslms_rx_rll_udata_req (struct msgb *msg, struct lapdm_datalink *dl)
static int rslms_rx_rll_data_req (struct msgb *msg, struct lapdm_datalink *dl)
static int rslms_rx_rll_susp_req (struct msgb *msg, struct lapdm_datalink *dl)
static int rslms_rx_rll_res_req (struct msgb *msg, struct lapdm_datalink *dl)
static int rslms_rx_rll_rel_req (struct msgb *msg, struct lapdm_datalink *dl)
static int rslms_rx_chan_rqd (struct lapdm_channel *lc, struct msgb *msg)
static int rslms_rx_rll (struct msgb *msg, struct lapdm_channel *lc)
static int rslms_rx_com_chan (struct msgb *msg, struct lapdm_channel *lc)
int lapdm_rslms_recvmsg (struct msgb *msg, struct lapdm_channel *lc)
 Receive a RSLms Message buffers from Layer 3.
int lapdm_entity_set_mode (struct lapdm_entity *le, enum lapdm_mode mode)
 Set the lapdm_mode of a LAPDm entity.
int lapdm_channel_set_mode (struct lapdm_channel *lc, enum lapdm_mode mode)
 Set the lapdm_mode of a LAPDm channel.
void lapdm_channel_set_l1 (struct lapdm_channel *lc, osmo_prim_cb cb, void *ctx)
 Set the L1 callback and context of a LAPDm channel.
void lapdm_channel_set_l3 (struct lapdm_channel *lc, lapdm_cb_t cb, void *ctx)
 Set the L3 callback and context of a LAPDm channel.
void lapdm_entity_reset (struct lapdm_entity *le)
 Reset an entire LAPDm entity and all its datalinks.
void lapdm_channel_reset (struct lapdm_channel *lc)
 Reset a LAPDm channel with all its entities.
void lapdm_entity_set_flags (struct lapdm_entity *le, unsigned int flags)
 Set the flags of a LAPDm entity.
void lapdm_channel_set_flags (struct lapdm_channel *lc, unsigned int flags)
 Set the flags of all LAPDm entities in a LAPDm channel.
void lapdm_entity_set_t200_fn (struct lapdm_entity *le, const uint32_t *t200_fn)
 Set the T200 FN timer of a LAPDm entity.
void lapdm_channel_set_t200_fn (struct lapdm_channel *lc, const uint32_t *t200_fn_dcch, const uint32_t *t200_fn_acch)
 Set the T200 FN timer of all LAPDm entities in a LAPDm channel.

Variables

const struct value_string osmo_ph_prim_names []
void * tall_lapd_ctx

Detailed Description

GSM LAPDm (TS 04.06) implementation.