Remove memory allocation in olsr_timer_add()
[oonf.git] / src / core / olsr_stream_socket.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2011, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 #ifndef OLSR_STREAM_SOCKET_H_
43 #define OLSR_STREAM_SOCKET_H_
44
45 #include "common/common_types.h"
46 #include "common/autobuf.h"
47 #include "common/list.h"
48 #include "common/netaddr.h"
49
50 #include "olsr_memcookie.h"
51 #include "olsr_netaddr_acl.h"
52 #include "olsr_socket.h"
53
54 enum olsr_stream_session_state {
55   STREAM_SESSION_ACTIVE,
56   STREAM_SESSION_SEND_AND_QUIT,
57   STREAM_SESSION_CLEANUP,
58 };
59
60 enum olsr_stream_errors {
61   STREAM_REQUEST_FORBIDDEN = 403,
62   STREAM_REQUEST_TOO_LARGE = 413,
63   STREAM_SERVICE_UNAVAILABLE = 503,
64 };
65
66 /* represents a TCP stream */
67 struct olsr_stream_session {
68   /*
69    * public part of the session data
70    *
71    * variables marked RW might be written from txt commands, those with
72    * an "R" mark are read only
73    */
74
75   /* ip addr of peer (R) */
76   struct netaddr remote_address;
77
78   /* output buffer, anything inside will be written to the peer as
79    * soon as possible */
80   struct autobuf out;
81
82   /*
83    * internal part of the server
84    */
85   struct list_entity node;
86
87   /* backpointer to the stream socket */
88   struct olsr_stream_socket *comport;
89
90   /* scheduler handler for the session */
91   struct olsr_socket_entry scheduler_entry;
92
93   /* timer for handling session timeout */
94   struct olsr_timer_entry *timeout;
95
96   /* input buffer for session */
97   struct autobuf in;
98
99   /*
100    * true if session user want to send before receiving anything. Will trigger
101    * an empty read even as soon as session is connected
102    */
103   bool send_first;
104
105   /* true if session is still waiting for initial handshake to finish */
106   bool wait_for_connect;
107
108   /* session event is just busy in scheduler */
109   bool busy;
110
111   /* session has been remove while being busy */
112   bool removed;
113
114   enum olsr_stream_session_state state;
115 };
116
117 struct olsr_stream_config {
118   /* memory cookie to allocate struct for tcp session */
119   struct olsr_memcookie_info *memcookie;
120
121   /* number of simultaneous sessions (default 10) */
122   int allowed_sessions;
123
124   /*
125    * Timeout of the socket. A session will be closed if it does not
126    * send or receive data for timeout milliseconds.
127    */
128   uint32_t session_timeout;
129
130   /* maximum allowed size of input buffer (default 65536) */
131   size_t maximum_input_buffer;
132
133   /*
134    * true if the socket wants to send data before it receives anything.
135    * This will trigger an size 0 read event as soon as the socket is connected
136    */
137   bool send_first;
138
139   /* only clients that match the acl (if set) can connect */
140   struct olsr_netaddr_acl *acl;
141
142   /* Called when a new session is created */
143   int (*init)(struct olsr_stream_session *);
144
145   /* Called when a TCP session ends */
146   void (*cleanup)(struct olsr_stream_session *);
147
148   /*
149    * An error happened during parsing the TCP session,
150    * the user of the session might want to create an error message
151    */
152   void (*create_error)(struct olsr_stream_session *, enum olsr_stream_errors);
153
154   /*
155    * Called when new data will be available in the input buffer
156    */
157   enum olsr_stream_session_state (*receive_data)(struct olsr_stream_session *);
158 };
159 /*
160  * Represents a TCP server socket or a configuration for a set of outgoing
161  * TCP streams.
162  */
163 struct olsr_stream_socket {
164   struct list_entity node;
165
166   union netaddr_socket local_socket;
167
168   struct list_entity session;
169
170   struct olsr_socket_entry scheduler_entry;
171
172   struct olsr_stream_config config;
173
174   bool busy;
175   bool remove;
176   bool remove_when_finished;
177 };
178
179 struct olsr_stream_managed {
180   struct olsr_stream_socket socket_v4;
181   struct olsr_stream_socket socket_v6;
182   struct olsr_netaddr_acl acl;
183
184   struct olsr_stream_config config;
185 };
186
187 struct olsr_stream_managed_config {
188   struct olsr_netaddr_acl acl;
189   struct netaddr bindto_v4;
190   struct netaddr bindto_v6;
191   uint16_t port;
192 };
193
194 EXPORT int olsr_stream_init(void) __attribute__((warn_unused_result));
195 EXPORT void olsr_stream_cleanup(void);
196
197 EXPORT int olsr_stream_add(struct olsr_stream_socket *,
198     union netaddr_socket *local);
199 EXPORT void olsr_stream_remove(struct olsr_stream_socket *, bool force);
200 EXPORT struct olsr_stream_session *olsr_stream_connect_to(
201     struct olsr_stream_socket *, union netaddr_socket *remote);
202 EXPORT void olsr_stream_flush(struct olsr_stream_session *con);
203
204 EXPORT void olsr_stream_set_timeout(
205     struct olsr_stream_session *con, uint32_t timeout);
206 EXPORT void olsr_stream_close(struct olsr_stream_session *con, bool force);
207
208 EXPORT void olsr_stream_add_managed(struct olsr_stream_managed *);
209 EXPORT int olsr_stream_apply_managed(struct olsr_stream_managed *,
210     struct olsr_stream_managed_config *);
211 EXPORT void olsr_stream_remove_managed(struct olsr_stream_managed *, bool force);
212
213 #endif /* OLSR_STREAM_SOCKET_H_ */