1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
#ifndef OPENBSC_LAPD_H
#define OPENBSC_LAPD_H
#include <stdint.h>
#include <osmocom/core/linuxlist.h>
typedef enum {
LAPD_MPH_NONE = 0,
LAPD_MPH_ACTIVATE_IND,
LAPD_MPH_DEACTIVATE_IND,
LAPD_DL_DATA_IND,
LAPD_DL_UNITDATA_IND,
} lapd_mph_type;
struct lapd_instance {
struct llist_head list; /* list of LAPD instances */
int network_side;
void (*transmit_cb)(uint8_t *data, int len, void *cbdata);
void *cbdata;
struct llist_head tei_list; /* list of TEI in this LAPD instance */
};
enum lapd_recv_errors {
LAPD_ERR_NONE = 0,
LAPD_ERR_BAD_LEN,
LAPD_ERR_BAD_ADDR,
LAPD_ERR_UNKNOWN_S_CMD,
LAPD_ERR_UNKNOWN_U_CMD,
LAPD_ERR_UNKNOWN_TEI,
LAPD_ERR_BAD_CMD,
__LAPD_ERR_MAX
};
extern uint8_t *lapd_receive(struct lapd_instance *li, uint8_t *data,
unsigned int len, int *ilen, lapd_mph_type *prim,
int *error);
extern void lapd_transmit(struct lapd_instance *li, uint8_t tei, uint8_t sapi,
uint8_t *data, unsigned int len);
struct lapd_instance *lapd_instance_alloc(int network_side,
void (*tx_cb)(uint8_t *data, int len,
void *cbdata), void *cbdata);
/* Start a (user-side) SAP for the specified TEI/SAPI on the LAPD instance */
int lapd_sap_start(struct lapd_instance *li, uint8_t tei, uint8_t sapi);
/* Stop a (user-side) SAP for the specified TEI/SAPI on the LAPD instance */
int lapd_sap_stop(struct lapd_instance *li, uint8_t tei, uint8_t sapi);
#endif /* OPENBSC_LAPD_H */
|