Statistics
| Branch: | Revision:

ml / transmissionHandler.h @ 6214e30a

History | View | Annotate | Download (15.6 KB)

1 a0a1f630 KristianBeckers
/*
2
 *          Policy Management
3
 *
4
 *          NEC Europe Ltd. PROPRIETARY INFORMATION
5
 *
6
 * This software is supplied under the terms of a license agreement
7
 * or nondisclosure agreement with NEC Europe Ltd. and may not be
8
 * copied or disclosed except in accordance with the terms of that
9
 * agreement.
10
 *
11
 *      Copyright (c) 2009 NEC Europe Ltd. All Rights Reserved.
12
 *
13
 * Authors: Kristian Beckers  <beckers@nw.neclab.eu>
14
 *          Sebastian Kiesel  <kiesel@nw.neclab.eu>
15
 *          
16
 *
17
 * NEC Europe Ltd. DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED,
18
 * INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY
19
 * AND FITNESS FOR A PARTICULAR PURPOSE AND THE WARRANTY AGAINST LATENT
20
 * DEFECTS, WITH RESPECT TO THE PROGRAM AND THE ACCOMPANYING
21
 * DOCUMENTATION.
22
 *
23
 * No Liability For Consequential Damages IN NO EVENT SHALL NEC Europe
24
 * Ltd., NEC Corporation OR ANY OF ITS SUBSIDIARIES BE LIABLE FOR ANY
25
 * DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS
26
 * OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF INFORMATION, OR
27
 * OTHER PECUNIARY LOSS AND INDIRECT, CONSEQUENTIAL, INCIDENTAL,
28
 * ECONOMIC OR PUNITIVE DAMAGES) ARISING OUT OF THE USE OF OR INABILITY
29
 * TO USE THIS PROGRAM, EVEN IF NEC Europe Ltd. HAS BEEN ADVISED OF THE
30
 * POSSIBILITY OF SUCH DAMAGES.
31
 *
32
 *     THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
33 8b17961c KristianBeckers
 */
34 a0a1f630 KristianBeckers
35
/**
36
 * @file transmissionHandler.h
37
 * @brief The transmissionHandler takes care of connecting peers and exchanging data between them.
38
 *
39
 * @author Kristian Beckers  <beckers@nw.neclab.eu>                             
40
 * @author Sebastian Kiesel  <kiesel@nw.neclab.eu> 
41
 *
42
 *                                                                              
43
 * @date 7/28/2009 
44
 */
45
46
#ifndef TRANSMISSIONHANDLER_H
47
#define TRANSMISSIONHANDLER_H
48 2a178954 KristianBeckers
#include <sys/time.h>
49 a0a1f630 KristianBeckers
#include <netinet/in.h>
50
#include <sys/socket.h>
51
#include <fcntl.h>
52 2a178954 KristianBeckers
#include <event2/event.h>
53 a0a1f630 KristianBeckers
#include <sys/types.h>
54
#include <netinet/in.h>
55
#include <arpa/inet.h>
56 1af63d85 RobertBirke
#include <sys/uio.h>
57 a0a1f630 KristianBeckers
#include "util/udpSocket.h"
58
#include "util/stun.h"
59 90cb1b52 TivadarSzemethy
#include "ml.h"
60
61
#ifndef boolean
62
typedef bool boolean;
63
#endif
64
#ifndef TRUE
65
#define TRUE ((bool)1)
66
#endif
67
#ifndef FALSE
68
#define FALSE ((bool)0)
69
#endif
70 a0a1f630 KristianBeckers
71
/**
72 1af63d85 RobertBirke
 * This is the maximum size of the monitoring module header that can be added to the messaging layer header
73 a0a1f630 KristianBeckers
 */
74 1af63d85 RobertBirke
#define MON_HEADER_SPACE 32
75 a0a1f630 KristianBeckers
76
77
/**
78
  * Define the size of the messaging layer header 
79
  */
80
#define MSGL_HEADER_SIZE 18
81
82 1af63d85 RobertBirke
#define MAX_TRIALS 3
83
84 a0a1f630 KristianBeckers
/**
85
  * Define a type that is a pointer to a libevent event 
86
  */
87
typedef struct event *sock_event_ptr;
88
89
/**
90 1af63d85 RobertBirke
 * Defined a mtu size - IP size - UDP size
91 a0a1f630 KristianBeckers
 */
92 1af63d85 RobertBirke
typedef enum {MAX = 1472, DSL = 1464, DSLMEDIUM = 1422, DSLSLIM = 1372, BELOWDSL = 1172, MIN = 472,ERROR = -1} pmtu;
93 a0a1f630 KristianBeckers
94
/**
95 380cf1b9 RobertBirke
 * Define connection command types
96 a0a1f630 KristianBeckers
 */
