1 /**
2  * @file re_tcp.h  Interface to Transport Control Protocol
3  *
4  * Copyright (C) 2010 Creytiv.com
5  */
6 struct sa;
7 struct tcp_sock;
8 struct tcp_conn;
9 
10 
11 /**
12  * Defines the incoming TCP connection handler
13  *
14  * @param peer Network address of peer
15  * @param arg  Handler argument
16  */
17 typedef void (tcp_conn_h)(const struct sa *peer, void *arg);
18 
19 /**
20  * Defines the TCP connection established handler
21  *
22  * @param arg Handler argument
23  */
24 typedef void (tcp_estab_h)(void *arg);
25 
26 /**
27  * Defines the TCP connection data send handler
28  *
29  * @param arg Handler argument
30  */
31 typedef void (tcp_send_h)(void *arg);
32 
33 /**
34  * Defines the TCP connection data receive handler
35  *
36  * @param mb  Buffer with data
37  * @param arg Handler argument
38  */
39 typedef void (tcp_recv_h)(struct mbuf *mb, void *arg);
40 
41 /**
42  * Defines the TCP connection close handler
43  *
44  * @param err Error code
45  * @param arg Handler argument
46  */
47 typedef void (tcp_close_h)(int err, void *arg);
48 
49 
50 /* TCP Socket */
51 int  tcp_sock_alloc(struct tcp_sock **tsp, const struct sa *local,
52 		    tcp_conn_h *ch, void *arg);
53 int  tcp_sock_bind(struct tcp_sock *ts, const struct sa *local);
54 int  tcp_sock_listen(struct tcp_sock *ts, int backlog);
55 int  tcp_accept(struct tcp_conn **tcp, struct tcp_sock *ts, tcp_estab_h *eh,
56 		tcp_recv_h *rh, tcp_close_h *ch, void *arg);
57 void tcp_reject(struct tcp_sock *ts);
58 int  tcp_sock_local_get(const struct tcp_sock *ts, struct sa *local);
59 
60 
61 /* TCP Connection */
62 int  tcp_conn_alloc(struct tcp_conn **tcp, const struct sa *peer,
63 		    tcp_estab_h *eh, tcp_recv_h *rh, tcp_close_h *ch,
64 		    void *arg);
65 int  tcp_conn_bind(struct tcp_conn *tc, const struct sa *local);
66 int  tcp_conn_connect(struct tcp_conn *tc, const struct sa *peer);
67 int  tcp_send(struct tcp_conn *tc, struct mbuf *mb);
68 int  tcp_set_send(struct tcp_conn *tc, tcp_send_h *sendh);
69 void tcp_set_handlers(struct tcp_conn *tc, tcp_estab_h *eh, tcp_recv_h *rh,
70 		      tcp_close_h *ch, void *arg);
71 void tcp_conn_rxsz_set(struct tcp_conn *tc, size_t rxsz);
72 void tcp_conn_txqsz_set(struct tcp_conn *tc, size_t txqsz);
73 int  tcp_conn_local_get(const struct tcp_conn *tc, struct sa *local);
74 int  tcp_conn_peer_get(const struct tcp_conn *tc, struct sa *peer);
75 int  tcp_conn_fd(const struct tcp_conn *tc);
76 size_t tcp_conn_txqsz(const struct tcp_conn *tc);
77 
78 
79 /* High-level API */
80 int  tcp_listen(struct tcp_sock **tsp, const struct sa *local,
81 		tcp_conn_h *ch, void *arg);
82 int  tcp_connect(struct tcp_conn **tcp, const struct sa *peer,
83 		 tcp_estab_h *eh, tcp_recv_h *rh, tcp_close_h *ch, void *arg);
84 int  tcp_local_get(const struct tcp_sock *ts, struct sa *local);
85 
86 
87 /* Helper API */
88 typedef bool (tcp_helper_estab_h)(int *err, bool active, void *arg);
89 typedef bool (tcp_helper_send_h)(int *err, struct mbuf *mb, void *arg);
90 typedef bool (tcp_helper_recv_h)(int *err, struct mbuf *mb, bool *estab,
91 				 void *arg);
92 
93 struct tcp_helper;
94 
95 
96 int tcp_register_helper(struct tcp_helper **thp, struct tcp_conn *tc,
97 			int layer,
98 			tcp_helper_estab_h *eh, tcp_helper_send_h *sh,
99 			tcp_helper_recv_h *rh, void *arg);
100 int tcp_send_helper(struct tcp_conn *tc, struct mbuf *mb,
101 		    struct tcp_helper *th);
102