sco.c (6bfa273e533d7b25eee3d74e28a7fe8e6a8e7a93) | sco.c (3f19ffb2f924db5b0925c77818d18ac1f6f08a44) |
---|---|
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 --- 54 unchanged lines hidden (view full) --- 63#define sco_pi(sk) ((struct sco_pinfo *) sk) 64 65struct sco_pinfo { 66 struct bt_sock bt; 67 bdaddr_t src; 68 bdaddr_t dst; 69 __u32 flags; 70 __u16 setting; | 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 --- 54 unchanged lines hidden (view full) --- 63#define sco_pi(sk) ((struct sco_pinfo *) sk) 64 65struct sco_pinfo { 66 struct bt_sock bt; 67 bdaddr_t src; 68 bdaddr_t dst; 69 __u32 flags; 70 __u16 setting; |
71 __u8 cmsg_mask; | |
72 struct bt_codec codec; 73 struct sco_conn *conn; 74}; 75 76/* ---- SCO timers ---- */ 77#define SCO_CONN_TIMEOUT (HZ * 40) 78#define SCO_DISCONN_TIMEOUT (HZ * 2) 79 --- 386 unchanged lines hidden (view full) --- 466static void sco_sock_close(struct sock *sk) 467{ 468 lock_sock(sk); 469 sco_sock_clear_timer(sk); 470 __sco_sock_close(sk); 471 release_sock(sk); 472} 473 | 71 struct bt_codec codec; 72 struct sco_conn *conn; 73}; 74 75/* ---- SCO timers ---- */ 76#define SCO_CONN_TIMEOUT (HZ * 40) 77#define SCO_DISCONN_TIMEOUT (HZ * 2) 78 --- 386 unchanged lines hidden (view full) --- 465static void sco_sock_close(struct sock *sk) 466{ 467 lock_sock(sk); 468 sco_sock_clear_timer(sk); 469 __sco_sock_close(sk); 470 release_sock(sk); 471} 472 |
474static void sco_skb_put_cmsg(struct sk_buff *skb, struct msghdr *msg, 475 struct sock *sk) 476{ 477 if (sco_pi(sk)->cmsg_mask & SCO_CMSG_PKT_STATUS) 478 put_cmsg(msg, SOL_BLUETOOTH, BT_SCM_PKT_STATUS, 479 sizeof(bt_cb(skb)->sco.pkt_status), 480 &bt_cb(skb)->sco.pkt_status); 481} 482 | |
483static void sco_sock_init(struct sock *sk, struct sock *parent) 484{ 485 BT_DBG("sk %p", sk); 486 487 if (parent) { 488 sk->sk_type = parent->sk_type; 489 bt_sk(sk)->flags = bt_sk(parent)->flags; 490 security_sk_clone(parent, sk); | 473static void sco_sock_init(struct sock *sk, struct sock *parent) 474{ 475 BT_DBG("sk %p", sk); 476 477 if (parent) { 478 sk->sk_type = parent->sk_type; 479 bt_sk(sk)->flags = bt_sk(parent)->flags; 480 security_sk_clone(parent, sk); |
491 } else { 492 bt_sk(sk)->skb_put_cmsg = sco_skb_put_cmsg; | |
493 } 494} 495 496static struct proto sco_proto = { 497 .name = "SCO", 498 .owner = THIS_MODULE, 499 .obj_size = sizeof(struct sco_pinfo) 500}; --- 401 unchanged lines hidden (view full) --- 902 903 case BT_PKT_STATUS: 904 if (copy_from_sockptr(&opt, optval, sizeof(u32))) { 905 err = -EFAULT; 906 break; 907 } 908 909 if (opt) | 481 } 482} 483 484static struct proto sco_proto = { 485 .name = "SCO", 486 .owner = THIS_MODULE, 487 .obj_size = sizeof(struct sco_pinfo) 488}; --- 401 unchanged lines hidden (view full) --- 890 891 case BT_PKT_STATUS: 892 if (copy_from_sockptr(&opt, optval, sizeof(u32))) { 893 err = -EFAULT; 894 break; 895 } 896 897 if (opt) |
910 sco_pi(sk)->cmsg_mask |= SCO_CMSG_PKT_STATUS; | 898 set_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags); |
911 else | 899 else |
912 sco_pi(sk)->cmsg_mask &= SCO_CMSG_PKT_STATUS; | 900 clear_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags); |
913 break; 914 915 case BT_CODEC: 916 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && 917 sk->sk_state != BT_CONNECT2) { 918 err = -EINVAL; 919 break; 920 } --- 114 unchanged lines hidden (view full) --- 1035 1036static int sco_sock_getsockopt(struct socket *sock, int level, int optname, 1037 char __user *optval, int __user *optlen) 1038{ 1039 struct sock *sk = sock->sk; 1040 int len, err = 0; 1041 struct bt_voice voice; 1042 u32 phys; | 901 break; 902 903 case BT_CODEC: 904 if (sk->sk_state != BT_OPEN && sk->sk_state != BT_BOUND && 905 sk->sk_state != BT_CONNECT2) { 906 err = -EINVAL; 907 break; 908 } --- 114 unchanged lines hidden (view full) --- 1023 1024static int sco_sock_getsockopt(struct socket *sock, int level, int optname, 1025 char __user *optval, int __user *optlen) 1026{ 1027 struct sock *sk = sock->sk; 1028 int len, err = 0; 1029 struct bt_voice voice; 1030 u32 phys; |
1043 int pkt_status; | |
1044 int buf_len; 1045 struct codec_list *c; 1046 u8 num_codecs, i, __user *ptr; 1047 struct hci_dev *hdev; 1048 struct hci_codec_caps *caps; 1049 struct bt_codec codec; 1050 1051 BT_DBG("sk %p", sk); --- 37 unchanged lines hidden (view full) --- 1089 1090 phys = hci_conn_get_phy(sco_pi(sk)->conn->hcon); 1091 1092 if (put_user(phys, (u32 __user *) optval)) 1093 err = -EFAULT; 1094 break; 1095 1096 case BT_PKT_STATUS: | 1031 int buf_len; 1032 struct codec_list *c; 1033 u8 num_codecs, i, __user *ptr; 1034 struct hci_dev *hdev; 1035 struct hci_codec_caps *caps; 1036 struct bt_codec codec; 1037 1038 BT_DBG("sk %p", sk); --- 37 unchanged lines hidden (view full) --- 1076 1077 phys = hci_conn_get_phy(sco_pi(sk)->conn->hcon); 1078 1079 if (put_user(phys, (u32 __user *) optval)) 1080 err = -EFAULT; 1081 break; 1082 1083 case BT_PKT_STATUS: |
1097 pkt_status = (sco_pi(sk)->cmsg_mask & SCO_CMSG_PKT_STATUS); 1098 1099 if (put_user(pkt_status, (int __user *)optval)) | 1084 if (put_user(test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags), 1085 (int __user *)optval)) |
1100 err = -EFAULT; 1101 break; 1102 1103 case BT_SNDMTU: 1104 case BT_RCVMTU: 1105 if (sk->sk_state != BT_CONNECTED) { 1106 err = -ENOTCONN; 1107 break; --- 406 unchanged lines hidden --- | 1086 err = -EFAULT; 1087 break; 1088 1089 case BT_SNDMTU: 1090 case BT_RCVMTU: 1091 if (sk->sk_state != BT_CONNECTED) { 1092 err = -ENOTCONN; 1093 break; --- 406 unchanged lines hidden --- |