97 380cf1b9 RobertBirke
typedef enum {INVITE = 0, CONNECT, READY} con_msg_types;
98 a0a1f630 KristianBeckers
99
/**
100 1af63d85 RobertBirke
 * Define receiver buffer status
101
 */
102
103
typedef enum {ACTIVE = 0, INACTIVE, COMPLETE} recvbuf_status_types;
104
105
/**
106 a0a1f630 KristianBeckers
 * A union that considers IPv4 and IPv6 addresses 
107
 */
108
typedef union{
109
110
  struct sockaddr_in udpaddr; ///< ipv4 address
111
  struct sockaddr_in6 udpaddr6; ///< ipv6 address
112
113
} socketaddrgen;
114
115
/**
116
  the socketID contains the internal and the external IP+Port 
117
 */
118 90cb1b52 TivadarSzemethy
typedef struct _socket_ID {
119 a0a1f630 KristianBeckers
120
  socketaddrgen internal_addr; ///< internal address
121
  socketaddrgen external_addr; ///< external or reflexive address
122 2a178954 KristianBeckers
} socket_ID;
123
124
/**
125 a0a1f630 KristianBeckers
  * A struct that contains information about data that is being received
126
  */
127
typedef struct {
128
129
  int recvID; ///< the receive ID
130
  int connectionID; ///< The connectionID
131
  int seqnr; ///< The sequence number
132
  char *recvbuf; ///< A pointer to the receive buffer
133
  int bufsize; ///< The  buffersize
134
  int status; ///< The receive status. 1 if reveived finished
135
  char msgtype; ///< The message type
136
  char firstPacketArrived; ///< did the first packet arrive 
137
  int recvFragments; ///< the number of received framgents
138 1af63d85 RobertBirke
  int arrivedBytes; ///< the number of received Bytes
139
  int monitoringDataHeaderLen; ///< size of the monitoring data header (0 == no header)
140 a0a1f630 KristianBeckers
  struct event *timeout; ///< a timeout event
141
  struct timeval timeout_value; ///< the value for a libevent timeout
142
  time_t starttime; ///< the start time
143
} recvdata;
144
145 8601bccf RobertBirke
struct receive_connection_cb_list{
146 4f1a41e6 RobertBirke
        struct receive_connection_cb_list *next;
147
        receive_connection_cb connection_cb;
148
        void *arg;
149 8601bccf RobertBirke
};
150 4f1a41e6 RobertBirke
151 a0a1f630 KristianBeckers
/**
152
 * A struct with information about a connection that exist or a connection that is being established
153 2a178954 KristianBeckers
 */
154 a0a1f630 KristianBeckers
typedef struct {
155
156
  int connectionID; ///< the connection ID
157 380cf1b9 RobertBirke
  socket_ID external_socketID; ///< the external socketID
158 a0a1f630 KristianBeckers
  int external_connectionID; ///< the internal connectionID
159
  pmtu pmtusize; ///< the pmtu size
160 1af63d85 RobertBirke
  bool delay;
161
  int trials;
162 380cf1b9 RobertBirke
  char *ctrl_msg_buf;
163
  int status; ///< the status of the connection. status has the following encoding: 0: INVITE send, 1: CONNECT send, 2: connection established
164 a0a1f630 KristianBeckers
  time_t starttime; ///< the time when the first connection attempt was made
165 1af63d85 RobertBirke
  uint32_t seqnr; ///< sequence number for connections that have been tried
166 a0a1f630 KristianBeckers
  //struct event *timeout;
167
  struct timeval timeout_value; ///< the timeout value for the connection estahlishment
168 4f1a41e6 RobertBirke
  bool internal_connect; ///< set to true if a connection to the internall address could be established
169 8601bccf RobertBirke
  struct receive_connection_cb_list *connection_head;
170
  struct receive_connection_cb_list *connection_last;
171 a0a1f630 KristianBeckers
} connect_data;
172
173 380cf1b9 RobertBirke
#define ML_CON_MSG 127
174
175
/**
176 1af63d85 RobertBirke
 * A struct with the messaging layer header for connection handling messages
177 380cf1b9 RobertBirke
 */
