libosmogsm 1.9.0.196-9975
Osmocom GSM library
LAPDm implementation according to GSM TS 04.06

Files

file  lapdm.h
 
file  lapdm.c
 GSM LAPDm (TS 04.06) implementation.
 

Data Structures

struct  lapdm_msg_ctx
 LAPDm message context. More...
 
struct  lapdm_datalink
 LAPDm datalink like TS 04.06 / Section 3.5.2. More...
 
struct  lapdm_entity
 a LAPDm Entity More...
 
struct  lapdm_channel
 the two lapdm_entities that form a GSM logical channel (ACCH + DCCH) More...
 

Macros

#define LAPDM_ENT_F_EMPTY_FRAME   0x0001
 
#define LAPDM_ENT_F_POLLING_ONLY   0x0002
 
#define LAPDM_ENT_F_DROP_2ND_REJ   0x0004
 
#define LAPDM_ENT_F_RTS   0x0008
 
#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)   ((((lpd) & 0x3) << 5) | (((sapi) & 0x7) << 2) | (((cr) & 0x1) << 1) | 0x1)
 
#define LAPDm_ADDR_LPD(addr)   (((addr) >> 5) & 0x3)
 
#define LAPDm_ADDR_SAPI(addr)   (((addr) >> 2) & 0x7)
 
#define LAPDm_ADDR_CR(addr)   (((addr) >> 1) & 0x1)
 
#define LAPDm_ADDR_EA(addr)   ((addr) & 0x1)
 
#define LAPDm_ADDR_SHORT_L2(addr)   ((addr) & 0x3)
 
#define LAPDm_CTRL_I(nr, ns, p)   ((((nr) & 0x7) << 5) | (((p) & 0x1) << 4) | (((ns) & 0x7) << 1))
 
#define LAPDm_CTRL_S(nr, s, p)   ((((nr) & 0x7) << 5) | (((p) & 0x1) << 4) | (((s) & 0x3) << 2) | 0x1)
 
#define LAPDm_CTRL_U(u, p)   ((((u) & 0x1c) << (5-2)) | (((p) & 0x1) << 4) | (((u) & 0x3) << 2) | 0x3)
 
#define LAPDm_CTRL_is_I(ctrl)   (((ctrl) & 0x1) == 0)
 
#define LAPDm_CTRL_is_S(ctrl)   (((ctrl) & 0x3) == 1)
 
#define LAPDm_CTRL_is_U(ctrl)   (((ctrl) & 0x3) == 3)
 
#define LAPDm_CTRL_U_BITS(ctrl)   ((((ctrl) & 0xC) >> 2) | ((ctrl) & 0xE0) >> 3)
 
#define LAPDm_CTRL_PF_BIT(ctrl)   (((ctrl) >> 4) & 0x1)
 
#define LAPDm_CTRL_S_BITS(ctrl)   (((ctrl) & 0xC) >> 2)
 
#define LAPDm_CTRL_I_Ns(ctrl)   (((ctrl) & 0xE) >> 1)
 
#define LAPDm_CTRL_Nr(ctrl)   (((ctrl) & 0xE0) >> 5)
 
#define LAPDm_LEN(len)   ((len << 2) | 0x1)
 
#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
 

Typedefs

typedef int(* lapdm_cb_t) (struct msgb *msg, struct lapdm_entity *le, void *ctx)
 

Enumerations

enum  lapdm_mode {
  LAPDM_MODE_MS ,
  LAPDM_MODE_BTS
}
 LAPDm mode/role. More...
 
enum  lapdm_dl_sapi {
  DL_SAPI0 = 0 ,
  DL_SAPI3 = 1 ,
  _NR_DL_SAPI
}
 LAPDm datalink SAPIs. More...
 
enum  lapdm_format {
  LAPDm_FMT_A ,
  LAPDm_FMT_B ,
  LAPDm_FMT_Bbis ,
  LAPDm_FMT_Bter ,
  LAPDm_FMT_B4
}
 

Functions

const char * get_rsl_name (int value)
 
struct lapdm_datalinklapdm_datalink_for_sapi (struct lapdm_entity *le, uint8_t sapi)
 
void lapdm_entity_init (struct lapdm_entity *le, enum lapdm_mode mode, int t200)
 initialize a LAPDm entity and all datalinks inside More...
 
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 More...
 
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 More...
 
