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