tport_internal.h

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 
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;       /* for printf() and friends */
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   /* ==== Receive queue ================================================== */
00189 
00190   msg_t              *tp_msg;           
00191   msg_t const        *tp_rlogged;       
00192   su_time_t           tp_rtime;         
00193   unsigned short      tp_ping;          
00195   /* ==== Pending messages =============================================== */
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   /* ==== Send queue ===================================================== */
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   /* ==== Extensions  ===================================================== */
00218 
00219   tport_compressor_t *tp_comp;
00220 
00221   /* ==== Statistics  ===================================================== */
00222   
00223   struct {
00224     uint64_t sent_msgs, sent_errors, sent_bytes, sent_on_line;
00225     uint64_t recv_msgs, recv_errors, recv_bytes, recv_on_line;
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   /* Delivery context */
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     /* stun_socket_t *stun_socket; */
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;          /* Size of primary tport */
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;    /* Size of secondary tport */
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 /* STUN plugin */
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 void tport_recv_bytes(tport_t *self, ssize_t bytes, ssize_t on_line);
00532 void tport_recv_message(tport_t *self, msg_t *msg, int error);
00533 
00534 void tport_sent_bytes(tport_t *self, ssize_t bytes, ssize_t on_line);
00535 void tport_sent_message(tport_t *self, msg_t *msg, int error);
00536 
00537 /* ---------------------------------------------------------------------- */
00538 /* Compressor plugin */
00539 extern tport_comp_vtable_t const *tport_comp_vtable;
00540 
00541 char const *tport_canonize_comp(char const *comp);
00542 
00543 int tport_init_compressor(tport_t *,
00544                           char const *comp_name,
00545                           tagi_t const *tags);
00546 void tport_deinit_compressor(tport_t *);
00547 
00548 struct sigcomp_compartment *
00549 tport_sigcomp_assign_if_needed(tport_t *self,
00550                                struct sigcomp_compartment *cc);
00551 
00552 struct sigcomp_udvm **tport_get_udvm_slot(tport_t *self);
00553 
00554 void tport_sigcomp_accept_incomplete(tport_t *self, msg_t *msg);
00555 
00556 int tport_recv_comp_dgram(tport_t const *self,
00557                           tport_compressor_t *sc,
00558                           msg_t **in_out_msg,
00559                           su_sockaddr_t *from,
00560                           socklen_t fromlen);
00561 
00562 ssize_t tport_send_comp(tport_t const *self,
00563                     msg_t *msg, 
00564                     msg_iovec_t iov[], 
00565                     size_t iovused,
00566                     struct sigcomp_compartment *cc,
00567                     tport_compressor_t *sc);
00568 
00569 SOFIA_END_DECLS
00570 
00571 #endif /* TPORT_INTERNAL_H */

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