1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 BNEP implementation for Linux Bluetooth stack (BlueZ). 4 Copyright (C) 2001-2002 Inventel Systemes 5 Written 2001-2002 by 6 Clément Moreau <clement.moreau@inventel.fr> 7 David Libault <david.libault@inventel.fr> 8 9 Copyright (C) 2002 Maxim Krasnyansky <maxk@qualcomm.com> 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 #include <linux/module.h> 26 #include <linux/kthread.h> 27 #include <linux/file.h> 28 #include <linux/etherdevice.h> 29 #include <linux/unaligned.h> 30 31 #include <net/bluetooth/bluetooth.h> 32 #include <net/bluetooth/l2cap.h> 33 #include <net/bluetooth/hci_core.h> 34 35 #include "bnep.h" 36 37 #define VERSION "1.3" 38 39 static bool compress_src = true; 40 static bool compress_dst = true; 41 42 static LIST_HEAD(bnep_session_list); 43 static DECLARE_RWSEM(bnep_session_sem); 44 45 static struct bnep_session *__bnep_get_session(u8 *dst) 46 { 47 struct bnep_session *s; 48 49 BT_DBG(""); 50 51 list_for_each_entry(s, &bnep_session_list, list) 52 if (ether_addr_equal(dst, s->eh.h_source)) 53 return s; 54 55 return NULL; 56 } 57 58 static void __bnep_link_session(struct bnep_session *s) 59 { 60 list_add(&s->list, &bnep_session_list); 61 } 62 63 static void __bnep_unlink_session(struct bnep_session *s) 64 { 65 list_del(&s->list); 66 } 67 68 static int bnep_send(struct bnep_session *s, void *data, size_t len) 69 { 70 struct socket *sock = s->sock; 71 struct kvec iv = { data, len }; 72 73 return kernel_sendmsg(sock, &s->msg, &iv, 1, len); 74 } 75 76 static int bnep_send_rsp(struct bnep_session *s, u8 ctrl, u16 resp) 77 { 78 struct bnep_control_rsp rsp; 79 rsp.type = BNEP_CONTROL; 80 rsp.ctrl = ctrl; 81 rsp.resp = htons(resp); 82 return bnep_send(s, &rsp, sizeof(rsp)); 83 } 84 85 #ifdef CONFIG_BT_BNEP_PROTO_FILTER 86 static inline void bnep_set_default_proto_filter(struct bnep_session *s) 87 { 88 /* (IPv4, ARP) */ 89 s->proto_filter[0].start = ETH_P_IP; 90 s->proto_filter[0].end = ETH_P_ARP; 91 /* (RARP, AppleTalk) */ 92 s->proto_filter[1].start = ETH_P_RARP; 93 s->proto_filter[1].end = ETH_P_AARP; 94 /* (IPX, IPv6) */ 95 s->proto_filter[2].start = ETH_P_IPX; 96 s->proto_filter[2].end = ETH_P_IPV6; 97 } 98 #endif 99 100 static int bnep_ctrl_set_netfilter(struct bnep_session *s, __be16 *data, int len) 101 { 102 int n; 103 104 if (len < 2) 105 return -EILSEQ; 106 107 n = get_unaligned_be16(data); 108 data++; 109 len -= 2; 110 111 if (len < n) 112 return -EILSEQ; 113 114 BT_DBG("filter len %d", n); 115 116 #ifdef CONFIG_BT_BNEP_PROTO_FILTER 117 n /= 4; 118 if (n <= BNEP_MAX_PROTO_FILTERS) { 119 struct bnep_proto_filter *f = s->proto_filter; 120 int i; 121 122 for (i = 0; i < n; i++) { 123 f[i].start = get_unaligned_be16(data++); 124 f[i].end = get_unaligned_be16(data++); 125 126 BT_DBG("proto filter start %u end %u", 127 f[i].start, f[i].end); 128 } 129 130 if (i < BNEP_MAX_PROTO_FILTERS) 131 memset(f + i, 0, sizeof(*f)); 132 133 if (n == 0) 134 bnep_set_default_proto_filter(s); 135 136 bnep_send_rsp(s, BNEP_FILTER_NET_TYPE_RSP, BNEP_SUCCESS); 137 } else { 138 bnep_send_rsp(s, BNEP_FILTER_NET_TYPE_RSP, BNEP_FILTER_LIMIT_REACHED); 139 } 140 #else 141 bnep_send_rsp(s, BNEP_FILTER_NET_TYPE_RSP, BNEP_FILTER_UNSUPPORTED_REQ); 142 #endif 143 return 0; 144 } 145 146 static int bnep_ctrl_set_mcfilter(struct bnep_session *s, u8 *data, int len) 147 { 148 int n; 149 150 if (len < 2) 151 return -EILSEQ; 152 153 n = get_unaligned_be16(data); 154 data += 2; 155 len -= 2; 156 157 if (len < n) 158 return -EILSEQ; 159 160 BT_DBG("filter len %d", n); 161 162 #ifdef CONFIG_BT_BNEP_MC_FILTER 163 n /= (ETH_ALEN * 2); 164 165 if (n > 0) { 166 int i; 167 168 s->mc_filter = 0; 169 170 /* Always send broadcast */ 171 set_bit(bnep_mc_hash(s->dev->broadcast), (ulong *) &s->mc_filter); 172 173 /* Add address ranges to the multicast hash */ 174 for (; n > 0; n--) { 175 u8 a1[6], *a2; 176 177 memcpy(a1, data, ETH_ALEN); 178 data += ETH_ALEN; 179 a2 = data; 180 data += ETH_ALEN; 181 182 BT_DBG("mc filter %pMR -> %pMR", a1, a2); 183 184 /* Iterate from a1 to a2 */ 185 set_bit(bnep_mc_hash(a1), (ulong *) &s->mc_filter); 186 while (memcmp(a1, a2, 6) < 0 && s->mc_filter != ~0LL) { 187 /* Increment a1 */ 188 i = 5; 189 while (i >= 0 && ++a1[i--] == 0) 190 ; 191 192 set_bit(bnep_mc_hash(a1), (ulong *) &s->mc_filter); 193 } 194 } 195 } 196 197 BT_DBG("mc filter hash 0x%llx", s->mc_filter); 198 199 bnep_send_rsp(s, BNEP_FILTER_MULTI_ADDR_RSP, BNEP_SUCCESS); 200 #else 201 bnep_send_rsp(s, BNEP_FILTER_MULTI_ADDR_RSP, BNEP_FILTER_UNSUPPORTED_REQ); 202 #endif 203 return 0; 204 } 205 206 static int bnep_rx_control_cmd(struct bnep_session *s, u8 cmd, void *data, 207 int len) 208 { 209 int err = 0; 210 211 switch (cmd) { 212 case BNEP_CMD_NOT_UNDERSTOOD: 213 case BNEP_SETUP_CONN_RSP: 214 case BNEP_FILTER_NET_TYPE_RSP: 215 case BNEP_FILTER_MULTI_ADDR_RSP: 216 /* Ignore these for now */ 217 break; 218 219 case BNEP_FILTER_NET_TYPE_SET: 220 err = bnep_ctrl_set_netfilter(s, data, len); 221 break; 222 223 case BNEP_FILTER_MULTI_ADDR_SET: 224 err = bnep_ctrl_set_mcfilter(s, data, len); 225 break; 226 227 case BNEP_SETUP_CONN_REQ: 228 /* Successful response should be sent only once */ 229 if (test_bit(BNEP_SETUP_RESPONSE, &s->flags) && 230 !test_and_set_bit(BNEP_SETUP_RSP_SENT, &s->flags)) 231 err = bnep_send_rsp(s, BNEP_SETUP_CONN_RSP, 232 BNEP_SUCCESS); 233 else 234 err = bnep_send_rsp(s, BNEP_SETUP_CONN_RSP, 235 BNEP_CONN_NOT_ALLOWED); 236 break; 237 238 default: { 239 u8 pkt[3]; 240 pkt[0] = BNEP_CONTROL; 241 pkt[1] = BNEP_CMD_NOT_UNDERSTOOD; 242 pkt[2] = cmd; 243 err = bnep_send(s, pkt, sizeof(pkt)); 244 } 245 break; 246 } 247 248 return err; 249 } 250 251 static int bnep_rx_control(struct bnep_session *s, void *data, int len) 252 { 253 if (len < 1) 254 return -EILSEQ; 255 256 return bnep_rx_control_cmd(s, *(u8 *)data, data + 1, len - 1); 257 } 258 259 static int bnep_rx_extension(struct bnep_session *s, struct sk_buff *skb) 260 { 261 struct bnep_ext_hdr *h; 262 int err = 0; 263 264 do { 265 h = (void *) skb->data; 266 if (!skb_pull(skb, sizeof(*h))) { 267 err = -EILSEQ; 268 break; 269 } 270 271 BT_DBG("type 0x%x len %u", h->type, h->len); 272 273 if (skb->len < h->len) { 274 err = -EILSEQ; 275 break; 276 } 277 278 switch (h->type & BNEP_TYPE_MASK) { 279 case BNEP_EXT_CONTROL: 280 bnep_rx_control(s, skb->data, h->len); 281 break; 282 283 default: 284 /* Unknown extension, skip it. */ 285 break; 286 } 287 288 if (!skb_pull(skb, h->len)) { 289 err = -EILSEQ; 290 break; 291 } 292 } while (!err && (h->type & BNEP_EXT_HEADER)); 293 294 return err; 295 } 296 297 static u8 __bnep_rx_hlen[] = { 298 ETH_HLEN, /* BNEP_GENERAL */ 299 0, /* BNEP_CONTROL */ 300 2, /* BNEP_COMPRESSED */ 301 ETH_ALEN + 2, /* BNEP_COMPRESSED_SRC_ONLY */ 302 ETH_ALEN + 2 /* BNEP_COMPRESSED_DST_ONLY */ 303 }; 304 305 static int bnep_rx_frame(struct bnep_session *s, struct sk_buff *skb) 306 { 307 struct net_device *dev = s->dev; 308 struct sk_buff *nskb; 309 u8 *data; 310 u8 type, ctrl_type; 311 312 dev->stats.rx_bytes += skb->len; 313 314 data = skb_pull_data(skb, sizeof(type)); 315 if (!data) 316 goto badframe; 317 type = *data; 318 319 if ((type & BNEP_TYPE_MASK) >= sizeof(__bnep_rx_hlen)) 320 goto badframe; 321 322 if ((type & BNEP_TYPE_MASK) == BNEP_CONTROL) { 323 data = skb_pull_data(skb, sizeof(ctrl_type)); 324 if (!data) 325 goto badframe; 326 ctrl_type = *data; 327 328 if (bnep_rx_control_cmd(s, ctrl_type, skb->data, skb->len) < 0) { 329 dev->stats.tx_errors++; 330 kfree_skb(skb); 331 return 0; 332 } 333 334 if (!(type & BNEP_EXT_HEADER)) { 335 kfree_skb(skb); 336 return 0; 337 } 338 339 /* Verify and pull ctrl message since it's already processed */ 340 switch (ctrl_type) { 341 case BNEP_SETUP_CONN_REQ: { 342 u8 uuid_size; 343 344 /* Pull uuid_size and the dst/src service UUIDs. */ 345 data = skb_pull_data(skb, sizeof(uuid_size)); 346 if (!data) 347 goto badframe; 348 uuid_size = *data; 349 if (!skb_pull(skb, uuid_size + uuid_size)) 350 goto badframe; 351 break; 352 } 353 case BNEP_FILTER_MULTI_ADDR_SET: 354 case BNEP_FILTER_NET_TYPE_SET: 355 /* Pull: len (2 b), data (len bytes) */ 356 data = skb_pull_data(skb, sizeof(u16)); 357 if (!data) 358 goto badframe; 359 if (!skb_pull(skb, get_unaligned_be16(data))) 360 goto badframe; 361 break; 362 default: 363 kfree_skb(skb); 364 return 0; 365 } 366 } else { 367 skb_reset_mac_header(skb); 368 369 /* Verify and pull out header */ 370 if (!skb_pull(skb, __bnep_rx_hlen[type & BNEP_TYPE_MASK])) 371 goto badframe; 372 373 s->eh.h_proto = get_unaligned((__be16 *) (skb->data - 2)); 374 } 375 376 if (type & BNEP_EXT_HEADER) { 377 if (bnep_rx_extension(s, skb) < 0) 378 goto badframe; 379 } 380 381 if ((type & BNEP_TYPE_MASK) == BNEP_CONTROL) { 382 kfree_skb(skb); 383 return 0; 384 } 385 386 /* Strip 802.1p header */ 387 if (ntohs(s->eh.h_proto) == ETH_P_8021Q) { 388 if (!skb_pull(skb, 4)) 389 goto badframe; 390 s->eh.h_proto = get_unaligned((__be16 *) (skb->data - 2)); 391 } 392 393 /* We have to alloc new skb and copy data here :(. Because original skb 394 * may not be modified and because of the alignment requirements. */ 395 nskb = alloc_skb(2 + ETH_HLEN + skb->len, GFP_KERNEL); 396 if (!nskb) { 397 dev->stats.rx_dropped++; 398 kfree_skb(skb); 399 return -ENOMEM; 400 } 401 skb_reserve(nskb, 2); 402 403 /* Decompress header and construct ether frame */ 404 switch (type & BNEP_TYPE_MASK) { 405 case BNEP_COMPRESSED: 406 __skb_put_data(nskb, &s->eh, ETH_HLEN); 407 break; 408 409 case BNEP_COMPRESSED_SRC_ONLY: 410 __skb_put_data(nskb, s->eh.h_dest, ETH_ALEN); 411 __skb_put_data(nskb, skb_mac_header(skb), ETH_ALEN); 412 put_unaligned(s->eh.h_proto, (__be16 *) __skb_put(nskb, 2)); 413 break; 414 415 case BNEP_COMPRESSED_DST_ONLY: 416 __skb_put_data(nskb, skb_mac_header(skb), ETH_ALEN); 417 __skb_put_data(nskb, s->eh.h_source, ETH_ALEN); 418 put_unaligned(s->eh.h_proto, (__be16 *)__skb_put(nskb, 2)); 419 break; 420 421 case BNEP_GENERAL: 422 __skb_put_data(nskb, skb_mac_header(skb), ETH_ALEN * 2); 423 put_unaligned(s->eh.h_proto, (__be16 *) __skb_put(nskb, 2)); 424 break; 425 } 426 427 skb_copy_from_linear_data(skb, __skb_put(nskb, skb->len), skb->len); 428 kfree_skb(skb); 429 430 dev->stats.rx_packets++; 431 nskb->ip_summed = CHECKSUM_NONE; 432 nskb->protocol = eth_type_trans(nskb, dev); 433 netif_rx(nskb); 434 return 0; 435 436 badframe: 437 dev->stats.rx_errors++; 438 kfree_skb(skb); 439 return 0; 440 } 441 442 static u8 __bnep_tx_types[] = { 443 BNEP_GENERAL, 444 BNEP_COMPRESSED_SRC_ONLY, 445 BNEP_COMPRESSED_DST_ONLY, 446 BNEP_COMPRESSED 447 }; 448 449 static int bnep_tx_frame(struct bnep_session *s, struct sk_buff *skb) 450 { 451 struct ethhdr *eh = (void *) skb->data; 452 struct socket *sock = s->sock; 453 struct kvec iv[3]; 454 int len = 0, il = 0; 455 u8 type = 0; 456 457 BT_DBG("skb %p dev %p type %u", skb, skb->dev, skb->pkt_type); 458 459 if (!skb->dev) { 460 /* Control frame sent by us */ 461 goto send; 462 } 463 464 if (skb->len < ETH_HLEN) { 465 kfree_skb(skb); 466 return 0; 467 } 468 469 iv[il++] = (struct kvec) { &type, 1 }; 470 len++; 471 472 if (compress_src && ether_addr_equal(eh->h_dest, s->eh.h_source)) 473 type |= 0x01; 474 475 if (compress_dst && ether_addr_equal(eh->h_source, s->eh.h_dest)) 476 type |= 0x02; 477 478 if (type) 479 skb_pull(skb, ETH_ALEN * 2); 480 481 type = __bnep_tx_types[type]; 482 switch (type) { 483 case BNEP_COMPRESSED_SRC_ONLY: 484 iv[il++] = (struct kvec) { eh->h_source, ETH_ALEN }; 485 len += ETH_ALEN; 486 break; 487 488 case BNEP_COMPRESSED_DST_ONLY: 489 iv[il++] = (struct kvec) { eh->h_dest, ETH_ALEN }; 490 len += ETH_ALEN; 491 break; 492 } 493 494 send: 495 iv[il++] = (struct kvec) { skb->data, skb->len }; 496 len += skb->len; 497 498 /* FIXME: linearize skb */ 499 { 500 len = kernel_sendmsg(sock, &s->msg, iv, il, len); 501 } 502 kfree_skb(skb); 503 504 if (len > 0) { 505 s->dev->stats.tx_bytes += len; 506 s->dev->stats.tx_packets++; 507 return 0; 508 } 509 510 return len; 511 } 512 513 static int bnep_session(void *arg) 514 { 515 struct bnep_session *s = arg; 516 struct net_device *dev = s->dev; 517 struct sock *sk = s->sock->sk; 518 struct sk_buff *skb; 519 DEFINE_WAIT_FUNC(wait, woken_wake_function); 520 521 BT_DBG(""); 522 523 set_user_nice(current, -15); 524 525 add_wait_queue(sk_sleep(sk), &wait); 526 while (1) { 527 if (atomic_read(&s->terminate)) 528 break; 529 /* RX */ 530 while ((skb = skb_dequeue(&sk->sk_receive_queue))) { 531 skb_orphan(skb); 532 if (!skb_linearize(skb)) 533 bnep_rx_frame(s, skb); 534 else 535 kfree_skb(skb); 536 } 537 538 if (sk->sk_state != BT_CONNECTED) 539 break; 540 541 /* TX */ 542 while ((skb = skb_dequeue(&sk->sk_write_queue))) 543 if (bnep_tx_frame(s, skb)) 544 break; 545 netif_wake_queue(dev); 546 547 /* 548 * wait_woken() performs the necessary memory barriers 549 * for us; see the header comment for this primitive. 550 */ 551 wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT); 552 } 553 remove_wait_queue(sk_sleep(sk), &wait); 554 555 /* Cleanup session */ 556 down_write(&bnep_session_sem); 557 558 /* Delete network device */ 559 unregister_netdev(dev); 560 561 /* Wakeup user-space polling for socket errors */ 562 s->sock->sk->sk_err = EUNATCH; 563 564 wake_up_interruptible(sk_sleep(s->sock->sk)); 565 566 /* Release the socket */ 567 fput(s->sock->file); 568 569 __bnep_unlink_session(s); 570 571 up_write(&bnep_session_sem); 572 free_netdev(dev); 573 module_put_and_kthread_exit(0); 574 return 0; 575 } 576 577 static struct l2cap_conn *bnep_get_conn(struct bnep_session *session) 578 { 579 struct l2cap_chan *chan = l2cap_pi(session->sock->sk)->chan; 580 struct l2cap_conn *conn; 581 582 l2cap_chan_lock(chan); 583 conn = chan->conn; 584 if (conn) 585 l2cap_conn_get(conn); 586 l2cap_chan_unlock(chan); 587 588 return conn; 589 } 590 591 static const struct device_type bnep_type = { 592 .name = "bluetooth", 593 }; 594 595 int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) 596 { 597 u32 valid_flags = BIT(BNEP_SETUP_RESPONSE); 598 struct net_device *dev; 599 struct bnep_session *s, *ss; 600 struct l2cap_conn *conn = NULL; 601 u8 dst[ETH_ALEN], src[ETH_ALEN]; 602 int err; 603 604 BT_DBG(""); 605 606 if (!l2cap_is_socket(sock)) 607 return -EBADFD; 608 609 if (req->flags & ~valid_flags) 610 return -EINVAL; 611 612 baswap((void *) dst, &l2cap_pi(sock->sk)->chan->dst); 613 baswap((void *) src, &l2cap_pi(sock->sk)->chan->src); 614 615 /* session struct allocated as private part of net_device */ 616 dev = alloc_netdev(sizeof(struct bnep_session), 617 (*req->device) ? req->device : "bnep%d", 618 NET_NAME_UNKNOWN, 619 bnep_net_setup); 620 if (!dev) 621 return -ENOMEM; 622 623 down_write(&bnep_session_sem); 624 625 ss = __bnep_get_session(dst); 626 if (ss && ss->state == BT_CONNECTED) { 627 err = -EEXIST; 628 goto failed; 629 } 630 631 s = netdev_priv(dev); 632 633 /* This is rx header therefore addresses are swapped. 634 * ie. eh.h_dest is our local address. */ 635 memcpy(s->eh.h_dest, &src, ETH_ALEN); 636 memcpy(s->eh.h_source, &dst, ETH_ALEN); 637 eth_hw_addr_set(dev, s->eh.h_dest); 638 639 s->dev = dev; 640 s->sock = sock; 641 s->role = req->role; 642 s->state = BT_CONNECTED; 643 s->flags = req->flags; 644 645 s->msg.msg_flags = MSG_NOSIGNAL; 646 647 #ifdef CONFIG_BT_BNEP_MC_FILTER 648 /* Set default mc filter to not filter out any mc addresses 649 * as defined in the BNEP specification (revision 0.95a) 650 * http://grouper.ieee.org/groups/802/15/Bluetooth/BNEP.pdf 651 */ 652 s->mc_filter = ~0LL; 653 #endif 654 655 #ifdef CONFIG_BT_BNEP_PROTO_FILTER 656 /* Set default protocol filter */ 657 bnep_set_default_proto_filter(s); 658 #endif 659 660 conn = bnep_get_conn(s); 661 if (!conn) { 662 err = -ENOTCONN; 663 goto failed; 664 } 665 666 SET_NETDEV_DEV(dev, &conn->hcon->dev); 667 SET_NETDEV_DEVTYPE(dev, &bnep_type); 668 669 err = register_netdev(dev); 670 l2cap_conn_put(conn); 671 conn = NULL; 672 if (err) 673 goto failed; 674 675 __bnep_link_session(s); 676 677 __module_get(THIS_MODULE); 678 s->task = kthread_run(bnep_session, s, "kbnepd %s", dev->name); 679 if (IS_ERR(s->task)) { 680 /* Session thread start failed, gotta cleanup. */ 681 module_put(THIS_MODULE); 682 unregister_netdev(dev); 683 __bnep_unlink_session(s); 684 err = PTR_ERR(s->task); 685 goto failed; 686 } 687 688 strcpy(req->device, dev->name); 689 up_write(&bnep_session_sem); 690 return 0; 691 692 failed: 693 if (conn) 694 l2cap_conn_put(conn); 695 up_write(&bnep_session_sem); 696 free_netdev(dev); 697 return err; 698 } 699 700 int bnep_del_connection(struct bnep_conndel_req *req) 701 { 702 u32 valid_flags = 0; 703 struct bnep_session *s; 704 int err = 0; 705 706 BT_DBG(""); 707 708 if (req->flags & ~valid_flags) 709 return -EINVAL; 710 711 down_read(&bnep_session_sem); 712 713 s = __bnep_get_session(req->dst); 714 if (s) { 715 atomic_inc(&s->terminate); 716 wake_up_interruptible(sk_sleep(s->sock->sk)); 717 } else 718 err = -ENOENT; 719 720 up_read(&bnep_session_sem); 721 return err; 722 } 723 724 static void __bnep_copy_ci(struct bnep_conninfo *ci, struct bnep_session *s) 725 { 726 u32 valid_flags = BIT(BNEP_SETUP_RESPONSE); 727 728 memset(ci, 0, sizeof(*ci)); 729 memcpy(ci->dst, s->eh.h_source, ETH_ALEN); 730 strcpy(ci->device, s->dev->name); 731 ci->flags = s->flags & valid_flags; 732 ci->state = s->state; 733 ci->role = s->role; 734 } 735 736 int bnep_get_connlist(struct bnep_connlist_req *req) 737 { 738 struct bnep_session *s; 739 int err = 0, n = 0; 740 741 down_read(&bnep_session_sem); 742 743 list_for_each_entry(s, &bnep_session_list, list) { 744 struct bnep_conninfo ci; 745 746 __bnep_copy_ci(&ci, s); 747 748 if (copy_to_user(req->ci, &ci, sizeof(ci))) { 749 err = -EFAULT; 750 break; 751 } 752 753 if (++n >= req->cnum) 754 break; 755 756 req->ci++; 757 } 758 req->cnum = n; 759 760 up_read(&bnep_session_sem); 761 return err; 762 } 763 764 int bnep_get_conninfo(struct bnep_conninfo *ci) 765 { 766 struct bnep_session *s; 767 int err = 0; 768 769 down_read(&bnep_session_sem); 770 771 s = __bnep_get_session(ci->dst); 772 if (s) 773 __bnep_copy_ci(ci, s); 774 else 775 err = -ENOENT; 776 777 up_read(&bnep_session_sem); 778 return err; 779 } 780 781 static int __init bnep_init(void) 782 { 783 char flt[50] = ""; 784 785 #ifdef CONFIG_BT_BNEP_PROTO_FILTER 786 strcat(flt, "protocol "); 787 #endif 788 789 #ifdef CONFIG_BT_BNEP_MC_FILTER 790 strcat(flt, "multicast"); 791 #endif 792 793 BT_INFO("BNEP (Ethernet Emulation) ver %s", VERSION); 794 if (flt[0]) 795 BT_INFO("BNEP filters: %s", flt); 796 797 return bnep_sock_init(); 798 } 799 800 static void __exit bnep_exit(void) 801 { 802 bnep_sock_cleanup(); 803 } 804 805 module_init(bnep_init); 806 module_exit(bnep_exit); 807 808 module_param(compress_src, bool, 0644); 809 MODULE_PARM_DESC(compress_src, "Compress sources headers"); 810 811 module_param(compress_dst, bool, 0644); 812 MODULE_PARM_DESC(compress_dst, "Compress destination headers"); 813 814 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); 815 MODULE_DESCRIPTION("Bluetooth BNEP ver " VERSION); 816 MODULE_VERSION(VERSION); 817 MODULE_LICENSE("GPL"); 818 MODULE_ALIAS("bt-proto-4"); 819