void lapdm_channel_init (struct lapdm_channel *lc, enum lapdm_mode mode)
 initialize a LAPDm channel and all its channels More...
 
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 More...
 
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 More...
 
void lapdm_entity_exit (struct lapdm_entity *le)
 flush and release all resoures in LAPDm entity More...
 
void lapdm_channel_exit (struct lapdm_channel *lc)
 
int lapdm_phsap_up (struct osmo_prim_hdr *oph, struct lapdm_entity *le)
 Receive a PH-SAP primitive from L1. More...
 
int lapdm_rslms_recvmsg (struct msgb *msg, struct lapdm_channel *lc)
 Receive a RSLms Message buffers from Layer 3. More...
 
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. More...
 
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. More...
 
int lapdm_entity_set_mode (struct lapdm_entity *le, enum lapdm_mode mode)
 Set the lapdm_mode of a LAPDm entity. More...
 
int lapdm_channel_set_mode (struct lapdm_channel *lc, enum lapdm_mode mode)
 Set the lapdm_mode of a LAPDm channel. More...
 
void lapdm_entity_reset (struct lapdm_entity *le)
 Reset an entire LAPDm entity and all its datalinks. More...
 
void lapdm_channel_reset (struct lapdm_channel *lc)
 Reset a LAPDm channel with all its entities. More...
 
void lapdm_entity_set_flags (struct lapdm_entity *le, unsigned int flags)
 Set the flags of a LAPDm entity. More...
 
void lapdm_channel_set_flags (struct lapdm_channel *lc, unsigned int flags)
 Set the flags of all LAPDm entities in a LAPDm channel. More...
 
void lapdm_entity_set_t200_fn (struct lapdm_entity *le, const uint32_t *t200_fn)
 Set the T200 FN timer of a LAPDm entity. More...
 
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. More...
 
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 More...
 
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 More...
 
void lapdm_t200_fn (struct lapdm_entity *le, uint32_t fn)
 Get receive frame number from L1. More...
 
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)
 
static int get_n200_dcch (enum gsm_chan_t chan_t)
 
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)
 
static void lapdm_t200_fn_dl (struct lapdm_datalink *dl, uint32_t fn)
 
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)
 
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)
 

Variables

const char * lapdm_state_names []
 
const struct value_string osmo_ph_prim_names []
 
void * tall_lapd_ctx
 

Detailed Description

Macro Definition Documentation

◆ LAPD_U_SABM

#define LAPD_U_SABM   0x7

◆ LAPDm_ADDR

#define LAPDm_ADDR (   lpd,
  sapi,
  cr 
)    ((((lpd) & 0x3) << 5) | (((sapi) & 0x7) << 2) | (((cr) & 0x1) << 1) | 0x1)

◆ LAPDm_ADDR_CR

#define LAPDm_ADDR_CR (   addr)    (((addr) >> 1) & 0x1)

◆ LAPDm_ADDR_EA

#define LAPDm_ADDR_EA (   addr)    ((addr) & 0x1)

◆ LAPDm_ADDR_LPD

#define LAPDm_ADDR_LPD (   addr)    (((addr) >> 5) & 0x3)

◆ LAPDm_ADDR_SAPI

#define LAPDm_ADDR_SAPI (   addr)    (((addr) >> 2) & 0x7)

◆ LAPDm_ADDR_SHORT_L2

#define LAPDm_ADDR_SHORT_L2 (   addr)    ((addr) & 0x3)

◆ LAPDm_CTRL_I

#define LAPDm_CTRL_I (   nr,
  ns,
 
)    ((((nr) & 0x7) << 5) | (((p) & 0x1) << 4) | (((ns) & 0x7) << 1))

◆ LAPDm_CTRL_I_Ns

#define LAPDm_CTRL_I_Ns (   ctrl)    (((ctrl) & 0xE) >> 1)

◆ LAPDm_CTRL_is_I

#define LAPDm_CTRL_is_I (   ctrl)    (((ctrl) & 0x1) == 0)

◆ LAPDm_CTRL_is_S

#define LAPDm_CTRL_is_S (   ctrl)    (((ctrl) & 0x3) == 1)

◆ LAPDm_CTRL_is_U

