00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _OSIP_H_
00022 #define _OSIP_H_
00023
00024 #include <osipparser2/osip_const.h>
00025
00026
00027 #include <osip2/osip_time.h>
00028
00029 #ifdef __sun
00030 #include <sys/types.h>
00031 #endif
00032
00033 #include <osipparser2/osip_parser.h>
00034 #include <osip2/osip_fifo.h>
00035
00048 #ifdef __cplusplus
00049 extern "C"
00050 {
00051 #endif
00052
00053
00059 typedef enum _state_t
00060 {
00061
00062 ICT_PRE_CALLING,
00063 ICT_CALLING,
00064 ICT_PROCEEDING,
00065 ICT_COMPLETED,
00066 ICT_TERMINATED,
00067
00068
00069 IST_PRE_PROCEEDING,
00070 IST_PROCEEDING,
00071 IST_COMPLETED,
00072 IST_CONFIRMED,
00073 IST_TERMINATED,
00074
00075
00076 NICT_PRE_TRYING,
00077 NICT_TRYING,
00078 NICT_PROCEEDING,
00079 NICT_COMPLETED,
00080 NICT_TERMINATED,
00081
00082
00083 NIST_PRE_TRYING,
00084 NIST_TRYING,
00085 NIST_PROCEEDING,
00086 NIST_COMPLETED,
00087 NIST_TERMINATED,
00088
00089 #ifndef DOXYGEN
00090 DIALOG_EARLY,
00091 DIALOG_CONFIRMED,
00092 DIALOG_CLOSE
00093 #endif
00094 }
00095 state_t;
00096
00114 typedef enum type_t
00115 {
00116
00117 TIMEOUT_A,
00118 TIMEOUT_B,
00119 TIMEOUT_D,
00121
00122 TIMEOUT_E,
00123 TIMEOUT_F,
00124 TIMEOUT_K,
00126
00127 TIMEOUT_G,
00128 TIMEOUT_H,
00129 TIMEOUT_I,
00131
00132 TIMEOUT_J,
00134
00135 RCV_REQINVITE,
00136 RCV_REQACK,
00137 RCV_REQUEST,
00138 RCV_STATUS_1XX,
00139 RCV_STATUS_2XX,
00140 RCV_STATUS_3456XX,
00142
00143 SND_REQINVITE,
00144 SND_REQACK,
00145 SND_REQUEST,
00146 SND_STATUS_1XX,
00147 SND_STATUS_2XX,
00148 SND_STATUS_3456XX,
00150 KILL_TRANSACTION,
00151 UNKNOWN_EVT
00152 }
00153 type_t;
00154
00163 typedef enum osip_fsm_type_t
00164 {
00165 ICT,
00166 IST,
00167 NICT,
00168 NIST
00169 }
00170 osip_fsm_type_t;
00171
00172 #ifndef DEFAULT_T1
00173
00177 #define DEFAULT_T1 500
00178 #endif
00179 #ifndef DEFAULT_T2
00180
00184 #define DEFAULT_T2 4000
00185 #endif
00186 #ifndef DEFAULT_T4
00187
00191 #define DEFAULT_T4 5000
00192 #endif
00193
00194
00199 typedef struct osip_ict osip_ict_t;
00200
00205 struct osip_ict
00206 {
00207 int timer_a_length;
00208 struct timeval timer_a_start;
00209 int timer_b_length;
00210 struct timeval timer_b_start;
00211 int timer_d_length;
00212 struct timeval timer_d_start;
00213 char *destination;
00214 int port;
00215 };
00216
00221 typedef struct osip_nict osip_nict_t;
00222
00227 struct osip_nict
00228 {
00229 int timer_e_length;
00230 struct timeval timer_e_start;
00231 int timer_f_length;
00232 struct timeval timer_f_start;
00233 int timer_k_length;
00234 struct timeval timer_k_start;
00235 char *destination;
00236 int port;
00238 };
00239
00244 typedef struct osip_ist osip_ist_t;
00245
00250 struct osip_ist
00251 {
00252 int timer_g_length;
00253 struct timeval timer_g_start;
00254 int timer_h_length;
00255 struct timeval timer_h_start;
00256 int timer_i_length;
00257 struct timeval timer_i_start;
00258 };
00259
00264 typedef struct osip_nist osip_nist_t;
00265
00270 struct osip_nist
00271 {
00272 int timer_j_length;
00273 struct timeval timer_j_start;
00274 };
00275
00280 typedef struct osip_transaction osip_transaction_t;
00281
00286 struct osip_transaction
00287 {
00288
00289 void *your_instance;
00290 int transactionid;
00291 osip_fifo_t *transactionff;
00293 osip_via_t *topvia;
00294 osip_from_t *from;
00295 osip_to_t *to;
00296 osip_call_id_t *callid;
00297 osip_cseq_t *cseq;
00299 osip_message_t *orig_request;
00300 osip_message_t *last_response;
00301 osip_message_t *ack;
00303 state_t state;
00305 time_t birth_time;
00306 time_t completed_time;
00308 int in_socket;
00309 int out_socket;
00311 void *config;
00313 osip_fsm_type_t ctx_type;
00314 osip_ict_t *ict_context;
00315 osip_ist_t *ist_context;
00316 osip_nict_t *nict_context;
00317 osip_nist_t *nist_context;
00318 };
00319
00320
00324 typedef enum osip_message_callback_type
00325 {
00326 OSIP_ICT_INVITE_SENT = 0,
00327 OSIP_ICT_INVITE_SENT_AGAIN,
00328 OSIP_ICT_ACK_SENT,
00329 OSIP_ICT_ACK_SENT_AGAIN,
00330 OSIP_ICT_STATUS_1XX_RECEIVED,
00331 OSIP_ICT_STATUS_2XX_RECEIVED,
00332 OSIP_ICT_STATUS_2XX_RECEIVED_AGAIN,
00333 OSIP_ICT_STATUS_3XX_RECEIVED,
00334 OSIP_ICT_STATUS_4XX_RECEIVED,
00335 OSIP_ICT_STATUS_5XX_RECEIVED,
00336 OSIP_ICT_STATUS_6XX_RECEIVED,
00337 OSIP_ICT_STATUS_3456XX_RECEIVED_AGAIN,
00339 OSIP_IST_INVITE_RECEIVED,
00340 OSIP_IST_INVITE_RECEIVED_AGAIN,
00341 OSIP_IST_ACK_RECEIVED,
00342 OSIP_IST_ACK_RECEIVED_AGAIN,
00343 OSIP_IST_STATUS_1XX_SENT,
00344 OSIP_IST_STATUS_2XX_SENT,
00345 OSIP_IST_STATUS_2XX_SENT_AGAIN,
00346 OSIP_IST_STATUS_3XX_SENT,
00347 OSIP_IST_STATUS_4XX_SENT,
00348 OSIP_IST_STATUS_5XX_SENT,
00349 OSIP_IST_STATUS_6XX_SENT,
00350 OSIP_IST_STATUS_3456XX_SENT_AGAIN,
00352 OSIP_NICT_REGISTER_SENT,
00353 OSIP_NICT_BYE_SENT,
00354 OSIP_NICT_OPTIONS_SENT,
00355 OSIP_NICT_INFO_SENT,
00356 OSIP_NICT_CANCEL_SENT,
00357 OSIP_NICT_NOTIFY_SENT,
00358 OSIP_NICT_SUBSCRIBE_SENT,
00359 OSIP_NICT_UNKNOWN_REQUEST_SENT,
00360 OSIP_NICT_REQUEST_SENT_AGAIN,
00361 OSIP_NICT_STATUS_1XX_RECEIVED,
00362 OSIP_NICT_STATUS_2XX_RECEIVED,
00363 OSIP_NICT_STATUS_2XX_RECEIVED_AGAIN,
00364 OSIP_NICT_STATUS_3XX_RECEIVED,
00365 OSIP_NICT_STATUS_4XX_RECEIVED,
00366 OSIP_NICT_STATUS_5XX_RECEIVED,
00367 OSIP_NICT_STATUS_6XX_RECEIVED,
00368 OSIP_NICT_STATUS_3456XX_RECEIVED_AGAIN,
00370 OSIP_NIST_REGISTER_RECEIVED,
00371 OSIP_NIST_BYE_RECEIVED,
00372 OSIP_NIST_OPTIONS_RECEIVED,
00373 OSIP_NIST_INFO_RECEIVED,
00374 OSIP_NIST_CANCEL_RECEIVED,
00375 OSIP_NIST_NOTIFY_RECEIVED,
00376 OSIP_NIST_SUBSCRIBE_RECEIVED,
00378 OSIP_NIST_UNKNOWN_REQUEST_RECEIVED,
00379 OSIP_NIST_REQUEST_RECEIVED_AGAIN,
00380 OSIP_NIST_STATUS_1XX_SENT,
00381 OSIP_NIST_STATUS_2XX_SENT,
00382 OSIP_NIST_STATUS_2XX_SENT_AGAIN,
00383 OSIP_NIST_STATUS_3XX_SENT,
00384 OSIP_NIST_STATUS_4XX_SENT,
00385 OSIP_NIST_STATUS_5XX_SENT,
00386 OSIP_NIST_STATUS_6XX_SENT,
00387 OSIP_NIST_STATUS_3456XX_SENT_AGAIN,
00389 OSIP_MESSAGE_CALLBACK_COUNT
00390 } osip_message_callback_type_t;
00391
00395 typedef enum osip_kill_callback_type
00396 {
00397 OSIP_ICT_KILL_TRANSACTION,
00398 OSIP_IST_KILL_TRANSACTION,
00399 OSIP_NICT_KILL_TRANSACTION,
00400 OSIP_NIST_KILL_TRANSACTION,
00402 OSIP_KILL_CALLBACK_COUNT
00403 } osip_kill_callback_type_t;
00404
00409 typedef enum osip_transport_error_callback_type
00410 {
00411 OSIP_ICT_TRANSPORT_ERROR,
00412 OSIP_IST_TRANSPORT_ERROR,
00413 OSIP_NICT_TRANSPORT_ERROR,
00414 OSIP_NIST_TRANSPORT_ERROR,
00416 OSIP_TRANSPORT_ERROR_CALLBACK_COUNT
00417 } osip_transport_error_callback_type_t;
00418
00423 typedef void (*osip_message_cb_t) (int type, osip_transaction_t *,
00424 osip_message_t *);
00429 typedef void (*osip_kill_transaction_cb_t) (int type, osip_transaction_t *);
00434 typedef void (*osip_transport_error_cb_t) (int type, osip_transaction_t *,
00435 int error);
00436
00437
00438 struct osip_dialog;
00439
00444 typedef struct ixt_t ixt_t;
00445
00450 struct ixt_t
00451 {
00452
00453 struct osip_dialog *dialog;
00454 osip_message_t *msg2xx;
00455 osip_message_t *ack;
00456 time_t start;
00457 int interval;
00458 char *dest;
00459 int port;
00460 int sock;
00461 int counter;
00462 };
00463
00464
00472 typedef struct osip osip_t;
00473
00478 struct osip
00479 {
00480
00481 void *application_context;
00483
00484 osip_list_t *osip_ict_transactions;
00485 osip_list_t *osip_ist_transactions;
00486 osip_list_t *osip_nict_transactions;
00487 osip_list_t *osip_nist_transactions;
00489 osip_list_t *ixt_retransmissions;
00491 osip_message_cb_t msg_callbacks[OSIP_MESSAGE_CALLBACK_COUNT];
00492 osip_kill_transaction_cb_t kill_callbacks[OSIP_KILL_CALLBACK_COUNT];
00493 osip_transport_error_cb_t tp_error_callbacks[OSIP_TRANSPORT_ERROR_CALLBACK_COUNT];
00495 int (*cb_send_message) (osip_transaction_t *, osip_message_t *, char *,
00496 int, int);
00497 };
00498
00505 int osip_set_message_callback (osip_t *osip, int type, osip_message_cb_t cb);
00506
00513 int osip_set_kill_transaction_callback (osip_t *osip, int type,
00514 osip_kill_transaction_cb_t cb);
00515
00522 int osip_set_transport_error_callback (osip_t *osip, int type,
00523 osip_transport_error_cb_t cb);
00524
00533 typedef struct osip_event osip_event_t;
00534
00539 struct osip_event
00540 {
00541 type_t type;
00542 int transactionid;
00543 osip_message_t *sip;
00544 };
00545
00546
00547
00555 int osip_transaction_init (osip_transaction_t ** transaction,
00556 osip_fsm_type_t ctx_type, osip_t * osip,
00557 osip_message_t * request);
00562 int osip_transaction_free (osip_transaction_t * transaction);
00570 int osip_transaction_free2 (osip_transaction_t * transaction);
00571
00579 void osip_response_get_destination (osip_message_t * response,
00580 char **address,
00581 int *portnum);
00591 int osip_ict_set_destination (osip_ict_t * ict, char *destination,
00592 int port);
00593
00603 int osip_nict_set_destination (osip_nict_t * nict, char *destination,
00604 int port);
00605
00611 int osip_transaction_add_event (osip_transaction_t * transaction,
00612 osip_event_t * evt);
00621 int osip_transaction_execute (osip_transaction_t * transaction,
00622 osip_event_t * evt);
00634 int osip_transaction_set_your_instance (osip_transaction_t * transaction,
00635 void *instance);
00640 void *osip_transaction_get_your_instance (osip_transaction_t * transaction);
00641
00649 int osip_transaction_get_destination (osip_transaction_t * transaction,
00650 char **ip, int *port);
00651
00652
00659 int osip_transaction_set_in_socket (osip_transaction_t * transaction,
00660 int sock);
00667 int osip_transaction_set_out_socket (osip_transaction_t * transaction,
00668 int sock);
00669
00670
00671
00676 int osip_init (osip_t ** osip);
00681 void osip_release (osip_t * osip);
00682
00689 void osip_set_application_context (osip_t * osip, void *pointer);
00690
00696 void *osip_get_application_context (osip_t * osip);
00697
00698
00704 int osip_remove_transaction (osip_t * osip, osip_transaction_t * ict);
00705
00706
00711 int osip_ict_execute (osip_t * osip);
00716 int osip_ist_execute (osip_t * osip);
00721 int osip_nict_execute (osip_t * osip);
00726 int osip_nist_execute (osip_t * osip);
00727
00736 void osip_timers_gettimeout (osip_t * osip, struct timeval *lower_tv);
00737
00742 void osip_timers_ict_execute (osip_t * osip);
00747 void osip_timers_ist_execute (osip_t * osip);
00752 void osip_timers_nict_execute (osip_t * osip);
00757 void osip_timers_nist_execute (osip_t * osip);
00758
00759
00765 osip_transaction_t *osip_transaction_find (osip_list_t * transactions,
00766 osip_event_t * evt);
00767
00768
00769 #ifndef DOXYGEN
00770
00777 #ifndef OSIP_MT
00778 osip_transaction_t *osip_find_transaction (osip_t * osip,
00779 osip_event_t * evt);
00780 #endif
00781
00782 osip_transaction_t *__osip_find_transaction (osip_t * osip,
00783 osip_event_t * evt,
00784 int consume);
00785 #endif
00786
00793 int osip_find_transaction_and_add_event (osip_t * osip, osip_event_t * evt);
00794
00800 osip_transaction_t *osip_create_transaction (osip_t * osip,
00801 osip_event_t * evt);
00802
00808 osip_event_t *osip_parse (const char *buf, size_t length);
00809
00810
00815 void osip_retransmissions_execute (osip_t * osip);
00816
00824 void osip_start_200ok_retransmissions (osip_t * osip,
00825 struct osip_dialog *dialog,
00826 osip_message_t * msg200ok, int sock);
00827
00837 void osip_start_ack_retransmissions (osip_t * osip,
00838 struct osip_dialog *dialog,
00839 osip_message_t * ack, char *dest,
00840 int port, int sock);
00841
00847 struct osip_dialog *osip_stop_200ok_retransmissions (osip_t * osip, osip_message_t * ack);
00848
00856 void osip_stop_retransmissions_from_dialog (osip_t * osip,
00857 struct osip_dialog *dialog);
00858
00859
00864 osip_event_t *osip_new_outgoing_sipmessage (osip_message_t * sip);
00865
00870 void osip_event_free (osip_event_t * event);
00871
00877 void osip_set_cb_send_message (osip_t * cf,
00878 int (*cb) (osip_transaction_t *,
00879 osip_message_t *, char *,
00880 int, int));
00881
00882
00887 #define EVT_IS_RCV_INVITE(event) (event->type==RCV_REQINVITE)
00888
00892 #define EVT_IS_RCV_ACK(event) (event->type==RCV_REQACK)
00893
00897 #define EVT_IS_RCV_REQUEST(event) (event->type==RCV_REQUEST)
00898
00902 #define EVT_IS_RCV_STATUS_1XX(event) (event->type==RCV_STATUS_1XX)
00903
00907 #define EVT_IS_RCV_STATUS_2XX(event) (event->type==RCV_STATUS_2XX)
00908
00912 #define EVT_IS_RCV_STATUS_3456XX(event) (event->type==RCV_STATUS_3456XX)
00913
00914
00915
00920 #define EVT_IS_SND_INVITE(event) (event->type==SND_REQINVITE)
00921
00925 #define EVT_IS_SND_ACK(event) (event->type==SND_REQACK)
00926
00930 #define EVT_IS_SND_REQUEST(event) (event->type==SND_REQUEST)
00931
00935 #define EVT_IS_SND_STATUS_1XX(event) (event->type==SND_STATUS_1XX)
00936
00940 #define EVT_IS_SND_STATUS_2XX(event) (event->type==SND_STATUS_2XX)
00941
00945 #define EVT_IS_SND_STATUS_3456XX(event) (event->type==SND_STATUS_3456XX)
00946
00950 #define EVT_IS_INCOMINGMSG(event) (event->type>=RCV_REQINVITE \
00951 &&event->type<=RCV_STATUS_3456XX)
00952
00956 #define EVT_IS_INCOMINGREQ(event) (EVT_IS_RCV_INVITE(event) \
00957 ||EVT_IS_RCV_ACK(event) \
00958 ||EVT_IS_RCV_REQUEST(event))
00959
00963 #define EVT_IS_INCOMINGRESP(event) (EVT_IS_RCV_STATUS_1XX(event) \
00964 ||EVT_IS_RCV_STATUS_2XX(event) \
00965 ||EVT_IS_RCV_STATUS_3456XX(event))
00966
00970 #define EVT_IS_OUTGOINGMSG(event) (event->type>=SND_REQINVITE \
00971 &&event->type<=SND_STATUS_3456XX)
00972
00976 #define EVT_IS_OUTGOINGREQ(event) (EVT_IS_SND_INVITE(event) \
00977 ||EVT_IS_SND_ACK(event) \
00978 ||EVT_IS_SND_REQUEST(event))
00979
00983 #define EVT_IS_OUTGOINGRESP(event) (EVT_IS_SND_STATUS_1XX(event) \
00984 ||EVT_IS_SND_STATUS_2XX(event) \
00985 ||EVT_IS_SND_STATUS_3456XX(event))
00986
00991 #define EVT_IS_MSG(event) (event->type>=RCV_REQINVITE \
00992 &&event->type<=SND_STATUS_3456XX)
00993
00998 #define EVT_IS_KILL_TRANSACTION(event) (event->type==KILL_TRANSACTION)
00999
01000 #ifdef __cplusplus
01001 }
01002 #endif
01003
01004
01007 #endif