blob: 6e9f9dd45d8c5182af29ac61bc2c6e097318ba22 [file] [log] [blame]
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +02001#ifndef _OSMO_IPA_H_
2#define _OSMO_IPA_H_
3
Pablo Neira Ayuso9b3a33c2011-06-21 13:52:41 +02004#include <stdint.h>
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +02005#include <osmocom/core/linuxlist.h>
6#include <osmocom/core/timer.h>
Jacob Erlbeck1acf4cb2014-12-22 11:14:34 +01007#include <osmocom/core/select.h>
Harald Welteb65f58f2014-08-20 22:04:11 +02008#include <osmocom/gsm/ipa.h>
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +02009
Jacob Erlbeck1acf4cb2014-12-22 11:14:34 +010010struct e1inp_line;
11struct e1inp_ts;
12struct msgb;
13
Pablo Neira Ayuso986191f2011-06-21 19:56:26 +020014struct ipa_server_link {
15 struct e1inp_line *line;
16 struct osmo_fd ofd;
Pablo Neira Ayuso986191f2011-06-21 19:56:26 +020017 const char *addr;
18 uint16_t port;
19 int (*accept_cb)(struct ipa_server_link *link, int fd);
Pablo Neira Ayusoe009f4a2011-06-23 13:36:34 +020020 void *data;
Pablo Neira Ayuso986191f2011-06-21 19:56:26 +020021};
22
Harald Welte205e9032014-08-17 11:48:44 +020023struct ipa_server_link *
24ipa_server_link_create(void *ctx, struct e1inp_line *line, const char *addr,
25 uint16_t port,
26 int (*accept_cb)(struct ipa_server_link *link, int fd),
27 void *data);
Pablo Neira Ayuso986191f2011-06-21 19:56:26 +020028void ipa_server_link_destroy(struct ipa_server_link *link);
29
30int ipa_server_link_open(struct ipa_server_link *link);
31void ipa_server_link_close(struct ipa_server_link *link);
32
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020033struct ipa_server_conn {
Pablo Neira Ayuso6af9b612011-06-23 14:07:47 +020034 struct ipa_server_link *server;
35 struct osmo_fd ofd;
36 struct llist_head tx_queue;
Daniel Willmanna0d93312011-09-15 12:56:58 +020037 int (*closed_cb)(struct ipa_server_conn *peer);
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020038 int (*cb)(struct ipa_server_conn *peer, struct msgb *msg);
Pablo Neira Ayuso6af9b612011-06-23 14:07:47 +020039 void *data;
Jacob Erlbeck98af3c32014-03-31 10:53:32 +020040 struct msgb *pending_msg;
Pablo Neira Ayuso6af9b612011-06-23 14:07:47 +020041};
42
Harald Welte205e9032014-08-17 11:48:44 +020043struct ipa_server_conn *
44ipa_server_conn_create(void *ctx, struct ipa_server_link *link, int fd,
45 int (*cb)(struct ipa_server_conn *peer, struct msgb *msg),
46 int (*closed_cb)(struct ipa_server_conn *peer),
47 void *data);
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020048void ipa_server_conn_destroy(struct ipa_server_conn *peer);
Pablo Neira Ayuso6af9b612011-06-23 14:07:47 +020049
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020050void ipa_server_conn_send(struct ipa_server_conn *peer, struct msgb *msg);
Pablo Neira Ayusoaf3fed92011-06-23 20:42:19 +020051
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020052enum ipa_client_conn_state {
Pablo Neira Ayusoc07a8e72011-06-21 19:50:04 +020053 IPA_CLIENT_LINK_STATE_NONE = 0,
54 IPA_CLIENT_LINK_STATE_CONNECTING = 1,
55 IPA_CLIENT_LINK_STATE_CONNECTED = 2,
56 IPA_CLIENT_LINK_STATE_MAX
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +020057};
58
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020059struct ipa_client_conn {
Pablo Neira Ayusoc07a8e72011-06-21 19:50:04 +020060 struct e1inp_line *line;
Pablo Neira Ayusoc9c4fd32011-06-30 12:19:42 +020061 struct osmo_fd *ofd;
Pablo Neira Ayusoc07a8e72011-06-21 19:50:04 +020062 struct llist_head tx_queue;
63 struct osmo_timer_list timer;
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020064 enum ipa_client_conn_state state;
Pablo Neira Ayusoc07a8e72011-06-21 19:50:04 +020065 const char *addr;
66 uint16_t port;
Harald Welte51de9ca2013-06-30 20:13:16 +020067 void (*updown_cb)(struct ipa_client_conn *link, int up);
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020068 int (*read_cb)(struct ipa_client_conn *link, struct msgb *msg);
69 int (*write_cb)(struct ipa_client_conn *link);
Pablo Neira Ayusoe009f4a2011-06-23 13:36:34 +020070 void *data;
Jacob Erlbeck98af3c32014-03-31 10:53:32 +020071 struct msgb *pending_msg;
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +020072};
73
Harald Welte205e9032014-08-17 11:48:44 +020074struct ipa_client_conn *
75ipa_client_conn_create(void *ctx, struct e1inp_ts *ts, int priv_nr,
76 const char *addr, uint16_t port,
77 void (*updown)(struct ipa_client_conn *link, int),
78 int (*read_cb)(struct ipa_client_conn *link, struct msgb *msgb),
79 int (*write_cb)(struct ipa_client_conn *link),
80 void *data);
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020081void ipa_client_conn_destroy(struct ipa_client_conn *link);
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +020082
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020083int ipa_client_conn_open(struct ipa_client_conn *link);
84void ipa_client_conn_close(struct ipa_client_conn *link);
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +020085
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020086void ipa_client_conn_send(struct ipa_client_conn *link, struct msgb *msg);
Holger Hans Peter Freyther90878592015-01-18 17:50:05 +010087size_t ipa_client_conn_clear_queue(struct ipa_client_conn *link);
Pablo Neira Ayusoaf3fed92011-06-23 20:42:19 +020088
Harald Welte783715b2014-08-17 18:24:51 +020089int ipaccess_bts_handle_ccm(struct ipa_client_conn *link,
90 struct ipaccess_unit *dev, struct msgb *msg);
Harald Weltebc25bca2011-08-19 22:32:38 +020091
Harald Welte3091e172014-08-18 14:53:05 +020092void ipa_msg_push_header(struct msgb *msg, uint8_t proto);
Holger Hans Peter Freytherd67f3f02014-05-06 06:59:52 +020093
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +020094#endif