tport 1.13.18
Loading...
Searching...
No Matches
tport_internal.h
1/*
2 * This file is part of the Sofia-SIP package
3 *
4 * Copyright (C) 2005 Nokia Corporation.
5 *
6 * Contact: Pekka Pessi <pekka.pessi@nokia-email.address.hidden>
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; either version 2.1 of
11 * the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21 * 02110-1301 USA
22 *
23 */
24
25#ifndef TPORT_INTERNAL_H
27#define TPORT_INTERNAL_H
28
37
38#ifndef SU_H
39#include <sofia-sip/su.h>
40#endif
41
43#include <sofia-sip/su_strlst.h>
44
45#ifndef MSG_ADDR_H
46#include <sofia-sip/msg_addr.h>
47#endif
48#ifndef TPORT_H
49#include <sofia-sip/tport.h>
50#endif
51
52#if HAVE_SOFIA_STUN
53#include "sofia-sip/stun.h"
54#include "sofia-sip/stun_tag.h"
55#endif
56
58
59#ifndef SU_DEBUG
60#define SU_DEBUG 3
61#endif
62#define SU_LOG tport_log
63
64#include <sofia-sip/su_debug.h>
65
66#if !defined(MSG_NOSIGNAL) || defined(__CYGWIN__) || defined(SYMBIAN)
67#undef MSG_NOSIGNAL
68#define MSG_NOSIGNAL (0)
69#endif
70
71#if (_WIN32_WINNT >= 0x0600)
72#ifndef HAVE_MSG_TRUNC
73#define HAVE_MSG_TRUNC 1
74#endif
75#endif
76
77#if !HAVE_MSG_TRUNC
78#define MSG_TRUNC (0)
79#endif
80
81#ifndef NONE
82#ifndef _MSC_VER
83#define NONE ((void *)-1)
84#else
85#define NONE ((void *)(INT_PTR)-1)
86#endif
87#endif
88
89SOFIA_BEGIN_DECLS
90
91typedef struct tport_master tport_master_t;
92typedef struct tport_pending_s tport_pending_t;
93typedef struct tport_primary tport_primary_t;
94typedef struct tport_vtable tport_vtable_t;
95
96struct sigcomp_state_handler;
97struct sigcomp_algorithm;
98struct sigcomp_udvm;
99struct sigcomp_magic;
100struct sigcomp_compartment;
101
102typedef long unsigned LU; /* for printf() and friends */
103
105typedef struct {
106 unsigned tpp_mtu;
107 unsigned tpp_idle;
108 unsigned tpp_timeout;
109 unsigned tpp_socket_keepalive;
110 unsigned tpp_keepalive;
111 unsigned tpp_pingpong;
112
113 unsigned tpp_sigcomp_lifetime;
114 unsigned tpp_thrpsize;
115
116 unsigned tpp_thrprqsize;
117 unsigned tpp_qsize;
118
119 unsigned tpp_drop;
120 int tpp_tos;
121
122 unsigned tpp_conn_orient:1;
123 unsigned tpp_sdwn_error:1;
124 unsigned tpp_stun_server:1;
125 unsigned tpp_pong2ping:1;
126
127 unsigned :0;
128
129} tport_params_t;
130
131
139struct tport_s {
140 su_home_t tp_home[1];
141
142 ssize_t tp_refs;
143
144 unsigned tp_black:1;
145
146 unsigned tp_accepted:1;
147 unsigned tp_conn_orient:1;
148 unsigned tp_has_connection:1;
149 unsigned tp_reusable:1;
150 unsigned tp_closed : 1;
155
157 unsigned tp_recv_close:2;
159 unsigned tp_send_close:2;
160 unsigned tp_has_keepalive:1;
161 unsigned tp_has_stun_server:1;
162 unsigned tp_trunc:1;
163 unsigned tp_is_connected:1;
164 unsigned tp_verified:1;
165 unsigned tp_pre_framed:1;
166 unsigned:0;
167
168 tport_t *tp_left, *tp_right, *tp_dad;
169
170 tport_master_t *tp_master;
171 tport_primary_t *tp_pri;
172
173 tport_params_t *tp_params;
174
175 tp_magic_t *tp_magic;
176
177 su_timer_t *tp_timer;
178
179 su_time_t tp_ktime;
180 su_time_t tp_ptime;
181 su_time_t tp_ltime;
182
183 tp_name_t tp_name[1];
188
189 su_strlst_t *tp_subjects;
196
197#define tp_protoname tp_name->tpn_proto
198#define tp_canon tp_name->tpn_canon
199#define tp_host tp_name->tpn_host
200#define tp_port tp_name->tpn_port
201#define tp_ident tp_name->tpn_ident
202
203 su_socket_t tp_socket;
204 int tp_index;
205 int tp_events;
206
207 su_addrinfo_t tp_addrinfo[1];
208 su_sockaddr_t tp_addr[1];
209#define tp_addrlen tp_addrinfo->ai_addrlen
210
211 /* ==== Receive queue ================================================== */
212
213 msg_t *tp_msg;
214 msg_t const *tp_rlogged;
215 msg_t const *tp_rcaptured;
216 su_time_t tp_rtime;
217 unsigned short tp_ping;
218
219 /* ==== Pending messages =============================================== */
220
221 unsigned short tp_reported;
222 unsigned tp_plen;
223 unsigned tp_pused;
224 tport_pending_t *tp_pending;
225 tport_pending_t *tp_released;
226
227 /* ==== Send queue ===================================================== */
228
229 msg_t **tp_queue;
230 unsigned short tp_qhead;
231
232 msg_iovec_t *tp_unsent;
233 size_t tp_unsentlen;
234
235 msg_iovec_t *tp_iov;
236 size_t tp_iovlen;
237
238 msg_t const *tp_slogged;
239 su_time_t tp_stime;
240
241 /* ==== Extensions ===================================================== */
242
243 tport_compressor_t *tp_comp;
244
245 /* ==== Statistics ===================================================== */
246
247 struct {
248 uint64_t sent_msgs, sent_errors, sent_bytes, sent_on_line;
249 uint64_t recv_msgs, recv_errors, recv_bytes, recv_on_line;
250 } tp_stats;
251};
252
254struct tport_primary {
255 tport_t pri_primary[1];
256#if DOXYGEN_ONLY
257 su_home_t pri_home[1];
258#else
259#define pri_home pri_primary->tp_home
260#define pri_master pri_primary->tp_master
261#define pri_protoname pri_primary->tp_name->tpn_proto
262#endif
263 tport_vtable_t const
264 *pri_vtable;
265 int pri_public;
269
270 tport_primary_t *pri_next;
271
272 tport_t *pri_open;
273 tport_t *pri_closed;
274
275 unsigned pri_updating:1;
276 unsigned pri_natted:1;
277 unsigned pri_has_tls:1;
278 unsigned:0;
279
280 void *pri_stun_handle;
281
282 tport_params_t pri_params[1];
283};
284
286struct tport_master {
287 tport_t mr_master[1];
288#if DOXYGEN_ONLY
289 su_home_t mr_home[1];
290#else
291#define mr_home mr_master->tp_home
292#endif
293
294 int mr_stun_step_ready;
295
296 tp_stack_t *mr_stack;
297 tp_stack_class_t
298 const *mr_tpac;
299 int mr_log;
300 su_root_t *mr_root;
301
303 su_timer_t *mr_timer;
305 FILE *mr_dump_file;
306 char *mr_dump;
308 su_socket_t mr_capt_sock;
309 char *mr_capt_name;
310 su_addrinfo_t *mr_capt_src_addr;
311 tport_primary_t *mr_primaries;
312 unsigned mr_prot_ver; /* hep version */
313 unsigned mr_agent_id; /* agent version */
314 unsigned mr_capt_bufsize; /* per-message HEP capture buffer cap (bytes). */
315
316 tport_params_t mr_params[1];
317
318 unsigned mr_boundserver:1;
319 unsigned mr_bindv6only:1;
320 unsigned :0;
321
322 /* Delivery context */
323 struct tport_delivery {
324 tport_t *d_tport;
325 msg_t *d_msg;
326 tp_name_t d_from[1];
327 tport_compressor_t *d_comp;
328 } mr_delivery[1];
329
330 tport_stun_server_t *mr_stun_server;
331
332#if 0
333 struct tport_nat_s {
334 int initialized;
335 int bound;
336 int stun_enabled;
337 char *external_ip_address;
338#if HAVE_UPNP || HAVE_SOFIA_STUN
339 int try_stun;
340#endif
341#if HAVE_UPNP
342#endif
343#if HAVE_SOFIA_STUN
344 tport_master_t *tport;
345 char *stun_server;
346 /* stun_socket_t *stun_socket; */
347 stun_handle_t *stun;
348 su_socket_t stun_socket;
349 su_sockaddr_t sockaddr;
350#endif
351 } mr_nat[1];
352#endif
353};
354
356struct tport_vtable
357{
358 char const *vtp_name;
359 enum tport_via vtp_public;
360
361 size_t vtp_pri_size; /* Size of primary tport */
362 int (*vtp_init_primary)(tport_primary_t *pri,
363 tp_name_t tpn[1],
364 su_addrinfo_t *ai, tagi_t const *,
365 char const **return_culprit);
366 void (*vtp_deinit_primary)(tport_primary_t *pri);
367 int (*vtp_wakeup_pri)(tport_primary_t *pri, int events);
368 tport_t *(*vtp_connect)(tport_primary_t *pri, su_addrinfo_t *ai,
369 tp_name_t const *tpn);
370
371 size_t vtp_secondary_size; /* Size of secondary tport */
372
373 int (*vtp_init_secondary)(tport_t *, int socket, int accepted,
374 char const **return_reason);
375 void (*vtp_deinit_secondary)(tport_t *);
376 void (*vtp_shutdown)(tport_t *, int how);
377 int (*vtp_set_events)(tport_t const *self);
378 int (*vtp_wakeup)(tport_t *self, int events);
379 int (*vtp_recv)(tport_t *self);
380 ssize_t (*vtp_send)(tport_t const *self, msg_t *msg,
381 msg_iovec_t iov[], size_t iovused);
382 void (*vtp_deliver)(tport_t *self, msg_t *msg, su_time_t now);
383 int (*vtp_prepare)(tport_t *self, msg_t *msg,
384 tp_name_t const *tpn,
385 struct sigcomp_compartment *cc,
386 unsigned mtu);
387 int (*vtp_keepalive)(tport_t *self, su_addrinfo_t const *ai,
388 tagi_t const *taglist);
389 int (*vtp_stun_response)(tport_t const *self,
390 void *msg, size_t msglen,
391 void *addr, socklen_t addrlen);
392 int (*vtp_next_secondary_timer)(tport_t *self, su_time_t *,
393 char const **return_why);
394 void (*vtp_secondary_timer)(tport_t *self, su_time_t);
395};
396
397int tport_register_type(tport_vtable_t const *vtp);
398
400su_inline int tport_is_connection_oriented(tport_t const *self)
401{
402 return self->tp_conn_orient;
403}
404
406su_inline int tport_has_connection(tport_t const *self)
407{
408 return self->tp_has_connection;
409}
410
411void tport_has_been_updated(tport_t *tport);
412
413int tport_primary_compression(tport_primary_t *pri,
414 char const *compression,
415 tagi_t const *tl);
416
417void tport_set_tos(su_socket_t socket, su_addrinfo_t *ai, int tos);
418
419tport_t *tport_base_connect(tport_primary_t *pri,
420 su_addrinfo_t *ai,
421 su_addrinfo_t *name,
422 tp_name_t const *tpn);
423
424int tport_stream_init_primary(tport_primary_t *pri,
425 su_socket_t socket,
426 tp_name_t tpn[1],
427 su_addrinfo_t *ai,
428 tagi_t const *tags,
429 char const **return_reason);
430
431tport_t *tport_alloc_secondary(tport_primary_t *pri,
432 int socket,
433 int accepted,
434 char const **return_reason);
435
436int tport_accept(tport_primary_t *pri, int events);
437int tport_register_secondary(tport_t *self, su_wakeup_f wakeup, int events);
438void tport_zap_secondary(tport_t *self);
439
440int tport_set_secondary_timer(tport_t *self);
441void tport_base_timer(tport_t *self, su_time_t now);
442
443int tport_bind_socket(int socket,
444 su_addrinfo_t *ai,
445 char const **return_culprit);
446void tport_close(tport_t *self);
447int tport_shutdown0(tport_t *self, int how);
448
449int tport_has_queued(tport_t const *self);
450
451int tport_error_event(tport_t *self);
452void tport_recv_event(tport_t *self);
453void tport_send_event(tport_t *self);
454void tport_hup_event(tport_t *self);
455int tport_setname(tport_t *, char const *, su_addrinfo_t const *, char const *);
456
457int tport_wakeup(su_root_magic_t *magic, su_wait_t *w, tport_t *self);
458
459ssize_t tport_recv_iovec(tport_t const *self,
460 msg_t **mmsg,
461 msg_iovec_t iovec[msg_n_fragments], size_t N,
462 int exact);
463
464msg_t *tport_msg_alloc(tport_t const *self, usize_t size);
465
466int tport_prepare_and_send(tport_t *self, msg_t *msg,
467 tp_name_t const *tpn,
468 struct sigcomp_compartment *cc,
469 unsigned mtu);
470int tport_send_msg(tport_t *self, msg_t *msg,
471 tp_name_t const *tpn,
472 struct sigcomp_compartment *cc);
473
474void tport_send_queue(tport_t *self);
475
476void tport_deliver(tport_t *self, msg_t *msg, msg_t *next,
477 tport_compressor_t *comp,
478 su_time_t now);
479void tport_base_deliver(tport_t *self, msg_t *msg, su_time_t now);
480
481int tport_recv_error_report(tport_t *self);
482void tport_error_report(tport_t *self, int errcode,
483 su_sockaddr_t const *addr);
484
485int tport_open_log(tport_master_t *mr, tagi_t *tags);
486void tport_log_msg(tport_t *tp, msg_t *msg, char const *what,
487 char const *via, su_time_t now);
488void tport_dump_iovec(tport_t const *self, msg_t *msg,
489 size_t n, su_iovec_t const iov[], size_t iovused,
490 char const *what, char const *how);
491
492void tport_capt_msg(tport_t const *self, msg_t *msg, size_t n,
493 su_iovec_t const iov[], size_t iovused, char const *what);
494
495int tport_capt_msg_hepv2(tport_t const *self, msg_t *msg, size_t n,
496 su_iovec_t const iov[], size_t iovused, char const *what, char **buffer);
497
498int tport_capt_msg_hepv3(tport_t const *self, msg_t *msg, size_t n,
499 su_iovec_t const iov[], size_t iovused, char const *what, char **buffer);
500
501int tport_tcp_ping(tport_t *self, su_time_t now);
502int tport_tcp_pong(tport_t *self);
503
504extern tport_vtable_t const tport_udp_vtable;
505extern tport_vtable_t const tport_udp_client_vtable;
506
507int tport_udp_init_primary(tport_primary_t *,
508 tp_name_t tpn[1],
510 tagi_t const *,
511 char const **return_culprit);
512void tport_udp_deinit_primary(tport_primary_t *);
513int tport_recv_dgram(tport_t *self);
514ssize_t tport_send_dgram(tport_t const *self, msg_t *msg,
515 msg_iovec_t iov[], size_t iovused);
516int tport_udp_error(tport_t const *self, su_sockaddr_t name[1]);
517
518extern tport_vtable_t const tport_tcp_vtable;
519extern tport_vtable_t const tport_tcp_client_vtable;
520
521int tport_tcp_init_primary(tport_primary_t *,
522 tp_name_t tpn[1],
523 su_addrinfo_t *, tagi_t const *,
524 char const **return_culprit);
525int tport_tcp_init_client(tport_primary_t *,
526 tp_name_t tpn[1],
527 su_addrinfo_t *, tagi_t const *,
528 char const **return_culprit);
529int tport_tcp_init_secondary(tport_t *self, int socket, int accepted,
530 char const **return_reason);
531int tport_recv_stream(tport_t *self);
532ssize_t tport_send_stream(tport_t const *self, msg_t *msg,
533 msg_iovec_t iov[], size_t iovused);
534
535int tport_tcp_next_timer(tport_t *self, su_time_t *, char const **);
536void tport_tcp_timer(tport_t *self, su_time_t);
537
538int tport_next_recv_timeout(tport_t *, su_time_t *, char const **);
539void tport_recv_timeout_timer(tport_t *self, su_time_t now);
540
541int tport_next_keepalive(tport_t *self, su_time_t *, char const **);
542void tport_keepalive_timer(tport_t *self, su_time_t now);
543
544extern tport_vtable_t const tport_ws_vtable;
545extern tport_vtable_t const tport_ws_client_vtable;
546extern tport_vtable_t const tport_wss_vtable;
547extern tport_vtable_t const tport_wss_client_vtable;
548extern tport_vtable_t const tport_sctp_vtable;
549extern tport_vtable_t const tport_sctp_client_vtable;
550extern tport_vtable_t const tport_tls_vtable;
551extern tport_vtable_t const tport_tls_client_vtable;
552extern tport_vtable_t const tport_stun_vtable;
553extern tport_vtable_t const tport_http_connect_vtable;
554extern tport_vtable_t const tport_threadpool_vtable;
555
556typedef struct tport_descriptor_s {
557 char const *tpd_name;
558 tport_vtable_t *tpd_vtable;
559 su_addrinfo_t *tpd_hints;
560 int tpd_is_client_only;
561} tport_descriptor_t;
562
563typedef int const *(tport_set_f)(tport_master_t *mr,
564 tp_name_t const *tpn,
565 tagi_t const *taglist,
566 tport_descriptor_t **return_set,
567 int return_set_size);
568
569/* STUN plugin */
570
571int tport_init_stun_server(tport_master_t *mr, tagi_t const *tags);
572void tport_deinit_stun_server(tport_master_t *mr);
573int tport_recv_stun_dgram(tport_t const *self, msg_t **in_out_msg,
574 su_sockaddr_t *from, socklen_t fromlen);
575
576int tport_stun_server_add_socket(tport_t *tp);
577int tport_stun_server_remove_socket(tport_t *tp);
578
579void tport_recv_bytes(tport_t *self, ssize_t bytes, ssize_t on_line);
580void tport_recv_message(tport_t *self, msg_t *msg, int error);
581
582void tport_sent_bytes(tport_t *self, ssize_t bytes, ssize_t on_line);
583void tport_sent_message(tport_t *self, msg_t *msg, int error);
584
585/* ---------------------------------------------------------------------- */
586/* Compressor plugin */
587extern tport_comp_vtable_t const *tport_comp_vtable;
588
589char const *tport_canonize_comp(char const *comp);
590
591int tport_init_compressor(tport_t *,
592 char const *comp_name,
593 tagi_t const *tags);
594void tport_deinit_compressor(tport_t *);
595
596struct sigcomp_compartment *
597tport_sigcomp_assign_if_needed(tport_t *self,
598 struct sigcomp_compartment *cc);
599
600struct sigcomp_udvm **tport_get_udvm_slot(tport_t *self);
601
602void tport_sigcomp_accept_incomplete(tport_t *self, msg_t *msg);
603
604int tport_recv_comp_dgram(tport_t const *self,
605 tport_compressor_t *sc,
606 msg_t **in_out_msg,
607 su_sockaddr_t *from,
608 socklen_t fromlen);
609
610ssize_t tport_send_comp(tport_t const *self,
611 msg_t *msg,
612 msg_iovec_t iov[],
613 size_t iovused,
614 struct sigcomp_compartment *cc,
615 tport_compressor_t *sc);
616
617SOFIA_END_DECLS
618
619#endif /* TPORT_INTERNAL_H */
struct su_iovec_s msg_iovec_t
msg_n_fragments
struct msg_s msg_t
Transport name.
Definition tport.h:156
int su_socket_t
struct su_iovec_s su_iovec_t
struct addrinfo su_addrinfo_t
SU_HOME_T su_home_t
#define su_inline
struct su_time_s su_time_t
SU_U64_T uint64_t
struct su_root_t su_root_t
int(* su_wakeup_f)(su_root_magic_t *, su_wait_t *, su_wakeup_arg_t *arg)
SU_ROOT_MAGIC_T su_root_magic_t
struct pollfd su_wait_t
struct su_timer_s su_timer_t
Transport interface.
TP_STACK_T tp_stack_t
Type of stack object.
Definition tport.h:71
TP_MAGIC_T tp_magic_t
Type of transport-protocol-specific context object.
Definition tport.h:78
Transport plugin interface.
TPORT_STUN_SERVER_T tport_stun_server_t
Safe type for tport server object.
Definition tport_plugins.h:43
tport_via
Define how the public transport connects to Internet.
Definition tport_tag.h:81

Sofia-SIP 1.13.18 - Copyright (C) 2006 Nokia Corporation. All rights reserved. Licensed under the terms of the GNU Lesser General Public License.