libosmoisdn 1.13.1.1-afb4 Osmocom ISDN library

lapd_core.h
Go to the documentation of this file.
1
4#pragma once
5
6#include <stdint.h>
7
8#include <osmocom/core/timer.h>
9#include <osmocom/core/msgb.h>
10#include <osmocom/gsm/prim.h>
11
17#define LOGDL(dl, level, fmt, args...) \
18 LOGP(DLLAPD, level, "(%s) " fmt, (dl)->name, ## args)
19
21 enum osmo_dl_prim {
22 PRIM_DL_UNIT_DATA,
23 PRIM_DL_DATA,
24 PRIM_DL_EST,
25 PRIM_DL_REL,
26 PRIM_DL_SUSP,
27 PRIM_DL_RES,
28 PRIM_DL_RECON,
29 PRIM_MDL_ERROR,
30};
31
32/* Uses the same values as RLL, so no conversion for GSM is required. */
33#define MDL_CAUSE_T200_EXPIRED 0x01
34#define MDL_CAUSE_REEST_REQ 0x02
35#define MDL_CAUSE_UNSOL_UA_RESP 0x03
36#define MDL_CAUSE_UNSOL_DM_RESP 0x04
37#define MDL_CAUSE_UNSOL_DM_RESP_MF 0x05
38#define MDL_CAUSE_UNSOL_SPRV_RESP 0x06
39#define MDL_CAUSE_SEQ_ERR 0x07
40#define MDL_CAUSE_UFRM_INC_PARAM 0x08
41#define MDL_CAUSE_SFRM_INC_PARAM 0x09
42#define MDL_CAUSE_IFRM_INC_MBITS 0x0a
43#define MDL_CAUSE_IFRM_INC_LEN 0x0b
44#define MDL_CAUSE_FRM_UNIMPL 0x0c
45#define MDL_CAUSE_SABM_MF 0x0d
46#define MDL_CAUSE_SABM_INFO_NOTALL 0x0e
47#define MDL_CAUSE_FRMR 0x0f
48
50 struct mdl_error_ind_param {
51 uint8_t cause;
52};
53
55 struct dl_rel_req_param {
56 uint8_t mode;
57};
58
60 struct osmo_dlsap_prim {
61 struct osmo_prim_hdr oph;
62 union {
63 struct mdl_error_ind_param error_ind;
64 struct dl_rel_req_param rel_req;
65 } u;
66};
67
69 enum lapd_mode {
70 LAPD_MODE_USER,
71 LAPD_MODE_NETWORK,
72};
73
75 enum lapd_state {
76 LAPD_STATE_NULL = 0,
77 LAPD_STATE_TEI_UNASS,
78 LAPD_STATE_ASS_TEI_WAIT,
79 LAPD_STATE_EST_TEI_WAIT,
80 LAPD_STATE_IDLE,
81 LAPD_STATE_SABM_SENT,
82 LAPD_STATE_DISC_SENT,
83 LAPD_STATE_MF_EST,
84 LAPD_STATE_TIMER_RECOV,
85};
86
88#define LAPD_F_RTS 0x0001
89#define LAPD_F_DROP_2ND_REJ 0x0002
90
92 enum lapd_t200_rts {
93 LAPD_T200_RTS_OFF = 0,
94 LAPD_T200_RTS_PENDING,
95 LAPD_T200_RTS_RUNNING,
96};
97
99 enum lapd_format {
100 LAPD_FORM_UKN = 0,
101 LAPD_FORM_I,
102 LAPD_FORM_S,
103 LAPD_FORM_U,
104};
105
107 struct lapd_msg_ctx {
108 struct lapd_datalink *dl;
109 int n201;
110 /* address */
111 uint8_t cr;
112 uint8_t sapi;
113 uint8_t tei;
114 uint8_t lpd;
115 /* control */
116 uint8_t format;
117 uint8_t p_f; /* poll / final bit */
118 uint8_t n_send;
119 uint8_t n_recv;
120 uint8_t s_u; /* S or repectivly U function bits */
121 /* length */
122 int length;
123 uint8_t more;
124};
125
126 struct lapd_cr_ent {
127 uint8_t cmd;
128 uint8_t resp;
129};
130
131 struct lapd_history {
132 struct msgb *msg; /* message to be sent / NULL, if histoy is empty */
133 int more; /* if message is fragmented */
134};
135
137 struct lapd_datalink {
138 int (*send_dlsap)(struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx);
139 int (*send_ph_data_req)(struct lapd_msg_ctx *lctx, struct msgb *msg);
140 int (*update_pending_frames)(struct lapd_msg_ctx *lctx);
141 struct {
143 struct lapd_cr_ent loc2rem;
144 struct lapd_cr_ent rem2loc;
145 } cr;
146 enum lapd_mode mode;
147 unsigned int lapd_flags;
148 int use_sabme;
149 int reestablish;
150 int n200, n200_est_rel;
151 struct lapd_msg_ctx lctx;
152 int maxf;
153 uint8_t k;
154 uint8_t v_range;
155 uint8_t v_send;
156 uint8_t v_ack;
157 uint8_t v_recv;
158 uint32_t state;
159 int seq_err_cond;
160 uint8_t own_busy;
161 uint8_t peer_busy;
162 int t200_sec, t200_usec;
163 int t203_sec, t203_usec;
164 enum lapd_t200_rts t200_rts;
165 struct osmo_timer_list t200;
166 struct osmo_timer_list t203;
167 uint8_t retrans_ctr;
168 struct llist_head tx_queue;
169 struct llist_head send_queue;
170 struct msgb *send_buffer;
171 int send_out;
172 struct lapd_history *tx_hist;
173 uint8_t range_hist;
174 struct msgb *rcv_buffer;
175 struct msgb *cont_res;
176 char *name;
177};
178
179 void lapd_dl_init(struct lapd_datalink *dl, uint8_t k, uint8_t v_range, int maxf)
180 OSMO_DEPRECATED("Use lapd_dl_init2() instead");
181 void lapd_dl_init2(struct lapd_datalink *dl, uint8_t k, uint8_t v_range, int maxf, const char *name);
182 void lapd_dl_set_name(struct lapd_datalink *dl, const char *name);
183 void lapd_dl_exit(struct lapd_datalink *dl);
184 void lapd_dl_reset(struct lapd_datalink *dl);
185 int lapd_dl_set_flags(struct lapd_datalink *dl, unsigned int flags);
186 int lapd_set_mode(struct lapd_datalink *dl, enum lapd_mode mode);
187 int lapd_ph_data_ind(struct msgb *msg, struct lapd_msg_ctx *lctx);
188 int lapd_ph_rts_ind(struct lapd_msg_ctx *lctx);
189 int lapd_recv_dlsap(struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx);
190 int lapd_t200_timeout(struct lapd_datalink *dl);
191
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.
Definition: lapd_core.c:305
lapd_set_mode
int lapd_set_mode(struct lapd_datalink *dl, enum lapd_mode mode)
Set the lapdm_mode of a LAPDm entity.
Definition: lapd_core.c:432
lapd_ph_data_ind
int lapd_ph_data_ind(struct msgb *msg, struct lapd_msg_ctx *lctx)
Definition: lapd_core.c:1772
lapd_dl_set_flags
int lapd_dl_set_flags(struct lapd_datalink *dl, unsigned int flags)
Set lapd_flags to change behaviour.
Definition: lapd_core.c:403
lapd_dl_reset
void lapd_dl_reset(struct lapd_datalink *dl)
Definition: lapd_core.c:380
lapd_t200_timeout
int lapd_t200_timeout(struct lapd_datalink *dl)
Handle timeout condition of T200 in RTS mode.
Definition: lapd_core.c:224
lapd_t200_rts
lapd_t200_rts
LAPD T200 state in RTS mode.
Definition: lapd_core.h:92
lapd_recv_dlsap
int lapd_recv_dlsap(struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx)
Definition: lapd_core.c:2316
lapd_mode
lapd_mode
LAPD mode/role.
Definition: lapd_core.h:69
lapd_dl_exit
void lapd_dl_exit(struct lapd_datalink *dl)
Definition: lapd_core.c:416
lapd_dl_set_name
void lapd_dl_set_name(struct lapd_datalink *dl, const char *name)
Definition: lapd_core.c:372
lapd_dl_init
void lapd_dl_init(struct lapd_datalink *dl, uint8_t k, uint8_t v_range, int maxf) OSMO_DEPRECATED("Use lapd_dl_init2() instead")
Initialize LAPD datalink instance and allocate history.
Definition: lapd_core.c:367
lapd_format
lapd_format
LAPD message format (I / S / U)
Definition: lapd_core.h:99
lapd_ph_rts_ind
int lapd_ph_rts_ind(struct lapd_msg_ctx *lctx)
Enqueue next LAPD frame and run pending T200.
Definition: lapd_core.c:1800
osmo_dl_prim
osmo_dl_prim
LAPD related primitives (L2<->L3 SAP)
Definition: lapd_core.h:21
lapd_state
lapd_state
LAPD state (Figure B.2/Q.921)
Definition: lapd_core.h:75
LAPD_T200_RTS_OFF
@ LAPD_T200_RTS_OFF
Definition: lapd_core.h:93
LAPD_T200_RTS_PENDING
@ LAPD_T200_RTS_PENDING
Definition: lapd_core.h:94
LAPD_T200_RTS_RUNNING
@ LAPD_T200_RTS_RUNNING
Definition: lapd_core.h:95
LAPD_MODE_USER
@ LAPD_MODE_USER
behave like user
Definition: lapd_core.h:70
LAPD_MODE_NETWORK
@ LAPD_MODE_NETWORK
behave like network
Definition: lapd_core.h:71
LAPD_FORM_U
@ LAPD_FORM_U
Definition: lapd_core.h:103
LAPD_FORM_I
@ LAPD_FORM_I
Definition: lapd_core.h:101
LAPD_FORM_S
@ LAPD_FORM_S
Definition: lapd_core.h:102
LAPD_FORM_UKN
@ LAPD_FORM_UKN
Definition: lapd_core.h:100
PRIM_DL_REL
@ PRIM_DL_REL
DL-RLEEASE.
Definition: lapd_core.h:25
PRIM_DL_RES
@ PRIM_DL_RES
DL-RESUME.
Definition: lapd_core.h:27
PRIM_DL_SUSP
@ PRIM_DL_SUSP
DL-SUSPEND.
Definition: lapd_core.h:26
PRIM_DL_EST
@ PRIM_DL_EST
DL-ESTABLISH.
Definition: lapd_core.h:24
PRIM_DL_DATA
@ PRIM_DL_DATA
DL-DATA.
Definition: lapd_core.h:23
PRIM_DL_UNIT_DATA
@ PRIM_DL_UNIT_DATA
DL-UNIT-DATA.
Definition: lapd_core.h:22
PRIM_MDL_ERROR
@ PRIM_MDL_ERROR
MDL-ERROR.
Definition: lapd_core.h:29
PRIM_DL_RECON
@ PRIM_DL_RECON
DL-RECONNECT.
Definition: lapd_core.h:28
LAPD_STATE_SABM_SENT
@ LAPD_STATE_SABM_SENT
Definition: lapd_core.h:81
LAPD_STATE_TEI_UNASS
@ LAPD_STATE_TEI_UNASS
Definition: lapd_core.h:77
LAPD_STATE_MF_EST
@ LAPD_STATE_MF_EST
Definition: lapd_core.h:83
LAPD_STATE_EST_TEI_WAIT
@ LAPD_STATE_EST_TEI_WAIT
Definition: lapd_core.h:79
LAPD_STATE_DISC_SENT
@ LAPD_STATE_DISC_SENT
Definition: lapd_core.h:82
LAPD_STATE_ASS_TEI_WAIT
@ LAPD_STATE_ASS_TEI_WAIT
Definition: lapd_core.h:78
LAPD_STATE_NULL
@ LAPD_STATE_NULL
Definition: lapd_core.h:76
LAPD_STATE_TIMER_RECOV
@ LAPD_STATE_TIMER_RECOV
Definition: lapd_core.h:84
LAPD_STATE_IDLE
@ LAPD_STATE_IDLE
Definition: lapd_core.h:80
OSMO_DEPRECATED
#define OSMO_DEPRECATED(text)
msgb.h
dl_rel_req_param
for DL-REL.req
Definition: lapd_core.h:55
dl_rel_req_param::mode
uint8_t mode
release mode
Definition: lapd_core.h:56
lapd_cr_ent
Definition: lapd_core.h:126
lapd_cr_ent::resp
uint8_t resp
Definition: lapd_core.h:128
lapd_cr_ent::cmd
uint8_t cmd
Definition: lapd_core.h:127
lapd_datalink
LAPD datalink.
Definition: lapd_core.h:137
lapd_datalink::peer_busy
uint8_t peer_busy
receiver busy on remote side
Definition: lapd_core.h:161
lapd_datalink::loc2rem
struct lapd_cr_ent loc2rem
filled-in once we set the lapd_mode above
Definition: lapd_core.h:143
lapd_datalink::update_pending_frames
int(* update_pending_frames)(struct lapd_msg_ctx *lctx)
Definition: lapd_core.h:140
lapd_datalink::cr
struct lapd_datalink::@3 cr
lapd_datalink::tx_queue
struct llist_head tx_queue
frames to L1
Definition: lapd_core.h:168
lapd_datalink::t203
struct osmo_timer_list t203
T203 timer.
Definition: lapd_core.h:166
lapd_datalink::seq_err_cond
int seq_err_cond
condition of sequence error
Definition: lapd_core.h:159
lapd_datalink::tx_hist
struct lapd_history * tx_hist
tx history structure array
Definition: lapd_core.h:172
lapd_datalink::use_sabme
int use_sabme
use SABME instead of SABM
Definition: lapd_core.h:148
lapd_datalink::range_hist
uint8_t range_hist
range of history buffer 2..2^n
Definition: lapd_core.h:173
lapd_datalink::reestablish
int reestablish
enable reestablish support
Definition: lapd_core.h:149
lapd_datalink::rem2loc
struct lapd_cr_ent rem2loc
Definition: lapd_core.h:144
lapd_datalink::name
char * name
user-provided name
Definition: lapd_core.h:176
lapd_datalink::v_ack
uint8_t v_ack
last frame ACKed by peer
Definition: lapd_core.h:156
lapd_datalink::own_busy
uint8_t own_busy
receiver busy on our side
Definition: lapd_core.h:160
lapd_datalink::t200
struct osmo_timer_list t200
T200 timer.
Definition: lapd_core.h:165
lapd_datalink::maxf
int maxf
maximum frame size (after defragmentation)
Definition: lapd_core.h:152
lapd_datalink::t200_usec
int t200_usec
retry timer (default 1 sec)
Definition: lapd_core.h:162
lapd_datalink::t200_rts
enum lapd_t200_rts t200_rts
state of T200 in RTS mode
Definition: lapd_core.h:164
lapd_datalink::retrans_ctr
uint8_t retrans_ctr
re-transmission counter
Definition: lapd_core.h:167
lapd_datalink::cont_res
struct msgb * cont_res
buffer to store content resolution data on network side, to detect multiple phones on same channel
Definition: lapd_core.h:175
lapd_datalink::v_send
uint8_t v_send
seq nr of next I frame to be transmitted
Definition: lapd_core.h:155
lapd_datalink::n200
int n200
Definition: lapd_core.h:150
lapd_datalink::lapd_flags
unsigned int lapd_flags
lapd_flags to change processing
Definition: lapd_core.h:147
lapd_datalink::send_buffer
struct msgb * send_buffer
current frame transmitting
Definition: lapd_core.h:170
lapd_datalink::t203_sec
int t203_sec
Definition: lapd_core.h:163
lapd_datalink::send_out
int send_out
how much was sent from send_buffer
Definition: lapd_core.h:171
lapd_datalink::k
uint8_t k
maximum number of unacknowledged frames
Definition: lapd_core.h:153
lapd_datalink::lctx
struct lapd_msg_ctx lctx
LAPD context.
Definition: lapd_core.h:151
lapd_datalink::send_ph_data_req
int(* send_ph_data_req)(struct lapd_msg_ctx *lctx, struct msgb *msg)
Definition: lapd_core.h:139
lapd_datalink::mode
enum lapd_mode mode
current mode of link
Definition: lapd_core.h:146
lapd_datalink::state
uint32_t state
LAPD state (lapd_state)
Definition: lapd_core.h:158
lapd_datalink::v_recv
uint8_t v_recv
seq nr of next I frame expected to be received
Definition: lapd_core.h:157
lapd_datalink::n200_est_rel
int n200_est_rel
number of retranmissions
Definition: lapd_core.h:150
lapd_datalink::send_dlsap
int(* send_dlsap)(struct osmo_dlsap_prim *dp, struct lapd_msg_ctx *lctx)
Definition: lapd_core.h:138
lapd_datalink::rcv_buffer
struct msgb * rcv_buffer
buffer to assemble the received message
Definition: lapd_core.h:174
lapd_datalink::v_range
uint8_t v_range
range of sequence numbers
Definition: lapd_core.h:154
lapd_datalink::t200_sec
int t200_sec
Definition: lapd_core.h:162
lapd_datalink::t203_usec
int t203_usec
retry timer (default 10 secs)
Definition: lapd_core.h:163
lapd_datalink::send_queue
struct llist_head send_queue
frames from L3
Definition: lapd_core.h:169
lapd_history
Definition: lapd_core.h:131
lapd_history::msg
struct msgb * msg
Definition: lapd_core.h:132
lapd_history::more
int more
Definition: lapd_core.h:133
lapd_msg_ctx
LAPD message context.
Definition: lapd_core.h:107
lapd_msg_ctx::more
uint8_t more
Definition: lapd_core.h:123
lapd_msg_ctx::n_send
uint8_t n_send
Definition: lapd_core.h:118
lapd_msg_ctx::dl
struct lapd_datalink * dl
Definition: lapd_core.h:108
lapd_msg_ctx::n_recv
uint8_t n_recv
Definition: lapd_core.h:119
lapd_msg_ctx::p_f
uint8_t p_f
Definition: lapd_core.h:117
lapd_msg_ctx::n201
int n201
Definition: lapd_core.h:109
lapd_msg_ctx::lpd
uint8_t lpd
Definition: lapd_core.h:114
lapd_msg_ctx::sapi
uint8_t sapi
Definition: lapd_core.h:112
lapd_msg_ctx::cr
uint8_t cr
Definition: lapd_core.h:111
lapd_msg_ctx::format
uint8_t format
Definition: lapd_core.h:116
lapd_msg_ctx::length
int length
Definition: lapd_core.h:122
lapd_msg_ctx::tei
uint8_t tei
Definition: lapd_core.h:113
lapd_msg_ctx::s_u
uint8_t s_u
Definition: lapd_core.h:120
llist_head
mdl_error_ind_param
for MDL-ERROR.ind
Definition: lapd_core.h:50
mdl_error_ind_param::cause
uint8_t cause
generic cause value
Definition: lapd_core.h:51
msgb
osmo_dlsap_prim
primitive header for LAPD DL-SAP primitives
Definition: lapd_core.h:60
osmo_dlsap_prim::u
union osmo_dlsap_prim::@2 u
request-specific data
osmo_dlsap_prim::oph
struct osmo_prim_hdr oph
generic primitive header
Definition: lapd_core.h:61
osmo_dlsap_prim::rel_req
struct dl_rel_req_param rel_req
Definition: lapd_core.h:64
osmo_dlsap_prim::error_ind
struct mdl_error_ind_param error_ind
Definition: lapd_core.h:63
osmo_prim_hdr
osmo_timer_list
timer.h