00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __PJNATH_STUN_SESSION_H__
00021 #define __PJNATH_STUN_SESSION_H__
00022
00028 #include <pjnath/stun_msg.h>
00029 #include <pjnath/stun_auth.h>
00030 #include <pjnath/stun_config.h>
00031 #include <pjnath/stun_transaction.h>
00032 #include <pj/list.h>
00033 #include <pj/timer.h>
00034
00035 PJ_BEGIN_DECL
00036
00037
00038
00168 typedef struct pj_stun_tx_data pj_stun_tx_data;
00169
00171 typedef struct pj_stun_rx_data pj_stun_rx_data;
00172
00174 typedef struct pj_stun_session pj_stun_session;
00175
00176
00182 typedef struct pj_stun_session_cb
00183 {
00205 pj_status_t (*on_send_msg)(pj_stun_session *sess,
00206 void *token,
00207 const void *pkt,
00208 pj_size_t pkt_size,
00209 const pj_sockaddr_t *dst_addr,
00210 unsigned addr_len);
00211
00235 pj_status_t (*on_rx_request)(pj_stun_session *sess,
00236 const pj_uint8_t *pkt,
00237 unsigned pkt_len,
00238 const pj_stun_rx_data *rdata,
00239 void *token,
00240 const pj_sockaddr_t *src_addr,
00241 unsigned src_addr_len);
00242
00273 void (*on_request_complete)(pj_stun_session *sess,
00274 pj_status_t status,
00275 void *token,
00276 pj_stun_tx_data *tdata,
00277 const pj_stun_msg *response,
00278 const pj_sockaddr_t *src_addr,
00279 unsigned src_addr_len);
00280
00281
00301 pj_status_t (*on_rx_indication)(pj_stun_session *sess,
00302 const pj_uint8_t *pkt,
00303 unsigned pkt_len,
00304 const pj_stun_msg *msg,
00305 void *token,
00306 const pj_sockaddr_t *src_addr,
00307 unsigned src_addr_len);
00308
00309 } pj_stun_session_cb;
00310
00311
00315 struct pj_stun_rx_data
00316 {
00320 pj_stun_msg *msg;
00321
00327 pj_stun_req_cred_info info;
00328 };
00329
00330
00335 struct pj_stun_tx_data
00336 {
00338 PJ_DECL_LIST_MEMBER(struct pj_stun_tx_data);
00339
00340 pj_pool_t *pool;
00341 pj_stun_session *sess;
00342 pj_stun_msg *msg;
00344 void *token;
00346 pj_stun_client_tsx *client_tsx;
00347 pj_bool_t retransmit;
00348 pj_uint32_t msg_magic;
00349 pj_uint8_t msg_key[12];
00351 pj_stun_req_cred_info auth_info;
00353 void *pkt;
00354 unsigned max_len;
00355 pj_size_t pkt_size;
00357 unsigned addr_len;
00358 const pj_sockaddr_t *dst_addr;
00360 pj_timer_entry res_timer;
00361 };
00362
00363
00367 typedef enum pj_stun_sess_msg_log_flag
00368 {
00369 PJ_STUN_SESS_LOG_TX_REQ=1,
00370 PJ_STUN_SESS_LOG_TX_RES=2,
00371 PJ_STUN_SESS_LOG_TX_IND=4,
00373 PJ_STUN_SESS_LOG_RX_REQ=8,
00374 PJ_STUN_SESS_LOG_RX_RES=16,
00375 PJ_STUN_SESS_LOG_RX_IND=32
00376 } pj_stun_sess_msg_log_flag;
00377
00378
00391 PJ_DECL(pj_status_t) pj_stun_session_create(pj_stun_config *cfg,
00392 const char *name,
00393 const pj_stun_session_cb *cb,
00394 pj_bool_t fingerprint,
00395 pj_stun_session **p_sess);
00396
00409 PJ_DECL(pj_status_t) pj_stun_session_destroy(pj_stun_session *sess);
00410
00420 PJ_DECL(pj_status_t) pj_stun_session_set_user_data(pj_stun_session *sess,
00421 void *user_data);
00422
00431 PJ_DECL(void*) pj_stun_session_get_user_data(pj_stun_session *sess);
00432
00445 PJ_DECL(pj_status_t) pj_stun_session_set_lock(pj_stun_session *sess,
00446 pj_lock_t *lock,
00447 pj_bool_t auto_del);
00448
00459 PJ_DECL(pj_status_t) pj_stun_session_set_software_name(pj_stun_session *sess,
00460 const pj_str_t *sw);
00461
00477 PJ_DECL(pj_status_t) pj_stun_session_set_credential(pj_stun_session *sess,
00478 pj_stun_auth_type auth_type,
00479 const pj_stun_auth_cred *cred);
00486 PJ_DECL(void) pj_stun_session_set_log(pj_stun_session *sess,
00487 unsigned flags);
00498 PJ_DECL(pj_bool_t) pj_stun_session_use_fingerprint(pj_stun_session *sess,
00499 pj_bool_t use);
00500
00516 PJ_DECL(pj_status_t) pj_stun_session_create_req(pj_stun_session *sess,
00517 int msg_type,
00518 pj_uint32_t magic,
00519 const pj_uint8_t tsx_id[12],
00520 pj_stun_tx_data **p_tdata);
00521
00536 PJ_DECL(pj_status_t) pj_stun_session_create_ind(pj_stun_session *sess,
00537 int msg_type,
00538 pj_stun_tx_data **p_tdata);
00539
00561 PJ_DECL(pj_status_t) pj_stun_session_create_res(pj_stun_session *sess,
00562 const pj_stun_rx_data *rdata,
00563 unsigned err_code,
00564 const pj_str_t *err_msg,
00565 pj_stun_tx_data **p_tdata);
00566
00603 PJ_DECL(pj_status_t) pj_stun_session_send_msg(pj_stun_session *sess,
00604 void *token,
00605 pj_bool_t cache_res,
00606 pj_bool_t retransmit,
00607 const pj_sockaddr_t *dst_addr,
00608 unsigned addr_len,
00609 pj_stun_tx_data *tdata);
00610
00646 PJ_DECL(pj_status_t) pj_stun_session_respond(pj_stun_session *sess,
00647 const pj_stun_rx_data *rdata,
00648 unsigned code,
00649 const char *err_msg,
00650 void *token,
00651 pj_bool_t cache,
00652 const pj_sockaddr_t *dst_addr,
00653 unsigned addr_len);
00654
00673 PJ_DECL(pj_status_t) pj_stun_session_cancel_req(pj_stun_session *sess,
00674 pj_stun_tx_data *tdata,
00675 pj_bool_t notify,
00676 pj_status_t status);
00677
00693 PJ_DECL(pj_status_t) pj_stun_session_retransmit_req(pj_stun_session *sess,
00694 pj_stun_tx_data *tdata,
00695 pj_bool_t mod_count);
00696
00697
00734 PJ_DECL(pj_status_t) pj_stun_session_on_rx_pkt(pj_stun_session *sess,
00735 const void *packet,
00736 pj_size_t pkt_size,
00737 unsigned options,
00738 void *token,
00739 pj_size_t *parsed_len,
00740 const pj_sockaddr_t *src_addr,
00741 unsigned src_addr_len);
00742
00753 PJ_DECL(void) pj_stun_msg_destroy_tdata(pj_stun_session *sess,
00754 pj_stun_tx_data *tdata);
00755
00756
00762 PJ_END_DECL
00763
00764 #endif
00765