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