00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef TPORT_INTERNAL_H
00026
00027 #define TPORT_INTERNAL_H
00028
00038 #ifndef SU_H
00039 #include <sofia-sip/su.h>
00040 #endif
00041
00042 #include <sofia-sip/su_uniqueid.h>
00043
00044 #ifndef MSG_ADDR_H
00045 #include <sofia-sip/msg_addr.h>
00046 #endif
00047 #ifndef TPORT_H
00048 #include <sofia-sip/tport.h>
00049 #endif
00050
00051 #if HAVE_SOFIA_STUN
00052 #include "sofia-sip/stun.h"
00053 #include "sofia-sip/stun_tag.h"
00054 #endif
00055
00056 #include <sofia-sip/tport_plugins.h>
00057
00058 #ifndef SU_DEBUG
00059 #define SU_DEBUG 3
00060 #endif
00061 #define SU_LOG tport_log
00062
00063 #include <sofia-sip/su_debug.h>
00064
00065 #if !defined(MSG_NOSIGNAL) || defined(__CYGWIN__) || defined(SYMBIAN)
00066 #undef MSG_NOSIGNAL
00067 #define MSG_NOSIGNAL (0)
00068 #endif
00069
00070 #if !HAVE_MSG_TRUNC
00071 #define MSG_TRUNC (0)
00072 #endif
00073
00074 #ifndef NONE
00075 #define NONE ((void *)-1)
00076 #endif
00077
00078 SOFIA_BEGIN_DECLS
00079
00080 typedef struct tport_master tport_master_t;
00081 typedef struct tport_pending_s tport_pending_t;
00082 typedef struct tport_primary tport_primary_t;
00083 typedef struct tport_vtable tport_vtable_t;
00084
00085 struct sigcomp_state_handler;
00086 struct sigcomp_algorithm;
00087 struct sigcomp_udvm;
00088 struct sigcomp_magic;
00089 struct sigcomp_compartment;
00090
00091 typedef long unsigned LU;
00092
00094 typedef struct {
00095 unsigned tpp_mtu;
00096 unsigned tpp_idle;
00097 unsigned tpp_timeout;
00098 unsigned tpp_keepalive;
00099 unsigned tpp_pingpong;
00101 unsigned tpp_sigcomp_lifetime;
00102 unsigned tpp_thrpsize;
00104 unsigned tpp_thrprqsize;
00105 unsigned tpp_qsize;
00107 unsigned tpp_drop;
00108 int tpp_tos;
00110 unsigned tpp_conn_orient:1;
00111 unsigned tpp_sdwn_error:1;
00112 unsigned tpp_stun_server:1;
00113 unsigned tpp_pong2ping:1;
00115 unsigned :0;
00116
00117 } tport_params_t;
00118
00119
00127 struct tport_s {
00128 su_home_t tp_home[1];
00130 ssize_t tp_refs;
00132 unsigned tp_black:1;
00134 unsigned tp_accepted:1;
00135 unsigned tp_conn_orient:1;
00136 unsigned tp_has_connection:1;
00137 unsigned tp_reusable:1;
00138 unsigned tp_closed : 1;
00145 unsigned tp_recv_close:2;
00147 unsigned tp_send_close:2;
00148 unsigned tp_has_keepalive:1;
00149 unsigned tp_has_stun_server:1;
00150 unsigned tp_trunc:1;
00151 unsigned tp_is_connected:1;
00152 unsigned:0;
00153
00154 tport_t *tp_left, *tp_right, *tp_dad;
00156 tport_master_t *tp_master;
00157 tport_primary_t *tp_pri;
00159 tport_params_t *tp_params;
00161 tp_magic_t *tp_magic;
00163 su_timer_t *tp_timer;
00165 su_time_t tp_ktime;
00166 su_time_t tp_ptime;
00168 tp_name_t tp_name[1];
00174 #define tp_protoname tp_name->tpn_proto
00175 #define tp_canon tp_name->tpn_canon
00176 #define tp_host tp_name->tpn_host
00177 #define tp_port tp_name->tpn_port
00178 #define tp_ident tp_name->tpn_ident
00179
00180 su_socket_t tp_socket;
00181 int tp_index;
00182 int tp_events;
00184 su_addrinfo_t tp_addrinfo[1];
00185 su_sockaddr_t tp_addr[1];
00186 #define tp_addrlen tp_addrinfo->ai_addrlen
00187
00188
00189
00190 msg_t *tp_msg;
00191 msg_t const *tp_rlogged;
00192 su_time_t tp_rtime;
00193 unsigned short tp_ping;
00195
00196
00197 unsigned short tp_reported;
00198 unsigned tp_plen;
00199 unsigned tp_pused;
00200 tport_pending_t *tp_pending;
00201 tport_pending_t *tp_released;
00203
00204
00205 msg_t **tp_queue;
00206 unsigned short tp_qhead;
00208 msg_iovec_t *tp_unsent;
00209 size_t tp_unsentlen;
00211 msg_iovec_t *tp_iov;
00212 size_t tp_iovlen;
00214 msg_t const *tp_slogged;
00215 su_time_t tp_stime;
00217
00218
00219 tport_compressor_t *tp_comp;
00220
00221
00222
00223 struct {
00224 uint64_t sent_bytes, sent_on_line, recv_bytes, recv_on_line;
00225 uint64_t sent_msgs, recv_msgs;
00226 } tp_stats;
00227 };
00228
00230 struct tport_primary {
00231 tport_t pri_primary[1];
00232 #if DOXYGEN_ONLY
00233 su_home_t pri_home[1];
00234 #else
00235 #define pri_home pri_primary->tp_home
00236 #define pri_master pri_primary->tp_master
00237 #define pri_protoname pri_primary->tp_name->tpn_proto
00238 #endif
00239 tport_vtable_t const
00240 *pri_vtable;
00241 int pri_public;
00246 tport_primary_t *pri_next;
00248 tport_t *pri_open;
00249 tport_t *pri_closed;
00251 unsigned pri_updating:1;
00252 unsigned pri_natted:1;
00253 unsigned pri_has_tls:1;
00254 unsigned:0;
00255
00256 void *pri_stun_handle;
00257
00258 tport_params_t pri_params[1];
00259 };
00260
00262 struct tport_master {
00263 tport_t mr_master[1];
00264 #if DOXYGEN_ONLY
00265 su_home_t mr_home[1];
00266 #else
00267 #define mr_home mr_master->tp_home
00268 #endif
00269
00270 int mr_stun_step_ready;
00272 tp_stack_t *mr_stack;
00273 tp_stack_class_t
00274 const *mr_tpac;
00275 int mr_log;
00276 su_root_t *mr_root;
00279 su_timer_t *mr_timer;
00281 FILE *mr_dump_file;
00282
00283 tport_primary_t *mr_primaries;
00285 tport_params_t mr_params[1];
00286
00287 unsigned mr_boundserver:1;
00288 unsigned mr_bindv6only:1;
00289 unsigned :0;
00290
00291
00292 struct tport_delivery {
00293 tport_t *d_tport;
00294 msg_t *d_msg;
00295 tp_name_t d_from[1];
00296 tport_compressor_t *d_comp;
00297 } mr_delivery[1];
00298
00299 tport_stun_server_t *mr_stun_server;
00300
00301 #if 0
00302 struct tport_nat_s {
00303 int initialized;
00304 int bound;
00305 int stun_enabled;
00306 char *external_ip_address;
00307 #if HAVE_UPNP || HAVE_SOFIA_STUN
00308 int try_stun;
00309 #endif
00310 #if HAVE_UPNP
00311 #endif
00312 #if HAVE_SOFIA_STUN
00313 tport_master_t *tport;
00314 char *stun_server;
00315
00316 stun_handle_t *stun;
00317 su_socket_t stun_socket;
00318 su_sockaddr_t sockaddr;
00319 #endif
00320 } mr_nat[1];
00321 #endif
00322 };
00323
00325 struct tport_vtable
00326 {
00327 char const *vtp_name;
00328 enum tport_via vtp_public;
00329
00330 size_t vtp_pri_size;
00331 int (*vtp_init_primary)(tport_primary_t *pri,
00332 tp_name_t tpn[1],
00333 su_addrinfo_t *ai, tagi_t const *,
00334 char const **return_culprit);
00335 void (*vtp_deinit_primary)(tport_primary_t *pri);
00336 int (*vtp_wakeup_pri)(tport_primary_t *pri, int events);
00337 tport_t *(*vtp_connect)(tport_primary_t *pri, su_addrinfo_t *ai,
00338 tp_name_t const *tpn);
00339
00340 size_t vtp_secondary_size;
00341
00342 int (*vtp_init_secondary)(tport_t *, int socket, int accepted,
00343 char const **return_reason);
00344 void (*vtp_deinit_secondary)(tport_t *);
00345 void (*vtp_shutdown)(tport_t *, int how);
00346 int (*vtp_set_events)(tport_t const *self);
00347 int (*vtp_wakeup)(tport_t *self, int events);
00348 int (*vtp_recv)(tport_t *self);
00349 ssize_t (*vtp_send)(tport_t const *self, msg_t *msg,
00350 msg_iovec_t iov[], size_t iovused);
00351 void (*vtp_deliver)(tport_t *self, msg_t *msg, su_time_t now);
00352 int (*vtp_prepare)(tport_t *self, msg_t *msg,
00353 tp_name_t const *tpn,
00354 struct sigcomp_compartment *cc,
00355 unsigned mtu);
00356 int (*vtp_keepalive)(tport_t *self, su_addrinfo_t const *ai,
00357 tagi_t const *taglist);
00358 int (*vtp_stun_response)(tport_t const *self,
00359 void *msg, size_t msglen,
00360 void *addr, socklen_t addrlen);
00361 int (*vtp_next_secondary_timer)(tport_t *self, su_time_t *,
00362 char const **return_why);
00363 void (*vtp_secondary_timer)(tport_t *self, su_time_t);
00364 };
00365
00366 int tport_register_type(tport_vtable_t const *vtp);
00367
00369 su_inline int tport_is_connection_oriented(tport_t const *self)
00370 {
00371 return self->tp_conn_orient;
00372 }
00373
00375 su_inline int tport_has_connection(tport_t const *self)
00376 {
00377 return self->tp_has_connection;
00378 }
00379
00380 void tport_has_been_updated(tport_t *tport);
00381
00382 int tport_primary_compression(tport_primary_t *pri,
00383 char const *compression,
00384 tagi_t const *tl);
00385
00386 void tport_set_tos(su_socket_t socket, su_addrinfo_t *ai, int tos);
00387
00388 tport_t *tport_base_connect(tport_primary_t *pri,
00389 su_addrinfo_t *ai,
00390 su_addrinfo_t *name,
00391 tp_name_t const *tpn);
00392
00393 int tport_stream_init_primary(tport_primary_t *pri,
00394 su_socket_t socket,
00395 tp_name_t tpn[1],
00396 su_addrinfo_t *ai,
00397 tagi_t const *tags,
00398 char const **return_reason);
00399
00400 tport_t *tport_alloc_secondary(tport_primary_t *pri,
00401 int socket,
00402 int accepted,
00403 char const **return_reason);
00404
00405 int tport_accept(tport_primary_t *pri, int events);
00406 void tport_zap_secondary(tport_t *self);
00407
00408 int tport_set_secondary_timer(tport_t *self);
00409 void tport_base_timer(tport_t *self, su_time_t now);
00410
00411 int tport_bind_socket(int socket,
00412 su_addrinfo_t *ai,
00413 char const **return_culprit);
00414 void tport_close(tport_t *self);
00415 int tport_shutdown0(tport_t *self, int how);
00416
00417 int tport_has_queued(tport_t const *self);
00418
00419 int tport_error_event(tport_t *self);
00420 void tport_recv_event(tport_t *self);
00421 void tport_send_event(tport_t *self);
00422 void tport_hup_event(tport_t *self);
00423
00424 ssize_t tport_recv_iovec(tport_t const *self,
00425 msg_t **mmsg,
00426 msg_iovec_t iovec[msg_n_fragments], size_t N,
00427 int exact);
00428
00429 msg_t *tport_msg_alloc(tport_t const *self, usize_t size);
00430
00431 int tport_prepare_and_send(tport_t *self, msg_t *msg,
00432 tp_name_t const *tpn,
00433 struct sigcomp_compartment *cc,
00434 unsigned mtu);
00435 int tport_send_msg(tport_t *self, msg_t *msg,
00436 tp_name_t const *tpn,
00437 struct sigcomp_compartment *cc);
00438
00439 void tport_send_queue(tport_t *self);
00440
00441 void tport_deliver(tport_t *self, msg_t *msg, msg_t *next,
00442 tport_compressor_t *comp,
00443 su_time_t now);
00444 void tport_base_deliver(tport_t *self, msg_t *msg, su_time_t now);
00445
00446 int tport_recv_error_report(tport_t *self);
00447 void tport_error_report(tport_t *self, int errcode,
00448 su_sockaddr_t const *addr);
00449
00450 void tport_open_log(tport_master_t *mr, tagi_t *tags);
00451 void tport_log_msg(tport_t *tp, msg_t *msg, char const *what,
00452 char const *via, su_time_t now);
00453 void tport_dump_iovec(tport_t const *self, msg_t *msg,
00454 size_t n, su_iovec_t const iov[], size_t iovused,
00455 char const *what, char const *how);
00456
00457 int tport_tcp_ping(tport_t *self, su_time_t now);
00458 int tport_tcp_pong(tport_t *self);
00459
00460 extern tport_vtable_t const tport_udp_vtable;
00461 extern tport_vtable_t const tport_udp_client_vtable;
00462
00463 int tport_udp_init_primary(tport_primary_t *,
00464 tp_name_t tpn[1],
00465 su_addrinfo_t *,
00466 tagi_t const *,
00467 char const **return_culprit);
00468 void tport_udp_deinit_primary(tport_primary_t *);
00469 int tport_recv_dgram(tport_t *self);
00470 ssize_t tport_send_dgram(tport_t const *self, msg_t *msg,
00471 msg_iovec_t iov[], size_t iovused);
00472 int tport_udp_error(tport_t const *self, su_sockaddr_t name[1]);
00473
00474 extern tport_vtable_t const tport_tcp_vtable;
00475 extern tport_vtable_t const tport_tcp_client_vtable;
00476
00477 int tport_tcp_init_primary(tport_primary_t *,
00478 tp_name_t tpn[1],
00479 su_addrinfo_t *, tagi_t const *,
00480 char const **return_culprit);
00481 int tport_tcp_init_client(tport_primary_t *,
00482 tp_name_t tpn[1],
00483 su_addrinfo_t *, tagi_t const *,
00484 char const **return_culprit);
00485 int tport_tcp_init_secondary(tport_t *self, int socket, int accepted,
00486 char const **return_reason);
00487 int tport_recv_stream(tport_t *self);
00488 ssize_t tport_send_stream(tport_t const *self, msg_t *msg,
00489 msg_iovec_t iov[], size_t iovused);
00490
00491 int tport_tcp_next_timer(tport_t *self, su_time_t *, char const **);
00492 void tport_tcp_timer(tport_t *self, su_time_t);
00493
00494 int tport_next_recv_timeout(tport_t *, su_time_t *, char const **);
00495 void tport_recv_timeout_timer(tport_t *self, su_time_t now);
00496
00497 int tport_next_keepalive(tport_t *self, su_time_t *, char const **);
00498 void tport_keepalive_timer(tport_t *self, su_time_t now);
00499
00500 extern tport_vtable_t const tport_sctp_vtable;
00501 extern tport_vtable_t const tport_sctp_client_vtable;
00502 extern tport_vtable_t const tport_tls_vtable;
00503 extern tport_vtable_t const tport_tls_client_vtable;
00504 extern tport_vtable_t const tport_stun_vtable;
00505 extern tport_vtable_t const tport_http_connect_vtable;
00506 extern tport_vtable_t const tport_threadpool_vtable;
00507
00508 typedef struct tport_descriptor_s {
00509 char const *tpd_name;
00510 tport_vtable_t *tpd_vtable;
00511 su_addrinfo_t *tpd_hints;
00512 int tpd_is_client_only;
00513 } tport_descriptor_t;
00514
00515 typedef int const *(tport_set_f)(tport_master_t *mr,
00516 tp_name_t const *tpn,
00517 tagi_t const *taglist,
00518 tport_descriptor_t **return_set,
00519 int return_set_size);
00520
00521
00522
00523 int tport_init_stun_server(tport_master_t *mr, tagi_t const *tags);
00524 void tport_deinit_stun_server(tport_master_t *mr);
00525 int tport_recv_stun_dgram(tport_t const *self, msg_t **in_out_msg,
00526 su_sockaddr_t *from, socklen_t fromlen);
00527
00528 int tport_stun_server_add_socket(tport_t *tp);
00529 int tport_stun_server_remove_socket(tport_t *tp);
00530
00531
00532
00533 extern tport_comp_vtable_t const *tport_comp_vtable;
00534
00535 char const *tport_canonize_comp(char const *comp);
00536
00537 int tport_init_compressor(tport_t *,
00538 char const *comp_name,
00539 tagi_t const *tags);
00540 void tport_deinit_compressor(tport_t *);
00541
00542 struct sigcomp_compartment *
00543 tport_sigcomp_assign_if_needed(tport_t *self,
00544 struct sigcomp_compartment *cc);
00545
00546 struct sigcomp_udvm **tport_get_udvm_slot(tport_t *self);
00547
00548 void tport_sigcomp_accept_incomplete(tport_t *self, msg_t *msg);
00549
00550 int tport_recv_comp_dgram(tport_t const *self,
00551 tport_compressor_t *sc,
00552 msg_t **in_out_msg,
00553 su_sockaddr_t *from,
00554 socklen_t fromlen);
00555
00556 ssize_t tport_send_comp(tport_t const *self,
00557 msg_t *msg,
00558 msg_iovec_t iov[],
00559 size_t iovused,
00560 struct sigcomp_compartment *cc,
00561 tport_compressor_t *sc);
00562
00563 SOFIA_END_DECLS
00564
00565 #endif