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 ---