tport_internal.h

Go to the documentation of this file.
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 
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;       /* for printf() and friends */
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   /* ==== Receive queue ================================================== */
00179 
00180   msg_t              *tp_msg;           
00182   /* ==== Pending messages =============================================== */
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   /* ==== Send queue ===================================================== */
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   /* ==== Extensions  ===================================================== */
00203 
00204   tport_compressor_t *tp_comp;
00205 
00206   /* ==== Statistics  ===================================================== */
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   /* Delivery context */
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     /* stun_socket_t *stun_socket; */
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;          /* Size of primary tport */
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;    /* Size of secondary tport */
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 /* STUN plugin */
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 /* Compressor plugin */
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 /* TPORT_INTERNAL_H */

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