#define LAPDm_CTRL_is_U (   ctrl)    (((ctrl) & 0x3) == 3)

◆ LAPDm_CTRL_Nr

#define LAPDm_CTRL_Nr (   ctrl)    (((ctrl) & 0xE0) >> 5)

◆ LAPDm_CTRL_PF_BIT

#define LAPDm_CTRL_PF_BIT (   ctrl)    (((ctrl) >> 4) & 0x1)

◆ LAPDm_CTRL_S

#define LAPDm_CTRL_S (   nr,
  s,
 
)    ((((nr) & 0x7) << 5) | (((p) & 0x1) << 4) | (((s) & 0x3) << 2) | 0x1)

◆ LAPDm_CTRL_S_BITS

#define LAPDm_CTRL_S_BITS (   ctrl)    (((ctrl) & 0xC) >> 2)

◆ LAPDm_CTRL_U

#define LAPDm_CTRL_U (   u,
 
)    ((((u) & 0x1c) << (5-2)) | (((p) & 0x1) << 4) | (((u) & 0x3) << 2) | 0x3)

◆ LAPDm_CTRL_U_BITS

#define LAPDm_CTRL_U_BITS (   ctrl)    ((((ctrl) & 0xC) >> 2) | ((ctrl) & 0xE0) >> 3)

◆ LAPDm_EL

#define LAPDm_EL   0x1

◆ LAPDM_ENT_F_DROP_2ND_REJ

#define LAPDM_ENT_F_DROP_2ND_REJ   0x0004

◆ LAPDM_ENT_F_EMPTY_FRAME

#define LAPDM_ENT_F_EMPTY_FRAME   0x0001

◆ LAPDM_ENT_F_POLLING_ONLY

#define LAPDM_ENT_F_POLLING_ONLY   0x0002

◆ LAPDM_ENT_F_RTS

#define LAPDM_ENT_F_RTS   0x0008

◆ LAPDm_LEN

#define LAPDm_LEN (   len)    ((len << 2) | 0x1)

◆ LAPDm_LPD_NORMAL

#define LAPDm_LPD_NORMAL   0

◆ LAPDm_LPD_SMSCB

#define LAPDm_LPD_SMSCB   1

◆ LAPDm_MORE

#define LAPDm_MORE   0x2

◆ LAPDm_SAPI_NORMAL

#define LAPDm_SAPI_NORMAL   0

◆ LAPDm_SAPI_SMS

#define LAPDm_SAPI_SMS   3

◆ LAPDm_U_UI

#define LAPDm_U_UI   0x0

◆ N200

#define N200   N200_TR_SDCCH

◆ N200_EST_REL

#define N200_EST_REL   5

◆ N200_TR_EFACCH_FR

#define N200_TR_EFACCH_FR   48

◆ N200_TR_FACCH_FR

#define N200_TR_FACCH_FR   34

◆ N200_TR_FACCH_HR

#define N200_TR_FACCH_HR   29

◆ N200_TR_SACCH

#define N200_TR_SACCH   5

◆ N200_TR_SDCCH

#define N200_TR_SDCCH   23

◆ N201_AB_FACCH

#define N201_AB_FACCH   20

◆ N201_AB_SACCH

#define N201_AB_SACCH   18

◆ N201_AB_SDCCH

#define N201_AB_SDCCH   20

◆ N201_B4

#define N201_B4   19

◆ N201_Bbis

#define N201_Bbis   23

◆ N201_Bter_FACCH

#define N201_Bter_FACCH   23

◆ N201_Bter_SACCH

#define N201_Bter_SACCH   21

◆ N201_Bter_SDCCH

#define N201_Bter_SDCCH   23

Typedef Documentation

◆ lapdm_cb_t

typedef int(* lapdm_cb_t) (struct msgb *msg, struct lapdm_entity *le, void *ctx)

Enumeration Type Documentation

◆ lapdm_dl_sapi

LAPDm datalink SAPIs.

Enumerator
DL_SAPI0 

SAPI 0.

DL_SAPI3 

SAPI 1.

_NR_DL_SAPI 

◆ lapdm_format

Enumerator
LAPDm_FMT_A 
LAPDm_FMT_B 
LAPDm_FMT_Bbis 
LAPDm_FMT_Bter 
LAPDm_FMT_B4 

