00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __PJNATH_ICE_SESSION_H__
00021 #define __PJNATH_ICE_SESSION_H__
00022
00027 #include <pjnath/types.h>
00028 #include <pjnath/stun_session.h>
00029 #include <pjnath/errno.h>
00030 #include <pj/sock.h>
00031 #include <pj/timer.h>
00032
00033 PJ_BEGIN_DECL
00034
00035
00127 typedef struct pj_ice_sess_checklist pj_ice_sess_checklist;
00128
00132 typedef enum pj_ice_cand_type
00133 {
00138 PJ_ICE_CAND_TYPE_HOST,
00139
00145 PJ_ICE_CAND_TYPE_SRFLX,
00146
00151 PJ_ICE_CAND_TYPE_PRFLX,
00152
00157 PJ_ICE_CAND_TYPE_RELAYED
00158
00159 } pj_ice_cand_type;
00160
00161
00163 typedef struct pj_ice_sess pj_ice_sess;
00164
00166 typedef struct pj_ice_sess_check pj_ice_sess_check;
00167
00168
00176 typedef struct pj_ice_sess_comp
00177 {
00183 pj_ice_sess_check *valid_check;
00184
00190 pj_ice_sess_check *nominated_check;
00191
00196 pj_stun_session *stun_sess;
00197
00198 } pj_ice_sess_comp;
00199
00200
00204 typedef struct pj_ice_msg_data
00205 {
00207 unsigned transport_id;
00208
00210 pj_bool_t has_req_data;
00211
00213 union data {
00215 struct request_data {
00216 pj_ice_sess *ice;
00217 pj_ice_sess_checklist *clist;
00218 unsigned ckid;
00219 } req;
00220 } data;
00221
00222 } pj_ice_msg_data;
00223
00224
00233 typedef struct pj_ice_sess_cand
00234 {
00238 pj_ice_cand_type type;
00239
00246 pj_status_t status;
00247
00253 pj_uint8_t comp_id;
00254
00258 pj_uint8_t transport_id;
00259
00263 pj_uint16_t local_pref;
00264
00271 pj_str_t foundation;
00272
00278 pj_uint32_t prio;
00279
00289 pj_sockaddr addr;
00290
00299 pj_sockaddr base_addr;
00300
00305 pj_sockaddr rel_addr;
00306
00307 } pj_ice_sess_cand;
00308
00309
00313 typedef enum pj_ice_sess_check_state
00314 {
00320 PJ_ICE_SESS_CHECK_STATE_FROZEN,
00321
00327 PJ_ICE_SESS_CHECK_STATE_WAITING,
00328
00334 PJ_ICE_SESS_CHECK_STATE_IN_PROGRESS,
00335
00341 PJ_ICE_SESS_CHECK_STATE_SUCCEEDED,
00342
00348 PJ_ICE_SESS_CHECK_STATE_FAILED
00349
00350 } pj_ice_sess_check_state;
00351
00352
00360 struct pj_ice_sess_check
00361 {
00365 pj_ice_sess_cand *lcand;
00366
00370 pj_ice_sess_cand *rcand;
00371
00375 pj_timestamp prio;
00376
00380 pj_ice_sess_check_state state;
00381
00388 pj_stun_tx_data *tdata;
00389
00394 pj_bool_t nominated;
00395
00400 pj_status_t err_code;
00401 };
00402
00403
00407 typedef enum pj_ice_sess_checklist_state
00408 {
00412 PJ_ICE_SESS_CHECKLIST_ST_IDLE,
00413
00418 PJ_ICE_SESS_CHECKLIST_ST_RUNNING,
00419
00424 PJ_ICE_SESS_CHECKLIST_ST_COMPLETED
00425
00426 } pj_ice_sess_checklist_state;
00427
00428
00433 struct pj_ice_sess_checklist
00434 {
00438 pj_ice_sess_checklist_state state;
00439
00443 unsigned count;
00444
00448 pj_ice_sess_check checks[PJ_ICE_MAX_CHECKS];
00449
00453 pj_timer_entry timer;
00454
00455 };
00456
00457
00462 typedef struct pj_ice_sess_cb
00463 {
00472 void (*on_ice_complete)(pj_ice_sess *ice, pj_status_t status);
00473
00486 pj_status_t (*on_tx_pkt)(pj_ice_sess *ice, unsigned comp_id,
00487 unsigned transport_id,
00488 const void *pkt, pj_size_t size,
00489 const pj_sockaddr_t *dst_addr,
00490 unsigned dst_addr_len);
00491
00505 void (*on_rx_data)(pj_ice_sess *ice, unsigned comp_id,
00506 unsigned transport_id,
00507 void *pkt, pj_size_t size,
00508 const pj_sockaddr_t *src_addr,
00509 unsigned src_addr_len);
00510 } pj_ice_sess_cb;
00511
00512
00516 typedef enum pj_ice_sess_role
00517 {
00521 PJ_ICE_SESS_ROLE_UNKNOWN,
00522
00526 PJ_ICE_SESS_ROLE_CONTROLLED,
00527
00531 PJ_ICE_SESS_ROLE_CONTROLLING
00532
00533 } pj_ice_sess_role;
00534
00535
00545 typedef struct pj_ice_rx_check
00546 {
00547 PJ_DECL_LIST_MEMBER(struct pj_ice_rx_check);
00549 unsigned comp_id;
00550 unsigned transport_id;
00552 pj_sockaddr src_addr;
00553 unsigned src_addr_len;
00555 pj_bool_t use_candidate;
00556 pj_uint32_t priority;
00557 pj_stun_uint64_attr *role_attr;
00559 } pj_ice_rx_check;
00560
00561
00567 typedef struct pj_ice_sess_options
00568 {
00572 pj_bool_t aggressive;
00573
00581 unsigned nominated_check_delay;
00582
00595 int controlled_agent_want_nom_timeout;
00596
00597 } pj_ice_sess_options;
00598
00599
00609 struct pj_ice_sess
00610 {
00611 char obj_name[PJ_MAX_OBJ_NAME];
00613 pj_pool_t *pool;
00614 void *user_data;
00615 pj_mutex_t *mutex;
00616 pj_ice_sess_role role;
00617 pj_ice_sess_options opt;
00618 pj_timestamp tie_breaker;
00619 pj_uint8_t *prefs;
00620 pj_bool_t is_nominating;
00621 pj_bool_t is_complete;
00622 pj_status_t ice_status;
00623 pj_timer_entry timer;
00624 pj_ice_sess_cb cb;
00626 pj_stun_config stun_cfg;
00628
00629 pj_str_t tx_ufrag;
00630 pj_str_t tx_uname;
00631 pj_str_t tx_pass;
00632 pj_str_t rx_ufrag;
00633 pj_str_t rx_uname;
00634 pj_str_t rx_pass;
00636
00637 unsigned comp_cnt;
00638 pj_ice_sess_comp comp[PJ_ICE_MAX_COMP];
00639 unsigned comp_ka;
00641
00642 unsigned lcand_cnt;
00643 pj_ice_sess_cand lcand[PJ_ICE_MAX_CAND];
00645
00646 unsigned rcand_cnt;
00647 pj_ice_sess_cand rcand[PJ_ICE_MAX_CAND];
00650 pj_ice_msg_data tp_data[4];
00651
00652
00653 pj_ice_rx_check early_check;
00655
00656 pj_ice_sess_checklist clist;
00658
00659 pj_ice_sess_checklist valid_list;
00662 union {
00663 char txt[128];
00664 char errmsg[PJ_ERR_MSG_SIZE];
00665 } tmp;
00666 };
00667
00668
00677 PJ_DECL(const char*) pj_ice_get_cand_type_name(pj_ice_cand_type type);
00678
00679
00688 PJ_DECL(const char*) pj_ice_sess_role_name(pj_ice_sess_role role);
00689
00690
00700 PJ_DECL(void) pj_ice_calc_foundation(pj_pool_t *pool,
00701 pj_str_t *foundation,
00702 pj_ice_cand_type type,
00703 const pj_sockaddr *base_addr);
00704
00710 PJ_DECL(void) pj_ice_sess_options_default(pj_ice_sess_options *opt);
00711
00736 PJ_DECL(pj_status_t) pj_ice_sess_create(pj_stun_config *stun_cfg,
00737 const char *name,
00738 pj_ice_sess_role role,
00739 unsigned comp_cnt,
00740 const pj_ice_sess_cb *cb,
00741 const pj_str_t *local_ufrag,
00742 const pj_str_t *local_passwd,
00743 pj_ice_sess **p_ice);
00744
00754 PJ_DECL(pj_status_t) pj_ice_sess_get_options(pj_ice_sess *ice,
00755 pj_ice_sess_options *opt);
00756
00770 PJ_DECL(pj_status_t) pj_ice_sess_set_options(pj_ice_sess *ice,
00771 const pj_ice_sess_options *opt);
00772
00782 PJ_DECL(pj_status_t) pj_ice_sess_destroy(pj_ice_sess *ice);
00783
00784
00796 PJ_DECL(pj_status_t) pj_ice_sess_change_role(pj_ice_sess *ice,
00797 pj_ice_sess_role new_role);
00798
00799
00817 PJ_DECL(pj_status_t) pj_ice_sess_set_prefs(pj_ice_sess *ice,
00818 const pj_uint8_t prefs[4]);
00819
00820
00821
00843 PJ_DECL(pj_status_t) pj_ice_sess_add_cand(pj_ice_sess *ice,
00844 unsigned comp_id,
00845 unsigned transport_id,
00846 pj_ice_cand_type type,
00847 pj_uint16_t local_pref,
00848 const pj_str_t *foundation,
00849 const pj_sockaddr_t *addr,
00850 const pj_sockaddr_t *base_addr,
00851 const pj_sockaddr_t *rel_addr,
00852 int addr_len,
00853 unsigned *p_cand_id);
00854
00869 PJ_DECL(pj_status_t) pj_ice_sess_find_default_cand(pj_ice_sess *ice,
00870 unsigned comp_id,
00871 int *p_cand_id);
00872
00894 PJ_DECL(pj_status_t)
00895 pj_ice_sess_create_check_list(pj_ice_sess *ice,
00896 const pj_str_t *rem_ufrag,
00897 const pj_str_t *rem_passwd,
00898 unsigned rem_cand_cnt,
00899 const pj_ice_sess_cand rem_cand[]);
00900
00910 PJ_DECL(pj_status_t) pj_ice_sess_start_check(pj_ice_sess *ice);
00911
00912
00930 PJ_DECL(pj_status_t) pj_ice_sess_send_data(pj_ice_sess *ice,
00931 unsigned comp_id,
00932 const void *data,
00933 pj_size_t data_len);
00934
00954 PJ_DECL(pj_status_t) pj_ice_sess_on_rx_pkt(pj_ice_sess *ice,
00955 unsigned comp_id,
00956 unsigned transport_id,
00957 void *pkt,
00958 pj_size_t pkt_size,
00959 const pj_sockaddr_t *src_addr,
00960 int src_addr_len);
00961
00962
00963
00969 PJ_END_DECL
00970
00971
00972 #endif
00973