178 dbbccb7c RobertBirke
#pragma pack(push)  /* push current alignment to stack */
179
#pragma pack(1)     /* set alignment to 1 byte boundary */
180 1af63d85 RobertBirke
struct conn_msg {
181 380cf1b9 RobertBirke
        uint32_t comand_type; ///< see con_msg_types
182
        int32_t pmtu_size;        /// the pmtu size 
183
        socket_ID sock_id;        /// the socketId of the sender
184
};
185
186 1af63d85 RobertBirke
struct msg_header {
187
        uint8_t msg_type; ///< set to ML_CON_MSG
188
        uint8_t len_mon_data_hdr;
189
        uint8_t len_mon_packet_hdr;
190
        uint32_t offset;
191
        uint32_t msg_length;
192
        int32_t local_con_id;        ///> the local connection id
193
        int32_t remote_con_id;        ///> the remote connection id
194
        int32_t msg_seq_num;
195
};
196 1b0e6d04 RobertBirke
#define MSG_HEADER_SIZE 23
197 dbbccb7c RobertBirke
#pragma pack(pop)   /* restore original alignment from stack */
198 1af63d85 RobertBirke
199
200 a0a1f630 KristianBeckers
/**
201
 * The init method needs to be called to initialise the transmissionHandler
202
 * @param recv_data_cb This is a boolean that decides how an upper layer receives data. When the boolean is set to true data is received via callback. When it is set to false the upper layer has to poll with the recv_data function. 
203 2a178954 KristianBeckers
 * @param timeout_value A timeout value for the data receival
204
 * @param port A port that will be used to create a new UDP socket 
205
 * @param ipaddr An ipaddress that will be used to create a new UDP socket. If left NULL th
206
e messaging layer binds it to localhost. 
207 a0a1f630 KristianBeckers
 * @param stun_port The port of the stun server.
208
 * @param stun_ipaddr The ip address of the stun server. 
209 2a178954 KristianBeckers
 * @param local_socketID_cb A callback from the type receive_localsocketID_cb that is envoke once the socketID is ready to use.
210
 * @param arg A void pointer that is used in this implementation to handover the libevent pointer. 
211 a0a1f630 KristianBeckers
 */
212 90cb1b52 TivadarSzemethy
void init_transmissionHandler(bool recv_data_cb,struct timeval timeout_value,const int port,const char *ipaddr,const int stun_port,const char *stun_ipaddr,receive_localsocketID_cb local_socketID_cb,void *arg);
213 a0a1f630 KristianBeckers
214
/**
215
 * create a socket: returns a socketID handle  
216
 * A socketID handle is a pointer to the opague data structre
217
 * @param port A port that will be used to create a new UDP socket
218
 * @param ipaddr An ipaddress that will be used to create a new UDP socket. If left NULL the messaging layer binds it to localhost. 
219 2a178954 KristianBeckers
 */
220
void create_socket(const int port,const char *ipaddr);
221 a0a1f630 KristianBeckers
222
/**
223
 * destroys a socket 
224
 * @param socketID The socketID handle to the socket ID that shall be destroyed.
225 2a178954 KristianBeckers
 */
226 a0a1f630 KristianBeckers
void close_socket(socketID_handle socketID);
227
228
/**
229
 * opens a connection between two socketIDs
230
 * @param local_socketID The local socketID
231
 * @param external_socketID The remote socketID
232 2a178954 KristianBeckers
 * @param connectionID A pointer to an int. The connectionID will be stored in that int. 
233
 * @param connection_cb  A function pointer to a callback function from the type receive_connection_cb
234
 * @param arg A void pointer that is returned via the callback.
235 380cf1b9 RobertBirke
 * @return returnValue the connectionId, < 0 for a failure.
236 a0a1f630 KristianBeckers
 */
237 380cf1b9 RobertBirke
int open_connection(socketID_handle external_socketID,receive_connection_cb connection_cb,void *arg);
238 a0a1f630 KristianBeckers
239
/**
240
 * destroys a connections
241
 * @param connectionID 
242
 */
243
void close_connection(const int connectionID);
244
245
246
/**
247
  * Send a NAT traversal keep alive
248
  * @param connectionID
249
  */
250
void keep_connection_alive(const int connectionID);
251
252
/**
253 2a178954 KristianBeckers
 * send all data
254
 * @param connectionID The connection the data should be send to.
255
 * @param container A container for several buffer pointer and length pairs from type send_all_data_container
256
 * @param nr_entries The number of buffer pointer and length pairs in the container. The maximum nr is 5.  
257
 * @param msgtype The message type.
258
 * @param sParams A pointer to a send_params struct.
259
 * @return 0 if a problem occured, 1 if everything was alright. 
260
 */
