1 /****************************************************************************** 2 * 3 * Copyright (C) 2010-2013 Broadcom Corporation 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 20 /****************************************************************************** 21 * 22 * This file contains definitions for some utility functions to help parse 23 * and build NFC Data Exchange Format (NDEF) messages 24 * 25 ******************************************************************************/ 26 27 #ifndef NDEF_UTILS_H 28 #define NDEF_UTILS_H 29 30 #include "bt_types.h" 31 32 #define NDEF_MB_MASK 0x80 /* Message Begin */ 33 #define NDEF_ME_MASK 0x40 /* Message End */ 34 #define NDEF_CF_MASK 0x20 /* Chunk Flag */ 35 #define NDEF_SR_MASK 0x10 /* Short Record */ 36 #define NDEF_IL_MASK 0x08 /* ID Length */ 37 #define NDEF_TNF_MASK 0x07 /* Type Name Format */ 38 39 /* NDEF Type Name Format */ 40 #define NDEF_TNF_EMPTY 0 /* Empty (type/id/payload len =0) */ 41 #define NDEF_TNF_WKT 1 /* NFC Forum well-known type/RTD */ 42 #define NDEF_TNF_MEDIA 2 /* Media-type as defined in RFC 2046 */ 43 #define NDEF_TNF_URI 3 /* Absolute URI as defined in RFC 3986 */ 44 #define NDEF_TNF_EXT 4 /* NFC Forum external type/RTD */ 45 #define NDEF_TNF_UNKNOWN 5 /* Unknown (type len =0) */ 46 #define NDEF_TNF_UNCHANGED 6 /* Unchanged (type len =0) */ 47 #define NDEF_TNF_RESERVED 7 /* Reserved */ 48 49 /* Define the status code returned from the Validate, Parse or Build functions 50 */ 51 enum 52 { 53 NDEF_OK, /* 0 - OK */ 54 55 NDEF_REC_NOT_FOUND, /* 1 - No record matching the find criteria */ 56 NDEF_MSG_TOO_SHORT, /* 2 - Message was too short (< 3 bytes) */ 57 NDEF_MSG_NO_MSG_BEGIN, /* 3 - No 'begin' flag at start of message */ 58 NDEF_MSG_NO_MSG_END, /* 4 - No 'end' flag at end of message */ 59 NDEF_MSG_EXTRA_MSG_BEGIN, /* 5 - 'begin' flag after start of message */ 60 NDEF_MSG_UNEXPECTED_CHUNK, /* 6 - Unexpected chunk found */ 61 NDEF_MSG_INVALID_EMPTY_REC, /* 7 - Empty record with non-zero contents */ 62 NDEF_MSG_INVALID_CHUNK, /* 8 - Invalid chunk found */ 63 NDEF_MSG_LENGTH_MISMATCH, /* 9 - Overall message length doesn't match */ 64 NDEF_MSG_INSUFFICIENT_MEM /* 10 - Insuffiecient memory to add record */ 65 }; 66 typedef UINT8 tNDEF_STATUS; 67 68 69 #define HR_REC_TYPE_LEN 2 /* Handover Request Record Type */ 70 #define HS_REC_TYPE_LEN 2 /* Handover Select Record Type */ 71 #define HC_REC_TYPE_LEN 2 /* Handover Carrier recrod Type */ 72 #define CR_REC_TYPE_LEN 2 /* Collision Resolution Record Type */ 73 #define AC_REC_TYPE_LEN 2 /* Alternative Carrier Record Type */ 74 #define ERR_REC_TYPE_LEN 3 /* Error Record Type */ 75 #define BT_OOB_REC_TYPE_LEN 32 /* Bluetooth OOB Data Type */ 76 #define WIFI_WSC_REC_TYPE_LEN 23 /* Wifi WSC Data Type */ 77 78 79 #ifdef __cplusplus 80 extern "C" { 81 #endif 82 83 /* Define prefix for exporting APIs from libraries */ 84 #ifdef NFC_DLL 85 #define EXPORT_NDEF_API __declspec(dllexport) /* Windows DLL export prefix */ 86 #else 87 #define EXPORT_NDEF_API 88 #endif 89 90 /* Functions to parse a received NDEF Message 91 */ 92 /******************************************************************************* 93 ** 94 ** Function NDEF_MsgValidate 95 ** 96 ** Description This function validates an NDEF message. 97 ** 98 ** Returns TRUE if all OK, or FALSE if the message is invalid. 99 ** 100 *******************************************************************************/ 101 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgValidate (UINT8 *p_msg, UINT32 msg_len, BOOLEAN b_allow_chunks); 102 103 /******************************************************************************* 104 ** 105 ** Function NDEF_MsgGetNumRecs 106 ** 107 ** Description This function gets the number of records in the given NDEF 108 ** message. 109 ** 110 ** Returns The record count, or 0 if the message is invalid. 111 ** 112 *******************************************************************************/ 113 EXPORT_NDEF_API extern INT32 NDEF_MsgGetNumRecs (UINT8 *p_msg); 114 115 /******************************************************************************* 116 ** 117 ** Function NDEF_MsgGetRecLength 118 ** 119 ** Description This function returns length of the current record in the given 120 ** NDEF message. 121 ** 122 ** Returns Length of record 123 ** 124 *******************************************************************************/ 125 EXPORT_NDEF_API extern UINT32 NDEF_MsgGetRecLength (UINT8 *p_cur_rec); 126 127 /******************************************************************************* 128 ** 129 ** Function NDEF_MsgGetNextRec 130 ** 131 ** Description This function gets a pointer to the next record after the 132 ** current one. 133 ** 134 ** Returns Pointer to the start of the record, or NULL if no more 135 ** 136 *******************************************************************************/ 137 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetNextRec (UINT8 *p_cur_rec); 138 139 /******************************************************************************* 140 ** 141 ** Function NDEF_MsgGetRecByIndex 142 ** 143 ** Description This function gets a pointer to the record with the given 144 ** index (0-based index) in the given NDEF message. 145 ** 146 ** Returns Pointer to the start of the record, or NULL 147 ** 148 *******************************************************************************/ 149 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetRecByIndex (UINT8 *p_msg, INT32 index); 150 151 /******************************************************************************* 152 ** 153 ** Function NDEF_MsgGetLastRecInMsg 154 ** 155 ** Description This function gets a pointer to the last record in the 156 ** given NDEF message. 157 ** 158 ** Returns Pointer to the start of the last record, or NULL if some problem 159 ** 160 *******************************************************************************/ 161 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetLastRecInMsg (UINT8 *p_msg); 162 163 /******************************************************************************* 164 ** 165 ** Function NDEF_MsgGetFirstRecByType 166 ** 167 ** Description This function gets a pointer to the first record with the given 168 ** record type in the given NDEF message. 169 ** 170 ** Returns Pointer to the start of the record, or NULL 171 ** 172 *******************************************************************************/ 173 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetFirstRecByType (UINT8 *p_msg, UINT8 tnf, UINT8 *p_type, UINT8 tlen); 174 175 /******************************************************************************* 176 ** 177 ** Function NDEF_MsgGetNextRecByType 178 ** 179 ** Description This function gets a pointer to the next record with the given 180 ** record type in the given NDEF message. 181 ** 182 ** Returns Pointer to the start of the record, or NULL 183 ** 184 *******************************************************************************/ 185 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetNextRecByType (UINT8 *p_cur_rec, UINT8 tnf, UINT8 *p_type, UINT8 tlen); 186 187 /******************************************************************************* 188 ** 189 ** Function NDEF_MsgGetFirstRecById 190 ** 191 ** Description This function gets a pointer to the first record with the given 192 ** record id in the given NDEF message. 193 ** 194 ** Returns Pointer to the start of the record, or NULL 195 ** 196 *******************************************************************************/ 197 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetFirstRecById (UINT8 *p_msg, UINT8 *p_id, UINT8 ilen); 198 199 /******************************************************************************* 200 ** 201 ** Function NDEF_MsgGetNextRecById 202 ** 203 ** Description This function gets a pointer to the next record with the given 204 ** record id in the given NDEF message. 205 ** 206 ** Returns Pointer to the start of the record, or NULL 207 ** 208 *******************************************************************************/ 209 EXPORT_NDEF_API extern UINT8 *NDEF_MsgGetNextRecById (UINT8 *p_cur_rec, UINT8 *p_id, UINT8 ilen); 210 211 /******************************************************************************* 212 ** 213 ** Function NDEF_RecGetType 214 ** 215 ** Description This function gets a pointer to the record type for the given NDEF record. 216 ** 217 ** Returns Pointer to Type (NULL if none). TNF and len are filled in. 218 ** 219 *******************************************************************************/ 220 EXPORT_NDEF_API extern UINT8 *NDEF_RecGetType (UINT8 *p_rec, UINT8 *p_tnf, UINT8 *p_type_len); 221 222 /******************************************************************************* 223 ** 224 ** Function NDEF_RecGetId 225 ** 226 ** Description This function gets a pointer to the record id for the given NDEF record. 227 ** 228 ** Returns Pointer to Id (NULL if none). ID Len is filled in. 229 ** 230 *******************************************************************************/ 231 EXPORT_NDEF_API extern UINT8 *NDEF_RecGetId (UINT8 *p_rec, UINT8 *p_id_len); 232 233 /******************************************************************************* 234 ** 235 ** Function NDEF_RecGetPayload 236 ** 237 ** Description This function gets a pointer to the payload for the given NDEF record. 238 ** 239 ** Returns a pointer to the payload (NULL if none). Payload len filled in. 240 ** 241 *******************************************************************************/ 242 EXPORT_NDEF_API extern UINT8 *NDEF_RecGetPayload (UINT8 *p_rec, UINT32 *p_payload_len); 243 244 245 /* Functions to build an NDEF Message 246 */ 247 /******************************************************************************* 248 ** 249 ** Function NDEF_MsgInit 250 ** 251 ** Description This function initializes an NDEF message. 252 ** 253 ** Returns void 254 ** *p_cur_size is initialized to 0 255 ** 256 *******************************************************************************/ 257 EXPORT_NDEF_API extern void NDEF_MsgInit (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size); 258 259 /******************************************************************************* 260 ** 261 ** Function NDEF_MsgAddRec 262 ** 263 ** Description This function adds an NDEF record to the end of an NDEF message. 264 ** 265 ** Returns OK, or error if the record did not fit 266 ** *p_cur_size is updated 267 ** 268 *******************************************************************************/ 269 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAddRec (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 270 UINT8 tnf, UINT8 *p_type, UINT8 type_len, 271 UINT8 *p_id, UINT8 id_len, 272 UINT8 *p_payload, UINT32 payload_len); 273 274 /******************************************************************************* 275 ** 276 ** Function NDEF_MsgInsertRec 277 ** 278 ** Description This function inserts a record at a specific index into the 279 ** given NDEF message 280 ** 281 ** Returns OK, or error if the record did not fit 282 ** *p_cur_size is updated 283 ** 284 *******************************************************************************/ 285 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgInsertRec (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, INT32 index, 286 UINT8 tnf, UINT8 *p_type, UINT8 type_len, 287 UINT8 *p_id, UINT8 id_len, 288 UINT8 *p_payload, UINT32 payload_len); 289 290 /******************************************************************************* 291 ** 292 ** Function NDEF_MsgAppendRec 293 ** 294 ** Description This function adds NDEF records to the end of an NDEF message. 295 ** 296 ** Returns OK, or error if the record did not fit 297 ** *p_cur_size is updated 298 ** 299 *******************************************************************************/ 300 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAppendRec (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 301 UINT8 *p_new_rec, UINT32 new_rec_len); 302 303 /******************************************************************************* 304 ** 305 ** Function NDEF_MsgAppendPayload 306 ** 307 ** Description This function appends extra payload to a specific record in the 308 ** given NDEF message 309 ** 310 ** Returns OK, or error if the extra payload did not fit 311 ** *p_cur_size is updated 312 ** 313 *******************************************************************************/ 314 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAppendPayload (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 315 UINT8 *p_rec, UINT8 *p_add_pl, UINT32 add_pl_len); 316 317 /******************************************************************************* 318 ** 319 ** Function NDEF_MsgReplacePayload 320 ** 321 ** Description This function replaces the payload of a specific record in the 322 ** given NDEF message 323 ** 324 ** Returns OK, or error if the new payload did not fit 325 ** *p_cur_size is updated 326 ** 327 *******************************************************************************/ 328 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgReplacePayload (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 329 UINT8 *p_rec, UINT8 *p_new_pl, UINT32 new_pl_len); 330 331 /******************************************************************************* 332 ** 333 ** Function NDEF_MsgReplaceType 334 ** 335 ** Description This function replaces the type field of a specific record in the 336 ** given NDEF message 337 ** 338 ** Returns OK, or error if the new type field did not fit 339 ** *p_cur_size is updated 340 ** 341 *******************************************************************************/ 342 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgReplaceType (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 343 UINT8 *p_rec, UINT8 *p_new_type, UINT8 new_type_len); 344 345 /******************************************************************************* 346 ** 347 ** Function NDEF_MsgReplaceId 348 ** 349 ** Description This function replaces the ID field of a specific record in the 350 ** given NDEF message 351 ** 352 ** Returns OK, or error if the new ID field did not fit 353 ** *p_cur_size is updated 354 ** 355 *******************************************************************************/ 356 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgReplaceId (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 357 UINT8 *p_rec, UINT8 *p_new_id, UINT8 new_id_len); 358 359 /******************************************************************************* 360 ** 361 ** Function NDEF_MsgRemoveRec 362 ** 363 ** Description This function removes the record at the given 364 ** index in the given NDEF message. 365 ** 366 ** Returns OK, or error if the index was invalid 367 ** *p_cur_size is updated 368 ** 369 *******************************************************************************/ 370 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgRemoveRec (UINT8 *p_msg, UINT32 *p_cur_size, INT32 index); 371 372 /******************************************************************************* 373 ** 374 ** Function NDEF_MsgCopyAndDechunk 375 ** 376 ** Description This function copies and de-chunks an NDEF message. 377 ** It is assumed that the destination is at least as large 378 ** as the source, since the source may not actually contain 379 ** any chunks. 380 ** 381 ** Returns The output byte count 382 ** 383 *******************************************************************************/ 384 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgCopyAndDechunk (UINT8 *p_src, UINT32 src_len, UINT8 *p_dest, UINT32 *p_out_len); 385 386 /******************************************************************************* 387 ** 388 ** Function NDEF_MsgCreateWktHr 389 ** 390 ** Description This function creates Handover Request Record with version. 391 ** 392 ** Returns NDEF_OK if all OK 393 ** 394 *******************************************************************************/ 395 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgCreateWktHr (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 396 UINT8 version ); 397 398 /******************************************************************************* 399 ** 400 ** Function NDEF_MsgCreateWktHs 401 ** 402 ** Description This function creates Handover Select Record with version. 403 ** 404 ** Returns NDEF_OK if all OK 405 ** 406 *******************************************************************************/ 407 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgCreateWktHs (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 408 UINT8 version ); 409 410 /******************************************************************************* 411 ** 412 ** Function NDEF_MsgAddWktHc 413 ** 414 ** Description This function adds Handover Carrier Record. 415 ** 416 ** Returns NDEF_OK if all OK 417 ** 418 *******************************************************************************/ 419 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAddWktHc (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 420 char *p_id_str, UINT8 ctf, 421 UINT8 carrier_type_len, UINT8 *p_carrier_type, 422 UINT8 carrier_data_len, UINT8 *p_carrier_data); 423 424 /******************************************************************************* 425 ** 426 ** Function NDEF_MsgAddWktAc 427 ** 428 ** Description This function adds Alternative Carrier Record. 429 ** 430 ** Returns NDEF_OK if all OK 431 ** 432 *******************************************************************************/ 433 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAddWktAc (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 434 UINT8 cps, char *p_carrier_data_ref_str, 435 UINT8 aux_data_ref_count, char *p_aux_data_ref_str[]); 436 437 /******************************************************************************* 438 ** 439 ** Function NDEF_MsgAddWktCr 440 ** 441 ** Description This function adds Collision Resolution Record. 442 ** 443 ** Returns NDEF_OK if all OK 444 ** 445 *******************************************************************************/ 446 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAddWktCr (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 447 UINT16 random_number ); 448 449 /******************************************************************************* 450 ** 451 ** Function NDEF_MsgAddWktErr 452 ** 453 ** Description This function adds Error Record. 454 ** 455 ** Returns NDEF_OK if all OK 456 ** 457 *******************************************************************************/ 458 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAddWktErr (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 459 UINT8 error_reason, UINT32 error_data ); 460 461 /******************************************************************************* 462 ** 463 ** Function NDEF_MsgAddMediaBtOob 464 ** 465 ** Description This function adds BT OOB Record. 466 ** 467 ** Returns NDEF_OK if all OK 468 ** 469 *******************************************************************************/ 470 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAddMediaBtOob (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 471 char *p_id_str, BD_ADDR bd_addr); 472 473 /******************************************************************************* 474 ** 475 ** Function NDEF_MsgAppendMediaBtOobCod 476 ** 477 ** Description This function appends COD EIR data at the end of BT OOB Record. 478 ** 479 ** Returns NDEF_OK if all OK 480 ** 481 *******************************************************************************/ 482 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAppendMediaBtOobCod (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 483 char *p_id_str, DEV_CLASS cod); 484 485 /******************************************************************************* 486 ** 487 ** Function NDEF_MsgAppendMediaBtOobName 488 ** 489 ** Description This function appends Bluetooth Local Name EIR data 490 ** at the end of BT OOB Record. 491 ** 492 ** Returns NDEF_OK if all OK 493 ** 494 *******************************************************************************/ 495 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAppendMediaBtOobName (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 496 char *p_id_str, BOOLEAN is_complete, 497 UINT8 name_len, UINT8 *p_name); 498 499 /******************************************************************************* 500 ** 501 ** Function NDEF_MsgAppendMediaBtOobHashCRandR 502 ** 503 ** Description This function appends Hash C and Rand R at the end of BT OOB Record. 504 ** 505 ** Returns NDEF_OK if all OK 506 ** 507 *******************************************************************************/ 508 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAppendMediaBtOobHashCRandR (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 509 char *p_id_str, UINT8 *p_hash_c, UINT8 *p_rand_r); 510 511 /******************************************************************************* 512 ** 513 ** Function NDEF_MsgAppendMediaBtOobEirData 514 ** 515 ** Description This function appends EIR Data at the end of BT OOB Record. 516 ** 517 ** Returns NDEF_OK if all OK 518 ** 519 *******************************************************************************/ 520 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAppendMediaBtOobEirData (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 521 char *p_id_str, 522 UINT8 eir_type, UINT8 data_len, UINT8 *p_data); 523 524 /******************************************************************************* 525 ** 526 ** Function NDEF_MsgAddMediaWifiWsc 527 ** 528 ** Description This function adds Wifi Wsc Record header. 529 ** 530 ** Returns NDEF_OK if all OK 531 ** 532 *******************************************************************************/ 533 EXPORT_NDEF_API extern tNDEF_STATUS NDEF_MsgAddMediaWifiWsc (UINT8 *p_msg, UINT32 max_size, UINT32 *p_cur_size, 534 char *p_id_str, UINT8 *p_payload, UINT32 payload_len); 535 536 #ifdef __cplusplus 537 } 538 #endif 539 540 #endif /* NDEF_UTILS_H */ 541