◆ lapdm_mode

enum lapdm_mode

LAPDm mode/role.

Enumerator
LAPDM_MODE_MS 

behave like a MS (mobile phone)

LAPDM_MODE_BTS 

behave like a BTS (network)

Function Documentation

◆ get_n200_dcch()

static int get_n200_dcch ( enum gsm_chan_t  chan_t)
static

◆ get_rsl_name()

const char * get_rsl_name ( int  value)

◆ l2_ph_chan_conf()

◆ l2_ph_data_conf()

◆ l2_ph_data_ind()

◆ l2_ph_rach_ind()

◆ lapdm_channel_exit()

void lapdm_channel_exit ( struct lapdm_channel lc)

◆ lapdm_channel_init()

void lapdm_channel_init ( struct lapdm_channel lc,
enum lapdm_mode  mode 
)

initialize a LAPDm channel and all its channels

Parameters
[in]lclapdm_channel to be initialized
[in]modelapdm_mode (BTS/MS)

Don't use this function; It doesn't support different T200 values per API and doesn't set the correct N200 counter, both of which are required by GSM specs and supported by lapdm_channel_init2().

References _NR_DL_SAPI, GSM_LCHAN_SDCCH, lapdm_channel_init3(), and mode.

◆ lapdm_channel_init2()

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

Parameters
[in]lclapdm_channel to be initialized
[in]modelapdm_mode (BTS/MS)
[in]t200_ms_dcchper-SAPI array of T200 in milli-seconds for DCCH
[in]t200_ms_acchper-SAPI array of T200 in milli-seconds for SACCH
[in]chan_tGSM channel type (to correctly set N200)

References lapdm_channel_init3(), and mode.

◆ lapdm_channel_init3()

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

Parameters
[in]lclapdm_channel to be initialized
[in]modelapdm_mode (BTS/MS)
[in]t200_ms_dcchper-SAPI array of T200 in milli-seconds for DCCH
[in]t200_ms_acchper-SAPI array of T200 in milli-seconds for SACCH
[in]chan_tGSM channel type (to correctly set N200)
[in]name_pfxhuman-readable name (copied by function + extended with ACCH/DCCH)

References get_n200_dcch(), lapdm_channel::lapdm_acch, lapdm_entity::lapdm_ch, lapdm_channel::lapdm_dcch, lapdm_entity_init3(), mode, N200_TR_SACCH, name, lapdm_channel::name, namebuf, osmo_talloc_replace_string(), and tall_lapd_ctx.

Referenced by lapdm_channel_init(), and lapdm_channel_init2().

◆ lapdm_channel_reset()

void lapdm_channel_reset ( struct lapdm_channel lc)

Reset a LAPDm channel with all its entities.

References lapdm_channel::lapdm_acch, lapdm_channel::lapdm_dcch, and lapdm_entity_reset().

◆ lapdm_channel_set_flags()

void lapdm_channel_set_flags ( struct lapdm_channel lc,
unsigned int  flags 
)

Set the flags of all LAPDm entities in a LAPDm channel.

References flags, lapdm_channel::lapdm_acch, lapdm_channel::lapdm_dcch, and lapdm_entity_set_flags().

◆ lapdm_channel_set_l1()

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.

References lapdm_entity::l1_ctx, lapdm_entity::l1_prim_cb, lapdm_channel::lapdm_acch, and lapdm_channel::lapdm_dcch.

◆ lapdm_channel_set_l3()

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.

References lapdm_entity::l3_cb, lapdm_entity::l3_ctx, lapdm_channel::lapdm_acch, and lapdm_channel::lapdm_dcch.

◆ lapdm_channel_set_mode()

int lapdm_channel_set_mode ( struct lapdm_channel lc,
enum lapdm_mode  mode 
)

◆ lapdm_channel_set_t200_fn()

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.

Parameters
[in]

ref lapdm_channel

Parameters
[in]t200_fn_dcchArray of T200 timeout in frame numbers for all SAPIs (0, 3) on SDCCH/FACCH
[in]t200_fn_acchArray of T200 timeout in frame numbers for all SAPIs (0, 3) on SACCH

References lapdm_channel::lapdm_acch, lapdm_channel::lapdm_dcch, and lapdm_entity_set_t200_fn().

◆ lapdm_datalink_for_sapi()

