libosmoisdn 1.9.0.196-9975
Osmocom ISDN library
LAPD implementation common part

Osmocom LAPD core, used for Q.921, LAPDm and others. More...

Files

file  lapd_core.h
 primitive related stuff
 
file  lapd_core.c
 LAPD core implementation.
 

Data Structures

struct  mdl_error_ind_param
 for MDL-ERROR.ind More...
 
struct  dl_rel_req_param
 for DL-REL.req More...
 
struct  osmo_dlsap_prim
 primitive header for LAPD DL-SAP primitives More...
 
struct  lapd_msg_ctx
 LAPD message context. More...
 
struct  lapd_cr_ent
 
struct  lapd_history
 
struct  lapd_datalink
 LAPD datalink. More...
 
struct  l2downstate
 

Macros

#define LOGDL(dl, level, fmt, args...)    LOGP(DLLAPD, level, "(%s) " fmt, (dl)->name, ## args)
 
#define MDL_CAUSE_T200_EXPIRED   0x01
 
#define MDL_CAUSE_REEST_REQ   0x02
 
#define MDL_CAUSE_UNSOL_UA_RESP   0x03
 
#define MDL_CAUSE_UNSOL_DM_RESP   0x04
 
#define MDL_CAUSE_UNSOL_DM_RESP_MF   0x05
 
#define MDL_CAUSE_UNSOL_SPRV_RESP   0x06
 
#define MDL_CAUSE_SEQ_ERR   0x07
 
#define MDL_CAUSE_UFRM_INC_PARAM   0x08
 
#define MDL_CAUSE_SFRM_INC_PARAM   0x09
 
#define MDL_CAUSE_IFRM_INC_MBITS   0x0a
 
#define MDL_CAUSE_IFRM_INC_LEN   0x0b
 
#define MDL_CAUSE_FRM_UNIMPL   0x0c
 
#define MDL_CAUSE_SABM_MF   0x0d
 
#define MDL_CAUSE_SABM_INFO_NOTALL   0x0e
 
#define MDL_CAUSE_FRMR   0x0f
 
#define LAPD_F_RTS   0x0001
 lapd_flags More...
 
#define LAPD_F_DROP_2ND_REJ   0x0002
 
#define LAPD_U_SABM   0x7
 
#define LAPD_U_SABME   0xf
 
#define LAPD_U_DM   0x3
 
#define LAPD_U_UI   0x0
 
#define LAPD_U_DISC   0x8
 
#define LAPD_U_UA   0xC
 
#define LAPD_U_FRMR   0x11
 
#define LAPD_S_RR   0x0
 
#define LAPD_S_RNR   0x1
 
#define LAPD_S_REJ   0x2
 
#define CR_USER2NET_CMD   0
 
#define CR_USER2NET_RESP   1
 
#define CR_NET2USER_CMD   1
 
#define CR_NET2USER_RESP   0
 
#define LAPD_HEADROOM   56
 
#define LAPD_TAILROOM   16
 
#define SBIT(a)   (1 << a)
 
#define ALL_STATES   0xffffffff
 
#define L2DOWNSLLEN    (sizeof(l2downstatelist) / sizeof(struct l2downstate))
 

Enumerations

enum  osmo_dl_prim {
  PRIM_DL_UNIT_DATA ,
  PRIM_DL_DATA ,
  PRIM_DL_EST ,
  PRIM_DL_REL ,
  PRIM_DL_SUSP ,
  PRIM_DL_RES ,
  PRIM_DL_RECON ,
  PRIM_MDL_ERROR
}
 LAPD related primitives (L2<->L3 SAP) More...
 
enum  lapd_mode {
  LAPD_MODE_USER ,
  LAPD_MODE_NETWORK
}
 LAPD mode/role. More...
 
enum  lapd_state {
  LAPD_STATE_NULL = 0 ,
  LAPD_STATE_TEI_UNASS ,
  LAPD_STATE_ASS_TEI_WAIT ,
  LAPD_STATE_EST_TEI_WAIT ,
  LAPD_STATE_IDLE ,
  LAPD_STATE_SABM_SENT ,
  LAPD_STATE_DISC_SENT ,
  LAPD_STATE_MF_EST ,
  LAPD_STATE_TIMER_RECOV
}
 LAPD state (Figure B.2/Q.921) More...
 
