Squashed 'third_party/rawrtc/re/' content from commit f3163ce8b

Change-Id: I6a235e6ac0f03269d951026f9d195da05c40fdab
git-subtree-dir: third_party/rawrtc/re
git-subtree-split: f3163ce8b526a13b35ef71ce4dd6f43585064d8a
diff --git a/include/re_sip.h b/include/re_sip.h
new file mode 100644
index 0000000..9a2af7a
--- /dev/null
+++ b/include/re_sip.h
@@ -0,0 +1,370 @@
+/**
+ * @file re_sip.h  Session Initiation Protocol
+ *
+ * Copyright (C) 2010 Creytiv.com
+ */
+
+
+enum {
+	SIP_PORT     = 5060,
+	SIP_PORT_TLS = 5061,
+};
+
+/** SIP Transport */
+enum sip_transp {
+	SIP_TRANSP_NONE = -1,
+	SIP_TRANSP_UDP = 0,
+	SIP_TRANSP_TCP,
+	SIP_TRANSP_TLS,
+	SIP_TRANSPC,
+};
+
+
+/** SIP Header ID (perfect hash value) */
+enum sip_hdrid {
+	SIP_HDR_ACCEPT                        = 3186,
+	SIP_HDR_ACCEPT_CONTACT                =  232,
+	SIP_HDR_ACCEPT_ENCODING               =  708,
+	SIP_HDR_ACCEPT_LANGUAGE               = 2867,
+	SIP_HDR_ACCEPT_RESOURCE_PRIORITY      = 1848,
+	SIP_HDR_ALERT_INFO                    =  274,
+	SIP_HDR_ALLOW                         = 2429,
+	SIP_HDR_ALLOW_EVENTS                  =   66,
+	SIP_HDR_ANSWER_MODE                   = 2905,
+	SIP_HDR_AUTHENTICATION_INFO           = 3144,
+	SIP_HDR_AUTHORIZATION                 = 2503,
+	SIP_HDR_CALL_ID                       = 3095,
+	SIP_HDR_CALL_INFO                     =  586,
+	SIP_HDR_CONTACT                       =  229,
+	SIP_HDR_CONTENT_DISPOSITION           = 1425,
+	SIP_HDR_CONTENT_ENCODING              =  580,
+	SIP_HDR_CONTENT_LANGUAGE              = 3371,
+	SIP_HDR_CONTENT_LENGTH                = 3861,
+	SIP_HDR_CONTENT_TYPE                  =  809,
+	SIP_HDR_CSEQ                          =  746,
+	SIP_HDR_DATE                          = 1027,
+	SIP_HDR_ENCRYPTION                    = 3125,
+	SIP_HDR_ERROR_INFO                    =   21,
+	SIP_HDR_EVENT                         = 3286,
+	SIP_HDR_EXPIRES                       = 1983,
+	SIP_HDR_FLOW_TIMER                    =  584,
+	SIP_HDR_FROM                          = 1963,
+	SIP_HDR_HIDE                          =  283,
+	SIP_HDR_HISTORY_INFO                  = 2582,
+	SIP_HDR_IDENTITY                      = 2362,
+	SIP_HDR_IDENTITY_INFO                 =  980,
+	SIP_HDR_IN_REPLY_TO                   = 1577,
+	SIP_HDR_JOIN                          = 3479,
+	SIP_HDR_MAX_BREADTH                   = 3701,
+	SIP_HDR_MAX_FORWARDS                  = 3549,
+	SIP_HDR_MIME_VERSION                  = 3659,
+	SIP_HDR_MIN_EXPIRES                   = 1121,
+	SIP_HDR_MIN_SE                        = 2847,
+	SIP_HDR_ORGANIZATION                  = 3247,
+	SIP_HDR_P_ACCESS_NETWORK_INFO         = 1662,
+	SIP_HDR_P_ANSWER_STATE                =   42,
+	SIP_HDR_P_ASSERTED_IDENTITY           = 1233,
+	SIP_HDR_P_ASSOCIATED_URI              =  900,
+	SIP_HDR_P_CALLED_PARTY_ID             = 3347,
+	SIP_HDR_P_CHARGING_FUNCTION_ADDRESSES = 2171,
+	SIP_HDR_P_CHARGING_VECTOR             =   25,
+	SIP_HDR_P_DCS_TRACE_PARTY_ID          = 3027,
+	SIP_HDR_P_DCS_OSPS                    = 1788,
+	SIP_HDR_P_DCS_BILLING_INFO            = 2017,
+	SIP_HDR_P_DCS_LAES                    =  693,
+	SIP_HDR_P_DCS_REDIRECT                = 1872,
+	SIP_HDR_P_EARLY_MEDIA                 = 2622,
+	SIP_HDR_P_MEDIA_AUTHORIZATION         = 1035,
+	SIP_HDR_P_PREFERRED_IDENTITY          = 1263,
+	SIP_HDR_P_PROFILE_KEY                 = 1904,
+	SIP_HDR_P_REFUSED_URI_LIST            = 1047,
+	SIP_HDR_P_SERVED_USER                 = 1588,
+	SIP_HDR_P_USER_DATABASE               = 2827,
+	SIP_HDR_P_VISITED_NETWORK_ID          = 3867,
+	SIP_HDR_PATH                          = 2741,
+	SIP_HDR_PERMISSION_MISSING            = 1409,
+	SIP_HDR_PRIORITY                      = 3520,
+	SIP_HDR_PRIV_ANSWER_MODE              = 2476,
+	SIP_HDR_PRIVACY                       = 3150,
+	SIP_HDR_PROXY_AUTHENTICATE            =  116,
+	SIP_HDR_PROXY_AUTHORIZATION           = 2363,
+	SIP_HDR_PROXY_REQUIRE                 = 3562,
+	SIP_HDR_RACK                          = 2523,
+	SIP_HDR_REASON                        = 3732,
+	SIP_HDR_RECORD_ROUTE                  =  278,
+	SIP_HDR_REFER_SUB                     = 2458,
+	SIP_HDR_REFER_TO                      = 1521,
+	SIP_HDR_REFERRED_BY                   = 3456,
+	SIP_HDR_REJECT_CONTACT                =  285,
+	SIP_HDR_REPLACES                      = 2534,
+	SIP_HDR_REPLY_TO                      = 2404,
+	SIP_HDR_REQUEST_DISPOSITION           = 3715,
+	SIP_HDR_REQUIRE                       = 3905,
+	SIP_HDR_RESOURCE_PRIORITY             = 1643,
+	SIP_HDR_RESPONSE_KEY                  = 1548,
+	SIP_HDR_RETRY_AFTER                   =  409,
+	SIP_HDR_ROUTE                         =  661,
+	SIP_HDR_RSEQ                          =  445,
+	SIP_HDR_SECURITY_CLIENT               = 1358,
+	SIP_HDR_SECURITY_SERVER               =  811,
+	SIP_HDR_SECURITY_VERIFY               =  519,
+	SIP_HDR_SERVER                        =  973,
+	SIP_HDR_SERVICE_ROUTE                 = 1655,
+	SIP_HDR_SESSION_EXPIRES               = 1979,
+	SIP_HDR_SIP_ETAG                      = 1997,
+	SIP_HDR_SIP_IF_MATCH                  = 3056,
+	SIP_HDR_SUBJECT                       = 1043,
+	SIP_HDR_SUBSCRIPTION_STATE            = 2884,
+	SIP_HDR_SUPPORTED                     =  119,
+	SIP_HDR_TARGET_DIALOG                 = 3450,
+	SIP_HDR_TIMESTAMP                     =  938,
+	SIP_HDR_TO                            = 1449,
+	SIP_HDR_TRIGGER_CONSENT               = 3180,
+	SIP_HDR_UNSUPPORTED                   =  982,
+	SIP_HDR_USER_AGENT                    = 4064,
+	SIP_HDR_VIA                           = 3961,
+	SIP_HDR_WARNING                       = 2108,
+	SIP_HDR_WWW_AUTHENTICATE              = 2763,
+
+	SIP_HDR_NONE = -1
+};
+
+
+enum {
+	SIP_T1 =  500,
+	SIP_T2 = 4000,
+	SIP_T4 = 5000,
+};
+
+
+/** SIP Via header */
+struct sip_via {
+	struct pl sentby;
+	struct sa addr;
+	struct pl params;
+	struct pl branch;
+	struct pl val;
+	enum sip_transp tp;
+};
+
+/** SIP Address */
+struct sip_addr {
+	struct pl dname;
+	struct pl auri;
+	struct uri uri;
+	struct pl params;
+};
+
+/** SIP Tag address */
+struct sip_taddr {
+	struct pl dname;
+	struct pl auri;
+	struct uri uri;
+	struct pl params;
+	struct pl tag;
+	struct pl val;
+};
+
+/** SIP CSeq header */
+struct sip_cseq {
+	struct pl met;
+	uint32_t num;
+};
+
+/** SIP Header */
+struct sip_hdr {
+	struct le le;          /**< Linked-list element    */
+	struct le he;          /**< Hash-table element     */
+	struct pl name;        /**< SIP Header name        */
+	struct pl val;         /**< SIP Header value       */
+	enum sip_hdrid id;     /**< SIP Header id (unique) */
+};
+
+/** SIP Message */
+struct sip_msg {
+	struct sa src;         /**< Source network address               */
+	struct sa dst;         /**< Destination network address          */
+	struct pl ver;         /**< SIP Version number                   */
+	struct pl met;         /**< Request method                       */
+	struct pl ruri;        /**< Raw request URI                      */
+	struct uri uri;        /**< Parsed request URI                   */
+	uint16_t scode;        /**< Response status code                 */
+	struct pl reason;      /**< Response reason phrase               */
+	struct list hdrl;      /**< List of SIP Headers (struct sip_hdr) */
+	struct sip_via via;    /**< Parsed first Via header              */
+	struct sip_taddr to;   /**< Parsed To header                     */
+	struct sip_taddr from; /**< Parsed From header                   */
+	struct sip_cseq cseq;  /**< Parsed CSeq header                   */
+	struct msg_ctype ctyp; /**< Content Type                         */
+	struct pl callid;      /**< Cached Call-ID header                */
+	struct pl maxfwd;      /**< Cached Max-Forwards header           */
+	struct pl expires;     /**< Cached Expires header                */
+	struct pl clen;        /**< Cached Content-Length header         */
+	struct hash *hdrht;    /**< Hash-table with all SIP headers      */
+	struct mbuf *mb;       /**< Buffer containing the SIP message    */
+	void *sock;            /**< Transport socket                     */
+	uint64_t tag;          /**< Opaque tag                           */
+	enum sip_transp tp;    /**< SIP Transport                        */
+	bool req;              /**< True if Request, False if Response  */
+};
+
+/** SIP Loop-state */
+struct sip_loopstate {
+	uint32_t failc;
+	uint16_t last_scode;
+};
+
+/** SIP Contact */
+struct sip_contact {
+	const char *uri;
+	const struct sa *addr;
+	enum sip_transp tp;
+};
+
+struct sip;
+struct sip_lsnr;
+struct sip_request;
+struct sip_strans;
+struct sip_auth;
+struct sip_dialog;
+struct sip_keepalive;
+struct dnsc;
+
+typedef bool(sip_msg_h)(const struct sip_msg *msg, void *arg);
+typedef int(sip_send_h)(enum sip_transp tp, const struct sa *src,
+			const struct sa *dst, struct mbuf *mb, void *arg);
+typedef void(sip_resp_h)(int err, const struct sip_msg *msg, void *arg);
+typedef void(sip_cancel_h)(void *arg);
+typedef void(sip_exit_h)(void *arg);
+typedef int(sip_auth_h)(char **username, char **password, const char *realm,
+			void *arg);
+typedef bool(sip_hdr_h)(const struct sip_hdr *hdr, const struct sip_msg *msg,
+			void *arg);
+typedef void(sip_keepalive_h)(int err, void *arg);
+
+
+/* sip */
+int  sip_alloc(struct sip **sipp, struct dnsc *dnsc, uint32_t ctsz,
+	       uint32_t stsz, uint32_t tcsz, const char *software,
+	       sip_exit_h *exith, void *arg);
+void sip_close(struct sip *sip, bool force);
+int  sip_listen(struct sip_lsnr **lsnrp, struct sip *sip, bool req,
+		sip_msg_h *msgh, void *arg);
+int  sip_debug(struct re_printf *pf, const struct sip *sip);
+int  sip_send(struct sip *sip, void *sock, enum sip_transp tp,
+	      const struct sa *dst, struct mbuf *mb);
+
+
+/* transport */
+int  sip_transp_add(struct sip *sip, enum sip_transp tp,
+		    const struct sa *laddr, ...);
+void sip_transp_flush(struct sip *sip);
+bool sip_transp_isladdr(const struct sip *sip, enum sip_transp tp,
+			const struct sa *laddr);
+const char *sip_transp_name(enum sip_transp tp);
+const char *sip_transp_param(enum sip_transp tp);
+uint16_t sip_transp_port(enum sip_transp tp, uint16_t port);
+int  sip_transp_laddr(struct sip *sip, struct sa *laddr, enum sip_transp tp,
+		      const struct sa *dst);
+
+
+/* request */
+int sip_request(struct sip_request **reqp, struct sip *sip, bool stateful,
+		const char *met, int metl, const char *uri, int uril,
+		const struct uri *route, struct mbuf *mb, size_t sortkey,
+		sip_send_h *sendh, sip_resp_h *resph, void *arg);
+int sip_requestf(struct sip_request **reqp, struct sip *sip, bool stateful,
+		 const char *met, const char *uri, const struct uri *route,
+		 struct sip_auth *auth, sip_send_h *sendh, sip_resp_h *resph,
+		 void *arg, const char *fmt, ...);
+int sip_drequestf(struct sip_request **reqp, struct sip *sip, bool stateful,
+		  const char *met, struct sip_dialog *dlg, uint32_t cseq,
+		  struct sip_auth *auth, sip_send_h *sendh, sip_resp_h *resph,
+		  void *arg, const char *fmt, ...);
+void sip_request_cancel(struct sip_request *req);
+bool sip_request_loops(struct sip_loopstate *ls, uint16_t scode);
+void sip_loopstate_reset(struct sip_loopstate *ls);
+
+
+/* reply */
+int  sip_strans_alloc(struct sip_strans **stp, struct sip *sip,
+		      const struct sip_msg *msg, sip_cancel_h *cancelh,
+		      void *arg);
+int  sip_strans_reply(struct sip_strans **stp, struct sip *sip,
+		      const struct sip_msg *msg, const struct sa *dst,
+		      uint16_t scode, struct mbuf *mb);
+int  sip_treplyf(struct sip_strans **stp, struct mbuf **mbp, struct sip *sip,
+		 const struct sip_msg *msg, bool rec_route, uint16_t scode,
+		 const char *reason, const char *fmt, ...);
+int  sip_treply(struct sip_strans **stp, struct sip *sip,
+		const struct sip_msg *msg, uint16_t scode, const char *reason);
+int  sip_replyf(struct sip *sip, const struct sip_msg *msg, uint16_t scode,
+		const char *reason, const char *fmt, ...);
+int  sip_reply(struct sip *sip, const struct sip_msg *msg, uint16_t scode,
+	       const char *reason);
+void sip_reply_addr(struct sa *addr, const struct sip_msg *msg, bool rport);
+
+
+/* auth */
+int  sip_auth_authenticate(struct sip_auth *auth, const struct sip_msg *msg);
+int  sip_auth_alloc(struct sip_auth **authp, sip_auth_h *authh,
+		    void *arg, bool ref);
+void sip_auth_reset(struct sip_auth *auth);
+
+
+/* contact */
+void sip_contact_set(struct sip_contact *contact, const char *uri,
+		     const struct sa *addr, enum sip_transp tp);
+int  sip_contact_print(struct re_printf *pf,
+		       const struct sip_contact *contact);
+
+
+/* dialog */
+int  sip_dialog_alloc(struct sip_dialog **dlgp,
+		      const char *uri, const char *to_uri,
+		      const char *from_name, const char *from_uri,
+		      const char *routev[], uint32_t routec);
+int  sip_dialog_accept(struct sip_dialog **dlgp, const struct sip_msg *msg);
+int  sip_dialog_create(struct sip_dialog *dlg, const struct sip_msg *msg);
+int  sip_dialog_fork(struct sip_dialog **dlgp, struct sip_dialog *odlg,
+		     const struct sip_msg *msg);
+int  sip_dialog_update(struct sip_dialog *dlg, const struct sip_msg *msg);
+bool sip_dialog_rseq_valid(struct sip_dialog *dlg, const struct sip_msg *msg);
+const char *sip_dialog_callid(const struct sip_dialog *dlg);
+uint32_t sip_dialog_lseq(const struct sip_dialog *dlg);
+bool sip_dialog_established(const struct sip_dialog *dlg);
+bool sip_dialog_cmp(const struct sip_dialog *dlg, const struct sip_msg *msg);
+bool sip_dialog_cmp_half(const struct sip_dialog *dlg,
+			 const struct sip_msg *msg);
+
+
+/* msg */
+int sip_msg_decode(struct sip_msg **msgp, struct mbuf *mb);
+const struct sip_hdr *sip_msg_hdr(const struct sip_msg *msg,
+				  enum sip_hdrid id);
+const struct sip_hdr *sip_msg_hdr_apply(const struct sip_msg *msg,
+					bool fwd, enum sip_hdrid id,
+					sip_hdr_h *h, void *arg);
+const struct sip_hdr *sip_msg_xhdr(const struct sip_msg *msg,
+				   const char *name);
+const struct sip_hdr *sip_msg_xhdr_apply(const struct sip_msg *msg,
+					 bool fwd, const char *name,
+					 sip_hdr_h *h, void *arg);
+uint32_t sip_msg_hdr_count(const struct sip_msg *msg, enum sip_hdrid id);
+uint32_t sip_msg_xhdr_count(const struct sip_msg *msg, const char *name);
+bool sip_msg_hdr_has_value(const struct sip_msg *msg, enum sip_hdrid id,
+			   const char *value);
+bool sip_msg_xhdr_has_value(const struct sip_msg *msg, const char *name,
+			    const char *value);
+struct tcp_conn *sip_msg_tcpconn(const struct sip_msg *msg);
+void sip_msg_dump(const struct sip_msg *msg);
+
+int sip_addr_decode(struct sip_addr *addr, const struct pl *pl);
+int sip_via_decode(struct sip_via *via, const struct pl *pl);
+int sip_cseq_decode(struct sip_cseq *cseq, const struct pl *pl);
+
+
+/* keepalive */
+int sip_keepalive_start(struct sip_keepalive **kap, struct sip *sip,
+			const struct sip_msg *msg, uint32_t interval,
+			sip_keepalive_h *kah, void *arg);