blob: cfeefd159bcd98e9fd70e0534d0258a455f7b056 [file] [log] [blame]
James Kuszmaul82f6c042021-01-17 11:30:16 -08001/**
2 * @file re_bfcp.h Interface to Binary Floor Control Protocol (BFCP)
3 *
4 * Copyright (C) 2010 Creytiv.com
5 */
6
7
8/** BFCP Versions */
9enum {
10 BFCP_VER1 = 1,
11 BFCP_VER2 = 2,
12};
13
14/** BFCP Primitives */
15enum bfcp_prim {
16 BFCP_FLOOR_REQUEST = 1,
17 BFCP_FLOOR_RELEASE = 2,
18 BFCP_FLOOR_REQUEST_QUERY = 3,
19 BFCP_FLOOR_REQUEST_STATUS = 4,
20 BFCP_USER_QUERY = 5,
21 BFCP_USER_STATUS = 6,
22 BFCP_FLOOR_QUERY = 7,
23 BFCP_FLOOR_STATUS = 8,
24 BFCP_CHAIR_ACTION = 9,
25 BFCP_CHAIR_ACTION_ACK = 10,
26 BFCP_HELLO = 11,
27 BFCP_HELLO_ACK = 12,
28 BFCP_ERROR = 13,
29 BFCP_FLOOR_REQ_STATUS_ACK = 14,
30 BFCP_FLOOR_STATUS_ACK = 15,
31 BFCP_GOODBYE = 16,
32 BFCP_GOODBYE_ACK = 17,
33};
34
35/** BFCP Attributes */
36enum bfcp_attrib {
37 BFCP_BENEFICIARY_ID = 1,
38 BFCP_FLOOR_ID = 2,
39 BFCP_FLOOR_REQUEST_ID = 3,
40 BFCP_PRIORITY = 4,
41 BFCP_REQUEST_STATUS = 5,
42 BFCP_ERROR_CODE = 6,
43 BFCP_ERROR_INFO = 7,
44 BFCP_PART_PROV_INFO = 8,
45 BFCP_STATUS_INFO = 9,
46 BFCP_SUPPORTED_ATTRS = 10,
47 BFCP_SUPPORTED_PRIMS = 11,
48 BFCP_USER_DISP_NAME = 12,
49 BFCP_USER_URI = 13,
50 /* grouped: */
51 BFCP_BENEFICIARY_INFO = 14,
52 BFCP_FLOOR_REQ_INFO = 15,
53 BFCP_REQUESTED_BY_INFO = 16,
54 BFCP_FLOOR_REQ_STATUS = 17,
55 BFCP_OVERALL_REQ_STATUS = 18,
56
57 /** Mandatory Attribute */
58 BFCP_MANDATORY = 1<<7,
59 /** Encode Handler */
60 BFCP_ENCODE_HANDLER = 1<<8,
61};
62
63/** BFCP Request Status */
64enum bfcp_reqstat {
65 BFCP_PENDING = 1,
66 BFCP_ACCEPTED = 2,
67 BFCP_GRANTED = 3,
68 BFCP_DENIED = 4,
69 BFCP_CANCELLED = 5,
70 BFCP_RELEASED = 6,
71 BFCP_REVOKED = 7
72};
73
74/** BFCP Error Codes */
75enum bfcp_err {
76 BFCP_CONF_NOT_EXIST = 1,
77 BFCP_USER_NOT_EXIST = 2,
78 BFCP_UNKNOWN_PRIM = 3,
79 BFCP_UNKNOWN_MAND_ATTR = 4,
80 BFCP_UNAUTH_OPERATION = 5,
81 BFCP_INVALID_FLOOR_ID = 6,
82 BFCP_FLOOR_REQ_ID_NOT_EXIST = 7,
83 BFCP_MAX_FLOOR_REQ_REACHED = 8,
84 BFCP_USE_TLS = 9,
85 BFCP_PARSE_ERROR = 10,
86 BFCP_USE_DTLS = 11,
87 BFCP_UNSUPPORTED_VERSION = 12,
88 BFCP_BAD_LENGTH = 13,
89 BFCP_GENERIC_ERROR = 14,
90};
91
92/** BFCP Priority */
93enum bfcp_priority {
94 BFCP_PRIO_LOWEST = 0,
95 BFCP_PRIO_LOW = 1,
96 BFCP_PRIO_NORMAL = 2,
97 BFCP_PRIO_HIGH = 3,
98 BFCP_PRIO_HIGHEST = 4
99};
100
101/** BFCP Transport */
102enum bfcp_transp {
103 BFCP_UDP,
104 BFCP_DTLS,
105};
106
107/** BFCP Request Status */
108struct bfcp_reqstatus {
109 enum bfcp_reqstat status;
110 uint8_t qpos;
111};
112
113/** BFCP Error Code */
114struct bfcp_errcode {
115 enum bfcp_err code;
116 uint8_t *details; /* optional */
117 size_t len;
118};
119
120/** BFCP Supported Attributes */
121struct bfcp_supattr {
122 enum bfcp_attrib *attrv;
123 size_t attrc;
124};
125
126/** BFCP Supported Primitives */
127struct bfcp_supprim {
128 enum bfcp_prim *primv;
129 size_t primc;
130};
131
132/** BFCP Attribute */
133struct bfcp_attr {
134 struct le le;
135 struct list attrl;
136 enum bfcp_attrib type;
137 bool mand;
138 union bfcp_union {
139 /* generic types */
140 char *str;
141 uint16_t u16;
142
143 /* actual attributes */
144 uint16_t beneficiaryid;
145 uint16_t floorid;
146 uint16_t floorreqid;
147 enum bfcp_priority priority;
148 struct bfcp_reqstatus reqstatus;
149 struct bfcp_errcode errcode;
150 char *errinfo;
151 char *partprovinfo;
152 char *statusinfo;
153 struct bfcp_supattr supattr;
154 struct bfcp_supprim supprim;
155 char *userdname;
156 char *useruri;
157 uint16_t reqbyid;
158 } v;
159};
160
161/** BFCP unknown attributes */
162struct bfcp_unknown_attr {
163 uint8_t typev[16];
164 size_t typec;
165};
166
167/** BFCP Message */
168struct bfcp_msg {
169 struct bfcp_unknown_attr uma;
170 struct sa src;
171 uint8_t ver;
172 unsigned r:1;
173 unsigned f:1;
174 enum bfcp_prim prim;
175 uint16_t len;
176 uint32_t confid;
177 uint16_t tid;
178 uint16_t userid;
179 struct list attrl;
180};
181
182struct tls;
183struct bfcp_conn;
184
185
186/**
187 * Defines the BFCP encode handler
188 *
189 * @param mb Mbuf to encode into
190 * @param arg Handler argument
191 *
192 * @return 0 if success, otherwise errorcode
193 */
194typedef int (bfcp_encode_h)(struct mbuf *mb, void *arg);
195
196/** BFCP Encode */
197struct bfcp_encode {
198 bfcp_encode_h *ench;
199 void *arg;
200};
201
202
203/**
204 * Defines the BFCP attribute handler
205 *
206 * @param attr BFCP attribute
207 * @param arg Handler argument
208 *
209 * @return True to stop processing, false to continue
210 */
211typedef bool (bfcp_attr_h)(const struct bfcp_attr *attr, void *arg);
212
213
214/**
215 * Defines the BFCP receive handler
216 *
217 * @param msg BFCP message
218 * @param arg Handler argument
219 */
220typedef void (bfcp_recv_h)(const struct bfcp_msg *msg, void *arg);
221
222
223/**
224 * Defines the BFCP response handler
225 *
226 * @param err Error code
227 * @param msg BFCP message
228 * @param arg Handler argument
229 */
230typedef void (bfcp_resp_h)(int err, const struct bfcp_msg *msg, void *arg);
231
232
233/* attr */
234int bfcp_attrs_vencode(struct mbuf *mb, unsigned attrc, va_list *ap);
235int bfcp_attrs_encode(struct mbuf *mb, unsigned attrc, ...);
236struct bfcp_attr *bfcp_attr_subattr(const struct bfcp_attr *attr,
237 enum bfcp_attrib type);
238struct bfcp_attr *bfcp_attr_subattr_apply(const struct bfcp_attr *attr,
239 bfcp_attr_h *h, void *arg);
240int bfcp_attr_print(struct re_printf *pf, const struct bfcp_attr *attr);
241const char *bfcp_attr_name(enum bfcp_attrib type);
242const char *bfcp_reqstatus_name(enum bfcp_reqstat status);
243const char *bfcp_errcode_name(enum bfcp_err code);
244
245
246/* msg */
247int bfcp_msg_vencode(struct mbuf *mb, uint8_t ver, bool r, enum bfcp_prim prim,
248 uint32_t confid, uint16_t tid, uint16_t userid,
249 unsigned attrc, va_list *ap);
250int bfcp_msg_encode(struct mbuf *mb, uint8_t ver, bool r, enum bfcp_prim prim,
251 uint32_t confid, uint16_t tid, uint16_t userid,
252 unsigned attrc, ...);
253int bfcp_msg_decode(struct bfcp_msg **msgp, struct mbuf *mb);
254struct bfcp_attr *bfcp_msg_attr(const struct bfcp_msg *msg,
255 enum bfcp_attrib type);
256struct bfcp_attr *bfcp_msg_attr_apply(const struct bfcp_msg *msg,
257 bfcp_attr_h *h, void *arg);
258int bfcp_msg_print(struct re_printf *pf, const struct bfcp_msg *msg);
259const char *bfcp_prim_name(enum bfcp_prim prim);
260
261
262/* conn */
263int bfcp_listen(struct bfcp_conn **bcp, enum bfcp_transp tp, struct sa *laddr,
264 struct tls *tls, bfcp_recv_h *recvh, void *arg);
265void *bfcp_sock(const struct bfcp_conn *bc);
266
267
268/* request */
269int bfcp_request(struct bfcp_conn *bc, const struct sa *dst, uint8_t ver,
270 enum bfcp_prim prim, uint32_t confid, uint16_t userid,
271 bfcp_resp_h *resph, void *arg, unsigned attrc, ...);
272
273
274/* notify */
275int bfcp_notify(struct bfcp_conn *bc, const struct sa *dst, uint8_t ver,
276 enum bfcp_prim prim, uint32_t confid, uint16_t userid,
277 unsigned attrc, ...);
278
279
280/* reply */
281int bfcp_reply(struct bfcp_conn *bc, const struct bfcp_msg *req,
282 enum bfcp_prim prim, unsigned attrc, ...);
283int bfcp_edreply(struct bfcp_conn *bc, const struct bfcp_msg *req,
284 enum bfcp_err code, const uint8_t *details, size_t len);
285int bfcp_ereply(struct bfcp_conn *bc, const struct bfcp_msg *req,
286 enum bfcp_err code);