enum  lapd_t200_rts {
  LAPD_T200_RTS_OFF = 0 ,
  LAPD_T200_RTS_PENDING ,
  LAPD_T200_RTS_RUNNING
}
 LAPD T200 state in RTS mode. More...
 
enum  lapd_format {
  LAPD_FORM_UKN = 0 ,
  LAPD_FORM_I ,
  LAPD_FORM_S ,
  LAPD_FORM_U
}
 LAPD message format (I / S / U) More...
 

Functions

void lapd_dl_init (struct lapd_datalink *dl, uint8_t k, uint8_t v_range, int maxf)
 Initialize LAPD datalink instance and allocate history. More...
 
void lapd_dl_init2 (struct lapd_datalink *dl, uint8_t k, uint8_t v_range, int maxf, const char *name)
 Initialize LAPD datalink instance and allocate history. More...
 
void lapd_dl_set_name (struct lapd_datalink *dl, const char *name)
 
void lapd_dl_exit (struct lapd_datalink *dl)
 
void lapd_dl_reset (struct lapd_datalink *dl)
 
int lapd_dl_set_flags (struct lapd_datalink *dl, unsigned int flags)
 Set lapd_flags to change behaviour. More...
 
int lapd_set_mode (struct lapd_datalink *dl, enum lapd_mode mode)
 Set the lapdm_mode of a LAPDm entity. More...
 
int lapd_ph_data_ind (struct msgb *msg, struct lapd_msg_ctx *lctx)
 
int lapd_ph_rts_ind (struct lapd_msg_ctx *lctx)
 Enqueue next LAPD frame and run pending T200. More...
 
int lapd_recv_dlsap (struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx)
 
int lapd_t200_timeout (struct lapd_datalink *dl)
 Handle timeout condition of T200 in RTS mode. More...
 
static void lapd_t200_cb (void *data)
 
static void lapd_t203_cb (void *data)
 
static int lapd_send_i (struct lapd_datalink *dl, int line, bool rts)
 
static int lapd_est_req (struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx)
 
struct msgblapd_msgb_alloc (int length, const char *name)
 
static uint8_t do_mod (uint8_t x, uint8_t m)
 
static uint8_t inc_mod (uint8_t x, uint8_t m)
 
static uint8_t add_mod (uint8_t x, uint8_t y, uint8_t m)
 
static uint8_t sub_mod (uint8_t x, uint8_t y, uint8_t m)
 
static void lapd_dl_flush_send (struct lapd_datalink *dl)
 
static void lapd_dl_flush_hist (struct lapd_datalink *dl)
 
static void lapd_dl_flush_tx_queue (struct lapd_datalink *dl)
 
static void lapd_dl_flush_tx (struct lapd_datalink *dl)
 
static const char * lapd_state_name (enum lapd_state state)
 
static void lapd_start_t200 (struct lapd_datalink *dl)
 
static void lapd_start_t203 (struct lapd_datalink *dl)
 
static void lapd_stop_t200 (struct lapd_datalink *dl)
 
static bool lapd_is_t200_started (struct lapd_datalink *dl)
 
static void lapd_stop_t203 (struct lapd_datalink *dl)
 
static void lapd_dl_newstate (struct lapd_datalink *dl, uint32_t state)
 
static int send_dl_l3 (uint8_t prim, uint8_t op, struct lapd_msg_ctx *lctx, struct msgb *msg)
 
static int send_dl_simple (uint8_t prim, uint8_t op, struct lapd_msg_ctx *lctx)
 
static int mdl_error (uint8_t cause, struct lapd_msg_ctx *lctx)
 
static int lapd_send_ua (struct lapd_msg_ctx *lctx, uint8_t len, uint8_t *data)
 
static int lapd_send_dm (struct lapd_msg_ctx *lctx)
 
static int lapd_send_rr (struct lapd_msg_ctx *lctx, uint8_t f_bit, uint8_t cmd)
 
static int lapd_send_rnr (struct lapd_msg_ctx *lctx, uint8_t f_bit, uint8_t cmd)
 
static int lapd_send_rej (struct lapd_msg_ctx *lctx, uint8_t f_bit)
 
static int lapd_send_resend (struct lapd_datalink *dl)
 
static int lapd_reestablish (struct lapd_datalink *dl)
 
static int lapd_acknowledge (struct lapd_msg_ctx *lctx)
 