261
int send_all_data(const int connectionID,send_all_data_container *container,int nr_entries,unsigned char msgtype,send_params *sParams);
262
263
/**
264 a0a1f630 KristianBeckers
 * send data  
265
 * @param connectionID The connection the data should be send to. 
266
 * @param sendbuf A pointer to the send buffer. 
267
 * @param bufsize The buffersize of the send buffer. 
268
 * @param msgtype The message type. 
269
 * @param sParams A pointer to a send_params struct. 
270
 */
271 1af63d85 RobertBirke
void send_data(const int connectionID,char *sendbuf,int bufsize,int msgtype,send_params *sParams);
272 a0a1f630 KristianBeckers
273 1af63d85 RobertBirke
void send_msg(int con_id, int msg_type, char* msg, int msg_len, bool truncable, send_params * sparam);
274 a0a1f630 KristianBeckers
/**
275
 * receive data  
276
 * @param connectionID The connection the data came from. 
277
 * @param recvbuf A pointer to a buffer the data will be stored in. 
278
 * @param bufsize A pointer to an int that tells the size of the received data. 
279
 * @param rParams A pointer to a recv_params struct. 
280
 */
281
int recv_data(const int connectionID,char *recvbuf,int *bufsize,recv_params *rParams);
282
283
/**
284
 * set the stun server  
285
 * @param port The port of the stun server. 
286
 * @param ipaddr The ip address of the stun server. 
287
 */
288
void setStunServer(const int port,const char *ipaddr);
289
290
/**
291 bde41184 CsabaKiraly
 * unset the stun server
292
 */
293
void unsetStunServer();
294
295
/**
296
 * checks whether a stun server was defined
297
 * @returns true if a stun serve rwas defined
298
 */
299
bool isStunDefined();
300
301
/**
302 a0a1f630 KristianBeckers
 * set recv timeout  
303
 * @param timeout_value The timeout value for receiving data. 
304
 */
305
void setRecvTimeout(struct timeval timeout_value);
306
307
/**
308
  * create a message for the connection establishment
309
  * @param *msgbuf A buffer for the message
310
  * @param bufsize The buffersize 
311
  * @param local_connectionID The local connectionID
312
  * @param local_socketID The local socketID
313 380cf1b9 RobertBirke
  * @param command_type The command type
314
  * @return -1 for failure otherwise the size of the allocated control message buffer
315 a0a1f630 KristianBeckers
  */
316 380cf1b9 RobertBirke
317
int
318
create_conn_msg(int pmtusize,int local_connectionID, socketID_handle local_socketID, con_msg_types command_type);
319 a0a1f630 KristianBeckers
320
/**
321
  * send a connect message to another peer
322
  * @param connectionID the connectionID
323
  * @param *msgbuf A pointer to the message buffer
324
  * @param bufsize The buffersize
325
  */
326 1af63d85 RobertBirke
void send_conn_msg(const int connectionID,int bufsize, int command);
327 a0a1f630 KristianBeckers
328
/**
329
  * process an incoming conenction message
330
  * @param local_socketID
331
  * @param bufsize
332
  */
333 1af63d85 RobertBirke
void recv_conn_msg(struct msg_header *msg_h,char *msgbuf,int bufsize);
334 a0a1f630 KristianBeckers
335
/**
336
  * process an incoming message
337
  * @param fd A file descriptor
338
  * @param event A libevent event 
339
  * @param arg An arg pointer
340
  */
341
void recv_pkg(int fd, short event, void *arg);
342
343
/**
344
  * receive a stun message
345
  * @param *msgbuf A pointer to a message buffer
346
  * @param recvSize The buffersize
347
  */
348 8b17961c KristianBeckers
void recv_stun_msg(char *msgbuf,int recvSize);
349 a0a1f630 KristianBeckers
350
/**
351
  * process an incoming data message
352
  * @param *msgbuf A pointer to a message buffer
353
  * @param bufsize The buffersize
354
  * @param ttl The ttl value of the packet
355
  */
356 1af63d85 RobertBirke
void recv_data_msg(struct msg_header *msg_h, char *msgbuf, int bufsize);
357 a0a1f630 KristianBeckers
358
/**
359
  * A receive timeout callback for the connections
360
  * @param fd A file descriptor
361
  * @param event A libevent event 
362
  * @param arg An arg pointer          
363
  */
364
void recv_timeout_cb(int fd,short event,void *arg);
365
366
/**
367
  * A pmtu timeout callback
368
  * @param fd A file descriptor
369
  * @param event A libevent event 
370
  * @param arg An arg pointer
371
  */
372
void pmtu_timeout_cb(int fd,short event,void *arg);
373
374
/**
375
  * A function to decrement the pmtu value
376
  * @param pmtusize A pmtusize 
377
  */
