svn commit: r290491 - in head/sys/netgraph/bluetooth: hci socket

Takanori Watanabe takawata at FreeBSD.org
Sat Nov 7 12:15:04 UTC 2015


Author: takawata
Date: Sat Nov  7 12:15:02 2015
New Revision: 290491
URL: https://svnweb.freebsd.org/changeset/base/290491

Log:
  Fix encryption error handling.
  Close l2cap connection on encryption error.

Modified:
  head/sys/netgraph/bluetooth/hci/ng_hci_evnt.c
  head/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c

Modified: head/sys/netgraph/bluetooth/hci/ng_hci_evnt.c
==============================================================================
--- head/sys/netgraph/bluetooth/hci/ng_hci_evnt.c	Sat Nov  7 12:11:17 2015	(r290490)
+++ head/sys/netgraph/bluetooth/hci/ng_hci_evnt.c	Sat Nov  7 12:15:02 2015	(r290491)
@@ -913,17 +913,17 @@ encryption_change(ng_hci_unit_p unit, st
 	ng_hci_encryption_change_ep	*ep = NULL;
 	ng_hci_unit_con_p		 con = NULL;
 	int				 error = 0;
+	u_int16_t	h;
 
 	NG_HCI_M_PULLUP(event, sizeof(*ep));
 	if (event == NULL)
 		return (ENOBUFS);
 
 	ep = mtod(event, ng_hci_encryption_change_ep *);
+	h = NG_HCI_CON_HANDLE(le16toh(ep->con_handle));
+	con = ng_hci_con_by_handle(unit, h);
 
 	if (ep->status == 0) {
-		u_int16_t	h = NG_HCI_CON_HANDLE(le16toh(ep->con_handle));
-
-		con = ng_hci_con_by_handle(unit, h);
 		if (con == NULL) {
 			NG_HCI_ALERT(
 "%s: %s - invalid connection handle=%d\n",
@@ -940,12 +940,14 @@ encryption_change(ng_hci_unit_p unit, st
 			con->encryption_mode = NG_HCI_ENCRYPTION_MODE_P2P;
 		else
 			con->encryption_mode = NG_HCI_ENCRYPTION_MODE_NONE;
-		ng_hci_lp_enc_change(con, ep->encryption_enable);
 	} else
 		NG_HCI_ERR(
 "%s: %s - failed to change encryption mode, status=%d\n",
 			__func__, NG_NODE_NAME(unit->node), ep->status);
 
+	/*Anyway, propagete encryption status to upper layer*/
+	ng_hci_lp_enc_change(con, con->encryption_mode);
+
 	NG_FREE_M(event);
 
 	return (error);

Modified: head/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c
==============================================================================
--- head/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c	Sat Nov  7 12:11:17 2015	(r290490)
+++ head/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c	Sat Nov  7 12:15:02 2015	(r290491)
@@ -467,6 +467,7 @@ ng_btsocket_l2cap_process_l2ca_con_req_r
 		   (pcb->idtype == NG_L2CAP_L2CA_IDTYPE_SMP)){
 			pcb->encryption = op->encryption;					pcb->cid = op->lcid;	
 			if(pcb->need_encrypt && !(pcb->encryption)){
+				ng_btsocket_l2cap_timeout(pcb);
 				pcb->state = NG_BTSOCKET_L2CAP_W4_ENC_CHANGE;
 			}else{
 				pcb->state = NG_BTSOCKET_L2CAP_OPEN;
@@ -713,6 +714,7 @@ static int ng_btsocket_l2cap_process_l2c
 	pcb->encryption = op->result;
 	
 	if(pcb->need_encrypt){
+		ng_btsocket_l2cap_untimeout(pcb);		
 		if(pcb->state != NG_BTSOCKET_L2CAP_W4_ENC_CHANGE){
 			NG_BTSOCKET_L2CAP_WARN("%s: Invalid pcb status %d",
 					       __func__, pcb->state);
@@ -721,6 +723,7 @@ static int ng_btsocket_l2cap_process_l2c
 			soisconnected(pcb->so);
 		}else{
 			pcb->so->so_error = EPERM;
+			ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);
 			pcb->state = NG_BTSOCKET_L2CAP_CLOSED;
 			soisdisconnected(pcb->so);
 		}
@@ -2844,6 +2847,7 @@ ng_btsocket_l2cap_process_timeout(void *
 	switch (pcb->state) {
 	case NG_BTSOCKET_L2CAP_CONNECTING:
 	case NG_BTSOCKET_L2CAP_CONFIGURING:
+	case NG_BTSOCKET_L2CAP_W4_ENC_CHANGE:		
 		/* Send disconnect request with "zero" token */
 		if (pcb->cid != 0)
 			ng_btsocket_l2cap_send_l2ca_discon_req(0, pcb);


More information about the svn-src-all mailing list