1 /** 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 */ 9 enum { 10 BFCP_VER1 = 1, 11 BFCP_VER2 = 2, 12 }; 13 14 /** BFCP Primitives */ 15 enum 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 */ 36 enum 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 */ 64 enum 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 */ 75 enum 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 */ 93 enum 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 */ 102 enum bfcp_transp { 103 BFCP_UDP, 104 BFCP_DTLS, 105 }; 106 107 /** BFCP Request Status */ 108 struct bfcp_reqstatus { 109 enum bfcp_reqstat status; 110 uint8_t qpos; 111 }; 112 113 /** BFCP Error Code */ 114 struct bfcp_errcode { 115 enum bfcp_err code; 116 uint8_t *details; /* optional */ 117 size_t len; 118 }; 119 120 /** BFCP Supported Attributes */ 121 struct bfcp_supattr { 122 enum bfcp_attrib *attrv; 123 size_t attrc; 124 }; 125 126 /** BFCP Supported Primitives */ 127 struct bfcp_supprim { 128 enum bfcp_prim *primv; 129 size_t primc; 130 }; 131 132 /** BFCP Attribute */ 133 struct 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 */ 162 struct bfcp_unknown_attr { 163 uint8_t typev[16]; 164 size_t typec; 165 }; 166 167 /** BFCP Message */ 168 struct 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 182 struct tls; 183 struct 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 */ 194 typedef int (bfcp_encode_h)(struct mbuf *mb, void *arg); 195 196 /** BFCP Encode */ 197 struct 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 */ 211 typedef 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 */ 220 typedef 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 */ 230 typedef void (bfcp_resp_h)(int err, const struct bfcp_msg *msg, void *arg); 231 232 233 /* attr */ 234 int bfcp_attrs_vencode(struct mbuf *mb, unsigned attrc, va_list *ap); 235 int bfcp_attrs_encode(struct mbuf *mb, unsigned attrc, ...); 236 struct bfcp_attr *bfcp_attr_subattr(const struct bfcp_attr *attr, 237 enum bfcp_attrib type); 238 struct bfcp_attr *bfcp_attr_subattr_apply(const struct bfcp_attr *attr, 239 bfcp_attr_h *h, void *arg); 240 int bfcp_attr_print(struct re_printf *pf, const struct bfcp_attr *attr); 241 const char *bfcp_attr_name(enum bfcp_attrib type); 242 const char *bfcp_reqstatus_name(enum bfcp_reqstat status); 243 const char *bfcp_errcode_name(enum bfcp_err code); 244 245 246 /* msg */ 247 int 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); 250 int 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, ...); 253 int bfcp_msg_decode(struct bfcp_msg **msgp, struct mbuf *mb); 254 struct bfcp_attr *bfcp_msg_attr(const struct bfcp_msg *msg, 255 enum bfcp_attrib type); 256 struct bfcp_attr *bfcp_msg_attr_apply(const struct bfcp_msg *msg, 257 bfcp_attr_h *h, void *arg); 258 int bfcp_msg_print(struct re_printf *pf, const struct bfcp_msg *msg); 259 const char *bfcp_prim_name(enum bfcp_prim prim); 260 261 262 /* conn */ 263 int bfcp_listen(struct bfcp_conn **bcp, enum bfcp_transp tp, struct sa *laddr, 264 struct tls *tls, bfcp_recv_h *recvh, void *arg); 265 void *bfcp_sock(const struct bfcp_conn *bc); 266 267 268 /* request */ 269 int 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 */ 275 int 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 */ 281 int bfcp_reply(struct bfcp_conn *bc, const struct bfcp_msg *req, 282 enum bfcp_prim prim, unsigned attrc, ...); 283 int bfcp_edreply(struct bfcp_conn *bc, const struct bfcp_msg *req, 284 enum bfcp_err code, const uint8_t *details, size_t len); 285 int bfcp_ereply(struct bfcp_conn *bc, const struct bfcp_msg *req, 286 enum bfcp_err code); 287