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_bfcp.h b/include/re_bfcp.h
new file mode 100644
index 0000000..cfeefd1
--- /dev/null
+++ b/include/re_bfcp.h
@@ -0,0 +1,286 @@
+/**
+ * @file re_bfcp.h Interface to Binary Floor Control Protocol (BFCP)
+ *
+ * Copyright (C) 2010 Creytiv.com
+ */
+
+
+/** BFCP Versions */
+enum {
+	BFCP_VER1 = 1,
+	BFCP_VER2 = 2,
+};
+
+/** BFCP Primitives */
+enum bfcp_prim {
+	BFCP_FLOOR_REQUEST        =  1,
+	BFCP_FLOOR_RELEASE        =  2,
+	BFCP_FLOOR_REQUEST_QUERY  =  3,
+	BFCP_FLOOR_REQUEST_STATUS =  4,
+	BFCP_USER_QUERY           =  5,
+	BFCP_USER_STATUS          =  6,
+	BFCP_FLOOR_QUERY          =  7,
+	BFCP_FLOOR_STATUS         =  8,
+	BFCP_CHAIR_ACTION         =  9,
+	BFCP_CHAIR_ACTION_ACK     = 10,
+	BFCP_HELLO                = 11,
+	BFCP_HELLO_ACK            = 12,
+	BFCP_ERROR                = 13,
+	BFCP_FLOOR_REQ_STATUS_ACK = 14,
+	BFCP_FLOOR_STATUS_ACK     = 15,
+	BFCP_GOODBYE              = 16,
+	BFCP_GOODBYE_ACK          = 17,
+};
+
+/** BFCP Attributes */
+enum bfcp_attrib {
+	BFCP_BENEFICIARY_ID     =  1,
+	BFCP_FLOOR_ID           =  2,
+	BFCP_FLOOR_REQUEST_ID   =  3,
+	BFCP_PRIORITY           =  4,
+	BFCP_REQUEST_STATUS     =  5,
+	BFCP_ERROR_CODE         =  6,
+	BFCP_ERROR_INFO         =  7,
+	BFCP_PART_PROV_INFO     =  8,
+	BFCP_STATUS_INFO        =  9,
+	BFCP_SUPPORTED_ATTRS    = 10,
+	BFCP_SUPPORTED_PRIMS    = 11,
+	BFCP_USER_DISP_NAME     = 12,
+	BFCP_USER_URI           = 13,
+	/* grouped: */
+	BFCP_BENEFICIARY_INFO   = 14,
+	BFCP_FLOOR_REQ_INFO     = 15,
+	BFCP_REQUESTED_BY_INFO  = 16,
+	BFCP_FLOOR_REQ_STATUS   = 17,
+	BFCP_OVERALL_REQ_STATUS = 18,
+
+	/** Mandatory Attribute */
+	BFCP_MANDATORY          = 1<<7,
+	/** Encode Handler */
+	BFCP_ENCODE_HANDLER     = 1<<8,
+};
+
+/** BFCP Request Status */
+enum bfcp_reqstat {
+	BFCP_PENDING   = 1,
+	BFCP_ACCEPTED  = 2,
+	BFCP_GRANTED   = 3,
+	BFCP_DENIED    = 4,
+	BFCP_CANCELLED = 5,
+	BFCP_RELEASED  = 6,
+	BFCP_REVOKED   = 7
+};
+
+/** BFCP Error Codes */
+enum bfcp_err {
+	BFCP_CONF_NOT_EXIST         = 1,
+	BFCP_USER_NOT_EXIST         = 2,
+	BFCP_UNKNOWN_PRIM           = 3,
+	BFCP_UNKNOWN_MAND_ATTR      = 4,
+	BFCP_UNAUTH_OPERATION       = 5,
+	BFCP_INVALID_FLOOR_ID       = 6,
+	BFCP_FLOOR_REQ_ID_NOT_EXIST = 7,
+	BFCP_MAX_FLOOR_REQ_REACHED  = 8,
+	BFCP_USE_TLS                = 9,
+	BFCP_PARSE_ERROR            = 10,
+	BFCP_USE_DTLS               = 11,
+	BFCP_UNSUPPORTED_VERSION    = 12,
+	BFCP_BAD_LENGTH             = 13,
+	BFCP_GENERIC_ERROR          = 14,
+};
+
+/** BFCP Priority */
+enum bfcp_priority {
+	BFCP_PRIO_LOWEST  = 0,
+	BFCP_PRIO_LOW     = 1,
+	BFCP_PRIO_NORMAL  = 2,
+	BFCP_PRIO_HIGH    = 3,
+	BFCP_PRIO_HIGHEST = 4
+};
+
+/** BFCP Transport */
+enum bfcp_transp {
+	BFCP_UDP,
+	BFCP_DTLS,
+};
+
+/** BFCP Request Status */
+struct bfcp_reqstatus {
+	enum bfcp_reqstat status;
+	uint8_t qpos;
+};
+
+/** BFCP Error Code */
+struct bfcp_errcode {
+	enum bfcp_err code;
+	uint8_t *details;  /* optional */
+	size_t len;
+};
+
+/** BFCP Supported Attributes */
+struct bfcp_supattr {
+	enum bfcp_attrib *attrv;
+	size_t attrc;
+};
+
+/** BFCP Supported Primitives */
+struct bfcp_supprim {
+	enum bfcp_prim *primv;
+	size_t primc;
+};
+
+/** BFCP Attribute */
+struct bfcp_attr {
+	struct le le;
+	struct list attrl;
+	enum bfcp_attrib type;
+	bool mand;
+	union bfcp_union {
+		/* generic types */
+		char *str;
+		uint16_t u16;
+
+		/* actual attributes */
+		uint16_t beneficiaryid;
+		uint16_t floorid;
+		uint16_t floorreqid;
+		enum bfcp_priority priority;
+		struct bfcp_reqstatus reqstatus;
+		struct bfcp_errcode errcode;
+		char *errinfo;
+		char *partprovinfo;
+		char *statusinfo;
+		struct bfcp_supattr supattr;
+		struct bfcp_supprim supprim;
+		char *userdname;
+		char *useruri;
+		uint16_t reqbyid;
+	} v;
+};
+
+/** BFCP unknown attributes */
+struct bfcp_unknown_attr {
+	uint8_t typev[16];
+	size_t typec;
+};
+
+/** BFCP Message */
+struct bfcp_msg {
+	struct bfcp_unknown_attr uma;
+	struct sa src;
+	uint8_t ver;
+	unsigned r:1;
+	unsigned f:1;
+	enum bfcp_prim prim;
+	uint16_t len;
+	uint32_t confid;
+	uint16_t tid;
+	uint16_t userid;
+	struct list attrl;
+};
+
+struct tls;
+struct bfcp_conn;
+
+
+/**
+ * Defines the BFCP encode handler
+ *
+ * @param mb  Mbuf to encode into
+ * @param arg Handler argument
+ *
+ * @return 0 if success, otherwise errorcode
+ */
+typedef int (bfcp_encode_h)(struct mbuf *mb, void *arg);
+
+/** BFCP Encode */
+struct bfcp_encode {
+	bfcp_encode_h *ench;
+	void *arg;
+};
+
+
+/**
+ * Defines the BFCP attribute handler
+ *
+ * @param attr BFCP attribute
+ * @param arg  Handler argument
+ *
+ * @return True to stop processing, false to continue
+ */
+typedef bool (bfcp_attr_h)(const struct bfcp_attr *attr, void *arg);
+
+
+/**
+ * Defines the BFCP receive handler
+ *
+ * @param msg BFCP message
+ * @param arg Handler argument
+ */
+typedef void (bfcp_recv_h)(const struct bfcp_msg *msg, void *arg);
+
+
+/**
+ * Defines the BFCP response handler
+ *
+ * @param err Error code
+ * @param msg BFCP message
+ * @param arg Handler argument
+ */
+typedef void (bfcp_resp_h)(int err, const struct bfcp_msg *msg, void *arg);
+
+
+/* attr */
+int bfcp_attrs_vencode(struct mbuf *mb, unsigned attrc, va_list *ap);
+int bfcp_attrs_encode(struct mbuf *mb, unsigned attrc, ...);
+struct bfcp_attr *bfcp_attr_subattr(const struct bfcp_attr *attr,
+				    enum bfcp_attrib type);
+struct bfcp_attr *bfcp_attr_subattr_apply(const struct bfcp_attr *attr,
+					  bfcp_attr_h *h, void *arg);
+int bfcp_attr_print(struct re_printf *pf, const struct bfcp_attr *attr);
+const char *bfcp_attr_name(enum bfcp_attrib type);
+const char *bfcp_reqstatus_name(enum bfcp_reqstat status);
+const char *bfcp_errcode_name(enum bfcp_err code);
+
+
+/* msg */
+int bfcp_msg_vencode(struct mbuf *mb, uint8_t ver, bool r, enum bfcp_prim prim,
+		     uint32_t confid, uint16_t tid, uint16_t userid,
+		     unsigned attrc, va_list *ap);
+int bfcp_msg_encode(struct mbuf *mb, uint8_t ver, bool r, enum bfcp_prim prim,
+		    uint32_t confid, uint16_t tid, uint16_t userid,
+		    unsigned attrc, ...);
+int bfcp_msg_decode(struct bfcp_msg **msgp, struct mbuf *mb);
+struct bfcp_attr *bfcp_msg_attr(const struct bfcp_msg *msg,
+				enum bfcp_attrib type);
+struct bfcp_attr *bfcp_msg_attr_apply(const struct bfcp_msg *msg,
+				      bfcp_attr_h *h, void *arg);
+int bfcp_msg_print(struct re_printf *pf, const struct bfcp_msg *msg);
+const char *bfcp_prim_name(enum bfcp_prim prim);
+
+
+/* conn */
+int bfcp_listen(struct bfcp_conn **bcp, enum bfcp_transp tp, struct sa *laddr,
+		struct tls *tls, bfcp_recv_h *recvh, void *arg);
+void *bfcp_sock(const struct bfcp_conn *bc);
+
+
+/* request */
+int bfcp_request(struct bfcp_conn *bc, const struct sa *dst, uint8_t ver,
+		 enum bfcp_prim prim, uint32_t confid, uint16_t userid,
+		 bfcp_resp_h *resph, void *arg, unsigned attrc, ...);
+
+
+/* notify */
+int bfcp_notify(struct bfcp_conn *bc, const struct sa *dst, uint8_t ver,
+		enum bfcp_prim prim, uint32_t confid, uint16_t userid,
+		unsigned attrc, ...);
+
+
+/* reply */
+int bfcp_reply(struct bfcp_conn *bc, const struct bfcp_msg *req,
+	       enum bfcp_prim prim, unsigned attrc, ...);
+int bfcp_edreply(struct bfcp_conn *bc, const struct bfcp_msg *req,
+		 enum bfcp_err code, const uint8_t *details, size_t len);
+int bfcp_ereply(struct bfcp_conn *bc, const struct bfcp_msg *req,
+		enum bfcp_err code);