blob: ee4ee38a1f3a56947840ce6ac457d3d36e6ac9e5 [file] [log] [blame]
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +02001#ifndef OPENBSC_LAPD_H
2#define OPENBSC_LAPD_H
3
4#include <stdint.h>
5
6#include <osmocom/core/linuxlist.h>
Andreas Eversberga7ff0012011-09-26 11:29:30 +02007#include <osmocom/gsm/lapd_core.h>
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +02008
Andreas Eversberga7ff0012011-09-26 11:29:30 +02009enum lapd_profile {
10 LAPD_PROFILE_ISDN,
11 LAPD_PROFILE_ABIS,
12 LAPD_PROFILE_ASAT,
13};
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +020014
15struct lapd_instance {
16 struct llist_head list; /* list of LAPD instances */
17 int network_side;
18
Andreas Eversberga7ff0012011-09-26 11:29:30 +020019 void (*transmit_cb)(struct msgb *msg, void *cbdata);
20 void *transmit_cbdata;
21 void (*receive_cb)(struct osmo_dlsap_prim *odp, uint8_t tei,
22 uint8_t sapi, void *rx_cbdata);
23 void *receive_cbdata;
24
25 enum lapd_profile profile;
26 uint8_t short_address;
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +020027
28 struct llist_head tei_list; /* list of TEI in this LAPD instance */
29};
30
Pablo Neira Ayuso31fe5f22011-08-09 23:15:38 +020031enum lapd_recv_errors {
32 LAPD_ERR_NONE = 0,
33 LAPD_ERR_BAD_LEN,
34 LAPD_ERR_BAD_ADDR,
35 LAPD_ERR_UNKNOWN_S_CMD,
36 LAPD_ERR_UNKNOWN_U_CMD,
37 LAPD_ERR_UNKNOWN_TEI,
38 LAPD_ERR_BAD_CMD,
Andreas Eversberga7ff0012011-09-26 11:29:30 +020039 LAPD_ERR_NO_MEM,
Pablo Neira Ayuso31fe5f22011-08-09 23:15:38 +020040 __LAPD_ERR_MAX
41};
42
Andreas Eversberga7ff0012011-09-26 11:29:30 +020043int lapd_receive(struct lapd_instance *li, struct msgb *msg, int *error);
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +020044
Andreas Eversberga7ff0012011-09-26 11:29:30 +020045void lapd_transmit(struct lapd_instance *li, uint8_t tei, uint8_t sapi,
46 struct msgb *msg);
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +020047
48struct lapd_instance *lapd_instance_alloc(int network_side,
Andreas Eversberga7ff0012011-09-26 11:29:30 +020049 void (*tx_cb)(struct msgb *msg, void *cbdata), void *tx_cbdata,
50 void (*rx_cb)(struct osmo_dlsap_prim *odp, uint8_t tei, uint8_t sapi,
51 void *rx_cbdata), void *rx_cbdata,
52 enum lapd_profile profile);
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +020053
Harald Welte14078ea2011-08-24 09:45:11 +020054void lapd_instance_free(struct lapd_instance *li);
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +020055
56/* Start a (user-side) SAP for the specified TEI/SAPI on the LAPD instance */
57int lapd_sap_start(struct lapd_instance *li, uint8_t tei, uint8_t sapi);
58
59/* Stop a (user-side) SAP for the specified TEI/SAPI on the LAPD instance */
60int lapd_sap_stop(struct lapd_instance *li, uint8_t tei, uint8_t sapi);
61
62#endif /* OPENBSC_LAPD_H */