]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
[Bluetooth] Track status of Simple Pairing mode
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 14 Jul 2008 18:13:48 +0000 (20:13 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 14 Jul 2008 18:13:48 +0000 (20:13 +0200)
The Simple Pairing feature is optional and needs to be enabled by the
host stack first. The Linux kernel relies on the Bluetooth daemon to
either enable or disable it, but at any time it needs to know the
current state of the Simple Pairing mode. So track any changes made
by external entities and store the current mode in the HCI device
structure.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
include/net/bluetooth/hci.h
include/net/bluetooth/hci_core.h
net/bluetooth/hci_event.c

index 79629ff40e3ef0c9398fbcc742d3e47effcd82de..6d0c04a81fc7427e23d8800e412b6c4c4e144560 100644 (file)
@@ -514,6 +514,17 @@ struct hci_cp_host_buffer_size {
        __le16   sco_max_pkt;
 } __attribute__ ((packed));
 
+#define HCI_OP_READ_SSP_MODE           0x0c55
+struct hci_rp_read_ssp_mode {
+       __u8     status;
+       __u8     mode;
+} __attribute__ ((packed));
+
+#define HCI_OP_WRITE_SSP_MODE          0x0c56
+struct hci_cp_write_ssp_mode {
+       __u8     mode;
+} __attribute__ ((packed));
+
 #define HCI_OP_READ_LOCAL_VERSION      0x1001
 struct hci_rp_read_local_version {
        __u8     status;
index 6424d63e33950f1b478068b5c9b26c40bc9adce5..b85754e29a7824caea29ba789706aaae174fb5ba 100644 (file)
@@ -75,6 +75,7 @@ struct hci_dev {
        __u8            dev_class[3];
        __u8            features[8];
        __u8            commands[64];
+       __u8            ssp_mode;
        __u8            hci_ver;
        __u16           hci_rev;
        __u16           manufacturer;
index 7c9ac01cd8f94029f97fd0a75696ef2f3f5c93ed..6077a651aac69a49009b57e0e89491db12770f33 100644 (file)
@@ -391,6 +391,35 @@ static void hci_cc_host_buffer_size(struct hci_dev *hdev, struct sk_buff *skb)
        hci_req_complete(hdev, status);
 }
 
+static void hci_cc_read_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
+{
+       struct hci_rp_read_ssp_mode *rp = (void *) skb->data;
+
+       BT_DBG("%s status 0x%x", hdev->name, rp->status);
+
+       if (rp->status)
+               return;
+
+       hdev->ssp_mode = rp->mode;
+}
+
+static void hci_cc_write_ssp_mode(struct hci_dev *hdev, struct sk_buff *skb)
+{
+       __u8 status = *((__u8 *) skb->data);
+       void *sent;
+
+       BT_DBG("%s status 0x%x", hdev->name, status);
+
+       if (status)
+               return;
+
+       sent = hci_sent_cmd_data(hdev, HCI_OP_WRITE_SSP_MODE);
+       if (!sent)
+               return;
+
+       hdev->ssp_mode = *((__u8 *) sent);
+}
+
 static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb)
 {
        struct hci_rp_read_local_version *rp = (void *) skb->data;
@@ -1084,6 +1113,14 @@ static inline void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *sk
                hci_cc_host_buffer_size(hdev, skb);
                break;
 
+       case HCI_OP_READ_SSP_MODE:
+               hci_cc_read_ssp_mode(hdev, skb);
+               break;
+
+       case HCI_OP_WRITE_SSP_MODE:
+               hci_cc_write_ssp_mode(hdev, skb);
+               break;
+
        case HCI_OP_READ_LOCAL_VERSION:
                hci_cc_read_local_version(hdev, skb);
                break;