| /** |
| * @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); |