378
pmtu pmtu_decrement(pmtu pmtusize);
379
380
/**
381
  * A pmtu error callback
382
  * @param *msg A pointer to a message buffer
383
  * @param msglen The buffersize
384
  */
385
void pmtu_error_cb_th(char *msg,int msglen);
386
387
/**
388 2a178954 KristianBeckers
 * Compare two socket IDs and check if the external IPaddresses match
389
 * @param sock1 The first socketID                                                                
390
 * @param sock2 The second socketID                                                               
391
 * @return 0 if they match, otherwise 1
392
 */
393
int compare_external_address_socketIDs(socketID_handle sock1,socketID_handle sock2);
394
395
/**
396 a0a1f630 KristianBeckers
  * Compare two socket IDs
397
  * @param sock1 The first socketID
398
  * @param sock2 The second socketID
399 2a178954 KristianBeckers
  * @return 0 if they match, otherwise 1
400 a0a1f630 KristianBeckers
  */
401
int compare_socketIDs(socketID_handle sock1,socketID_handle sock2);
402
403
/**
404
  * A NAT traversal timeout callback
405
  * @param fd A file descriptor
406
  * @param event A libevent event 
407
  * @param arg An arg pointer
408
  */
409 2a178954 KristianBeckers
void nat_traversal_timeout(int fd, short event, void *arg);
410 a0a1f630 KristianBeckers
411
/**
412
 * A function that returns the standard TTL value the operating system places i
413
n every IP packet                                                              
414
 * @param socketID A local socketID   
415
 * @param ttl A pointer to an integer 
416
 * @return 0 if everything went well and -1 if an error occured
417
 */
418 8601bccf RobertBirke
int get_standard_ttl(socketID_handle socketID,uint8_t *ttl);
419 a0a1f630 KristianBeckers
420 2a178954 KristianBeckers
/**
421
 * A funtion that returns a handle for the local socketID
422
 * @param errorstatus Returns 0 if the socketID is operational and 2 if the NAT traversal failed
423
 * @return A socketID handle
424
 */
425
socketID_handle get_local_socketID(int *errorstatus);
426
427
/**
428
 * A funtion that returns the external IP from the local socketID
429
 * @param external_addr A pointer to a char buffer that holds the externall address
430
 * @return -1 if an error occurred and 0 if it succeded
431
 */
432
int get_external_IP(char* external_addr);
433
434
/**
435
 * A funtion that returns a string from a socketID handler
436
 * @param socketID
437
 * @param socketID_string
438 7455d709 TivadarSzemethy
 * @param len size of socketID_string buffer
439 2a178954 KristianBeckers
 * @return -1 if an error occurred and 0 if it succeded
440
 */
441 7455d709 TivadarSzemethy
int socketID_to_String(socketID_handle socketID,char* socketID_string, size_t len);
442 2a178954 KristianBeckers
443
/**
444
 * A funtion that returns a socketID handler from a string
445
 * @param socketID A socketID in string format
446
 * @return a pointer to a socketID
447
 */
448 5842fcf1 TivadarSzemethy
int string_to_socketID(const char* socketID_string, socketID_handle socketID);
449 2a178954 KristianBeckers
450
/**
451
 * A funtion that returns the whenever a connection is ready to use or not. 
452
 * @param connectionID The connectionID of the connection that is queried.
453 380cf1b9 RobertBirke
 * @return the status or -1 if the connectionID does not exist
454 2a178954 KristianBeckers
 */
455
int get_connection_status(int connectionID);
456
457
/**
458
 * A funtion that returns the whenever a connection is ready to use or not.
459 8b17961c KristianBeckers
 * @param socketID A remote socketID to which the connection has been established.
460 6214e30a TivadarSzemethy
 * @param ready if true,return the connID for READY connections only
461 2a178954 KristianBeckers
 * @return -1 if the connection does not exist and the connection ID if it exists.
462
 */
463 6214e30a TivadarSzemethy
int connection_exist(socketID_handle socketID,bool ready);
464 2a178954 KristianBeckers
465 19c6ca17 TivadarSzemethy
/**
466
 * Resolve a hostname to an unsigned long ready to be loaded into struct in_addr.s_addr
467
 * @param ipaddr the ip addr in a textual format
468
 * @return the resolved address, in network byte ordering
469
 */
470
unsigned long resolve(const char *ipaddr);
471
472 bcf9c2dd RobertBirke
int get_path_mtu(int ConnectionId);
473
474 19c6ca17 TivadarSzemethy
475 a0a1f630 KristianBeckers
#endif