static int lapd_rx_u_sabm (struct msgb *msg, struct lapd_msg_ctx *lctx)
 
static int lapd_rx_u_dm (struct msgb *msg, struct lapd_msg_ctx *lctx)
 
static int lapd_rx_u_ui (struct msgb *msg, struct lapd_msg_ctx *lctx)
 
static int lapd_rx_u_disc (struct msgb *msg, struct lapd_msg_ctx *lctx)
 
static int lapd_rx_u_ua (struct msgb *msg, struct lapd_msg_ctx *lctx)
 
static int lapd_rx_u_frmr (struct msgb *msg, struct lapd_msg_ctx *lctx)
 
static int lapd_rx_u (struct msgb *msg, struct lapd_msg_ctx *lctx)
 
static int lapd_rx_s (struct msgb *msg, struct lapd_msg_ctx *lctx)
 
static int lapd_rx_i (struct msgb *msg, struct lapd_msg_ctx *lctx)
 
static int lapd_udata_req (struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx)
 
static void msg_to_tx_hist (struct lapd_history *tx_hist, const struct msgb *msg, int length, int more)
 
static void msg_to_tx_hist0 (struct lapd_datalink *dl, const struct msgb *msg)
 
static int lapd_data_req (struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx)
 
static int lapd_susp_req (struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx)
 
static int lapd_res_req (struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx)
 
static int lapd_rel_req (struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx)
 
static int lapd_rel_req_idle (struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx)
 

Variables

const struct value_string lapd_state_names []
 
void * tall_lapd_ctx = NULL
 
static const struct l2downstate l2downstatelist []
 

Detailed Description

Osmocom LAPD core, used for Q.921, LAPDm and others.

Notes on Buffering: rcv_buffer, tx_queue, tx_hist, send_buffer, send_queue

RX data is stored in the rcv_buffer (pointer). If the message is complete, it is removed from rcv_buffer pointer and forwarded to L3. If the RX data is received while there is an incomplete rcv_buffer, it is appended to it.

TX data is stored in the send_queue first. When transmitting a frame, the first message in the send_queue is moved to the send_buffer. There it resides until all fragments are acknowledged. Fragments to be sent by I frames are stored in the tx_hist buffer for resend, if required. Also the current fragment is copied into the tx_queue. There it resides until it is forwarded to layer 1.

In case we have SAPI 0, we only have a window size of 1, so the unack- nowledged message resides always in the send_buffer. In case of a suspend, it can be written back to the first position of the send_queue.

The layer 1 normally sends a PH-READY-TO-SEND. But because we use asynchronous transfer between layer 1 and layer 2 (serial link), we must send a frame before layer 1 reaches the right timeslot to send it. So we move the tx_queue to layer 1 when there is not already a pending frame, and wait until acknowledge after the frame has been sent. If we receive an acknowledge, we can send the next frame from the buffer, if any.

The moving of tx_queue to layer 1 may also trigger T200, if desired. Also it will trigger next I frame, if possible.

T203 is optional. It will be stated when entering MF EST state. It will also be started when I or S frame is received in that state . It will be restarted in the lapd_acknowledge() function, in case outstanding frames will not trigger T200. It will be stoped, when T200 is started in MF EST state. It will also be stoped when leaving MF EST state.

Macro Definition Documentation

◆ ALL_STATES

#define ALL_STATES   0xffffffff

◆ CR_NET2USER_CMD

#define CR_NET2USER_CMD   1

◆ CR_NET2USER_RESP

#define CR_NET2USER_RESP   0

◆ CR_USER2NET_CMD

#define CR_USER2NET_CMD   0

◆ CR_USER2NET_RESP

#define CR_USER2NET_RESP   1

◆ L2DOWNSLLEN

#define L2DOWNSLLEN    (sizeof(l2downstatelist) / sizeof(struct l2downstate))

◆ LAPD_F_DROP_2ND_REJ

#define LAPD_F_DROP_2ND_REJ   0x0002

◆ LAPD_F_RTS

#define LAPD_F_RTS   0x0001

lapd_flags

◆ LAPD_HEADROOM

#define LAPD_HEADROOM   56

◆ LAPD_S_REJ

#define LAPD_S_REJ   0x2

◆ LAPD_S_RNR

#define LAPD_S_RNR   0x1

◆ LAPD_S_RR

#define LAPD_S_RR   0x0