struct lapdm_datalink * lapdm_datalink_for_sapi ( struct lapdm_entity le,
uint8_t  sapi 
)

◆ lapdm_dl_init()

◆ lapdm_entity_exit()

void lapdm_entity_exit ( struct lapdm_entity le)

flush and release all resoures in LAPDm entity

References ARRAY_SIZE, lapdm_entity::datalink, lapdm_datalink::dl, lapd_dl_exit(), and msgb_queue_free().

Referenced by lapdm_channel_exit().

◆ lapdm_entity_init()

void lapdm_entity_init ( struct lapdm_entity le,
enum lapdm_mode  mode,
int  t200 
)

initialize a LAPDm entity and all datalinks inside

Parameters
[in]leLAPDm entity
[in]modelapdm_mode (BTS/MS)
[in]t200T200 re-transmission timer for all SAPIs in seconds

Don't use this function; It doesn't support different T200 values per API and doesn't permit the caller to specify the N200 counter, both of which are required by GSM specs and supported by lapdm_entity_init2().

References _NR_DL_SAPI, ARRAY_SIZE, lapdm_entity_init3(), mode, and N200.

◆ lapdm_entity_init2()

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

Parameters
[in]leLAPDm entity
[in]modelapdm_mode (BTS/MS)
[in]t200_msper-SAPI array of T200 re-transmission timer in milli-seconds
[in]n200N200 re-transmisison count

References lapdm_entity_init3(), and mode.

◆ lapdm_entity_init3()

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

Parameters
[in]leLAPDm entity
[in]modelapdm_mode (BTS/MS)
[in]t200_msper-SAPI array of T200 re-transmission timer in milli-seconds
[in]n200N200 re-transmisison count
[in]namehuman-readable name (will be copied internally + extended with SAPI)

References ARRAY_SIZE, lapdm_entity::datalink, INIT_LLIST_HEAD, lapdm_dl_init(), lapdm_entity_set_mode(), mode, name, and lapdm_datalink::tx_ui_queue.

Referenced by lapdm_channel_init3(), lapdm_entity_init(), and lapdm_entity_init2().

◆ lapdm_entity_reset()

void lapdm_entity_reset ( struct lapdm_entity le)

Reset an entire LAPDm entity and all its datalinks.

References ARRAY_SIZE, lapdm_entity::datalink, lapdm_datalink::dl, lapd_dl_reset(), and msgb_queue_free().

Referenced by lapdm_channel_reset().

◆ lapdm_entity_set_flags()

void lapdm_entity_set_flags ( struct lapdm_entity le,
unsigned int  flags 
)

◆ lapdm_entity_set_mode()

◆ lapdm_entity_set_t200_fn()

void lapdm_entity_set_t200_fn ( struct lapdm_entity le,
const uint32_t *  t200_fn 
)

Set the T200 FN timer of a LAPDm entity.

Parameters
[in]

ref lapdm_entity

Parameters
[in]t200_fnArray of T200 timeout in frame numbers for all SAPIs (0, 3)

References ARRAY_SIZE, lapdm_entity::datalink, and lapdm_datalink::t200_fn.

Referenced by lapdm_channel_set_t200_fn().

◆ lapdm_pad_msgb()

static void lapdm_pad_msgb ( struct msgb msg,
uint8_t  n201 
)
static

◆ lapdm_phsap_dequeue_prim()

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

References lapdm_phsap_dequeue_prim_fn().

Referenced by l2_ph_data_conf().

◆ lapdm_phsap_dequeue_prim_fn()

◆ lapdm_phsap_up()

◆ lapdm_rslms_recvmsg()

int lapdm_rslms_recvmsg ( struct msgb msg,
struct lapdm_channel lc 
)

Receive a RSLms Message buffers from Layer 3.

'msg' ownership is transferred, i.e. caller must not free it

References ABIS_RSL_MDISC_COM_CHAN, ABIS_RSL_MDISC_RLL, DLLAPD, LOGL_ERROR, LOGP, msg, abis_rsl_common_hdr::msg_discr, msgb_free(), msgb_l2, msgb_l2len(), rslms_rx_com_chan(), and rslms_rx_rll().

◆ lapdm_rx_not_permitted()

◆ lapdm_send_ph_data_req()

