@@ -2897,6 +2897,11 @@ static inline void event_enc_prep(struct ll_conn *conn)
2897
2897
event_enc_reject_prep (conn , pdu_ctrl_tx );
2898
2898
2899
2899
ctrl_tx_enqueue (conn , tx );
2900
+
2901
+ /* procedure request acked */
2902
+ conn -> llcp_ack = conn -> llcp_req ;
2903
+
2904
+ return ;
2900
2905
}
2901
2906
/* place the start enc req packet as next in tx queue */
2902
2907
else {
@@ -2942,19 +2947,16 @@ static inline void event_enc_prep(struct ll_conn *conn)
2942
2947
}
2943
2948
2944
2949
#if !defined(CONFIG_BT_CTLR_FAST_ENC )
2950
+ /* Peripheral sends start enc rsp after reception of start enc rsp */
2945
2951
} else {
2946
2952
start_enc_rsp_send (conn , pdu_ctrl_tx );
2947
2953
2948
2954
ctrl_tx_enqueue (conn , tx );
2949
-
2950
- /* resume data packet rx and tx */
2951
- conn -> llcp_enc .pause_rx = 0U ;
2952
- conn -> llcp_enc .pause_tx = 0U ;
2953
2955
#endif /* !CONFIG_BT_CTLR_FAST_ENC */
2954
2956
}
2955
2957
2956
- /* procedure request acked */
2957
- conn -> llcp_ack = conn -> llcp_req ;
2958
+ /* Wait for encryption setup to complete */
2959
+ conn -> llcp . encryption . state = LLCP_ENC_STATE_ENC_WAIT ;
2958
2960
}
2959
2961
#endif /* CONFIG_BT_CTLR_LE_ENC */
2960
2962
@@ -5403,13 +5405,29 @@ static inline void ctrl_tx_ack(struct ll_conn *conn, struct node_tx **tx,
5403
5405
break ;
5404
5406
5405
5407
case PDU_DATA_LLCTRL_TYPE_START_ENC_REQ :
5406
- /* Nothing to do.
5407
- * Remember that we may have received encrypted START_ENC_RSP
5408
+ /* Remember that we may have received encrypted START_ENC_RSP
5408
5409
* alongwith this tx ack at this point in time.
5409
5410
*/
5411
+ conn -> llcp .encryption .state = LLCP_ENC_STATE_ENC_WAIT ;
5410
5412
break ;
5411
5413
#endif /* CONFIG_BT_PERIPHERAL */
5412
5414
5415
+ case PDU_DATA_LLCTRL_TYPE_START_ENC_RSP :
5416
+ if (conn -> lll .role ) {
5417
+ /* resume data packet rx and tx */
5418
+ conn -> llcp_enc .pause_rx = 0U ;
5419
+ conn -> llcp_enc .pause_tx = 0U ;
5420
+
5421
+ /* Procedure complete */
5422
+ conn -> procedure_expire = 0U ;
5423
+
5424
+ /* procedure request acked */
5425
+ conn -> llcp_ack = conn -> llcp_req ;
5426
+ } else {
5427
+ conn -> llcp .encryption .state = LLCP_ENC_STATE_ENC_WAIT ;
5428
+ }
5429
+ break ;
5430
+
5413
5431
#if defined(CONFIG_BT_CENTRAL )
5414
5432
case PDU_DATA_LLCTRL_TYPE_PAUSE_ENC_REQ :
5415
5433
/* pause data packet tx */
@@ -5820,40 +5838,35 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
5820
5838
#endif /* CONFIG_BT_CENTRAL */
5821
5839
5822
5840
case PDU_DATA_LLCTRL_TYPE_START_ENC_RSP :
5823
- if (!pdu_len_cmp (PDU_DATA_LLCTRL_TYPE_START_ENC_RSP ,
5824
- pdu_rx -> len )) {
5841
+ if ((conn -> llcp_req == conn -> llcp_ack ) ||
5842
+ (conn -> llcp_type != LLCP_ENCRYPTION ) ||
5843
+ (!pdu_len_cmp (PDU_DATA_LLCTRL_TYPE_START_ENC_RSP ,
5844
+ pdu_rx -> len ))) {
5825
5845
goto ull_conn_rx_unknown_rsp_send ;
5826
5846
}
5827
5847
5828
5848
if (conn -> lll .role ) {
5829
5849
#if !defined(CONFIG_BT_CTLR_FAST_ENC )
5830
- if ((conn -> llcp_req != conn -> llcp_ack ) &&
5831
- (conn -> llcp_type != LLCP_ENCRYPTION )) {
5832
- goto ull_conn_rx_unknown_rsp_send ;
5833
- }
5834
-
5835
- /* start enc rsp to be scheduled in slave prepare */
5850
+ /* start enc rsp to be scheduled in slave prepare */
5836
5851
conn -> llcp .encryption .state = LLCP_ENC_STATE_INPROG ;
5837
- if (conn -> llcp_req == conn -> llcp_ack ) {
5838
- conn -> llcp_type = LLCP_ENCRYPTION ;
5839
- conn -> llcp_ack -= 2U ;
5840
- }
5841
5852
5842
5853
#else /* CONFIG_BT_CTLR_FAST_ENC */
5843
5854
nack = start_enc_rsp_send (conn , NULL );
5844
5855
if (nack ) {
5845
5856
break ;
5846
5857
}
5847
-
5848
- /* resume data packet rx and tx */
5849
- conn -> llcp_enc .pause_rx = 0U ;
5850
- conn -> llcp_enc .pause_tx = 0U ;
5851
5858
#endif /* CONFIG_BT_CTLR_FAST_ENC */
5852
5859
5853
5860
} else {
5854
5861
/* resume data packet rx and tx */
5855
5862
conn -> llcp_enc .pause_rx = 0U ;
5856
5863
conn -> llcp_enc .pause_tx = 0U ;
5864
+
5865
+ /* Procedure complete */
5866
+ conn -> procedure_expire = 0U ;
5867
+
5868
+ /* procedure request acked */
5869
+ conn -> llcp_ack = conn -> llcp_req ;
5857
5870
}
5858
5871
5859
5872
/* enqueue the start enc resp (encryption change/refresh) */
@@ -5863,10 +5876,6 @@ static inline int ctrl_rx(memq_link_t *link, struct node_rx_pdu **rx,
5863
5876
/* key refresh event */
5864
5877
(* rx )-> hdr .type = NODE_RX_TYPE_ENC_REFRESH ;
5865
5878
}
5866
-
5867
- /* Procedure complete */
5868
- conn -> procedure_expire = 0U ;
5869
-
5870
5879
break ;
5871
5880
#endif /* CONFIG_BT_CTLR_LE_ENC */
5872
5881
0 commit comments