blob: eafcb2c49f3c4beeb9a8f882f5895dd0a5b830c5 [file] [log] [blame]
/**
* @file ice.h Internal Interface to ICE
*
* Copyright (C) 2010 Creytiv.com
*/
struct ice_tcpconn;
struct ice_conncheck;
/**
* Active Checklist. Only used by Full-ICE and Trickle-ICE
*/
struct ice_checklist {
struct trice *icem; /* parent */
struct tmr tmr_pace; /**< Timer for pacing STUN requests */
uint32_t interval; /**< Interval in [ms] */
struct stun *stun; /**< STUN Transport */
struct list conncheckl;
bool is_running; /**< Checklist is running */
/* callback handlers */
trice_estab_h *estabh;
trice_failed_h *failh;
void *arg;
};
/**
* Defines an ICE media-stream
*
* NOTE: We try to follow the Resource Acquisition Is Initialization (RAII)
* programming idiom, which means:
*
* - at any time is the number of local/remote candidates correct
* - at any time is the checklist up to date (matching local/remote candidates)
*
*/
struct trice {
struct trice_conf conf;
enum ice_role lrole; /**< Local role */
uint64_t tiebrk; /**< Tie-break value for roleconflict */
/* stun/authentication */
char *lufrag; /**< Local Username fragment */
char *lpwd; /**< Local Password */
char *rufrag; /**< Remote Username fragment */
char *rpwd; /**< Remote Password */
struct list lcandl; /**< local candidates (add order) */
struct list rcandl; /**< remote candidates (add order) */
struct list checkl; /**< Check List of cand pairs (sorted) */
struct list validl; /**< Valid List of cand pairs (sorted) */
struct list reqbufl; /**< buffered incoming requests */
struct ice_checklist *checklist;
struct list connl; /**< TCP-connections for all components */
char *sw;
/* Port range */
struct {
uint16_t min;
uint16_t max;
} ports;
};
/**
* Holds an unhandled STUN request message that will be handled once
* the role has been determined.
*/
struct trice_reqbuf {
struct le le; /**< list element */
struct ice_lcand *lcand; /**< corresponding local candidate */
void *sock; /**< request's socket */
struct sa src; /**< source address */
struct stun_msg *req; /**< buffered STUN request */
size_t presz; /**< number of bytes in preamble */
};
/* return TRUE if handled */
typedef bool (tcpconn_frame_h)(struct trice *icem,
struct tcp_conn *tc, struct sa *src,
struct mbuf *mb, void *arg);
/**
* Defines a TCP-connection from local-adress to remote-address
*
* - one TCP-connection can be shared by multiple candidate pairs
*
* - one TCP-connection is always created by the Local Candidate
*/
struct ice_tcpconn {
struct trice *icem; /* parent */
struct le le;
struct tcp_conn *tc;
struct shim *shim;
struct sa laddr;
struct sa paddr;
unsigned compid;
int layer;
bool active;
bool estab;
tcpconn_frame_h *frameh;
void *arg;
};
struct ice_conncheck {
struct le le;
struct ice_candpair *pair; /* pointer */
struct stun_ctrans *ct_conn;
struct trice *icem; /* owner */
bool use_cand;
bool term;
};
/* cand */
int trice_add_lcandidate(struct ice_lcand **candp,
struct trice *icem, struct list *lst,
unsigned compid, char *foundation, int proto,
uint32_t prio, const struct sa *addr,
const struct sa *base_addr,
enum ice_cand_type type,
const struct sa *rel_addr,
enum ice_tcptype tcptype);
int trice_lcands_debug(struct re_printf *pf, const struct list *lst);
int trice_rcands_debug(struct re_printf *pf, const struct list *lst);
/* candpair */
int trice_candpair_alloc(struct ice_candpair **cpp, struct trice *icem,
struct ice_lcand *lcand, struct ice_rcand *rcand);
void trice_candpair_prio_order(struct list *lst, bool controlling);
void trice_candpair_make_valid(struct trice *icem, struct ice_candpair *pair);
void trice_candpair_failed(struct ice_candpair *cp, int err, uint16_t scode);
void trice_candpair_set_state(struct ice_candpair *cp,
enum ice_candpair_state state);
bool trice_candpair_iscompleted(const struct ice_candpair *cp);
bool trice_candpair_cmp_fnd(const struct ice_candpair *cp1,
const struct ice_candpair *cp2);
struct ice_candpair *trice_candpair_find(const struct list *lst,
const struct ice_lcand *lcand,
const struct ice_rcand *rcand);
int trice_candpair_with_local(struct trice *icem, struct ice_lcand *lcand);
int trice_candpair_with_remote(struct trice *icem, struct ice_rcand *rcand);
const char *trice_candpair_state2name(enum ice_candpair_state st);
/* STUN server */
int trice_stund_recv(struct trice *icem, struct ice_lcand *lcand,
void *sock, const struct sa *src,
struct stun_msg *req, size_t presz);
int trice_stund_recv_role_set(struct trice *icem, struct ice_lcand *lcand,
void *sock, const struct sa *src,
struct stun_msg *req, size_t presz);
/* ICE media */
void trice_switch_local_role(struct trice *ice);
void trice_printf(struct trice *icem, const char *fmt, ...);
void trice_tracef(struct trice *icem, int color, const char *fmt, ...);
/* ICE checklist */
int trice_checklist_debug(struct re_printf *pf,
const struct ice_checklist *ic);
void trice_conncheck_schedule_check(struct trice *icem);
int trice_checklist_update(struct trice *icem);
void trice_checklist_refresh(struct trice *icem);
/* ICE conncheck */
int trice_conncheck_stun_request(struct ice_checklist *ic,
struct ice_conncheck *cc,
struct ice_candpair *cp, void *sock,
bool cc_use_cand);
int trice_conncheck_trigged(struct trice *icem, struct ice_candpair *pair,
void *sock, bool use_cand);
int trice_conncheck_debug(struct re_printf *pf,
const struct ice_conncheck *cc);
/* TCP connections */
int trice_conn_alloc(struct list *connl, struct trice *icem, unsigned compid,
bool active, const struct sa *laddr, const struct sa *peer,
struct tcp_sock *ts, int layer,
tcpconn_frame_h *frameh, void *arg);
struct ice_tcpconn *trice_conn_find(struct list *connl, unsigned compid,
const struct sa *laddr,
const struct sa *peer);
int trice_conn_debug(struct re_printf *pf, const struct ice_tcpconn *conn);
bool trice_stun_process(struct trice *icem, struct ice_lcand *lcand,
int proto, void *sock, const struct sa *src,
struct mbuf *mb);
int trice_reqbuf_append(struct trice *icem, struct ice_lcand *lcand,
void *sock, const struct sa *src,
struct stun_msg *req, size_t presz);