blob: 70308304f8a7670273ad04a1f9dfe7b2dc0a7160 [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>
Harald Welte783715b2014-08-17 18:24:51 +02007#include <osmocom/abis/ipaccess.h>
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +02008
Pablo Neira Ayuso986191f2011-06-21 19:56:26 +02009struct ipa_server_link {
10 struct e1inp_line *line;
11 struct osmo_fd ofd;
Pablo Neira Ayuso986191f2011-06-21 19:56:26 +020012 const char *addr;
13 uint16_t port;
14 int (*accept_cb)(struct ipa_server_link *link, int fd);
Pablo Neira Ayusoe009f4a2011-06-23 13:36:34 +020015 void *data;
Pablo Neira Ayuso986191f2011-06-21 19:56:26 +020016};
17
Harald Welte205e9032014-08-17 11:48:44 +020018struct ipa_server_link *
19ipa_server_link_create(void *ctx, struct e1inp_line *line, const char *addr,
20 uint16_t port,
21 int (*accept_cb)(struct ipa_server_link *link, int fd),
22 void *data);
Pablo Neira Ayuso986191f2011-06-21 19:56:26 +020023void ipa_server_link_destroy(struct ipa_server_link *link);
24
25int ipa_server_link_open(struct ipa_server_link *link);
26void ipa_server_link_close(struct ipa_server_link *link);
27
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020028struct ipa_server_conn {
Pablo Neira Ayuso6af9b612011-06-23 14:07:47 +020029 struct ipa_server_link *server;
30 struct osmo_fd ofd;
31 struct llist_head tx_queue;
Daniel Willmanna0d93312011-09-15 12:56:58 +020032 int (*closed_cb)(struct ipa_server_conn *peer);
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020033 int (*cb)(struct ipa_server_conn *peer, struct msgb *msg);
Pablo Neira Ayuso6af9b612011-06-23 14:07:47 +020034 void *data;
Jacob Erlbeck98af3c32014-03-31 10:53:32 +020035 struct msgb *pending_msg;
Pablo Neira Ayuso6af9b612011-06-23 14:07:47 +020036};
37
Harald Welte205e9032014-08-17 11:48:44 +020038struct ipa_server_conn *
39ipa_server_conn_create(void *ctx, struct ipa_server_link *link, int fd,
40 int (*cb)(struct ipa_server_conn *peer, struct msgb *msg),
41 int (*closed_cb)(struct ipa_server_conn *peer),
42 void *data);
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020043void ipa_server_conn_destroy(struct ipa_server_conn *peer);
Pablo Neira Ayuso6af9b612011-06-23 14:07:47 +020044
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020045void ipa_server_conn_send(struct ipa_server_conn *peer, struct msgb *msg);
Pablo Neira Ayusoaf3fed92011-06-23 20:42:19 +020046
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020047enum ipa_client_conn_state {
Pablo Neira Ayusoc07a8e72011-06-21 19:50:04 +020048 IPA_CLIENT_LINK_STATE_NONE = 0,
49 IPA_CLIENT_LINK_STATE_CONNECTING = 1,
50 IPA_CLIENT_LINK_STATE_CONNECTED = 2,
51 IPA_CLIENT_LINK_STATE_MAX
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +020052};
53
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020054struct ipa_client_conn {
Pablo Neira Ayusoc07a8e72011-06-21 19:50:04 +020055 struct e1inp_line *line;
Pablo Neira Ayusoc9c4fd32011-06-30 12:19:42 +020056 struct osmo_fd *ofd;
Pablo Neira Ayusoc07a8e72011-06-21 19:50:04 +020057 struct llist_head tx_queue;
58 struct osmo_timer_list timer;
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020059 enum ipa_client_conn_state state;
Pablo Neira Ayusoc07a8e72011-06-21 19:50:04 +020060 const char *addr;
61 uint16_t port;
Harald Welte51de9ca2013-06-30 20:13:16 +020062 void (*updown_cb)(struct ipa_client_conn *link, int up);
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020063 int (*read_cb)(struct ipa_client_conn *link, struct msgb *msg);
64 int (*write_cb)(struct ipa_client_conn *link);
Pablo Neira Ayusoe009f4a2011-06-23 13:36:34 +020065 void *data;
Jacob Erlbeck98af3c32014-03-31 10:53:32 +020066 struct msgb *pending_msg;
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +020067};
68
Harald Welte205e9032014-08-17 11:48:44 +020069struct ipa_client_conn *
70ipa_client_conn_create(void *ctx, struct e1inp_ts *ts, int priv_nr,
71 const char *addr, uint16_t port,
72 void (*updown)(struct ipa_client_conn *link, int),
73 int (*read_cb)(struct ipa_client_conn *link, struct msgb *msgb),
74 int (*write_cb)(struct ipa_client_conn *link),
75 void *data);
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020076void ipa_client_conn_destroy(struct ipa_client_conn *link);
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +020077
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020078int ipa_client_conn_open(struct ipa_client_conn *link);
79void ipa_client_conn_close(struct ipa_client_conn *link);
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +020080
Pablo Neira Ayusof0995672011-09-08 12:58:38 +020081void ipa_client_conn_send(struct ipa_client_conn *link, struct msgb *msg);
Pablo Neira Ayusoaf3fed92011-06-23 20:42:19 +020082
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +020083int ipa_msg_recv(int fd, struct msgb **rmsg);
Jacob Erlbeck98af3c32014-03-31 10:53:32 +020084int ipa_msg_recv_buffered(int fd, struct msgb **rmsg, struct msgb **tmp_msg);
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +020085
Harald Weltebc25bca2011-08-19 22:32:38 +020086int ipaccess_rcvmsg_base(struct msgb *msg, struct osmo_fd *bfd);
Harald Welte783715b2014-08-17 18:24:51 +020087int ipaccess_bts_handle_ccm(struct ipa_client_conn *link,
88 struct ipaccess_unit *dev, struct msgb *msg);
Harald Weltebc25bca2011-08-19 22:32:38 +020089
Holger Hans Peter Freytherd67f3f02014-05-06 06:59:52 +020090void ipaccess_prepend_header(struct msgb *msg, int proto);
91void ipaccess_prepend_header_ext(struct msgb *msg, int proto);
92
Harald Welte3091e172014-08-18 14:53:05 +020093void ipa_msg_push_header(struct msgb *msg, uint8_t proto);
Holger Hans Peter Freytherd67f3f02014-05-06 06:59:52 +020094
Harald Weltec1edf602014-08-18 17:28:54 +020095int ipaccess_idtag_parse(struct tlv_parsed *dec, unsigned char *buf, int len);
96int ipaccess_send_id_req(int fd);
97int ipaccess_parse_unitid(const char *str, struct ipaccess_unit *unit_data);
98
Pablo Neira Ayuso96e81282011-06-09 15:06:11 +020099#endif