blob: f29491aaff3a780c51f8135274dff8663f55257a [file] [log] [blame]
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +02001#ifndef _E1_INPUT_H
2#define _E1_INPUT_H
3
4#include <stdlib.h>
5#include <netinet/in.h>
6
7#include <osmocom/core/linuxlist.h>
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +02008#include <osmocom/core/timer.h>
9#include <osmocom/core/msgb.h>
10#include <osmocom/core/select.h>
Pablo Neira Ayuso177094b2011-06-07 12:21:51 +020011#include <osmocom/abis/subchan_demux.h>
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +020012
13#define NUM_E1_TS 32
14
15enum e1inp_sign_type {
16 E1INP_SIGN_NONE,
17 E1INP_SIGN_OML,
18 E1INP_SIGN_RSL,
19};
20const char *e1inp_signtype_name(enum e1inp_sign_type tp);
21
22struct e1inp_ts;
23
24struct e1inp_sign_link {
25 /* list of signalling links */
26 struct llist_head list;
27
28 /* to which timeslot do we belong? */
29 struct e1inp_ts *ts;
30
31 enum e1inp_sign_type type;
32
33 /* trx for msg->trx of received msgs */
34 struct gsm_bts_trx *trx;
35
36 /* msgb queue of to-be-transmitted msgs */
37 struct llist_head tx_list;
38
39 /* SAPI and TEI on the E1 TS */
40 uint8_t sapi;
41 uint8_t tei;
42
43 union {
44 struct {
45 uint8_t channel;
46 } misdn;
47 } driver;
48};
49
50enum e1inp_ts_type {
51 E1INP_TS_TYPE_NONE,
52 E1INP_TS_TYPE_SIGN,
53 E1INP_TS_TYPE_TRAU,
54};
55const char *e1inp_tstype_name(enum e1inp_ts_type tp);
56
57/* A timeslot in the E1 interface */
58struct e1inp_ts {
59 enum e1inp_ts_type type;
60 int num;
61
62 /* to which line do we belong ? */
63 struct e1inp_line *line;
64
65 union {
66 struct {
67 /* list of all signalling links on this TS */
68 struct llist_head sign_links;
69 /* delay for the queue */
70 int delay;
71 /* timer when to dequeue next frame */
72 struct osmo_timer_list tx_timer;
73 } sign;
74 struct {
75 /* subchannel demuxer for frames from E1 */
76 struct subch_demux demux;
77 /* subchannel muxer for frames to E1 */
78 struct subch_mux mux;
79 } trau;
80 };
81 union {
82 struct {
83 /* mISDN driver has one fd for each ts */
84 struct osmo_fd fd;
85 } misdn;
86 struct {
87 /* ip.access driver has one fd for each ts */
88 struct osmo_fd fd;
89 } ipaccess;
90 struct {
91 /* DAHDI driver has one fd for each ts */
92 struct osmo_fd fd;
93 struct lapd_instance *lapd;
94 } dahdi;
95 } driver;
96};
97
98struct gsm_e1_subslot {
99 /* Number of E1 link */
100 uint8_t e1_nr;
101 /* Number of E1 TS inside E1 link */
102 uint8_t e1_ts;
103 /* Sub-slot within the E1 TS, 0xff if full TS */
104 uint8_t e1_ts_ss;
105};
106
107enum e1inp_line_role {
108 E1INP_LINE_R_NONE,
109 E1INP_LINE_R_BSC,
110 E1INP_LINE_R_BTS,
111 E1INP_LINE_R_MAX
112};
113
114struct e1inp_driver {
115 struct llist_head list;
116 const char *name;
117 int (*want_write)(struct e1inp_ts *ts);
Pablo Neira Ayusoc00ee732011-06-21 12:22:49 +0200118 int (*line_update)(struct e1inp_line *line, enum e1inp_line_role role, const char *addr);
Pablo Neira Ayusoc9c4fd32011-06-30 12:19:42 +0200119 void (*close)(struct e1inp_ts *ts);
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +0200120 int default_delay;
121};
122
Pablo Neira Ayuso5a4b7c52011-06-07 14:07:48 +0200123struct e1inp_line_ops {
Pablo Neira Ayusof163d232011-06-25 18:42:55 +0200124 enum e1inp_line_role role;
125 char *addr;
Pablo Neira Ayusodfafe682011-07-02 14:32:32 +0200126 void *data;
Pablo Neira Ayusof163d232011-06-25 18:42:55 +0200127
Pablo Neira Ayusoc9c4fd32011-06-30 12:19:42 +0200128 struct e1inp_sign_link * (*sign_link_up)(void *unit_info, struct e1inp_line *line, enum e1inp_sign_type type);
129 void (*sign_link_down)(struct e1inp_line *line);
130 int (*sign_link)(struct msgb *msg, struct e1inp_sign_link *link);
Pablo Neira Ayuso5a4b7c52011-06-07 14:07:48 +0200131};
132
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +0200133struct e1inp_line {
134 struct llist_head list;
135 int refcnt;
136
137 unsigned int num;
138 const char *name;
139
140 /* array of timestlots */
141 struct e1inp_ts ts[NUM_E1_TS];
142
Pablo Neira Ayusof163d232011-06-25 18:42:55 +0200143 const struct e1inp_line_ops *ops;
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +0200144
145 struct e1inp_driver *driver;
146 void *driver_data;
147};
148
149/* SS_INPUT signals */
150enum signal_input {
151 S_INP_NONE,
152 S_INP_TEI_UP,
153 S_INP_TEI_DN,
154 S_INP_LINE_INIT,
155 S_INP_LINE_ALARM,
156 S_INP_LINE_NOALARM,
157};
158
159/* register a driver with the E1 core */
160int e1inp_driver_register(struct e1inp_driver *drv);
161
162/* fine a previously registered driver */
163struct e1inp_driver *e1inp_driver_find(const char *name);
164
165/* register a line with the E1 core */
166int e1inp_line_register(struct e1inp_line *line);
167
168/* get a line by its ID */
169struct e1inp_line *e1inp_line_get(uint8_t e1_nr);
170
171/* create a line in the E1 input core */
Pablo Neira Ayusof163d232011-06-25 18:42:55 +0200172struct e1inp_line *e1inp_line_create(uint8_t e1_nr, const char *driver_name);
173
174/* bind operations to one E1 input line */
175void e1inp_line_bind_ops(struct e1inp_line *line, const struct e1inp_line_ops *ops);
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +0200176
177/* find a sign_link for given TEI and SAPI in a TS */
178struct e1inp_sign_link *
179e1inp_lookup_sign_link(struct e1inp_ts *ts, uint8_t tei,
180 uint8_t sapi);
181
182/* create a new signalling link in a E1 timeslot */
183struct e1inp_sign_link *
184e1inp_sign_link_create(struct e1inp_ts *ts, enum e1inp_sign_type type,
185 struct gsm_bts_trx *trx, uint8_t tei,
186 uint8_t sapi);
187
Pablo Neira Ayuso211d2ca2011-06-07 17:15:10 +0200188/* configure and initialize one signalling e1inp_ts */
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +0200189int e1inp_ts_config_sign(struct e1inp_ts *ts, struct e1inp_line *line);
Pablo Neira Ayuso211d2ca2011-06-07 17:15:10 +0200190
191/* configure and initialize one timeslot dedicated to TRAU frames. */
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +0200192int e1inp_ts_config_trau(struct e1inp_ts *ts, struct e1inp_line *line,
Pablo Neira Ayuso211d2ca2011-06-07 17:15:10 +0200193 int (*trau_rcv_cb)(struct subch_demux *dmx, int ch,
194 uint8_t *data, int len, void *_priv));
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +0200195
196/* Call from the Stack: configuration of this TS has changed */
197int e1inp_update_ts(struct e1inp_ts *ts);
198
199/* Receive a packet from the E1 driver */
200int e1inp_rx_ts(struct e1inp_ts *ts, struct msgb *msg,
201 uint8_t tei, uint8_t sapi);
202
203/* called by driver if it wants to transmit on a given TS */
204struct msgb *e1inp_tx_ts(struct e1inp_ts *e1i_ts,
205 struct e1inp_sign_link **sign_link);
206
207/* called by driver in case some kind of link state event */
208int e1inp_event(struct e1inp_ts *ts, int evt, uint8_t tei, uint8_t sapi);
209
210/* Write LAPD frames to the fd. */
211void e1_set_pcap_fd(int fd);
212
213/* called by TRAU muxer to obtain the destination mux entity */
214struct subch_mux *e1inp_get_mux(uint8_t e1_nr, uint8_t ts_nr);
215
216void e1inp_sign_link_destroy(struct e1inp_sign_link *link);
Pablo Neira Ayusof163d232011-06-25 18:42:55 +0200217int e1inp_line_update(struct e1inp_line *line);
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +0200218
219struct gsm_network;
220int ipaccess_setup(struct gsm_network *gsmnet);
221int hsl_setup(struct gsm_network *gsmnet);
222
223extern struct llist_head e1inp_driver_list;
224extern struct llist_head e1inp_line_list;
225
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +0200226/* XXX */
227struct input_signal_data {
228 int link_type;
229 uint8_t tei;
230 uint8_t sapi;
231 struct gsm_bts_trx *trx;
232 struct e1inp_line *line;
233};
234
Pablo Neira Ayuso96e72632011-06-26 19:08:05 +0200235int abis_sendmsg(struct msgb *msg);
236
Pablo Neira Ayuso0ba77d52011-06-05 18:32:44 +0200237#endif /* _E1_INPUT_H */