◆ lapdm_t200_fn()

void lapdm_t200_fn ( struct lapdm_entity le,
uint32_t  fn 
)

Get receive frame number from L1.

It is used to check the T200 timeout. This function is used if LAPD is in RTS mode only. (Applies if the LAPDM_ENT_F_POLLING_ONLY flag is set.) This function must be called for every valid or invalid data frame received. The frame number fn must be the frame number of the first burst of a data frame. This function must be called after the frame is delivered to layer 2. In case of TCH, this this function must be called for every speech frame received, meaning that there was no valid data frame.

References ARRAY_SIZE, lapdm_entity::datalink, DLLAPD, lapdm_entity::flags, LAPDM_ENT_F_POLLING_ONLY, lapdm_t200_fn_dl(), LOGL_ERROR, and LOGP.

◆ lapdm_t200_fn_dl()

◆ rsl_is_transparent()

static int rsl_is_transparent ( uint8_t  msg_type)
static

◆ rsl_rll_error()

◆ rslms_rx_chan_rqd()

◆ rslms_rx_com_chan()

static int rslms_rx_com_chan ( struct msgb msg,
struct lapdm_channel lc 
)
static

◆ rslms_rx_rll()

◆ rslms_rx_rll_data_req()

◆ rslms_rx_rll_est_req()

◆ rslms_rx_rll_rel_req()

◆ rslms_rx_rll_res_req()

◆ rslms_rx_rll_susp_req()

◆ rslms_rx_rll_udata_req()

◆ rslms_sendmsg()

static int rslms_sendmsg ( struct msgb msg,
struct lapdm_entity le 
)
static

◆ send_rll_simple()

◆ send_rslms_dlsap()

◆ send_rslms_rll_l3()

static int send_rslms_rll_l3 ( uint8_t  msg_type,
struct lapdm_msg_ctx mctx,
struct msgb msg 
)
static

◆ send_rslms_rll_l3_ui()

◆ set_lapdm_context()

static int set_lapdm_context ( struct lapdm_datalink dl,
uint8_t  chan_nr,
uint8_t  link_id,
int  n201,
uint8_t  sapi 
)
static

◆ tx_dequeue_acch_msgb()

static struct msgb * tx_dequeue_acch_msgb ( struct lapdm_entity le,
uint32_t  fn 
)
static

◆ tx_dequeue_dcch_msgb()

static struct msgb * tx_dequeue_dcch_msgb ( struct lapdm_entity le,
uint32_t  fn 
)
static

◆ tx_dequeue_msgb()

◆ tx_ph_data_enqueue()

◆ tx_ph_data_enqueue_ui()

◆ update_pending_frames()

Variable Documentation

◆ lapdm_state_names

const char* lapdm_state_names[]
extern

◆ osmo_ph_prim_names

const struct value_string osmo_ph_prim_names[]
Initial value:
= {
{ PRIM_PH_DATA, "PH-DATA" },
{ PRIM_PH_RACH, "PH-RANDOM_ACCESS" },
{ PRIM_PH_CONN, "PH-CONNECT" },
{ PRIM_PH_EMPTY_FRAME, "PH-EMPTY_FRAME" },
{ PRIM_PH_RTS, "PH-RTS" },
{ PRIM_MPH_INFO, "MPH-INFO" },
{ PRIM_TCH, "TCH" },
{ PRIM_TCH_RTS, "TCH-RTS" },
{ 0, NULL }
}
@ PRIM_PH_CONN
PH-CONNECT.
Definition: l1sap.h:11
@ PRIM_PH_RTS
PH-RTS.
Definition: l1sap.h:13
@ PRIM_PH_DATA
PH-DATA.
Definition: l1sap.h:9
@ PRIM_PH_RACH
PH-RANDOM_ACCESS.
Definition: l1sap.h:10
@ PRIM_TCH_RTS
TCH.
Definition: l1sap.h:16
@ PRIM_PH_EMPTY_FRAME
PH-EMPTY_FRAME.
Definition: l1sap.h:12
@ PRIM_MPH_INFO
MPH-INFO.
Definition: l1sap.h:14
@ PRIM_TCH
TCH.
Definition: l1sap.h:15

◆ tall_lapd_ctx

void* tall_lapd_ctx
extern

Referenced by lapdm_channel_init3().