tport
1.12.11
|
00001 /* 00002 * This file is part of the Sofia-SIP package 00003 * 00004 * Copyright (C) 2005 Nokia Corporation. 00005 * 00006 * Contact: Pekka Pessi <pekka.pessi@nokia-email.address.hidden> 00007 * 00008 * This library is free software; you can redistribute it and/or 00009 * modify it under the terms of the GNU Lesser General Public License 00010 * as published by the Free Software Foundation; either version 2.1 of 00011 * the License, or (at your option) any later version. 00012 * 00013 * This library is distributed in the hope that it will be useful, but 00014 * WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 * Lesser General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public 00019 * License along with this library; if not, write to the Free Software 00020 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 00021 * 02110-1301 USA 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 #include <sofia-sip/su_strlst.h> 00044 00045 #ifndef MSG_ADDR_H 00046 #include <sofia-sip/msg_addr.h> 00047 #endif 00048 #ifndef TPORT_H 00049 #include <sofia-sip/tport.h> 00050 #endif 00051 00052 #if HAVE_SOFIA_STUN 00053 #include "sofia-sip/stun.h" 00054 #include "sofia-sip/stun_tag.h" 00055 #endif 00056 00057 #include <sofia-sip/tport_plugins.h> 00058 00059 #ifndef SU_DEBUG 00060 #define SU_DEBUG 3 00061 #endif 00062 #define SU_LOG tport_log 00063 00064 #include <sofia-sip/su_debug.h> 00065 00066 #if !defined(MSG_NOSIGNAL) || defined(__CYGWIN__) || defined(SYMBIAN) 00067 #undef MSG_NOSIGNAL 00068 #define MSG_NOSIGNAL (0) 00069 #endif 00070 00071 #if (_WIN32_WINNT >= 0x0600) 00072 #ifndef HAVE_MSG_TRUNC 00073 #define HAVE_MSG_TRUNC 1 00074 #endif 00075 #endif 00076 00077 #if !HAVE_MSG_TRUNC 00078 #define MSG_TRUNC (0) 00079 #endif 00080 00081 #ifndef NONE 00082 #define NONE ((void *)-1) 00083 #endif 00084 00085 SOFIA_BEGIN_DECLS 00086 00087 typedef struct tport_master tport_master_t; 00088 typedef struct tport_pending_s tport_pending_t; 00089 typedef struct tport_primary tport_primary_t; 00090 typedef struct tport_vtable tport_vtable_t; 00091 00092 struct sigcomp_state_handler; 00093 struct sigcomp_algorithm; 00094 struct sigcomp_udvm; 00095 struct sigcomp_magic; 00096 struct sigcomp_compartment; 00097 00098 typedef long unsigned LU; /* for printf() and friends */ 00099 00101 typedef struct { 00102 unsigned tpp_mtu; 00103 unsigned tpp_idle; 00104 unsigned tpp_timeout; 00105 unsigned tpp_keepalive; 00106 unsigned tpp_pingpong; 00108 unsigned tpp_sigcomp_lifetime; 00109 unsigned tpp_thrpsize; 00111 unsigned tpp_thrprqsize; 00112 unsigned tpp_qsize; 00114 unsigned tpp_drop; 00115 int tpp_tos; 00117 unsigned tpp_conn_orient:1; 00118 unsigned tpp_sdwn_error:1; 00119 unsigned tpp_stun_server:1; 00120 unsigned tpp_pong2ping:1; 00122 unsigned :0; 00123 00124 } tport_params_t; 00125 00126 00134 struct tport_s { 00135 su_home_t tp_home[1]; 00137 ssize_t tp_refs; 00139 unsigned tp_black:1; 00141 unsigned tp_accepted:1; 00142 unsigned tp_conn_orient:1; 00143 unsigned tp_has_connection:1; 00144 unsigned tp_reusable:1; 00145 unsigned tp_closed : 1; 00152 unsigned tp_recv_close:2; 00154 unsigned tp_send_close:2; 00155 unsigned tp_has_keepalive:1; 00156 unsigned tp_has_stun_server:1; 00157 unsigned tp_trunc:1; 00158 unsigned tp_is_connected:1; 00159 unsigned tp_verified:1; 00160 unsigned:0; 00161 00162 tport_t *tp_left, *tp_right, *tp_dad; 00164 tport_master_t *tp_master; 00165 tport_primary_t *tp_pri; 00167 tport_params_t *tp_params; 00169 tp_magic_t *tp_magic; 00171 su_timer_t *tp_timer; 00173 su_time_t tp_ktime; 00174 su_time_t tp_ptime; 00176 tp_name_t tp_name[1]; 00182 su_strlst_t *tp_subjects; 00190 #define tp_protoname tp_name->tpn_proto 00191 #define tp_canon tp_name->tpn_canon 00192 #define tp_host tp_name->tpn_host 00193 #define tp_port tp_name->tpn_port 00194 #define tp_ident tp_name->tpn_ident 00195 00196 su_socket_t tp_socket; 00197 int tp_index; 00198 int tp_events; 00200 su_addrinfo_t tp_addrinfo[1]; 00201 su_sockaddr_t tp_addr[1]; 00202 #define tp_addrlen tp_addrinfo->ai_addrlen 00203 00204 /* ==== Receive queue ================================================== */ 00205 00206 msg_t *tp_msg; 00207 msg_t const *tp_rlogged; 00208 su_time_t tp_rtime; 00209 unsigned short tp_ping; 00211 /* ==== Pending messages =============================================== */ 00212 00213 unsigned short tp_reported; 00214 unsigned tp_plen; 00215 unsigned tp_pused; 00216 tport_pending_t *tp_pending; 00217 tport_pending_t *tp_released; 00219 /* ==== Send queue ===================================================== */ 00220 00221 msg_t **tp_queue; 00222 unsigned short tp_qhead; 00224 msg_iovec_t *tp_unsent; 00225 size_t tp_unsentlen; 00227 msg_iovec_t *tp_iov; 00228 size_t tp_iovlen; 00230 msg_t const *tp_slogged; 00231 su_time_t tp_stime; 00233 /* ==== Extensions ===================================================== */ 00234 00235 tport_compressor_t *tp_comp; 00236 00237 /* ==== Statistics ===================================================== */ 00238 00239 struct { 00240 uint64_t sent_msgs, sent_errors, sent_bytes, sent_on_line; 00241 uint64_t recv_msgs, recv_errors, recv_bytes, recv_on_line; 00242 } tp_stats; 00243 }; 00244 00246 struct tport_primary { 00247 tport_t pri_primary[1]; 00248 #if DOXYGEN_ONLY 00249 su_home_t pri_home[1]; 00250 #else 00251 #define pri_home pri_primary->tp_home 00252 #define pri_master pri_primary->tp_master 00253 #define pri_protoname pri_primary->tp_name->tpn_proto 00254 #endif 00255 tport_vtable_t const 00256 *pri_vtable; 00257 int pri_public; 00262 tport_primary_t *pri_next; 00264 tport_t *pri_open; 00265 tport_t *pri_closed; 00267 unsigned pri_updating:1; 00268 unsigned pri_natted:1; 00269 unsigned pri_has_tls:1; 00270 unsigned:0; 00271 00272 void *pri_stun_handle; 00273 00274 tport_params_t pri_params[1]; 00275 }; 00276 00278 struct tport_master { 00279 tport_t mr_master[1]; 00280 #if DOXYGEN_ONLY 00281 su_home_t mr_home[1]; 00282 #else 00283 #define mr_home mr_master->tp_home 00284 #endif 00285 00286 int mr_stun_step_ready; 00288 tp_stack_t *mr_stack; 00289 tp_stack_class_t 00290 const *mr_tpac; 00291 int mr_log; 00292 su_root_t *mr_root; 00295 su_timer_t *mr_timer; 00297 FILE *mr_dump_file; 00298 char *mr_dump; 00300 su_socket_t mr_capt_sock; 00301 char *mr_capt_name; 00302 tport_primary_t *mr_primaries; 00304 tport_params_t mr_params[1]; 00305 00306 unsigned mr_boundserver:1; 00307 unsigned mr_bindv6only:1; 00308 unsigned :0; 00309 00310 /* Delivery context */ 00311 struct tport_delivery { 00312 tport_t *d_tport; 00313 msg_t *d_msg; 00314 tp_name_t d_from[1]; 00315 tport_compressor_t *d_comp; 00316 } mr_delivery[1]; 00317 00318 tport_stun_server_t *mr_stun_server; 00319 00320 #if 0 00321 struct tport_nat_s { 00322 int initialized; 00323 int bound; 00324 int stun_enabled; 00325 char *external_ip_address; 00326 #if HAVE_UPNP || HAVE_SOFIA_STUN 00327 int try_stun; 00328 #endif 00329 #if HAVE_UPNP 00330 #endif 00331 #if HAVE_SOFIA_STUN 00332 tport_master_t *tport; 00333 char *stun_server; 00334 /* stun_socket_t *stun_socket; */ 00335 stun_handle_t *stun; 00336 su_socket_t stun_socket; 00337 su_sockaddr_t sockaddr; 00338 #endif 00339 } mr_nat[1]; 00340 #endif 00341 }; 00342 00344 struct tport_vtable 00345 { 00346 char const *vtp_name; 00347 enum tport_via vtp_public; 00348 00349 size_t vtp_pri_size; /* Size of primary tport */ 00350 int (*vtp_init_primary)(tport_primary_t *pri, 00351 tp_name_t tpn[1], 00352 su_addrinfo_t *ai, tagi_t const *, 00353 char const **return_culprit); 00354 void (*vtp_deinit_primary)(tport_primary_t *pri); 00355 int (*vtp_wakeup_pri)(tport_primary_t *pri, int events); 00356 tport_t *(*vtp_connect)(tport_primary_t *pri, su_addrinfo_t *ai, 00357 tp_name_t const *tpn); 00358 00359 size_t vtp_secondary_size; /* Size of secondary tport */ 00360 00361 int (*vtp_init_secondary)(tport_t *, int socket, int accepted, 00362 char const **return_reason); 00363 void (*vtp_deinit_secondary)(tport_t *); 00364 void (*vtp_shutdown)(tport_t *, int how); 00365 int (*vtp_set_events)(tport_t const *self); 00366 int (*vtp_wakeup)(tport_t *self, int events); 00367 int (*vtp_recv)(tport_t *self); 00368 ssize_t (*vtp_send)(tport_t const *self, msg_t *msg, 00369 msg_iovec_t iov[], size_t iovused); 00370 void (*vtp_deliver)(tport_t *self, msg_t *msg, su_time_t now); 00371 int (*vtp_prepare)(tport_t *self, msg_t *msg, 00372 tp_name_t const *tpn, 00373 struct sigcomp_compartment *cc, 00374 unsigned mtu); 00375 int (*vtp_keepalive)(tport_t *self, su_addrinfo_t const *ai, 00376 tagi_t const *taglist); 00377 int (*vtp_stun_response)(tport_t const *self, 00378 void *msg, size_t msglen, 00379 void *addr, socklen_t addrlen); 00380 int (*vtp_next_secondary_timer)(tport_t *self, su_time_t *, 00381 char const **return_why); 00382 void (*vtp_secondary_timer)(tport_t *self, su_time_t); 00383 }; 00384 00385 int tport_register_type(tport_vtable_t const *vtp); 00386 00388 su_inline int tport_is_connection_oriented(tport_t const *self) 00389 { 00390 return self->tp_conn_orient; 00391 } 00392 00394 su_inline int tport_has_connection(tport_t const *self) 00395 { 00396 return self->tp_has_connection; 00397 } 00398 00399 void tport_has_been_updated(tport_t *tport); 00400 00401 int tport_primary_compression(tport_primary_t *pri, 00402 char const *compression, 00403 tagi_t const *tl); 00404 00405 void tport_set_tos(su_socket_t socket, su_addrinfo_t *ai, int tos); 00406 00407 tport_t *tport_base_connect(tport_primary_t *pri, 00408 su_addrinfo_t *ai, 00409 su_addrinfo_t *name, 00410 tp_name_t const *tpn); 00411 00412 int tport_stream_init_primary(tport_primary_t *pri, 00413 su_socket_t socket, 00414 tp_name_t tpn[1], 00415 su_addrinfo_t *ai, 00416 tagi_t const *tags, 00417 char const **return_reason); 00418 00419 tport_t *tport_alloc_secondary(tport_primary_t *pri, 00420 int socket, 00421 int accepted, 00422 char const **return_reason); 00423 00424 int tport_accept(tport_primary_t *pri, int events); 00425 int tport_register_secondary(tport_t *self, su_wakeup_f wakeup, int events); 00426 void tport_zap_secondary(tport_t *self); 00427 00428 int tport_set_secondary_timer(tport_t *self); 00429 void tport_base_timer(tport_t *self, su_time_t now); 00430 00431 int tport_bind_socket(int socket, 00432 su_addrinfo_t *ai, 00433 char const **return_culprit); 00434 void tport_close(tport_t *self); 00435 int tport_shutdown0(tport_t *self, int how); 00436 00437 int tport_has_queued(tport_t const *self); 00438 00439 int tport_error_event(tport_t *self); 00440 void tport_recv_event(tport_t *self); 00441 void tport_send_event(tport_t *self); 00442 void tport_hup_event(tport_t *self); 00443 int tport_setname(tport_t *, char const *, su_addrinfo_t const *, char const *); 00444 00445 int tport_wakeup(su_root_magic_t *magic, su_wait_t *w, tport_t *self); 00446 00447 ssize_t tport_recv_iovec(tport_t const *self, 00448 msg_t **mmsg, 00449 msg_iovec_t iovec[msg_n_fragments], size_t N, 00450 int exact); 00451 00452 msg_t *tport_msg_alloc(tport_t const *self, usize_t size); 00453 00454 int tport_prepare_and_send(tport_t *self, msg_t *msg, 00455 tp_name_t const *tpn, 00456 struct sigcomp_compartment *cc, 00457 unsigned mtu); 00458 int tport_send_msg(tport_t *self, msg_t *msg, 00459 tp_name_t const *tpn, 00460 struct sigcomp_compartment *cc); 00461 00462 void tport_send_queue(tport_t *self); 00463 00464 void tport_deliver(tport_t *self, msg_t *msg, msg_t *next, 00465 tport_compressor_t *comp, 00466 su_time_t now); 00467 void tport_base_deliver(tport_t *self, msg_t *msg, su_time_t now); 00468 00469 int tport_recv_error_report(tport_t *self); 00470 void tport_error_report(tport_t *self, int errcode, 00471 su_sockaddr_t const *addr); 00472 00473 int tport_open_log(tport_master_t *mr, tagi_t *tags); 00474 void tport_log_msg(tport_t *tp, msg_t *msg, char const *what, 00475 char const *via, su_time_t now); 00476 void tport_dump_iovec(tport_t const *self, msg_t *msg, 00477 size_t n, su_iovec_t const iov[], size_t iovused, 00478 char const *what, char const *how); 00479 00480 void tport_capt_msg(tport_t const *self, msg_t *msg, size_t n, 00481 su_iovec_t const iov[], size_t iovused, char const *what); 00482 00483 int tport_tcp_ping(tport_t *self, su_time_t now); 00484 int tport_tcp_pong(tport_t *self); 00485 00486 extern tport_vtable_t const tport_udp_vtable; 00487 extern tport_vtable_t const tport_udp_client_vtable; 00488 00489 int tport_udp_init_primary(tport_primary_t *, 00490 tp_name_t tpn[1], 00491 su_addrinfo_t *, 00492 tagi_t const *, 00493 char const **return_culprit); 00494 void tport_udp_deinit_primary(tport_primary_t *); 00495 int tport_recv_dgram(tport_t *self); 00496 ssize_t tport_send_dgram(tport_t const *self, msg_t *msg, 00497 msg_iovec_t iov[], size_t iovused); 00498 int tport_udp_error(tport_t const *self, su_sockaddr_t name[1]); 00499 00500 extern tport_vtable_t const tport_tcp_vtable; 00501 extern tport_vtable_t const tport_tcp_client_vtable; 00502 00503 int tport_tcp_init_primary(tport_primary_t *, 00504 tp_name_t tpn[1], 00505 su_addrinfo_t *, tagi_t const *, 00506 char const **return_culprit); 00507 int tport_tcp_init_client(tport_primary_t *, 00508 tp_name_t tpn[1], 00509 su_addrinfo_t *, tagi_t const *, 00510 char const **return_culprit); 00511 int tport_tcp_init_secondary(tport_t *self, int socket, int accepted, 00512 char const **return_reason); 00513 int tport_recv_stream(tport_t *self); 00514 ssize_t tport_send_stream(tport_t const *self, msg_t *msg, 00515 msg_iovec_t iov[], size_t iovused); 00516 00517 int tport_tcp_next_timer(tport_t *self, su_time_t *, char const **); 00518 void tport_tcp_timer(tport_t *self, su_time_t); 00519 00520 int tport_next_recv_timeout(tport_t *, su_time_t *, char const **); 00521 void tport_recv_timeout_timer(tport_t *self, su_time_t now); 00522 00523 int tport_next_keepalive(tport_t *self, su_time_t *, char const **); 00524 void tport_keepalive_timer(tport_t *self, su_time_t now); 00525 00526 extern tport_vtable_t const tport_sctp_vtable; 00527 extern tport_vtable_t const tport_sctp_client_vtable; 00528 extern tport_vtable_t const tport_tls_vtable; 00529 extern tport_vtable_t const tport_tls_client_vtable; 00530 extern tport_vtable_t const tport_stun_vtable; 00531 extern tport_vtable_t const tport_http_connect_vtable; 00532 extern tport_vtable_t const tport_threadpool_vtable; 00533 00534 typedef struct tport_descriptor_s { 00535 char const *tpd_name; 00536 tport_vtable_t *tpd_vtable; 00537 su_addrinfo_t *tpd_hints; 00538 int tpd_is_client_only; 00539 } tport_descriptor_t; 00540 00541 typedef int const *(tport_set_f)(tport_master_t *mr, 00542 tp_name_t const *tpn, 00543 tagi_t const *taglist, 00544 tport_descriptor_t **return_set, 00545 int return_set_size); 00546 00547 /* STUN plugin */ 00548 00549 int tport_init_stun_server(tport_master_t *mr, tagi_t const *tags); 00550 void tport_deinit_stun_server(tport_master_t *mr); 00551 int tport_recv_stun_dgram(tport_t const *self, msg_t **in_out_msg, 00552 su_sockaddr_t *from, socklen_t fromlen); 00553 00554 int tport_stun_server_add_socket(tport_t *tp); 00555 int tport_stun_server_remove_socket(tport_t *tp); 00556 00557 void tport_recv_bytes(tport_t *self, ssize_t bytes, ssize_t on_line); 00558 void tport_recv_message(tport_t *self, msg_t *msg, int error); 00559 00560 void tport_sent_bytes(tport_t *self, ssize_t bytes, ssize_t on_line); 00561 void tport_sent_message(tport_t *self, msg_t *msg, int error); 00562 00563 /* ---------------------------------------------------------------------- */ 00564 /* Compressor plugin */ 00565 extern tport_comp_vtable_t const *tport_comp_vtable; 00566 00567 char const *tport_canonize_comp(char const *comp); 00568 00569 int tport_init_compressor(tport_t *, 00570 char const *comp_name, 00571 tagi_t const *tags); 00572 void tport_deinit_compressor(tport_t *); 00573 00574 struct sigcomp_compartment * 00575 tport_sigcomp_assign_if_needed(tport_t *self, 00576 struct sigcomp_compartment *cc); 00577 00578 struct sigcomp_udvm **tport_get_udvm_slot(tport_t *self); 00579 00580 void tport_sigcomp_accept_incomplete(tport_t *self, msg_t *msg); 00581 00582 int tport_recv_comp_dgram(tport_t const *self, 00583 tport_compressor_t *sc, 00584 msg_t **in_out_msg, 00585 su_sockaddr_t *from, 00586 socklen_t fromlen); 00587 00588 ssize_t tport_send_comp(tport_t const *self, 00589 msg_t *msg, 00590 msg_iovec_t iov[], 00591 size_t iovused, 00592 struct sigcomp_compartment *cc, 00593 tport_compressor_t *sc); 00594 00595 SOFIA_END_DECLS 00596 00597 #endif /* TPORT_INTERNAL_H */