1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
|
/*
* Copyright (C) 2010 NXP Semiconductors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* \file phFriNfc_Llcp.h
* \brief NFC LLCP core
*
* Project: NFC-FRI
*
*/
#ifndef PHFRINFC_LLCP_H
#define PHFRINFC_LLCP_H
/*include files*/
#include <phNfcTypes.h>
#include <phNfcLlcpTypes.h>
#include <phNfcStatus.h>
#include <phFriNfc.h>
#include <phFriNfc_LlcpMac.h>
/**
* \name NFC Forum Logical Link Control Protocol
*
* File: \ref phFriNfc_Llcp.h
*
*/
/** \defgroup grp_fri_nfc_llcp NFC Forum Logical Link Control Protocol Component
*
* TODO
*
*/
/*=========== DEBUG MACROS ===========*/
/* LLCP TRACE Macros */
#if defined(LLCP_TRACE)
#include <phOsalNfc.h>
#include <stdio.h>
extern char phOsalNfc_DbgTraceBuffer[];
#define LLCP_MAX_TRACE_BUFFER 150
#define LLCP_PRINT( str ) phOsalNfc_DbgString(str)
#define LLCP_DEBUG(str, arg) \
{ \
snprintf(phOsalNfc_DbgTraceBuffer,LLCP_MAX_TRACE_BUFFER,str,arg); \
phOsalNfc_DbgString(phOsalNfc_DbgTraceBuffer); \
}
#define LLCP_PRINT_BUFFER(msg,buf,len) \
{ \
snprintf(phOsalNfc_DbgTraceBuffer,LLCP_MAX_TRACE_BUFFER,"\n\t %s:",msg); \
phOsalNfc_DbgString(phOsalNfc_DbgTraceBuffer); \
phOsalNfc_DbgTrace(buf,len); \
phOsalNfc_DbgString("\r"); \
}
#else
#define LLCP_PRINT( str )
#define LLCP_DEBUG(str, arg)
#define LLCP_PRINT_BUFFER(msg,buf,len)
#endif
/*=========== CONSTANTS ===========*/
/**
* \name LLCP local protocol version.
*
*/
/*@{*/
#define PHFRINFC_LLCP_VERSION_MAJOR 0x01 /**< Major number of local LLCP version.*/
#define PHFRINFC_LLCP_VERSION_MINOR 0x01 /**< Minor number of local LLCP version.*/
#define PHFRINFC_LLCP_VERSION ((PHFRINFC_LLCP_VERSION_MAJOR << 4) | PHFRINFC_LLCP_VERSION_MINOR) /**< Local LLCP version.*/
/*@}*/
/**
* \name LLCP packet types.
*
*/
/*@{*/
#define PHFRINFC_LLCP_PTYPE_SYMM 0x00 /**< Symmetry.*/
#define PHFRINFC_LLCP_PTYPE_PAX 0x01 /**< PArameter Exchange.*/
#define PHFRINFC_LLCP_PTYPE_AGF 0x02 /**< AGgregated Frame.*/
#define PHFRINFC_LLCP_PTYPE_UI 0x03 /**< Unnumbered Information.*/
#define PHFRINFC_LLCP_PTYPE_CONNECT 0x04 /**< Connect.*/
#define PHFRINFC_LLCP_PTYPE_DISC 0x05 /**< Disconnect.*/
#define PHFRINFC_LLCP_PTYPE_CC 0x06 /**< Connection Complete.*/
#define PHFRINFC_LLCP_PTYPE_DM 0x07 /**< Disconnected Mode.*/
#define PHFRINFC_LLCP_PTYPE_FRMR 0x08 /**< FRaMe Reject.*/
#define PHFRINFC_LLCP_PTYPE_SNL 0x09 /**< Service Name Lookup.*/
#define PHFRINFC_LLCP_PTYPE_RESERVED1 0x0A /**< Reserved.*/
#define PHFRINFC_LLCP_PTYPE_RESERVED2 0x0B /**< Reserved.*/
#define PHFRINFC_LLCP_PTYPE_I 0x0C /**< Information.*/
#define PHFRINFC_LLCP_PTYPE_RR 0x0D /**< Receive Ready.*/
#define PHFRINFC_LLCP_PTYPE_RNR 0x0E /**< Receive Not Ready.*/
#define PHFRINFC_LLCP_PTYPE_RESERVED3 0x0F /**< Reserved.*/
/*@}*/
/**
* \name LLCP well-known SAPs.
*
*/
/*@{*/
#define PHFRINFC_LLCP_SAP_LINK 0x00 /**< Link SAP.*/
#define PHFRINFC_LLCP_SAP_SDP 0x01 /**< Service Discovery Protocol SAP.*/
#define PHFRINFC_LLCP_SAP_WKS_FIRST 0x02 /**< Other Well-Known Services defined by the NFC Forum.*/
#define PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST 0x10 /**< First SAP number from SDP-avertised SAP range.*/
#define PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST 0x20 /**< First SAP number from SDP-unavertised SAP range.*/
#define PHFRINFC_LLCP_SAP_NUMBER 0x40 /**< Number of possible SAP values (also first invalid value).*/
#define PHFRINFC_LLCP_SAP_DEFAULT 0xFF /**< Default number when a socket is created or reset */
#define PHFRINFC_LLCP_SDP_ADVERTISED_NB 0x10 /**< Number of SDP advertised SAP slots */
/*@}*/
/**
* \name LLCP well-known SAPs.
*
*/
/*@{*/
#define PHFRINFC_LLCP_SERVICENAME_SDP "urn:nfc:sn:sdp" /**< Service Discovery Protocol name.*/
/*@}*/
/**
* \name Length value for DM opCode
*
*/
/*@{*/
#define PHFRINFC_LLCP_DM_LENGTH 0x01 /**< Length value for DM opCode */
/*@}*/
/**
* \internal
* \name Masks used with parameters value.
*
*/
/*@{*/
#define PHFRINFC_LLCP_TLV_MIUX_MASK 0x07FF /**< \internal Mask to apply to MIUX TLV Value.*/
#define PHFRINFC_LLCP_TLV_WKS_MASK 0x0001 /**< \internal Minimal bits to be set in WKS TLV Value.*/
#define PHFRINFC_LLCP_TLV_RW_MASK 0x0F /**< \internal Mask to apply to RW TLV Value.*/
#define PHFRINFC_LLCP_TLV_OPT_MASK 0x03 /**< \internal Mask to apply to OPT TLV Value.*/
/*@}*/
/**
* \internal
* \name Type codes for parameters in TLV.
*
*/
/*@{*/
#define PHFRINFC_LLCP_TLV_TYPE_VERSION 0x01 /**< \internal VERSION parameter Type code.*/
#define PHFRINFC_LLCP_TLV_TYPE_MIUX 0x02 /**< \internal MIUX parameter Type code.*/
#define PHFRINFC_LLCP_TLV_TYPE_WKS 0x03 /**< \internal WKS parameter Type code.*/
#define PHFRINFC_LLCP_TLV_TYPE_LTO 0x04 /**< \internal LTO parameter Type code.*/
#define PHFRINFC_LLCP_TLV_TYPE_RW 0x05 /**< \internal RW parameter Type code.*/
#define PHFRINFC_LLCP_TLV_TYPE_SN 0x06 /**< \internal SN parameter Type code.*/
#define PHFRINFC_LLCP_TLV_TYPE_OPT 0x07 /**< \internal OPT parameter Type code.*/
#define PHFRINFC_LLCP_TLV_TYPE_SDREQ 0x08 /**< \internal SDREQ parameter Type code.*/
#define PHFRINFC_LLCP_TLV_TYPE_SDRES 0x09 /**< \internal SDRES parameter Type code.*/
/*@}*/
/**
* \internal
* \name Fixed Value length for parameters in TLV.
*
*/
/*@{*/
#define PHFRINFC_LLCP_TLV_LENGTH_HEADER 2 /**< \internal Fixed length of Type and Length fields in TLV.*/
#define PHFRINFC_LLCP_TLV_LENGTH_VERSION 1 /**< \internal Fixed length of VERSION parameter Value.*/
#define PHFRINFC_LLCP_TLV_LENGTH_MIUX 2 /**< \internal Fixed length of MIUX parameter Value.*/
#define PHFRINFC_LLCP_TLV_LENGTH_WKS 2 /**< \internal Fixed length of WKS parameter Value.*/
#define PHFRINFC_LLCP_TLV_LENGTH_LTO 1 /**< \internal Fixed length of LTO parameter Value.*/
#define PHFRINFC_LLCP_TLV_LENGTH_RW 1 /**< \internal Fixed length of RW parameter Value.*/
#define PHFRINFC_LLCP_TLV_LENGTH_OPT 1 /**< \internal Fixed length of OPT parameter Value.*/
/*@}*/
/**
* \name LLCP packet field sizes.
*
*/
/*@{*/
#define PHFRINFC_LLCP_PACKET_HEADER_SIZE 2 /**< Size of the general packet header (DSAP+PTYPE+SSAP).*/
#define PHFRINFC_LLCP_PACKET_SEQUENCE_SIZE 1 /**< Size of the sequence field, if present.*/
#define PHFRINFC_LLCP_PACKET_MAX_SIZE (PHFRINFC_LLCP_PACKET_HEADER_SIZE + \
PHFRINFC_LLCP_PACKET_SEQUENCE_SIZE + \
PHFRINFC_LLCP_MIU_DEFAULT + \
PHFRINFC_LLCP_TLV_MIUX_MASK) /**< Maximum size of a packet */
/*@}*/
/*========== MACROS ===========*/
#define CHECK_SEND_RW(socket) ( (((socket)->socket_VS - (socket)->socket_VSA) % 16) < (socket)->remoteRW )
/*========== ENUMERATES ===========*/
typedef phFriNfc_LlcpMac_ePeerType_t phFriNfc_Llcp_eRole_t;
typedef phFriNfc_LlcpMac_eLinkStatus_t phFriNfc_Llcp_eLinkStatus_t;
/*========== CALLBACKS ===========*/
typedef void (*phFriNfc_Llcp_Check_CB_t) (
void *pContext,
NFCSTATUS status
);
typedef void (*phFriNfc_Llcp_LinkStatus_CB_t) (
void *pContext,
phFriNfc_Llcp_eLinkStatus_t eLinkStatus
);
typedef void (*phFriNfc_Llcp_Send_CB_t) (
void *pContext,
NFCSTATUS status
);
typedef void (*phFriNfc_Llcp_Recv_CB_t) (
void *pContext,
phNfc_sData_t *psData,
NFCSTATUS status
);
/*========== STRUCTURES ===========*/
typedef struct phFriNfc_Llcp_sPacketHeader
{
/**< The destination service access point*/
unsigned dsap : 6;
/**< The packet type*/
unsigned ptype : 4;
/**< The source service access point*/
unsigned ssap : 6;
} phFriNfc_Llcp_sPacketHeader_t;
typedef struct phFriNfc_Llcp_sPacketSequence
{
/**< Sequence number for sending*/
unsigned ns : 4;
/**< Sequence number for reception*/
unsigned nr : 4;
} phFriNfc_Llcp_sPacketSequence_t;
typedef struct phFriNfc_Llcp_sSendOperation
{
/**< Sequence number for sending*/
phFriNfc_Llcp_sPacketHeader_t *psHeader;
/**< Sequence number for sending*/
phFriNfc_Llcp_sPacketSequence_t *psSequence;
/**< Sequence number for sending*/
phNfc_sData_t *psInfo;
/**< Sequence number for sending*/
phFriNfc_Llcp_Send_CB_t pfSend_CB;
/**< Sequence number for sending*/
void *pContext;
} phFriNfc_Llcp_sSendOperation_t;
typedef struct phFriNfc_Llcp_sRecvOperation
{
/**< Sequence number for sending*/
uint8_t nSap;
/**< Sequence number for sending*/
phNfc_sData_t *psBuffer;
/**< Sequence number for sending*/
phFriNfc_Llcp_Recv_CB_t pfRecv_CB;
/**< Sequence number for sending*/
void *pContext;
} phFriNfc_Llcp_sRecvOperation_t;
typedef struct phFriNfc_Llcp
{
/**< The current state*/
uint8_t state;
/**< MAC mapping instance*/
phFriNfc_LlcpMac_t MAC;
/**< Local LLC role*/
phFriNfc_LlcpMac_ePeerType_t eRole;
/**< Local link parameters*/
phFriNfc_Llcp_sLinkParameters_t sLocalParams;
/**< Remote link parameters*/
phFriNfc_Llcp_sLinkParameters_t sRemoteParams;
/**< Negociated protocol version (major number on MSB, minor on LSB)*/
uint8_t version;
/**< Internal reception buffer, its size may vary during time but not exceed nRxBufferSize*/
phNfc_sData_t sRxBuffer;
/**< Actual size of reception buffer*/
uint16_t nRxBufferLength;
/**< Internal emission buffer, its size may vary during time but not exceed nTxBufferSize*/
phNfc_sData_t sTxBuffer;
/**< Actual size of emission buffer*/
uint16_t nTxBufferLength;
/**< Callback function for link status notification*/
phFriNfc_Llcp_LinkStatus_CB_t pfLink_CB;
/**< Callback context for link status notification*/
void *pLinkContext;
/**< Callback function for compliance checking*/
phFriNfc_Llcp_Check_CB_t pfChk_CB;
/**< Callback context for compliance checking*/
void *pChkContext;
/**< Symmetry timer*/
uint32_t hSymmTimer;
/**< Control frames buffer*/
uint8_t pCtrlTxBuffer[10];
/**< Control frames buffer size*/
uint8_t pCtrlTxBufferLength;
/**< DISC packet send pending flag*/
bool_t bDiscPendingFlag;
/**< FRMR packet send pending flag*/
bool_t bFrmrPendingFlag;
/**< Header of pending FRMR packet*/
phFriNfc_Llcp_sPacketHeader_t sFrmrHeader;
/**< Info field of pending FRMR packet*/
uint8_t pFrmrInfo[4];
/**< Send callback*/
phFriNfc_Llcp_Send_CB_t pfSendCB;
/**< Send callback*/
void *pSendContext;
/**< Pending send header*/
phFriNfc_Llcp_sPacketHeader_t *psSendHeader;
/**< Pending send sequence*/
phFriNfc_Llcp_sPacketSequence_t *psSendSequence;
/**< Pending send info*/
phNfc_sData_t *psSendInfo;
/**< Receive callback*/
phFriNfc_Llcp_Recv_CB_t pfRecvCB;
/**< Receive callback*/
void *pRecvContext;
} phFriNfc_Llcp_t;
/*========== UNIONS ===========*/
/*========== FUNCTIONS ===========*/
/*!
* \brief TODO
*/
NFCSTATUS phFriNfc_Llcp_EncodeLinkParams( phNfc_sData_t *psRawBuffer,
phFriNfc_Llcp_sLinkParameters_t *psLinkParams,
uint8_t nVersion );
/*!
* \brief TODO
*/
NFCSTATUS phFriNfc_Llcp_Reset( phFriNfc_Llcp_t *Llcp,
void *LowerDevice,
phFriNfc_Llcp_sLinkParameters_t *psLinkParams,
void *pRxBuffer,
uint16_t nRxBufferLength,
void *pTxBuffer,
uint16_t nTxBufferLength,
phFriNfc_Llcp_LinkStatus_CB_t pfLink_CB,
void *pContext );
/*!
* \brief TODO
*/
NFCSTATUS phFriNfc_Llcp_ChkLlcp( phFriNfc_Llcp_t *Llcp,
phHal_sRemoteDevInformation_t *psRemoteDevInfo,
phFriNfc_Llcp_Check_CB_t pfCheck_CB,
void *pContext );
/*!
* \brief TODO
*/
NFCSTATUS phFriNfc_Llcp_Activate( phFriNfc_Llcp_t *Llcp );
/*!
* \brief TODO
*/
NFCSTATUS phFriNfc_Llcp_Deactivate( phFriNfc_Llcp_t *Llcp );
/*!
* \brief TODO
*/
NFCSTATUS phFriNfc_Llcp_GetLocalInfo( phFriNfc_Llcp_t *Llcp,
phFriNfc_Llcp_sLinkParameters_t *pParams );
/*!
* \brief TODO
*/
NFCSTATUS phFriNfc_Llcp_GetRemoteInfo( phFriNfc_Llcp_t *Llcp,
phFriNfc_Llcp_sLinkParameters_t *pParams );
/*!
* \brief TODO
*/
NFCSTATUS phFriNfc_Llcp_Send( phFriNfc_Llcp_t *Llcp,
phFriNfc_Llcp_sPacketHeader_t *psHeader,
phFriNfc_Llcp_sPacketSequence_t *psSequence,
phNfc_sData_t *psInfo,
phFriNfc_Llcp_Send_CB_t pfSend_CB,
void *pContext );
/*!
* \brief TODO
*/
NFCSTATUS phFriNfc_Llcp_Recv( phFriNfc_Llcp_t *Llcp,
phFriNfc_Llcp_Recv_CB_t pfRecv_CB,
void *pContext );
#endif /* PHFRINFC_LLCP_H */
|