linux-old/net/bluetooth/hci_event.c
<<
>>
Prefs
   1/* 
   2   BlueZ - Bluetooth protocol stack for Linux
   3   Copyright (C) 2000-2001 Qualcomm Incorporated
   4
   5   Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
   6
   7   This program is free software; you can redistribute it and/or modify
   8   it under the terms of the GNU General Public License version 2 as
   9   published by the Free Software Foundation;
  10
  11   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  12   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  13   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
  14   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
  15   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
  16   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
  17   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
  18   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19
  20   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
  21   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
  22   SOFTWARE IS DISCLAIMED.
  23*/
  24
  25/*
  26 * HCI Events.
  27 *
  28 * $Id: hci_event.c,v 1.4 2002/07/27 18:14:38 maxk Exp $
  29 */
  30
  31#include <linux/config.h>
  32#include <linux/module.h>
  33
  34#include <linux/types.h>
  35#include <linux/errno.h>
  36#include <linux/kernel.h>
  37#include <linux/major.h>
  38#include <linux/sched.h>
  39#include <linux/slab.h>
  40#include <linux/poll.h>
  41#include <linux/fcntl.h>
  42#include <linux/init.h>
  43#include <linux/skbuff.h>
  44#include <linux/interrupt.h>
  45#include <linux/notifier.h>
  46#include <net/sock.h>
  47
  48#include <asm/system.h>
  49#include <asm/uaccess.h>
  50#include <asm/unaligned.h>
  51
  52#include <net/bluetooth/bluetooth.h>
  53#include <net/bluetooth/hci_core.h>
  54
  55#ifndef HCI_CORE_DEBUG
  56#undef  BT_DBG
  57#define BT_DBG( A... )
  58#endif
  59
  60/* Handle HCI Event packets */
  61
  62/* Command Complete OGF LINK_CTL  */
  63static void hci_cc_link_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb)
  64{
  65        __u8 status;
  66
  67        BT_DBG("%s ocf 0x%x", hdev->name, ocf);
  68
  69        switch (ocf) {
  70        case OCF_INQUIRY_CANCEL:
  71                status = *((__u8 *) skb->data);
  72
  73                if (status) {
  74                        BT_DBG("%s Inquiry cancel error: status 0x%x", hdev->name, status);
  75                } else {
  76                        clear_bit(HCI_INQUIRY, &hdev->flags);
  77                        hci_req_complete(hdev, status);
  78                }
  79                break;
  80
  81        default:
  82                BT_DBG("%s Command complete: ogf LINK_CTL ocf %x", hdev->name, ocf);
  83                break;
  84        };
  85}
  86
  87/* Command Complete OGF LINK_POLICY  */
  88static void hci_cc_link_policy(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb)
  89{
  90        struct hci_conn *conn;
  91        role_discovery_rp *rd;
  92
  93        BT_DBG("%s ocf 0x%x", hdev->name, ocf);
  94
  95        switch (ocf) {
  96        case OCF_ROLE_DISCOVERY: 
  97                rd = (void *) skb->data;
  98
  99                if (rd->status)
 100                        break;
 101                
 102                hci_dev_lock(hdev);
 103        
 104                conn = conn_hash_lookup_handle(hdev, __le16_to_cpu(rd->handle));
 105                if (conn) {
 106                        if (rd->role)
 107                                conn->link_mode &= ~HCI_LM_MASTER;
 108                        else
 109                                conn->link_mode |= HCI_LM_MASTER;
 110                }
 111                        
 112                hci_dev_unlock(hdev);
 113                break;
 114
 115        default:
 116                BT_DBG("%s: Command complete: ogf LINK_POLICY ocf %x", 
 117                                hdev->name, ocf);
 118                break;
 119        };
 120}
 121
 122/* Command Complete OGF HOST_CTL  */
 123static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb)
 124{
 125        __u8 status, param;
 126        void *sent;
 127
 128        BT_DBG("%s ocf 0x%x", hdev->name, ocf);
 129
 130        switch (ocf) {
 131        case OCF_RESET:
 132                status = *((__u8 *) skb->data);
 133                hci_req_complete(hdev, status);
 134                break;
 135
 136        case OCF_SET_EVENT_FLT:
 137                status = *((__u8 *) skb->data);
 138                if (status) {
 139                        BT_DBG("%s SET_EVENT_FLT failed %d", hdev->name, status);
 140                } else {
 141                        BT_DBG("%s SET_EVENT_FLT succeseful", hdev->name);
 142                }
 143                break;
 144
 145        case OCF_WRITE_AUTH_ENABLE:
 146                sent = hci_sent_cmd_data(hdev, OGF_HOST_CTL, OCF_WRITE_AUTH_ENABLE);
 147                if (!sent)
 148                        break;
 149
 150                status = *((__u8 *) skb->data);
 151                param  = *((__u8 *) sent);
 152
 153                if (!status) {
 154                        if (param == AUTH_ENABLED)
 155                                set_bit(HCI_AUTH, &hdev->flags);
 156                        else
 157                                clear_bit(HCI_AUTH, &hdev->flags);
 158                }
 159                hci_req_complete(hdev, status);
 160                break;
 161
 162        case OCF_WRITE_ENCRYPT_MODE:
 163                sent = hci_sent_cmd_data(hdev, OGF_HOST_CTL, OCF_WRITE_ENCRYPT_MODE);
 164                if (!sent)
 165                        break;
 166
 167                status = *((__u8 *) skb->data);
 168                param  = *((__u8 *) sent);
 169
 170                if (!status) {
 171                        if (param)
 172                                set_bit(HCI_ENCRYPT, &hdev->flags);
 173                        else
 174                                clear_bit(HCI_ENCRYPT, &hdev->flags);
 175                }
 176                hci_req_complete(hdev, status);
 177                break;
 178
 179        case OCF_WRITE_CA_TIMEOUT:
 180                status = *((__u8 *) skb->data);
 181                if (status) {
 182                        BT_DBG("%s OCF_WRITE_CA_TIMEOUT failed %d", hdev->name, status);
 183                } else {
 184                        BT_DBG("%s OCF_WRITE_CA_TIMEOUT succeseful", hdev->name);
 185                }
 186                break;
 187
 188        case OCF_WRITE_PG_TIMEOUT:
 189                status = *((__u8 *) skb->data);
 190                if (status) {
 191                        BT_DBG("%s OCF_WRITE_PG_TIMEOUT failed %d", hdev->name, status);
 192                } else {
 193                        BT_DBG("%s: OCF_WRITE_PG_TIMEOUT succeseful", hdev->name);
 194                }
 195                break;
 196
 197        case OCF_WRITE_SCAN_ENABLE:
 198                sent = hci_sent_cmd_data(hdev, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE);
 199                if (!sent)
 200                        break;
 201                status = *((__u8 *) skb->data);
 202                param  = *((__u8 *) sent);
 203
 204                BT_DBG("param 0x%x", param);
 205
 206                if (!status) {
 207                        clear_bit(HCI_PSCAN, &hdev->flags);
 208                        clear_bit(HCI_ISCAN, &hdev->flags);
 209                        if (param & SCAN_INQUIRY) 
 210                                set_bit(HCI_ISCAN, &hdev->flags);
 211
 212                        if (param & SCAN_PAGE) 
 213                                set_bit(HCI_PSCAN, &hdev->flags);
 214                }
 215                hci_req_complete(hdev, status);
 216                break;
 217
 218        case OCF_HOST_BUFFER_SIZE:
 219                status = *((__u8 *) skb->data);
 220                if (status) {
 221                        BT_DBG("%s OCF_BUFFER_SIZE failed %d", hdev->name, status);
 222                        hci_req_complete(hdev, status);
 223                }
 224                break;
 225
 226        default:
 227                BT_DBG("%s Command complete: ogf HOST_CTL ocf %x", hdev->name, ocf);
 228                break;
 229        };
 230}
 231
 232/* Command Complete OGF INFO_PARAM  */
 233static void hci_cc_info_param(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb)
 234{
 235        read_local_features_rp *lf;
 236        read_buffer_size_rp *bs;
 237        read_bd_addr_rp *ba;
 238
 239        BT_DBG("%s ocf 0x%x", hdev->name, ocf);
 240
 241        switch (ocf) {
 242        case OCF_READ_LOCAL_FEATURES:
 243                lf = (read_local_features_rp *) skb->data;
 244
 245                if (lf->status) {
 246                        BT_DBG("%s READ_LOCAL_FEATURES failed %d", hdev->name, lf->status);
 247                        break;
 248                }
 249
 250                memcpy(hdev->features, lf->features, sizeof(hdev->features));
 251
 252                /* Adjust default settings according to features 
 253                 * supported by device. */
 254                if (hdev->features[0] & LMP_3SLOT)
 255                        hdev->pkt_type |= (HCI_DM3 | HCI_DH3);
 256
 257                if (hdev->features[0] & LMP_5SLOT)
 258                        hdev->pkt_type |= (HCI_DM5 | HCI_DH5);
 259
 260                if (hdev->features[1] & LMP_HV2)
 261                        hdev->pkt_type |= (HCI_HV2);
 262
 263                if (hdev->features[1] & LMP_HV3)
 264                        hdev->pkt_type |= (HCI_HV3);
 265
 266                BT_DBG("%s: features 0x%x 0x%x 0x%x", hdev->name, lf->features[0], lf->features[1], lf->features[2]);
 267
 268                break;
 269
 270        case OCF_READ_BUFFER_SIZE:
 271                bs = (read_buffer_size_rp *) skb->data;
 272
 273                if (bs->status) {
 274                        BT_DBG("%s READ_BUFFER_SIZE failed %d", hdev->name, bs->status);
 275                        hci_req_complete(hdev, bs->status);
 276                        break;
 277                }
 278
 279                hdev->acl_mtu  = __le16_to_cpu(bs->acl_mtu);
 280                hdev->sco_mtu  = bs->sco_mtu ? bs->sco_mtu : 64;
 281                hdev->acl_pkts = hdev->acl_cnt = __le16_to_cpu(bs->acl_max_pkt);
 282                hdev->sco_pkts = hdev->sco_cnt = __le16_to_cpu(bs->sco_max_pkt);
 283
 284                BT_DBG("%s mtu: acl %d, sco %d max_pkt: acl %d, sco %d", hdev->name,
 285                    hdev->acl_mtu, hdev->sco_mtu, hdev->acl_pkts, hdev->sco_pkts);
 286                break;
 287
 288        case OCF_READ_BD_ADDR:
 289                ba = (read_bd_addr_rp *) skb->data;
 290
 291                if (!ba->status) {
 292                        bacpy(&hdev->bdaddr, &ba->bdaddr);
 293                } else {
 294                        BT_DBG("%s: READ_BD_ADDR failed %d", hdev->name, ba->status);
 295                }
 296
 297                hci_req_complete(hdev, ba->status);
 298                break;
 299
 300        default:
 301                BT_DBG("%s Command complete: ogf INFO_PARAM ocf %x", hdev->name, ocf);
 302                break;
 303        };
 304}
 305
 306/* Command Status OGF LINK_CTL  */
 307static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
 308{
 309        struct hci_conn *conn;
 310        create_conn_cp *cc = hci_sent_cmd_data(hdev, OGF_LINK_CTL, OCF_CREATE_CONN);
 311
 312        if (!cc)
 313                return;
 314
 315        hci_dev_lock(hdev);
 316        
 317        conn = conn_hash_lookup_ba(hdev, ACL_LINK, &cc->bdaddr);
 318
 319        BT_DBG("%s status 0x%x bdaddr %s conn %p", hdev->name, 
 320                        status, batostr(&cc->bdaddr), conn);
 321
 322        if (status) {
 323                if (conn && conn->state == BT_CONNECT) {
 324                        conn->state = BT_CLOSED;
 325                        hci_proto_connect_cfm(conn, status);
 326                        hci_conn_del(conn);
 327                }
 328        } else {
 329                if (!conn) {
 330                        conn = hci_conn_add(hdev, ACL_LINK, &cc->bdaddr);
 331                        if (conn) {
 332                                conn->out = 1;
 333                                conn->link_mode |= HCI_LM_MASTER;
 334                        } else
 335                                BT_ERR("No memmory for new connection");
 336                }
 337        }
 338
 339        hci_dev_unlock(hdev);
 340}
 341
 342static void hci_cs_link_ctl(struct hci_dev *hdev, __u16 ocf, __u8 status)
 343{
 344        BT_DBG("%s ocf 0x%x", hdev->name, ocf);
 345
 346        switch (ocf) {
 347        case OCF_CREATE_CONN:
 348                hci_cs_create_conn(hdev, status);
 349                break;
 350
 351        case OCF_ADD_SCO:
 352                if (status) {
 353                        struct hci_conn *acl, *sco;
 354                        add_sco_cp *cp = hci_sent_cmd_data(hdev, 
 355                                                OGF_LINK_CTL, OCF_ADD_SCO);
 356                        __u16 handle;
 357
 358                        if (!cp)
 359                                break;
 360
 361                        handle = __le16_to_cpu(cp->handle);
 362
 363                        BT_DBG("%s Add SCO error: handle %d status 0x%x", hdev->name, handle, status);
 364
 365                        hci_dev_lock(hdev);
 366        
 367                        acl = conn_hash_lookup_handle(hdev, handle);
 368                        if (acl && (sco = acl->link)) {
 369                                sco->state = BT_CLOSED;
 370                                hci_proto_connect_cfm(sco, status);
 371                                hci_conn_del(sco);
 372                        }
 373
 374                        hci_dev_unlock(hdev);
 375                }
 376                break;
 377
 378        case OCF_INQUIRY:
 379                if (status) {
 380                        BT_DBG("%s Inquiry error: status 0x%x", hdev->name, status);
 381                        hci_req_complete(hdev, status);
 382                } else {
 383                        set_bit(HCI_INQUIRY, &hdev->flags);
 384                }
 385                break;
 386
 387        default:
 388                BT_DBG("%s Command status: ogf LINK_CTL ocf %x status %d", 
 389                        hdev->name, ocf, status);
 390                break;
 391        };
 392}
 393
 394/* Command Status OGF LINK_POLICY */
 395static void hci_cs_link_policy(struct hci_dev *hdev, __u16 ocf, __u8 status)
 396{
 397        BT_DBG("%s ocf 0x%x", hdev->name, ocf);
 398
 399        switch (ocf) {
 400        default:
 401                BT_DBG("%s Command status: ogf HOST_POLICY ocf %x", hdev->name, ocf);
 402                break;
 403        };
 404}
 405
 406/* Command Status OGF HOST_CTL */
 407static void hci_cs_host_ctl(struct hci_dev *hdev, __u16 ocf, __u8 status)
 408{
 409        BT_DBG("%s ocf 0x%x", hdev->name, ocf);
 410
 411        switch (ocf) {
 412        default:
 413                BT_DBG("%s Command status: ogf HOST_CTL ocf %x", hdev->name, ocf);
 414                break;
 415        };
 416}
 417
 418/* Command Status OGF INFO_PARAM  */
 419static void hci_cs_info_param(struct hci_dev *hdev, __u16 ocf, __u8 status)
 420{
 421        BT_DBG("%s: hci_cs_info_param: ocf 0x%x", hdev->name, ocf);
 422
 423        switch (ocf) {
 424        default:
 425                BT_DBG("%s Command status: ogf INFO_PARAM ocf %x", hdev->name, ocf);
 426                break;
 427        };
 428}
 429
 430/* Inquiry Complete */
 431static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
 432{
 433        __u8 status = *((__u8 *) skb->data);
 434
 435        BT_DBG("%s status %d", hdev->name, status);
 436
 437        clear_bit(HCI_INQUIRY, &hdev->flags);
 438        hci_req_complete(hdev, status);
 439}
 440
 441/* Inquiry Result */
 442static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb)
 443{
 444        inquiry_info *info = (inquiry_info *) (skb->data + 1);
 445        int num_rsp = *((__u8 *) skb->data);
 446
 447        BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
 448
 449        hci_dev_lock(hdev);
 450        for (; num_rsp; num_rsp--)
 451                inquiry_cache_update(hdev, info++);
 452        hci_dev_unlock(hdev);
 453}
 454
 455/* Inquiry Result With RSSI */
 456static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct sk_buff *skb)
 457{
 458        inquiry_info_with_rssi *info = (inquiry_info_with_rssi *) (skb->data + 1);
 459        int num_rsp = *((__u8 *) skb->data);
 460
 461        BT_DBG("%s num_rsp %d", hdev->name, num_rsp);
 462
 463        hci_dev_lock(hdev);
 464        for (; num_rsp; num_rsp--) {
 465                inquiry_info tmp;
 466                bacpy(&tmp.bdaddr, &info->bdaddr);
 467                tmp.pscan_rep_mode    = info->pscan_rep_mode;
 468                tmp.pscan_period_mode = info->pscan_period_mode;
 469                tmp.pscan_mode        = 0x00;
 470                memcpy(tmp.dev_class, &info->dev_class, 3);
 471                tmp.clock_offset      = info->clock_offset;
 472                info++;
 473                inquiry_cache_update(hdev, &tmp);
 474        }
 475        hci_dev_unlock(hdev);
 476}
 477
 478/* Connect Request */
 479static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
 480{
 481        evt_conn_request *cr = (evt_conn_request *) skb->data;
 482        int mask = hdev->link_mode;
 483
 484        BT_DBG("%s Connection request: %s type 0x%x", hdev->name,
 485                        batostr(&cr->bdaddr), cr->link_type);
 486
 487        mask |= hci_proto_connect_ind(hdev, &cr->bdaddr, cr->link_type);
 488
 489        if (mask & HCI_LM_ACCEPT) {
 490                /* Connection accepted */
 491                struct hci_conn *conn;
 492                accept_conn_req_cp ac;
 493
 494                hci_dev_lock(hdev);
 495                conn = conn_hash_lookup_ba(hdev, cr->link_type, &cr->bdaddr);
 496                if (!conn) {
 497                        if (!(conn = hci_conn_add(hdev, cr->link_type, &cr->bdaddr))) {
 498                                BT_ERR("No memmory for new connection");
 499                                hci_dev_unlock(hdev);
 500                                return;
 501                        }
 502                }
 503                conn->state = BT_CONNECT;
 504                hci_dev_unlock(hdev);
 505
 506                bacpy(&ac.bdaddr, &cr->bdaddr);
 507        
 508                if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER))
 509                        ac.role = 0x00; /* Become master */
 510                else
 511                        ac.role = 0x01; /* Remain slave */
 512
 513                hci_send_cmd(hdev, OGF_LINK_CTL, OCF_ACCEPT_CONN_REQ, 
 514                                ACCEPT_CONN_REQ_CP_SIZE, &ac);
 515        } else {
 516                /* Connection rejected */
 517                reject_conn_req_cp rc;
 518
 519                bacpy(&rc.bdaddr, &cr->bdaddr);
 520                rc.reason = 0x0f;
 521                hci_send_cmd(hdev, OGF_LINK_CTL, OCF_REJECT_CONN_REQ,
 522                                REJECT_CONN_REQ_CP_SIZE, &rc);
 523        }
 524}
 525
 526/* Connect Complete */
 527static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
 528{
 529        evt_conn_complete *cc = (evt_conn_complete *) skb->data;
 530        struct hci_conn *conn = NULL;
 531
 532        BT_DBG("%s", hdev->name);
 533
 534        hci_dev_lock(hdev);
 535        
 536        conn = conn_hash_lookup_ba(hdev, cc->link_type, &cc->bdaddr);
 537        if (!conn) {
 538                hci_dev_unlock(hdev);
 539                return;
 540        }
 541
 542        if (!cc->status) {
 543                conn->handle = __le16_to_cpu(cc->handle);
 544                conn->state  = BT_CONNECTED;
 545
 546                if (test_bit(HCI_AUTH, &hdev->flags))
 547                        conn->link_mode |= HCI_LM_AUTH;
 548                
 549                if (test_bit(HCI_ENCRYPT, &hdev->flags))
 550                        conn->link_mode |= HCI_LM_ENCRYPT;
 551
 552
 553                /* Set link policy */
 554                if (conn->type == ACL_LINK && hdev->link_policy) {
 555                        write_link_policy_cp lp;
 556                        lp.handle = cc->handle;
 557                        lp.policy = __cpu_to_le16(hdev->link_policy);
 558                        hci_send_cmd(hdev, OGF_LINK_POLICY, OCF_WRITE_LINK_POLICY,
 559                                WRITE_LINK_POLICY_CP_SIZE, &lp);
 560                }
 561
 562                /* Set packet type for incomming connection */
 563                if (!conn->out) {
 564                        change_conn_ptype_cp cp;
 565                        cp.handle = cc->handle;
 566                        cp.pkt_type = (conn->type == ACL_LINK) ? 
 567                                __cpu_to_le16(hdev->pkt_type & ACL_PTYPE_MASK):
 568                                __cpu_to_le16(hdev->pkt_type & SCO_PTYPE_MASK);
 569
 570                        hci_send_cmd(hdev, OGF_LINK_CTL, OCF_CHANGE_CONN_PTYPE,
 571                                CHANGE_CONN_PTYPE_CP_SIZE, &cp);
 572                }
 573        } else
 574                conn->state = BT_CLOSED;
 575
 576        if (conn->type == ACL_LINK) {
 577                struct hci_conn *sco = conn->link;
 578                if (sco) {
 579                        if (!cc->status)
 580                                hci_add_sco(sco, conn->handle);
 581                        else {
 582                                hci_proto_connect_cfm(sco, cc->status);
 583                                hci_conn_del(sco);
 584                        }
 585                }
 586        }
 587
 588        hci_proto_connect_cfm(conn, cc->status);
 589        if (cc->status)
 590                hci_conn_del(conn);
 591
 592        hci_dev_unlock(hdev);
 593}
 594
 595/* Disconnect Complete */
 596static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
 597{
 598        evt_disconn_complete *dc = (evt_disconn_complete *) skb->data;
 599        struct hci_conn *conn = NULL;
 600        __u16 handle = __le16_to_cpu(dc->handle);
 601
 602        BT_DBG("%s status %d", hdev->name, dc->status);
 603
 604        if (dc->status)
 605                return;
 606
 607        hci_dev_lock(hdev);
 608        
 609        conn = conn_hash_lookup_handle(hdev, handle);
 610        if (conn) {
 611                conn->state = BT_CLOSED;
 612                hci_proto_disconn_ind(conn, dc->reason);
 613                hci_conn_del(conn);
 614        }
 615
 616        hci_dev_unlock(hdev);
 617}
 618
 619/* Number of completed packets */
 620static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *skb)
 621{
 622        evt_num_comp_pkts *nc = (evt_num_comp_pkts *) skb->data;
 623        __u16 *ptr;
 624        int i;
 625
 626        skb_pull(skb, EVT_NUM_COMP_PKTS_SIZE);
 627
 628        BT_DBG("%s num_hndl %d", hdev->name, nc->num_hndl);
 629
 630        if (skb->len < nc->num_hndl * 4) {
 631                BT_DBG("%s bad parameters", hdev->name);
 632                return;
 633        }
 634
 635        tasklet_disable(&hdev->tx_task);
 636
 637        for (i = 0, ptr = (__u16 *) skb->data; i < nc->num_hndl; i++) {
 638                struct hci_conn *conn;
 639                __u16  handle, count;
 640
 641                handle = __le16_to_cpu(get_unaligned(ptr++));
 642                count  = __le16_to_cpu(get_unaligned(ptr++));
 643
 644                conn = conn_hash_lookup_handle(hdev, handle);
 645                if (conn) {
 646                        conn->sent -= count;
 647
 648                        if (conn->type == SCO_LINK) {
 649                                if ((hdev->sco_cnt += count) > hdev->sco_pkts)
 650                                        hdev->sco_cnt = hdev->sco_pkts;
 651                        } else {
 652                                if ((hdev->acl_cnt += count) > hdev->acl_pkts)
 653                                        hdev->acl_cnt = hdev->acl_pkts;
 654                        }
 655                }
 656        }
 657        hci_sched_tx(hdev);
 658
 659        tasklet_enable(&hdev->tx_task);
 660}
 661
 662/* Role Change */
 663static inline void hci_role_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
 664{
 665        evt_role_change *rc = (evt_role_change *) skb->data;
 666        struct hci_conn *conn = NULL;
 667
 668        BT_DBG("%s status %d", hdev->name, rc->status);
 669
 670        if (rc->status)
 671                return;
 672
 673        hci_dev_lock(hdev);
 674        
 675        conn = conn_hash_lookup_ba(hdev, ACL_LINK, &rc->bdaddr);
 676        if (conn) {
 677                if (rc->role)
 678                        conn->link_mode &= ~HCI_LM_MASTER;
 679                else 
 680                        conn->link_mode |= HCI_LM_MASTER;
 681        }
 682
 683        hci_dev_unlock(hdev);
 684}
 685
 686/* Authentication Complete */
 687static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
 688{
 689        evt_auth_complete *ac = (evt_auth_complete *) skb->data;
 690        struct hci_conn *conn = NULL;
 691        __u16 handle = __le16_to_cpu(ac->handle);
 692
 693        BT_DBG("%s status %d", hdev->name, ac->status);
 694
 695        hci_dev_lock(hdev);
 696        
 697        conn = conn_hash_lookup_handle(hdev, handle);
 698        if (conn) {
 699                if (!ac->status)
 700                        conn->link_mode |= HCI_LM_AUTH;
 701                clear_bit(HCI_CONN_AUTH_PEND, &conn->pend);
 702
 703                hci_proto_auth_cfm(conn, ac->status);
 704                
 705                if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) {
 706                        if (!ac->status) {
 707                                set_conn_encrypt_cp ce;
 708                                ce.handle  = __cpu_to_le16(conn->handle);
 709                                ce.encrypt = 1;
 710                                hci_send_cmd(conn->hdev, OGF_LINK_CTL,
 711                                                OCF_SET_CONN_ENCRYPT,
 712                                                SET_CONN_ENCRYPT_CP_SIZE, &ce);
 713                        } else {
 714                                clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend);
 715                                hci_proto_encrypt_cfm(conn, ac->status);
 716                        }
 717                }
 718        }
 719
 720        hci_dev_unlock(hdev);
 721}
 722
 723/* Encryption Change */
 724static inline void hci_encrypt_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
 725{
 726        evt_encrypt_change *ec = (evt_encrypt_change *) skb->data;
 727        struct hci_conn *conn = NULL;
 728        __u16 handle = __le16_to_cpu(ec->handle);
 729
 730        BT_DBG("%s status %d", hdev->name, ec->status);
 731
 732        hci_dev_lock(hdev);
 733        
 734        conn = conn_hash_lookup_handle(hdev, handle);
 735        if (conn) {
 736                if (!ec->status) {
 737                        if (ec->encrypt)
 738                                conn->link_mode |= HCI_LM_ENCRYPT;
 739                        else
 740                                conn->link_mode &= ~HCI_LM_ENCRYPT;
 741                }
 742                clear_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend);
 743                
 744                hci_proto_encrypt_cfm(conn, ec->status);
 745        }
 746
 747        hci_dev_unlock(hdev);
 748}
 749
 750void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb)
 751{
 752        hci_event_hdr *he = (hci_event_hdr *) skb->data;
 753        evt_cmd_status *cs;
 754        evt_cmd_complete *ec;
 755        __u16 opcode, ocf, ogf;
 756
 757        skb_pull(skb, HCI_EVENT_HDR_SIZE);
 758
 759        BT_DBG("%s evt 0x%x", hdev->name, he->evt);
 760
 761        switch (he->evt) {
 762        case EVT_NUM_COMP_PKTS:
 763                hci_num_comp_pkts_evt(hdev, skb);
 764                break;
 765
 766        case EVT_INQUIRY_COMPLETE:
 767                hci_inquiry_complete_evt(hdev, skb);
 768                break;
 769
 770        case EVT_INQUIRY_RESULT:
 771                hci_inquiry_result_evt(hdev, skb);
 772                break;
 773
 774        case EVT_INQUIRY_RESULT_WITH_RSSI:
 775                hci_inquiry_result_with_rssi_evt(hdev, skb);
 776                break;
 777
 778        case EVT_CONN_REQUEST:
 779                hci_conn_request_evt(hdev, skb);
 780                break;
 781
 782        case EVT_CONN_COMPLETE:
 783                hci_conn_complete_evt(hdev, skb);
 784                break;
 785
 786        case EVT_DISCONN_COMPLETE:
 787                hci_disconn_complete_evt(hdev, skb);
 788                break;
 789
 790        case EVT_ROLE_CHANGE:
 791                hci_role_change_evt(hdev, skb);
 792                break;
 793
 794        case EVT_AUTH_COMPLETE:
 795                hci_auth_complete_evt(hdev, skb);
 796                break;
 797
 798        case EVT_ENCRYPT_CHANGE:
 799                hci_encrypt_change_evt(hdev, skb);
 800                break;
 801
 802        case EVT_CMD_STATUS:
 803                cs = (evt_cmd_status *) skb->data;
 804                skb_pull(skb, EVT_CMD_STATUS_SIZE);
 805                                
 806                opcode = __le16_to_cpu(cs->opcode);
 807                ogf = cmd_opcode_ogf(opcode);
 808                ocf = cmd_opcode_ocf(opcode);
 809
 810                switch (ogf) {
 811                case OGF_INFO_PARAM:
 812                        hci_cs_info_param(hdev, ocf, cs->status);
 813                        break;
 814
 815                case OGF_HOST_CTL:
 816                        hci_cs_host_ctl(hdev, ocf, cs->status);
 817                        break;
 818
 819                case OGF_LINK_CTL:
 820                        hci_cs_link_ctl(hdev, ocf, cs->status);
 821                        break;
 822
 823                case OGF_LINK_POLICY:
 824                        hci_cs_link_policy(hdev, ocf, cs->status);
 825                        break;
 826
 827                default:
 828                        BT_DBG("%s Command Status OGF %x", hdev->name, ogf);
 829                        break;
 830                };
 831
 832                if (cs->ncmd) {
 833                        atomic_set(&hdev->cmd_cnt, 1);
 834                        if (!skb_queue_empty(&hdev->cmd_q))
 835                                hci_sched_cmd(hdev);
 836                }
 837                break;
 838
 839        case EVT_CMD_COMPLETE:
 840                ec = (evt_cmd_complete *) skb->data;
 841                skb_pull(skb, EVT_CMD_COMPLETE_SIZE);
 842
 843                opcode = __le16_to_cpu(ec->opcode);
 844                ogf = cmd_opcode_ogf(opcode);
 845                ocf = cmd_opcode_ocf(opcode);
 846
 847                switch (ogf) {
 848                case OGF_INFO_PARAM:
 849                        hci_cc_info_param(hdev, ocf, skb);
 850                        break;
 851
 852                case OGF_HOST_CTL:
 853                        hci_cc_host_ctl(hdev, ocf, skb);
 854                        break;
 855
 856                case OGF_LINK_CTL:
 857                        hci_cc_link_ctl(hdev, ocf, skb);
 858                        break;
 859
 860                case OGF_LINK_POLICY:
 861                        hci_cc_link_policy(hdev, ocf, skb);
 862                        break;
 863
 864                default:
 865                        BT_DBG("%s Command Completed OGF %x", hdev->name, ogf);
 866                        break;
 867                };
 868
 869                if (ec->ncmd) {
 870                        atomic_set(&hdev->cmd_cnt, 1);
 871                        if (!skb_queue_empty(&hdev->cmd_q))
 872                                hci_sched_cmd(hdev);
 873                }
 874                break;
 875        };
 876
 877        kfree_skb(skb);
 878        hdev->stat.evt_rx++;
 879}
 880
 881/* General internal stack event */
 882void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data)
 883{
 884        hci_event_hdr *eh;
 885        evt_stack_internal *si;
 886        struct sk_buff *skb;
 887        int size;
 888        void *ptr;
 889
 890        size = HCI_EVENT_HDR_SIZE + EVT_STACK_INTERNAL_SIZE + dlen;
 891        skb  = bluez_skb_alloc(size, GFP_ATOMIC);
 892        if (!skb)
 893                return;
 894
 895        ptr = skb_put(skb, size);
 896
 897        eh = ptr;
 898        eh->evt  = EVT_STACK_INTERNAL;
 899        eh->plen = EVT_STACK_INTERNAL_SIZE + dlen;
 900        ptr += HCI_EVENT_HDR_SIZE;
 901
 902        si = ptr;
 903        si->type = type;
 904        memcpy(si->data, data, dlen);
 905        
 906        skb->pkt_type = HCI_EVENT_PKT;
 907        skb->dev = (void *) hdev;
 908        hci_send_to_sock(hdev, skb);
 909        kfree_skb(skb);
 910}
 911
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.