Squashed 'third_party/rawrtc/rew/' content from commit 24c91fd83
Change-Id: Ica2fcc790472ecd5b195d20da982c4e84139cbdd
git-subtree-dir: third_party/rawrtc/rew
git-subtree-split: 24c91fd839b40b11f727c902fa46d20874da33fb
diff --git a/src/trice/trice.h b/src/trice/trice.h
new file mode 100644
index 0000000..eafcb2c
--- /dev/null
+++ b/src/trice/trice.h
@@ -0,0 +1,208 @@
+/**
+ * @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);