@@ -284,6 +284,9 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
284284 struct nfc_llcp_local * local ;
285285 struct sk_buff * skb ;
286286 u8 * service_name_tlv = NULL , service_name_tlv_length ;
287+ u8 * miux_tlv = NULL , miux_tlv_length ;
288+ u8 * rw_tlv = NULL , rw_tlv_length , rw ;
289+ __be16 miux ;
287290 int err ;
288291 u16 size = 0 ;
289292
@@ -301,6 +304,14 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
301304 size += service_name_tlv_length ;
302305 }
303306
307+ miux = cpu_to_be16 (LLCP_MAX_MIUX );
308+ miux_tlv = nfc_llcp_build_tlv (LLCP_TLV_MIUX , (u8 * )& miux , 0 , & miux_tlv_length );
309+ size += miux_tlv_length ;
310+
311+ rw = LLCP_MAX_RW ;
312+ rw_tlv = nfc_llcp_build_tlv (LLCP_TLV_RW , & rw , 0 , & rw_tlv_length );
313+ size += rw_tlv_length ;
314+
304315 pr_debug ("SKB size %d SN length %zu\n" , size , sock -> service_name_len );
305316
306317 skb = llcp_allocate_pdu (sock , LLCP_PDU_CONNECT , size );
@@ -313,6 +324,9 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
313324 skb = llcp_add_tlv (skb , service_name_tlv ,
314325 service_name_tlv_length );
315326
327+ skb = llcp_add_tlv (skb , miux_tlv , miux_tlv_length );
328+ skb = llcp_add_tlv (skb , rw_tlv , rw_tlv_length );
329+
316330 skb_queue_tail (& local -> tx_queue , skb );
317331
318332 return 0 ;
@@ -321,6 +335,8 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
321335 pr_err ("error %d\n" , err );
322336
323337 kfree (service_name_tlv );
338+ kfree (miux_tlv );
339+ kfree (rw_tlv );
324340
325341 return err ;
326342}
@@ -329,20 +345,46 @@ int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)
329345{
330346 struct nfc_llcp_local * local ;
331347 struct sk_buff * skb ;
348+ u8 * miux_tlv = NULL , miux_tlv_length ;
349+ u8 * rw_tlv = NULL , rw_tlv_length , rw ;
350+ __be16 miux ;
351+ int err ;
352+ u16 size = 0 ;
332353
333354 pr_debug ("Sending CC\n" );
334355
335356 local = sock -> local ;
336357 if (local == NULL )
337358 return - ENODEV ;
338359
339- skb = llcp_allocate_pdu (sock , LLCP_PDU_CC , 0 );
340- if (skb == NULL )
341- return - ENOMEM ;
360+ miux = cpu_to_be16 (LLCP_MAX_MIUX );
361+ miux_tlv = nfc_llcp_build_tlv (LLCP_TLV_MIUX , (u8 * )& miux , 0 , & miux_tlv_length );
362+ size += miux_tlv_length ;
363+
364+ rw = LLCP_MAX_RW ;
365+ rw_tlv = nfc_llcp_build_tlv (LLCP_TLV_RW , & rw , 0 , & rw_tlv_length );
366+ size += rw_tlv_length ;
367+
368+ skb = llcp_allocate_pdu (sock , LLCP_PDU_CC , size );
369+ if (skb == NULL ) {
370+ err = - ENOMEM ;
371+ goto error_tlv ;
372+ }
373+
374+ skb = llcp_add_tlv (skb , miux_tlv , miux_tlv_length );
375+ skb = llcp_add_tlv (skb , rw_tlv , rw_tlv_length );
342376
343377 skb_queue_tail (& local -> tx_queue , skb );
344378
345379 return 0 ;
380+
381+ error_tlv :
382+ pr_err ("error %d\n" , err );
383+
384+ kfree (miux_tlv );
385+ kfree (rw_tlv );
386+
387+ return err ;
346388}
347389
348390int nfc_llcp_send_dm (struct nfc_llcp_local * local , u8 ssap , u8 dsap , u8 reason )
0 commit comments