25 #ifndef TPORT_INTERNAL_H
27 #define TPORT_INTERNAL_H
53 #include "sofia-sip/stun.h"
54 #include "sofia-sip/stun_tag.h"
62 #define SU_LOG tport_log
66 #if !defined(MSG_NOSIGNAL) || defined(__CYGWIN__) || defined(SYMBIAN)
68 #define MSG_NOSIGNAL (0)
71 #if (_WIN32_WINNT >= 0x0600)
72 #ifndef HAVE_MSG_TRUNC
73 #define HAVE_MSG_TRUNC 1
83 #define NONE ((void *)-1)
85 #define NONE ((void *)(INT_PTR)-1)
91 typedef struct tport_master tport_master_t;
92 typedef struct tport_pending_s tport_pending_t;
93 typedef struct tport_primary tport_primary_t;
94 typedef struct tport_vtable tport_vtable_t;
96 struct sigcomp_state_handler;
97 struct sigcomp_algorithm;
100 struct sigcomp_compartment;
102 typedef long unsigned LU;
108 unsigned tpp_timeout;
109 unsigned tpp_socket_keepalive;
110 unsigned tpp_keepalive;
111 unsigned tpp_pingpong;
113 unsigned tpp_sigcomp_lifetime;
114 unsigned tpp_thrpsize;
116 unsigned tpp_thrprqsize;
122 unsigned tpp_conn_orient:1;
123 unsigned tpp_sdwn_error:1;
124 unsigned tpp_stun_server:1;
125 unsigned tpp_pong2ping:1;
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;
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;
163 unsigned tp_is_connected:1;
164 unsigned tp_verified:1;
165 unsigned tp_pre_framed:1;
168 tport_t *tp_left, *tp_right, *tp_dad;
170 tport_master_t *tp_master;
171 tport_primary_t *tp_pri;
173 tport_params_t *tp_params;
188 su_strlst_t *tp_subjects;
196 #define tp_protoname tp_name->tpn_proto
197 #define tp_canon tp_name->tpn_canon
198 #define tp_host tp_name->tpn_host
199 #define tp_port tp_name->tpn_port
200 #define tp_ident tp_name->tpn_ident
207 su_sockaddr_t tp_addr[1];
208 #define tp_addrlen tp_addrinfo->ai_addrlen
213 msg_t const *tp_rlogged;
215 unsigned short tp_ping;
219 unsigned short tp_reported;
222 tport_pending_t *tp_pending;
223 tport_pending_t *tp_released;
228 unsigned short tp_qhead;
236 msg_t const *tp_slogged;
241 tport_compressor_t *tp_comp;
246 uint64_t sent_msgs, sent_errors, sent_bytes, sent_on_line;
247 uint64_t recv_msgs, recv_errors, recv_bytes, recv_on_line;
252 struct tport_primary {
253 tport_t pri_primary[1];
257 #define pri_home pri_primary->tp_home
258 #define pri_master pri_primary->tp_master
259 #define pri_protoname pri_primary->tp_name->tpn_proto
268 tport_primary_t *pri_next;
273 unsigned pri_updating:1;
274 unsigned pri_natted:1;
275 unsigned pri_has_tls:1;
278 void *pri_stun_handle;
280 tport_params_t pri_params[1];
284 struct tport_master {
285 tport_t mr_master[1];
289 #define mr_home mr_master->tp_home
292 int mr_stun_step_ready;
309 tport_primary_t *mr_primaries;
310 unsigned mr_prot_ver;
311 unsigned mr_agent_id;
313 tport_params_t mr_params[1];
315 unsigned mr_boundserver:1;
316 unsigned mr_bindv6only:1;
320 struct tport_delivery {
324 tport_compressor_t *d_comp;
334 char *external_ip_address;
335 #if HAVE_UPNP || HAVE_SOFIA_STUN
341 tport_master_t *tport;
346 su_sockaddr_t sockaddr;
355 char const *vtp_name;
359 int (*vtp_init_primary)(tport_primary_t *pri,
362 char const **return_culprit);
363 void (*vtp_deinit_primary)(tport_primary_t *pri);
364 int (*vtp_wakeup_pri)(tport_primary_t *pri,
int events);
365 tport_t *(*vtp_connect)(tport_primary_t *pri,
su_addrinfo_t *ai,
368 size_t vtp_secondary_size;
370 int (*vtp_init_secondary)(tport_t *,
int socket,
int accepted,
371 char const **return_reason);
372 void (*vtp_deinit_secondary)(tport_t *);
373 void (*vtp_shutdown)(tport_t *,
int how);
374 int (*vtp_set_events)(tport_t
const *
self);
375 int (*vtp_wakeup)(tport_t *
self,
int events);
376 int (*vtp_recv)(tport_t *
self);
377 ssize_t (*vtp_send)(tport_t
const *
self,
msg_t *msg,
380 int (*vtp_prepare)(tport_t *
self,
msg_t *msg,
382 struct sigcomp_compartment *cc,
386 int (*vtp_stun_response)(tport_t
const *
self,
387 void *msg,
size_t msglen,
388 void *addr, socklen_t addrlen);
389 int (*vtp_next_secondary_timer)(tport_t *
self,
su_time_t *,
390 char const **return_why);
391 void (*vtp_secondary_timer)(tport_t *
self,
su_time_t);
394 int tport_register_type(tport_vtable_t
const *vtp);
397 su_inline int tport_is_connection_oriented(tport_t
const *
self)
399 return self->tp_conn_orient;
403 su_inline int tport_has_connection(tport_t
const *
self)
405 return self->tp_has_connection;
408 void tport_has_been_updated(tport_t *tport);
410 int tport_primary_compression(tport_primary_t *pri,
411 char const *compression,
416 tport_t *tport_base_connect(tport_primary_t *pri,
421 int tport_stream_init_primary(tport_primary_t *pri,
426 char const **return_reason);
428 tport_t *tport_alloc_secondary(tport_primary_t *pri,
431 char const **return_reason);
433 int tport_accept(tport_primary_t *pri,
int events);
434 int tport_register_secondary(tport_t *
self, su_wakeup_f wakeup,
int events);
435 void tport_zap_secondary(tport_t *
self);
437 int tport_set_secondary_timer(tport_t *
self);
438 void tport_base_timer(tport_t *
self,
su_time_t now);
440 int tport_bind_socket(
int socket,
442 char const **return_culprit);
443 void tport_close(tport_t *
self);
444 int tport_shutdown0(tport_t *
self,
int how);
446 int tport_has_queued(tport_t
const *
self);
448 int tport_error_event(tport_t *
self);
449 void tport_recv_event(tport_t *
self);
450 void tport_send_event(tport_t *
self);
451 void tport_hup_event(tport_t *
self);
452 int tport_setname(tport_t *,
char const *,
su_addrinfo_t const *,
char const *);
456 ssize_t tport_recv_iovec(tport_t
const *
self,
461 msg_t *tport_msg_alloc(tport_t
const *
self, usize_t size);
463 int tport_prepare_and_send(tport_t *
self,
msg_t *msg,
465 struct sigcomp_compartment *cc,
467 int tport_send_msg(tport_t *
self,
msg_t *msg,
469 struct sigcomp_compartment *cc);
471 void tport_send_queue(tport_t *
self);
473 void tport_deliver(tport_t *
self,
msg_t *msg,
msg_t *next,
474 tport_compressor_t *comp,
476 void tport_base_deliver(tport_t *
self,
msg_t *msg,
su_time_t now);
478 int tport_recv_error_report(tport_t *
self);
479 void tport_error_report(tport_t *
self,
int errcode,
480 su_sockaddr_t
const *addr);
482 int tport_open_log(tport_master_t *mr,
tagi_t *tags);
483 void tport_log_msg(tport_t *tp,
msg_t *msg,
char const *what,
485 void tport_dump_iovec(tport_t
const *
self,
msg_t *msg,
486 size_t n,
su_iovec_t const iov[],
size_t iovused,
487 char const *what,
char const *how);
489 void tport_capt_msg(tport_t
const *
self,
msg_t *msg,
size_t n,
490 su_iovec_t const iov[],
size_t iovused,
char const *what);
492 int tport_capt_msg_hepv2(tport_t
const *
self,
msg_t *msg,
size_t n,
493 su_iovec_t const iov[],
size_t iovused,
char const *what,
char **buffer);
495 int tport_capt_msg_hepv3(tport_t
const *
self,
msg_t *msg,
size_t n,
496 su_iovec_t const iov[],
size_t iovused,
char const *what,
char **buffer);
498 int tport_tcp_ping(tport_t *
self,
su_time_t now);
499 int tport_tcp_pong(tport_t *
self);
501 extern tport_vtable_t
const tport_udp_vtable;
502 extern tport_vtable_t
const tport_udp_client_vtable;
504 int tport_udp_init_primary(tport_primary_t *,
508 char const **return_culprit);
509 void tport_udp_deinit_primary(tport_primary_t *);
510 int tport_recv_dgram(tport_t *
self);
511 ssize_t tport_send_dgram(tport_t
const *
self,
msg_t *msg,
513 int tport_udp_error(tport_t
const *
self, su_sockaddr_t name[1]);
515 extern tport_vtable_t
const tport_tcp_vtable;
516 extern tport_vtable_t
const tport_tcp_client_vtable;
518 int tport_tcp_init_primary(tport_primary_t *,
521 char const **return_culprit);
522 int tport_tcp_init_client(tport_primary_t *,
525 char const **return_culprit);
526 int tport_tcp_init_secondary(tport_t *
self,
int socket,
int accepted,
527 char const **return_reason);
528 int tport_recv_stream(tport_t *
self);
529 ssize_t tport_send_stream(tport_t
const *
self,
msg_t *msg,
532 int tport_tcp_next_timer(tport_t *
self,
su_time_t *,
char const **);
533 void tport_tcp_timer(tport_t *
self,
su_time_t);
535 int tport_next_recv_timeout(tport_t *,
su_time_t *,
char const **);
536 void tport_recv_timeout_timer(tport_t *
self,
su_time_t now);
538 int tport_next_keepalive(tport_t *
self,
su_time_t *,
char const **);
539 void tport_keepalive_timer(tport_t *
self,
su_time_t now);
541 extern tport_vtable_t
const tport_ws_vtable;
542 extern tport_vtable_t
const tport_ws_client_vtable;
543 extern tport_vtable_t
const tport_wss_vtable;
544 extern tport_vtable_t
const tport_wss_client_vtable;
545 extern tport_vtable_t
const tport_sctp_vtable;
546 extern tport_vtable_t
const tport_sctp_client_vtable;
547 extern tport_vtable_t
const tport_tls_vtable;
548 extern tport_vtable_t
const tport_tls_client_vtable;
549 extern tport_vtable_t
const tport_stun_vtable;
550 extern tport_vtable_t
const tport_http_connect_vtable;
551 extern tport_vtable_t
const tport_threadpool_vtable;
553 typedef struct tport_descriptor_s {
554 char const *tpd_name;
555 tport_vtable_t *tpd_vtable;
557 int tpd_is_client_only;
558 } tport_descriptor_t;
560 typedef int const *(tport_set_f)(tport_master_t *mr,
563 tport_descriptor_t **return_set,
564 int return_set_size);
568 int tport_init_stun_server(tport_master_t *mr,
tagi_t const *tags);
569 void tport_deinit_stun_server(tport_master_t *mr);
570 int tport_recv_stun_dgram(tport_t
const *
self,
msg_t **in_out_msg,
571 su_sockaddr_t *from, socklen_t fromlen);
573 int tport_stun_server_add_socket(tport_t *tp);
574 int tport_stun_server_remove_socket(tport_t *tp);
576 void tport_recv_bytes(tport_t *
self, ssize_t bytes, ssize_t on_line);
577 void tport_recv_message(tport_t *
self,
msg_t *msg,
int error);
579 void tport_sent_bytes(tport_t *
self, ssize_t bytes, ssize_t on_line);
580 void tport_sent_message(tport_t *
self,
msg_t *msg,
int error);
584 extern tport_comp_vtable_t
const *tport_comp_vtable;
586 char const *tport_canonize_comp(
char const *comp);
588 int tport_init_compressor(tport_t *,
589 char const *comp_name,
591 void tport_deinit_compressor(tport_t *);
593 struct sigcomp_compartment *
594 tport_sigcomp_assign_if_needed(tport_t *
self,
595 struct sigcomp_compartment *cc);
597 struct sigcomp_udvm **tport_get_udvm_slot(tport_t *
self);
599 void tport_sigcomp_accept_incomplete(tport_t *
self,
msg_t *msg);
601 int tport_recv_comp_dgram(tport_t
const *
self,
602 tport_compressor_t *sc,
607 ssize_t tport_send_comp(tport_t
const *
self,
611 struct sigcomp_compartment *cc,
612 tport_compressor_t *sc);
Transport name.
Definition: tport.h:156
Interface towards stack.
Definition: tport.h:93
struct addrinfo su_addrinfo_t
struct su_root_t su_root_t
SU_ROOT_MAGIC_T su_root_magic_t
struct su_timer_s su_timer_t
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