blob: e01d065aa921034f65bc2a08ce077804691b1a5d [file] [log] [blame]
Sylvain Munaut12ba7782014-06-16 10:13:40 +02001#pragma once
Harald Welte1f0b8c22011-06-27 10:51:37 +02002
Andreas Eversbergaa85a2d2013-02-07 12:18:37 +01003#include <osmocom/gsm/l1sap.h>
rootaf48bed2011-09-26 11:23:06 +02004#include <osmocom/gsm/lapd_core.h>
Harald Welte1f0b8c22011-06-27 10:51:37 +02005
Harald Welte6bdf0b12011-08-17 18:22:08 +02006/*! \defgroup lapdm LAPDm implementation according to GSM TS 04.06
7 * @{
Neels Hofmeyr17518fe2017-06-20 04:35:06 +02008 * \file lapdm.h */
Harald Welte6bdf0b12011-08-17 18:22:08 +02009
Neels Hofmeyr87e45502017-06-20 00:17:59 +020010/*! LAPDm mode/role */
Harald Welte1f0b8c22011-06-27 10:51:37 +020011enum lapdm_mode {
Neels Hofmeyr87e45502017-06-20 00:17:59 +020012 LAPDM_MODE_MS, /*!< behave like a MS (mobile phone) */
13 LAPDM_MODE_BTS, /*!< behave like a BTS (network) */
Harald Welte1f0b8c22011-06-27 10:51:37 +020014};
15
Harald Welte1f0b8c22011-06-27 10:51:37 +020016struct lapdm_entity;
17
Neels Hofmeyr87e45502017-06-20 00:17:59 +020018/*! LAPDm message context */
Harald Welte1f0b8c22011-06-27 10:51:37 +020019struct lapdm_msg_ctx {
20 struct lapdm_datalink *dl;
21 int lapdm_fmt;
Harald Welte1f0b8c22011-06-27 10:51:37 +020022 uint8_t chan_nr;
23 uint8_t link_id;
Andreas.Eversbergf1f80de2011-11-06 20:45:29 +010024 uint8_t ta_ind; /* TA indicated by network */
25 uint8_t tx_power_ind; /* MS power indicated by network */
Harald Welte1f0b8c22011-06-27 10:51:37 +020026};
27
Neels Hofmeyr87e45502017-06-20 00:17:59 +020028/*! LAPDm datalink like TS 04.06 / Section 3.5.2 */
Harald Welte1f0b8c22011-06-27 10:51:37 +020029struct lapdm_datalink {
Neels Hofmeyr87e45502017-06-20 00:17:59 +020030 struct lapd_datalink dl; /* common LAPD */
31 struct lapdm_msg_ctx mctx; /*!< context of established connection */
Harald Welte1f0b8c22011-06-27 10:51:37 +020032
Neels Hofmeyr87e45502017-06-20 00:17:59 +020033 struct lapdm_entity *entity; /*!< LAPDm entity we are part of */
Harald Welte1f0b8c22011-06-27 10:51:37 +020034};
35
Neels Hofmeyr87e45502017-06-20 00:17:59 +020036/*! LAPDm datalink SAPIs */
Harald Welte1f0b8c22011-06-27 10:51:37 +020037enum lapdm_dl_sapi {
Neels Hofmeyr87e45502017-06-20 00:17:59 +020038 DL_SAPI0 = 0, /*!< SAPI 0 */
39 DL_SAPI3 = 1, /*!< SAPI 1 */
Harald Welte1f0b8c22011-06-27 10:51:37 +020040 _NR_DL_SAPI
41};
42
43typedef int (*lapdm_cb_t)(struct msgb *msg, struct lapdm_entity *le, void *ctx);
44
Harald Welte1f0b8c22011-06-27 10:51:37 +020045#define LAPDM_ENT_F_EMPTY_FRAME 0x0001
46#define LAPDM_ENT_F_POLLING_ONLY 0x0002
47
Neels Hofmeyr87e45502017-06-20 00:17:59 +020048/*! a LAPDm Entity */
Harald Welte1f0b8c22011-06-27 10:51:37 +020049struct lapdm_entity {
Neels Hofmeyr87e45502017-06-20 00:17:59 +020050 /*! the SAPIs of the LAPDm entity */
Harald Welte1f0b8c22011-06-27 10:51:37 +020051 struct lapdm_datalink datalink[_NR_DL_SAPI];
Neels Hofmeyr87e45502017-06-20 00:17:59 +020052 int last_tx_dequeue; /*!< last entity that was dequeued */
53 int tx_pending; /*!< currently a pending frame not confirmed by L1 */
54 enum lapdm_mode mode; /*!< are we in BTS mode or MS mode */
Harald Welte1f0b8c22011-06-27 10:51:37 +020055 unsigned int flags;
56
Neels Hofmeyr87e45502017-06-20 00:17:59 +020057 void *l1_ctx; /*!< context for layer1 instance */
58 void *l3_ctx; /*!< context for layer3 instance */
Harald Welte1f0b8c22011-06-27 10:51:37 +020059
Neels Hofmeyr87e45502017-06-20 00:17:59 +020060 osmo_prim_cb l1_prim_cb;/*!< callback for sending prims to L1 */
61 lapdm_cb_t l3_cb; /*!< callback for sending stuff to L3 */
Harald Welte1f0b8c22011-06-27 10:51:37 +020062
Neels Hofmeyr87e45502017-06-20 00:17:59 +020063 /*! pointer to \ref lapdm_channel of which we're part */
Harald Welte1f0b8c22011-06-27 10:51:37 +020064 struct lapdm_channel *lapdm_ch;
Andreas.Eversbergf1f80de2011-11-06 20:45:29 +010065
66 uint8_t ta; /* TA used and indicated to network */
67 uint8_t tx_power; /* MS power used and indicated to network */
Harald Welte1f0b8c22011-06-27 10:51:37 +020068};
69
Neels Hofmeyr87e45502017-06-20 00:17:59 +020070/*! the two lapdm_entities that form a GSM logical channel (ACCH + DCCH) */
Harald Welte1f0b8c22011-06-27 10:51:37 +020071struct lapdm_channel {
Neels Hofmeyr87e45502017-06-20 00:17:59 +020072 struct llist_head list; /*!< internal linked list */
73 char *name; /*!< human-readable name */
74 struct lapdm_entity lapdm_acch; /*!< Associated Control Channel */
75 struct lapdm_entity lapdm_dcch; /*!< Dedicated Control Channel */
Harald Welte1f0b8c22011-06-27 10:51:37 +020076};
77
78const char *get_rsl_name(int value);
79extern const char *lapdm_state_names[];
80
Daniel Willmann55405fb2014-03-26 13:45:17 +010081struct lapdm_datalink *lapdm_datalink_for_sapi(struct lapdm_entity *le, uint8_t sapi);
82
Harald Welte1f0b8c22011-06-27 10:51:37 +020083/* initialize a LAPDm entity */
Andreas.Eversberg5ac44782011-11-06 20:35:48 +010084void lapdm_entity_init(struct lapdm_entity *le, enum lapdm_mode mode, int t200);
Harald Welte1f0b8c22011-06-27 10:51:37 +020085void lapdm_channel_init(struct lapdm_channel *lc, enum lapdm_mode mode);
86
87/* deinitialize a LAPDm entity */
88void lapdm_entity_exit(struct lapdm_entity *le);
89void lapdm_channel_exit(struct lapdm_channel *lc);
90
91/* input into layer2 (from layer 1) */
92int lapdm_phsap_up(struct osmo_prim_hdr *oph, struct lapdm_entity *le);
93
94/* input into layer2 (from layer 3) */
95int lapdm_rslms_recvmsg(struct msgb *msg, struct lapdm_channel *lc);
96
97void lapdm_channel_set_l3(struct lapdm_channel *lc, lapdm_cb_t cb, void *ctx);
98void lapdm_channel_set_l1(struct lapdm_channel *lc, osmo_prim_cb cb, void *ctx);
99
100int lapdm_entity_set_mode(struct lapdm_entity *le, enum lapdm_mode mode);
101int lapdm_channel_set_mode(struct lapdm_channel *lc, enum lapdm_mode mode);
102
103void lapdm_entity_reset(struct lapdm_entity *le);
104void lapdm_channel_reset(struct lapdm_channel *lc);
105
106void lapdm_entity_set_flags(struct lapdm_entity *le, unsigned int flags);
107void lapdm_channel_set_flags(struct lapdm_channel *lc, unsigned int flags);
108
109int lapdm_phsap_dequeue_prim(struct lapdm_entity *le, struct osmo_phsap_prim *pp);
110
Sylvain Munautdca7d2c2012-04-18 21:53:23 +0200111/*! @} */