◆ LAPD_TAILROOM

#define LAPD_TAILROOM   16

◆ LAPD_U_DISC

#define LAPD_U_DISC   0x8

◆ LAPD_U_DM

#define LAPD_U_DM   0x3

◆ LAPD_U_FRMR

#define LAPD_U_FRMR   0x11

◆ LAPD_U_SABM

#define LAPD_U_SABM   0x7

◆ LAPD_U_SABME

#define LAPD_U_SABME   0xf

◆ LAPD_U_UA

#define LAPD_U_UA   0xC

◆ LAPD_U_UI

#define LAPD_U_UI   0x0

◆ LOGDL

#define LOGDL (   dl,
  level,
  fmt,
  args... 
)     LOGP(DLLAPD, level, "(%s) " fmt, (dl)->name, ## args)

◆ MDL_CAUSE_FRM_UNIMPL

#define MDL_CAUSE_FRM_UNIMPL   0x0c

◆ MDL_CAUSE_FRMR

#define MDL_CAUSE_FRMR   0x0f

◆ MDL_CAUSE_IFRM_INC_LEN

#define MDL_CAUSE_IFRM_INC_LEN   0x0b

◆ MDL_CAUSE_IFRM_INC_MBITS

#define MDL_CAUSE_IFRM_INC_MBITS   0x0a

◆ MDL_CAUSE_REEST_REQ

#define MDL_CAUSE_REEST_REQ   0x02

◆ MDL_CAUSE_SABM_INFO_NOTALL

#define MDL_CAUSE_SABM_INFO_NOTALL   0x0e

◆ MDL_CAUSE_SABM_MF

#define MDL_CAUSE_SABM_MF   0x0d

◆ MDL_CAUSE_SEQ_ERR

#define MDL_CAUSE_SEQ_ERR   0x07

◆ MDL_CAUSE_SFRM_INC_PARAM

#define MDL_CAUSE_SFRM_INC_PARAM   0x09

◆ MDL_CAUSE_T200_EXPIRED

#define MDL_CAUSE_T200_EXPIRED   0x01

◆ MDL_CAUSE_UFRM_INC_PARAM

#define MDL_CAUSE_UFRM_INC_PARAM   0x08

◆ MDL_CAUSE_UNSOL_DM_RESP

#define MDL_CAUSE_UNSOL_DM_RESP   0x04

◆ MDL_CAUSE_UNSOL_DM_RESP_MF

#define MDL_CAUSE_UNSOL_DM_RESP_MF   0x05

◆ MDL_CAUSE_UNSOL_SPRV_RESP

#define MDL_CAUSE_UNSOL_SPRV_RESP   0x06

◆ MDL_CAUSE_UNSOL_UA_RESP

#define MDL_CAUSE_UNSOL_UA_RESP   0x03

◆ SBIT

#define SBIT (   a)    (1 << a)

Enumeration Type Documentation

◆ lapd_format

LAPD message format (I / S / U)

Enumerator
LAPD_FORM_UKN 
LAPD_FORM_I 
LAPD_FORM_S 
LAPD_FORM_U 

◆ lapd_mode

enum lapd_mode

LAPD mode/role.

Enumerator
LAPD_MODE_USER 

behave like user

LAPD_MODE_NETWORK 

behave like network

◆ lapd_state

enum lapd_state

LAPD state (Figure B.2/Q.921)

Enumerator
LAPD_STATE_NULL 
LAPD_STATE_TEI_UNASS 
LAPD_STATE_ASS_TEI_WAIT 
LAPD_STATE_EST_TEI_WAIT 
LAPD_STATE_IDLE 
LAPD_STATE_SABM_SENT 
LAPD_STATE_DISC_SENT 
LAPD_STATE_MF_EST 
LAPD_STATE_TIMER_RECOV 

◆ lapd_t200_rts

LAPD T200 state in RTS mode.

Enumerator
LAPD_T200_RTS_OFF 
LAPD_T200_RTS_PENDING 
LAPD_T200_RTS_RUNNING 

◆ osmo_dl_prim

LAPD related primitives (L2<->L3 SAP)

Enumerator
PRIM_DL_UNIT_DATA 

DL-UNIT-DATA.

PRIM_DL_DATA 

DL-DATA.

PRIM_DL_EST 

DL-ESTABLISH.

PRIM_DL_REL 

DL-RLEEASE.

PRIM_DL_SUSP 

DL-SUSPEND.

PRIM_DL_RES 

DL-RESUME.

PRIM_DL_RECON 

DL-RECONNECT.

PRIM_MDL_ERROR 

MDL-ERROR.

Function Documentation

◆ add_mod()

static uint8_t add_mod ( uint8_t  x,
uint8_t  y,
uint8_t  m 
)
inlinestatic

Referenced by lapd_send_i().

◆ do_mod()

static uint8_t do_mod ( uint8_t  x,
uint8_t  m 
)
inlinestatic

◆ inc_mod()

static uint8_t inc_mod ( uint8_t  x,
uint8_t  m 
)
inlinestatic

◆ lapd_acknowledge()

◆ lapd_data_req()

◆ lapd_dl_exit()

◆ lapd_dl_flush_hist()

◆ lapd_dl_flush_send()

◆ lapd_dl_flush_tx()

static void lapd_dl_flush_tx ( struct lapd_datalink dl)
static

◆ lapd_dl_flush_tx_queue()

static void lapd_dl_flush_tx_queue ( struct lapd_datalink dl)
static

◆ lapd_dl_init()

void lapd_dl_init ( struct lapd_datalink dl,
uint8_t  k,
uint8_t  v_range,
int  maxf 
)

Initialize LAPD datalink instance and allocate history.

Parameters
[in]dlcaller-allocated datalink structure
[in]kmaximum number of unacknowledged frames
[in]v_rangerange of sequence numbers
[in]maxfmaximum frame size (after defragmentation)

References lapd_dl_init2().

◆ lapd_dl_init2()

void lapd_dl_init2 ( struct lapd_datalink dl,
uint8_t  k,
uint8_t  v_range,
int  maxf,
const char *  name 
)

Initialize LAPD datalink instance and allocate history.

Parameters
[in]dlcaller-allocated datalink structure
[in]kmaximum number of unacknowledged frames
[in]v_rangerange of sequence numbers
[in]maxfmaximum frame size (after defragmentation)
[in]namehuman-readable name for this LAPD datalink

References INIT_LLIST_HEAD, lapd_datalink::k, lapd_dl_newstate(), LAPD_STATE_IDLE, lapd_t200_cb(), lapd_t203_cb(), LOGDL, LOGL_INFO, lapd_datalink::maxf, lapd_datalink::n200, lapd_datalink::n200_est_rel, name, lapd_datalink::name, OSMO_ASSERT, osmo_timer_setup(), lapd_datalink::range_hist, lapd_datalink::reestablish, lapd_datalink::send_queue, lapd_datalink::t200, lapd_datalink::t200_sec, lapd_datalink::t200_usec, lapd_datalink::t203, lapd_datalink::t203_sec, lapd_datalink::t203_usec, tall_lapd_ctx, lapd_datalink::tx_hist, lapd_datalink::tx_queue, and lapd_datalink::v_range.

Referenced by lapd_dl_init().

◆ lapd_dl_newstate()

◆ lapd_dl_reset()

◆ lapd_dl_set_flags()

int lapd_dl_set_flags ( struct lapd_datalink dl,
unsigned int  flags 
)

Set lapd_flags to change behaviour.

Parameters
[in]dllapd_datalink instance
[in]flagslapd_flags

References flags, LAPD_F_RTS, lapd_datalink::lapd_flags, lapd_is_t200_started(), LOGDL, and LOGL_ERROR.

◆ lapd_dl_set_name()

void lapd_dl_set_name ( struct lapd_datalink dl,
const char *  name 
)

◆ lapd_est_req()

◆ lapd_is_t200_started()

◆ lapd_msgb_alloc()

◆ lapd_ph_data_ind()

◆ lapd_ph_rts_ind()

int lapd_ph_rts_ind ( struct lapd_msg_ctx lctx)

Enqueue next LAPD frame and run pending T200.

(Must be called when frame is ready to send.) The caller (LAPDm code) calls this function before it sends the next frame. If there is no frame in the TX queue, LAPD will enqueue next I-frame, if possible. If the T200 is pending, it is changed to running state.

Parameters
[in]lctxLAPD context
[out]rcset to 1, if timer T200 state changed to running, set to 0, if not.

References lapd_msg_ctx::dl, lapd_send_i(), LAPD_STATE_MF_EST, LAPD_STATE_TIMER_RECOV, LAPD_T200_RTS_PENDING, LAPD_T200_RTS_RUNNING, lapd_datalink::lctx, llist_empty(), lapd_datalink::state, lapd_datalink::t200_rts, and lapd_datalink::tx_queue.

◆ lapd_recv_dlsap()

◆ lapd_reestablish()

◆ lapd_rel_req()

◆ lapd_rel_req_idle()

static int lapd_rel_req_idle ( struct osmo_dlsap_prim dp,
struct lapd_msg_ctx lctx 
)
static

◆ lapd_res_req()

◆ lapd_rx_i()

◆ lapd_rx_s()

◆ lapd_rx_u()

◆ lapd_rx_u_disc()

◆ lapd_rx_u_dm()

◆ lapd_rx_u_frmr()

static int lapd_rx_u_frmr ( struct msgb msg,
struct lapd_msg_ctx lctx 
)
static

◆ lapd_rx_u_sabm()

◆ lapd_rx_u_ua()

◆ lapd_rx_u_ui()

◆ lapd_send_dm()

◆ lapd_send_i()

◆ lapd_send_rej()

◆ lapd_send_resend()

◆ lapd_send_rnr()

◆ lapd_send_rr()

◆ lapd_send_ua()

◆ lapd_set_mode()

◆ lapd_start_t200()

◆ lapd_start_t203()

◆ lapd_state_name()

◆ lapd_stop_t200()

◆ lapd_stop_t203()

◆ lapd_susp_req()

◆ lapd_t200_cb()

◆ lapd_t200_timeout()

int lapd_t200_timeout ( struct lapd_datalink dl)

Handle timeout condition of T200 in RTS mode.

The caller (LAPDm code) implements the T200 timer and must detect timeout condition. The function gets called by LAPDm code when it detects a timeout of T200.

Parameters
[in]dlcaller-allocated datalink structure

References LAPD_F_RTS, lapd_datalink::lapd_flags, lapd_t200_cb(), LAPD_T200_RTS_OFF, LAPD_T200_RTS_RUNNING, OSMO_ASSERT, and lapd_datalink::t200_rts.

◆ lapd_t203_cb()

◆ lapd_udata_req()

◆ mdl_error()

◆ msg_to_tx_hist()

static void msg_to_tx_hist ( struct lapd_history tx_hist,
const struct msgb msg,
int  length,
int  more 
)
static

◆ msg_to_tx_hist0()

static void msg_to_tx_hist0 ( struct lapd_datalink dl,
const struct msgb msg 
)
static

◆ send_dl_l3()

static int send_dl_l3 ( uint8_t  prim,
uint8_t  op,
struct lapd_msg_ctx lctx,
struct msgb msg 
)
static

◆ send_dl_simple()

static int send_dl_simple ( uint8_t  prim,
uint8_t  op,
struct lapd_msg_ctx lctx 
)
inlinestatic

◆ sub_mod()

static uint8_t sub_mod ( uint8_t  x,
uint8_t  y,
uint8_t  m 
)
inlinestatic

Referenced by lapd_acknowledge(), and lapd_t200_cb().

Variable Documentation

◆ l2downstatelist

const struct l2downstate l2downstatelist[]
static

Referenced by lapd_recv_dlsap().

◆ lapd_state_names

const struct value_string lapd_state_names[]
Initial value:
= {
{ 0, NULL }
}
@ LAPD_STATE_SABM_SENT
Definition: lapd_core.h:81
@ LAPD_STATE_TEI_UNASS
Definition: lapd_core.h:77
@ LAPD_STATE_MF_EST
Definition: lapd_core.h:83
@ LAPD_STATE_EST_TEI_WAIT
Definition: lapd_core.h:79
@ LAPD_STATE_DISC_SENT
Definition: lapd_core.h:82
@ LAPD_STATE_ASS_TEI_WAIT
Definition: lapd_core.h:78
@ LAPD_STATE_NULL
Definition: lapd_core.h:76
@ LAPD_STATE_TIMER_RECOV
Definition: lapd_core.h:84
@ LAPD_STATE_IDLE
Definition: lapd_core.h:80
#define OSMO_VALUE_STRING(x)

Referenced by lapd_state_name().

◆ tall_lapd_ctx

void* tall_lapd_ctx = NULL

Referenced by lapd_dl_init2(), and lapd_dl_set_name().