blob: dd22028abbe986b7bdcce9c40133ca89af429a8f [file] [log] [blame]
Harald Welte6803ab22011-02-04 20:38:22 +01001#ifndef OPENBSC_LAPD_H
2#define OPENBSC_LAPD_H
Matthew Fredrickson124c80e2010-02-16 22:01:36 +01003
4#include <stdint.h>
5
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +01006#include <osmocom/core/linuxlist.h>
Harald Welte306a2062011-02-05 19:13:00 +01007
Matthew Fredrickson124c80e2010-02-16 22:01:36 +01008typedef enum {
9 LAPD_MPH_NONE = 0,
10
11 LAPD_MPH_ACTIVATE_IND,
12 LAPD_MPH_DEACTIVATE_IND,
13
14 LAPD_DL_DATA_IND,
creslin28752b0e022010-03-26 12:57:31 -050015 LAPD_DL_UNITDATA_IND,
Matthew Fredrickson124c80e2010-02-16 22:01:36 +010016
17} lapd_mph_type;
18
Harald Welte306a2062011-02-05 19:13:00 +010019struct lapd_instance {
20 struct llist_head list; /* list of LAPD instances */
21 int network_side;
Matthew Fredrickson124c80e2010-02-16 22:01:36 +010022
Harald Welte306a2062011-02-05 19:13:00 +010023 void (*transmit_cb)(uint8_t *data, int len, void *cbdata);
24 void *cbdata;
Matthew Fredrickson124c80e2010-02-16 22:01:36 +010025
Harald Welte306a2062011-02-05 19:13:00 +010026 struct llist_head tei_list; /* list of TEI in this LAPD instance */
27};
28
Pablo Neira Ayuso3f663282011-08-09 23:15:38 +020029enum lapd_recv_errors {
30 LAPD_ERR_NONE = 0,
31 LAPD_ERR_BAD_LEN,
32 LAPD_ERR_BAD_ADDR,
33 LAPD_ERR_UNKNOWN_S_CMD,
34 LAPD_ERR_UNKNOWN_U_CMD,
35 LAPD_ERR_UNKNOWN_TEI,
36 LAPD_ERR_BAD_CMD,
37 __LAPD_ERR_MAX
38};
39
40extern uint8_t *lapd_receive(struct lapd_instance *li, uint8_t *data,
41 unsigned int len, int *ilen, lapd_mph_type *prim,
42 int *error);
Harald Welte306a2062011-02-05 19:13:00 +010043
Harald Weltecbaa38a2011-02-05 20:20:50 +010044extern void lapd_transmit(struct lapd_instance *li, uint8_t tei, uint8_t sapi,
45 uint8_t *data, unsigned int len);
Harald Welte306a2062011-02-05 19:13:00 +010046
Harald Welte0a474002011-02-11 18:34:51 +010047struct lapd_instance *lapd_instance_alloc(int network_side,
48 void (*tx_cb)(uint8_t *data, int len,
Harald Welte306a2062011-02-05 19:13:00 +010049 void *cbdata), void *cbdata);
Matthew Fredrickson124c80e2010-02-16 22:01:36 +010050
Harald Welte0303a362011-02-13 11:58:21 +010051
52/* Start a (user-side) SAP for the specified TEI/SAPI on the LAPD instance */
53int lapd_sap_start(struct lapd_instance *li, uint8_t tei, uint8_t sapi);
54
55/* Stop a (user-side) SAP for the specified TEI/SAPI on the LAPD instance */
56int lapd_sap_stop(struct lapd_instance *li, uint8_t tei, uint8_t sapi);
Harald Welte0a474002011-02-11 18:34:51 +010057
Harald Welte6803ab22011-02-04 20:38:22 +010058#endif /* OPENBSC_LAPD_H */