tport  1.12.11
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 #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 */
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines

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