diff options
author | John W. Linville <linville@tuxdriver.com> | 2012-12-03 13:46:03 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-12-03 13:46:03 -0500 |
commit | 06ef5c4bbb9816e7a7eb44917f11c2e3375fb51a (patch) | |
tree | cac94ec09e789a6e5162d1925ee944075bf6eef6 /net | |
parent | 55cec505559dade9e7776de8f3d23fc3e54e091d (diff) | |
parent | 0b27a4b97cb1874503c78453c0903df53c0c86b2 (diff) |
Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next
Diffstat (limited to 'net')
-rw-r--r-- | net/bluetooth/hci_core.c | 5 | ||||
-rw-r--r-- | net/bluetooth/hci_event.c | 56 | ||||
-rw-r--r-- | net/bluetooth/l2cap_core.c | 100 | ||||
-rw-r--r-- | net/bluetooth/mgmt.c | 10 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/sock.c | 4 | ||||
-rw-r--r-- | net/bluetooth/sco.c | 86 |
6 files changed, 187 insertions, 74 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 7140f83328a2..596660d37c5e 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -861,6 +861,9 @@ static int hci_dev_do_close(struct hci_dev *hdev) | |||
861 | /* Clear flags */ | 861 | /* Clear flags */ |
862 | hdev->flags = 0; | 862 | hdev->flags = 0; |
863 | 863 | ||
864 | /* Controller radio is available but is currently powered down */ | ||
865 | hdev->amp_status = 0; | ||
866 | |||
864 | memset(hdev->eir, 0, sizeof(hdev->eir)); | 867 | memset(hdev->eir, 0, sizeof(hdev->eir)); |
865 | memset(hdev->dev_class, 0, sizeof(hdev->dev_class)); | 868 | memset(hdev->dev_class, 0, sizeof(hdev->dev_class)); |
866 | 869 | ||
@@ -1854,6 +1857,8 @@ void hci_unregister_dev(struct hci_dev *hdev) | |||
1854 | for (i = 0; i < NUM_REASSEMBLY; i++) | 1857 | for (i = 0; i < NUM_REASSEMBLY; i++) |
1855 | kfree_skb(hdev->reassembly[i]); | 1858 | kfree_skb(hdev->reassembly[i]); |
1856 | 1859 | ||
1860 | cancel_work_sync(&hdev->power_on); | ||
1861 | |||
1857 | if (!test_bit(HCI_INIT, &hdev->flags) && | 1862 | if (!test_bit(HCI_INIT, &hdev->flags) && |
1858 | !test_bit(HCI_SETUP, &hdev->dev_flags)) { | 1863 | !test_bit(HCI_SETUP, &hdev->dev_flags)) { |
1859 | hci_dev_lock(hdev); | 1864 | hci_dev_lock(hdev); |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 9f5c5f244502..705078a0cc39 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -794,10 +794,10 @@ static void hci_set_le_support(struct hci_dev *hdev) | |||
794 | 794 | ||
795 | if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) { | 795 | if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) { |
796 | cp.le = 1; | 796 | cp.le = 1; |
797 | cp.simul = !!lmp_le_br_capable(hdev); | 797 | cp.simul = lmp_le_br_capable(hdev); |
798 | } | 798 | } |
799 | 799 | ||
800 | if (cp.le != !!lmp_host_le_capable(hdev)) | 800 | if (cp.le != lmp_host_le_capable(hdev)) |
801 | hci_send_cmd(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(cp), | 801 | hci_send_cmd(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(cp), |
802 | &cp); | 802 | &cp); |
803 | } | 803 | } |
@@ -2047,15 +2047,53 @@ unlock: | |||
2047 | hci_conn_check_pending(hdev); | 2047 | hci_conn_check_pending(hdev); |
2048 | } | 2048 | } |
2049 | 2049 | ||
2050 | void hci_conn_accept(struct hci_conn *conn, int mask) | ||
2051 | { | ||
2052 | struct hci_dev *hdev = conn->hdev; | ||
2053 | |||
2054 | BT_DBG("conn %p", conn); | ||
2055 | |||
2056 | conn->state = BT_CONFIG; | ||
2057 | |||
2058 | if (!lmp_esco_capable(hdev)) { | ||
2059 | struct hci_cp_accept_conn_req cp; | ||
2060 | |||
2061 | bacpy(&cp.bdaddr, &conn->dst); | ||
2062 | |||
2063 | if (lmp_rswitch_capable(hdev) && (mask & HCI_LM_MASTER)) | ||
2064 | cp.role = 0x00; /* Become master */ | ||
2065 | else | ||
2066 | cp.role = 0x01; /* Remain slave */ | ||
2067 | |||
2068 | hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), &cp); | ||
2069 | } else /* lmp_esco_capable(hdev)) */ { | ||
2070 | struct hci_cp_accept_sync_conn_req cp; | ||
2071 | |||
2072 | bacpy(&cp.bdaddr, &conn->dst); | ||
2073 | cp.pkt_type = cpu_to_le16(conn->pkt_type); | ||
2074 | |||
2075 | cp.tx_bandwidth = __constant_cpu_to_le32(0x00001f40); | ||
2076 | cp.rx_bandwidth = __constant_cpu_to_le32(0x00001f40); | ||
2077 | cp.max_latency = __constant_cpu_to_le16(0xffff); | ||
2078 | cp.content_format = cpu_to_le16(hdev->voice_setting); | ||
2079 | cp.retrans_effort = 0xff; | ||
2080 | |||
2081 | hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, | ||
2082 | sizeof(cp), &cp); | ||
2083 | } | ||
2084 | } | ||
2085 | |||
2050 | static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) | 2086 | static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) |
2051 | { | 2087 | { |
2052 | struct hci_ev_conn_request *ev = (void *) skb->data; | 2088 | struct hci_ev_conn_request *ev = (void *) skb->data; |
2053 | int mask = hdev->link_mode; | 2089 | int mask = hdev->link_mode; |
2090 | __u8 flags = 0; | ||
2054 | 2091 | ||
2055 | BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr, | 2092 | BT_DBG("%s bdaddr %pMR type 0x%x", hdev->name, &ev->bdaddr, |
2056 | ev->link_type); | 2093 | ev->link_type); |
2057 | 2094 | ||
2058 | mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type); | 2095 | mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type, |
2096 | &flags); | ||
2059 | 2097 | ||
2060 | if ((mask & HCI_LM_ACCEPT) && | 2098 | if ((mask & HCI_LM_ACCEPT) && |
2061 | !hci_blacklist_lookup(hdev, &ev->bdaddr)) { | 2099 | !hci_blacklist_lookup(hdev, &ev->bdaddr)) { |
@@ -2081,12 +2119,13 @@ static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) | |||
2081 | } | 2119 | } |
2082 | 2120 | ||
2083 | memcpy(conn->dev_class, ev->dev_class, 3); | 2121 | memcpy(conn->dev_class, ev->dev_class, 3); |
2084 | conn->state = BT_CONNECT; | ||
2085 | 2122 | ||
2086 | hci_dev_unlock(hdev); | 2123 | hci_dev_unlock(hdev); |
2087 | 2124 | ||
2088 | if (ev->link_type == ACL_LINK || !lmp_esco_capable(hdev)) { | 2125 | if (ev->link_type == ACL_LINK || |
2126 | (!(flags & HCI_PROTO_DEFER) && !lmp_esco_capable(hdev))) { | ||
2089 | struct hci_cp_accept_conn_req cp; | 2127 | struct hci_cp_accept_conn_req cp; |
2128 | conn->state = BT_CONNECT; | ||
2090 | 2129 | ||
2091 | bacpy(&cp.bdaddr, &ev->bdaddr); | 2130 | bacpy(&cp.bdaddr, &ev->bdaddr); |
2092 | 2131 | ||
@@ -2097,8 +2136,9 @@ static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) | |||
2097 | 2136 | ||
2098 | hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), | 2137 | hci_send_cmd(hdev, HCI_OP_ACCEPT_CONN_REQ, sizeof(cp), |
2099 | &cp); | 2138 | &cp); |
2100 | } else { | 2139 | } else if (!(flags & HCI_PROTO_DEFER)) { |
2101 | struct hci_cp_accept_sync_conn_req cp; | 2140 | struct hci_cp_accept_sync_conn_req cp; |
2141 | conn->state = BT_CONNECT; | ||
2102 | 2142 | ||
2103 | bacpy(&cp.bdaddr, &ev->bdaddr); | 2143 | bacpy(&cp.bdaddr, &ev->bdaddr); |
2104 | cp.pkt_type = cpu_to_le16(conn->pkt_type); | 2144 | cp.pkt_type = cpu_to_le16(conn->pkt_type); |
@@ -2111,6 +2151,10 @@ static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) | |||
2111 | 2151 | ||
2112 | hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, | 2152 | hci_send_cmd(hdev, HCI_OP_ACCEPT_SYNC_CONN_REQ, |
2113 | sizeof(cp), &cp); | 2153 | sizeof(cp), &cp); |
2154 | } else { | ||
2155 | conn->state = BT_CONNECT2; | ||
2156 | hci_proto_connect_cfm(conn, 0); | ||
2157 | hci_conn_put(conn); | ||
2114 | } | 2158 | } |
2115 | } else { | 2159 | } else { |
2116 | /* Connection rejected */ | 2160 | /* Connection rejected */ |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index b52f66d22437..2c78208d793e 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -53,8 +53,7 @@ static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, | |||
53 | static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, | 53 | static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len, |
54 | void *data); | 54 | void *data); |
55 | static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data); | 55 | static int l2cap_build_conf_req(struct l2cap_chan *chan, void *data); |
56 | static void l2cap_send_disconn_req(struct l2cap_conn *conn, | 56 | static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err); |
57 | struct l2cap_chan *chan, int err); | ||
58 | 57 | ||
59 | static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control, | 58 | static void l2cap_tx(struct l2cap_chan *chan, struct l2cap_ctrl *control, |
60 | struct sk_buff_head *skbs, u8 event); | 59 | struct sk_buff_head *skbs, u8 event); |
@@ -632,7 +631,7 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason) | |||
632 | if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && | 631 | if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && |
633 | conn->hcon->type == ACL_LINK) { | 632 | conn->hcon->type == ACL_LINK) { |
634 | __set_chan_timer(chan, sk->sk_sndtimeo); | 633 | __set_chan_timer(chan, sk->sk_sndtimeo); |
635 | l2cap_send_disconn_req(conn, chan, reason); | 634 | l2cap_send_disconn_req(chan, reason); |
636 | } else | 635 | } else |
637 | l2cap_chan_del(chan, reason); | 636 | l2cap_chan_del(chan, reason); |
638 | break; | 637 | break; |
@@ -1014,6 +1013,7 @@ static bool __amp_capable(struct l2cap_chan *chan) | |||
1014 | struct l2cap_conn *conn = chan->conn; | 1013 | struct l2cap_conn *conn = chan->conn; |
1015 | 1014 | ||
1016 | if (enable_hs && | 1015 | if (enable_hs && |
1016 | hci_amp_capable() && | ||
1017 | chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED && | 1017 | chan->chan_policy == BT_CHANNEL_POLICY_AMP_PREFERRED && |
1018 | conn->fixed_chan_mask & L2CAP_FC_A2MP) | 1018 | conn->fixed_chan_mask & L2CAP_FC_A2MP) |
1019 | return true; | 1019 | return true; |
@@ -1180,10 +1180,10 @@ static inline int l2cap_mode_supported(__u8 mode, __u32 feat_mask) | |||
1180 | } | 1180 | } |
1181 | } | 1181 | } |
1182 | 1182 | ||
1183 | static void l2cap_send_disconn_req(struct l2cap_conn *conn, | 1183 | static void l2cap_send_disconn_req(struct l2cap_chan *chan, int err) |
1184 | struct l2cap_chan *chan, int err) | ||
1185 | { | 1184 | { |
1186 | struct sock *sk = chan->sk; | 1185 | struct sock *sk = chan->sk; |
1186 | struct l2cap_conn *conn = chan->conn; | ||
1187 | struct l2cap_disconn_req req; | 1187 | struct l2cap_disconn_req req; |
1188 | 1188 | ||
1189 | if (!conn) | 1189 | if (!conn) |
@@ -1960,7 +1960,7 @@ static void l2cap_ertm_resend(struct l2cap_chan *chan) | |||
1960 | if (chan->max_tx != 0 && | 1960 | if (chan->max_tx != 0 && |
1961 | bt_cb(skb)->control.retries > chan->max_tx) { | 1961 | bt_cb(skb)->control.retries > chan->max_tx) { |
1962 | BT_DBG("Retry limit exceeded (%d)", chan->max_tx); | 1962 | BT_DBG("Retry limit exceeded (%d)", chan->max_tx); |
1963 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 1963 | l2cap_send_disconn_req(chan, ECONNRESET); |
1964 | l2cap_seq_list_clear(&chan->retrans_list); | 1964 | l2cap_seq_list_clear(&chan->retrans_list); |
1965 | break; | 1965 | break; |
1966 | } | 1966 | } |
@@ -2666,7 +2666,7 @@ static void l2cap_tx_state_wait_f(struct l2cap_chan *chan, | |||
2666 | __set_monitor_timer(chan); | 2666 | __set_monitor_timer(chan); |
2667 | chan->retry_count++; | 2667 | chan->retry_count++; |
2668 | } else { | 2668 | } else { |
2669 | l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED); | 2669 | l2cap_send_disconn_req(chan, ECONNABORTED); |
2670 | } | 2670 | } |
2671 | break; | 2671 | break; |
2672 | default: | 2672 | default: |
@@ -3106,18 +3106,17 @@ done: | |||
3106 | if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) | 3106 | if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) |
3107 | l2cap_add_opt_efs(&ptr, chan); | 3107 | l2cap_add_opt_efs(&ptr, chan); |
3108 | 3108 | ||
3109 | if (!(chan->conn->feat_mask & L2CAP_FEAT_FCS)) | ||
3110 | break; | ||
3111 | |||
3112 | if (chan->fcs == L2CAP_FCS_NONE || | ||
3113 | test_bit(CONF_NO_FCS_RECV, &chan->conf_state)) { | ||
3114 | chan->fcs = L2CAP_FCS_NONE; | ||
3115 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, chan->fcs); | ||
3116 | } | ||
3117 | |||
3118 | if (test_bit(FLAG_EXT_CTRL, &chan->flags)) | 3109 | if (test_bit(FLAG_EXT_CTRL, &chan->flags)) |
3119 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2, | 3110 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_EWS, 2, |
3120 | chan->tx_win); | 3111 | chan->tx_win); |
3112 | |||
3113 | if (chan->conn->feat_mask & L2CAP_FEAT_FCS) | ||
3114 | if (chan->fcs == L2CAP_FCS_NONE || | ||
3115 | test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) { | ||
3116 | chan->fcs = L2CAP_FCS_NONE; | ||
3117 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, | ||
3118 | chan->fcs); | ||
3119 | } | ||
3121 | break; | 3120 | break; |
3122 | 3121 | ||
3123 | case L2CAP_MODE_STREAMING: | 3122 | case L2CAP_MODE_STREAMING: |
@@ -3139,14 +3138,13 @@ done: | |||
3139 | if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) | 3138 | if (test_bit(FLAG_EFS_ENABLE, &chan->flags)) |
3140 | l2cap_add_opt_efs(&ptr, chan); | 3139 | l2cap_add_opt_efs(&ptr, chan); |
3141 | 3140 | ||
3142 | if (!(chan->conn->feat_mask & L2CAP_FEAT_FCS)) | 3141 | if (chan->conn->feat_mask & L2CAP_FEAT_FCS) |
3143 | break; | 3142 | if (chan->fcs == L2CAP_FCS_NONE || |
3144 | 3143 | test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) { | |
3145 | if (chan->fcs == L2CAP_FCS_NONE || | 3144 | chan->fcs = L2CAP_FCS_NONE; |
3146 | test_bit(CONF_NO_FCS_RECV, &chan->conf_state)) { | 3145 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, |
3147 | chan->fcs = L2CAP_FCS_NONE; | 3146 | chan->fcs); |
3148 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_FCS, 1, chan->fcs); | 3147 | } |
3149 | } | ||
3150 | break; | 3148 | break; |
3151 | } | 3149 | } |
3152 | 3150 | ||
@@ -3198,7 +3196,7 @@ static int l2cap_parse_conf_req(struct l2cap_chan *chan, void *data) | |||
3198 | 3196 | ||
3199 | case L2CAP_CONF_FCS: | 3197 | case L2CAP_CONF_FCS: |
3200 | if (val == L2CAP_FCS_NONE) | 3198 | if (val == L2CAP_FCS_NONE) |
3201 | set_bit(CONF_NO_FCS_RECV, &chan->conf_state); | 3199 | set_bit(CONF_RECV_NO_FCS, &chan->conf_state); |
3202 | break; | 3200 | break; |
3203 | 3201 | ||
3204 | case L2CAP_CONF_EFS: | 3202 | case L2CAP_CONF_EFS: |
@@ -3433,6 +3431,13 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, | |||
3433 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs), | 3431 | l2cap_add_conf_opt(&ptr, L2CAP_CONF_EFS, sizeof(efs), |
3434 | (unsigned long) &efs); | 3432 | (unsigned long) &efs); |
3435 | break; | 3433 | break; |
3434 | |||
3435 | case L2CAP_CONF_FCS: | ||
3436 | if (*result == L2CAP_CONF_PENDING) | ||
3437 | if (val == L2CAP_FCS_NONE) | ||
3438 | set_bit(CONF_RECV_NO_FCS, | ||
3439 | &chan->conf_state); | ||
3440 | break; | ||
3436 | } | 3441 | } |
3437 | } | 3442 | } |
3438 | 3443 | ||
@@ -3802,7 +3807,7 @@ static inline void set_default_fcs(struct l2cap_chan *chan) | |||
3802 | */ | 3807 | */ |
3803 | if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING) | 3808 | if (chan->mode != L2CAP_MODE_ERTM && chan->mode != L2CAP_MODE_STREAMING) |
3804 | chan->fcs = L2CAP_FCS_NONE; | 3809 | chan->fcs = L2CAP_FCS_NONE; |
3805 | else if (!test_bit(CONF_NO_FCS_RECV, &chan->conf_state)) | 3810 | else if (!test_bit(CONF_RECV_NO_FCS, &chan->conf_state)) |
3806 | chan->fcs = L2CAP_FCS_CRC16; | 3811 | chan->fcs = L2CAP_FCS_CRC16; |
3807 | } | 3812 | } |
3808 | 3813 | ||
@@ -3877,7 +3882,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, | |||
3877 | /* Complete config. */ | 3882 | /* Complete config. */ |
3878 | len = l2cap_parse_conf_req(chan, rsp); | 3883 | len = l2cap_parse_conf_req(chan, rsp); |
3879 | if (len < 0) { | 3884 | if (len < 0) { |
3880 | l2cap_send_disconn_req(conn, chan, ECONNRESET); | 3885 | l2cap_send_disconn_req(chan, ECONNRESET); |
3881 | goto unlock; | 3886 | goto unlock; |
3882 | } | 3887 | } |
3883 | 3888 | ||
@@ -3899,7 +3904,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, | |||
3899 | err = l2cap_ertm_init(chan); | 3904 | err = l2cap_ertm_init(chan); |
3900 | 3905 | ||
3901 | if (err < 0) | 3906 | if (err < 0) |
3902 | l2cap_send_disconn_req(chan->conn, chan, -err); | 3907 | l2cap_send_disconn_req(chan, -err); |
3903 | else | 3908 | else |
3904 | l2cap_chan_ready(chan); | 3909 | l2cap_chan_ready(chan); |
3905 | 3910 | ||
@@ -3967,7 +3972,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, | |||
3967 | len = l2cap_parse_conf_rsp(chan, rsp->data, len, | 3972 | len = l2cap_parse_conf_rsp(chan, rsp->data, len, |
3968 | buf, &result); | 3973 | buf, &result); |
3969 | if (len < 0) { | 3974 | if (len < 0) { |
3970 | l2cap_send_disconn_req(conn, chan, ECONNRESET); | 3975 | l2cap_send_disconn_req(chan, ECONNRESET); |
3971 | goto done; | 3976 | goto done; |
3972 | } | 3977 | } |
3973 | 3978 | ||
@@ -3988,7 +3993,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, | |||
3988 | char req[64]; | 3993 | char req[64]; |
3989 | 3994 | ||
3990 | if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) { | 3995 | if (len > sizeof(req) - sizeof(struct l2cap_conf_req)) { |
3991 | l2cap_send_disconn_req(conn, chan, ECONNRESET); | 3996 | l2cap_send_disconn_req(chan, ECONNRESET); |
3992 | goto done; | 3997 | goto done; |
3993 | } | 3998 | } |
3994 | 3999 | ||
@@ -3997,7 +4002,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, | |||
3997 | len = l2cap_parse_conf_rsp(chan, rsp->data, len, | 4002 | len = l2cap_parse_conf_rsp(chan, rsp->data, len, |
3998 | req, &result); | 4003 | req, &result); |
3999 | if (len < 0) { | 4004 | if (len < 0) { |
4000 | l2cap_send_disconn_req(conn, chan, ECONNRESET); | 4005 | l2cap_send_disconn_req(chan, ECONNRESET); |
4001 | goto done; | 4006 | goto done; |
4002 | } | 4007 | } |
4003 | 4008 | ||
@@ -4013,7 +4018,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, | |||
4013 | l2cap_chan_set_err(chan, ECONNRESET); | 4018 | l2cap_chan_set_err(chan, ECONNRESET); |
4014 | 4019 | ||
4015 | __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT); | 4020 | __set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT); |
4016 | l2cap_send_disconn_req(conn, chan, ECONNRESET); | 4021 | l2cap_send_disconn_req(chan, ECONNRESET); |
4017 | goto done; | 4022 | goto done; |
4018 | } | 4023 | } |
4019 | 4024 | ||
@@ -4030,7 +4035,7 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, | |||
4030 | err = l2cap_ertm_init(chan); | 4035 | err = l2cap_ertm_init(chan); |
4031 | 4036 | ||
4032 | if (err < 0) | 4037 | if (err < 0) |
4033 | l2cap_send_disconn_req(chan->conn, chan, -err); | 4038 | l2cap_send_disconn_req(chan, -err); |
4034 | else | 4039 | else |
4035 | l2cap_chan_ready(chan); | 4040 | l2cap_chan_ready(chan); |
4036 | } | 4041 | } |
@@ -4392,7 +4397,7 @@ static void l2cap_logical_fail(struct l2cap_chan *chan) | |||
4392 | /* Logical link setup failed */ | 4397 | /* Logical link setup failed */ |
4393 | if (chan->state != BT_CONNECTED) { | 4398 | if (chan->state != BT_CONNECTED) { |
4394 | /* Create channel failure, disconnect */ | 4399 | /* Create channel failure, disconnect */ |
4395 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 4400 | l2cap_send_disconn_req(chan, ECONNRESET); |
4396 | return; | 4401 | return; |
4397 | } | 4402 | } |
4398 | 4403 | ||
@@ -4435,7 +4440,7 @@ static void l2cap_logical_finish_create(struct l2cap_chan *chan, | |||
4435 | 4440 | ||
4436 | err = l2cap_ertm_init(chan); | 4441 | err = l2cap_ertm_init(chan); |
4437 | if (err < 0) | 4442 | if (err < 0) |
4438 | l2cap_send_disconn_req(chan->conn, chan, -err); | 4443 | l2cap_send_disconn_req(chan, -err); |
4439 | else | 4444 | else |
4440 | l2cap_chan_ready(chan); | 4445 | l2cap_chan_ready(chan); |
4441 | } | 4446 | } |
@@ -5400,7 +5405,7 @@ static void l2cap_handle_srej(struct l2cap_chan *chan, | |||
5400 | 5405 | ||
5401 | if (control->reqseq == chan->next_tx_seq) { | 5406 | if (control->reqseq == chan->next_tx_seq) { |
5402 | BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); | 5407 | BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); |
5403 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 5408 | l2cap_send_disconn_req(chan, ECONNRESET); |
5404 | return; | 5409 | return; |
5405 | } | 5410 | } |
5406 | 5411 | ||
@@ -5414,7 +5419,7 @@ static void l2cap_handle_srej(struct l2cap_chan *chan, | |||
5414 | 5419 | ||
5415 | if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) { | 5420 | if (chan->max_tx != 0 && bt_cb(skb)->control.retries >= chan->max_tx) { |
5416 | BT_DBG("Retry limit exceeded (%d)", chan->max_tx); | 5421 | BT_DBG("Retry limit exceeded (%d)", chan->max_tx); |
5417 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 5422 | l2cap_send_disconn_req(chan, ECONNRESET); |
5418 | return; | 5423 | return; |
5419 | } | 5424 | } |
5420 | 5425 | ||
@@ -5458,7 +5463,7 @@ static void l2cap_handle_rej(struct l2cap_chan *chan, | |||
5458 | 5463 | ||
5459 | if (control->reqseq == chan->next_tx_seq) { | 5464 | if (control->reqseq == chan->next_tx_seq) { |
5460 | BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); | 5465 | BT_DBG("Invalid reqseq %d, disconnecting", control->reqseq); |
5461 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 5466 | l2cap_send_disconn_req(chan, ECONNRESET); |
5462 | return; | 5467 | return; |
5463 | } | 5468 | } |
5464 | 5469 | ||
@@ -5467,7 +5472,7 @@ static void l2cap_handle_rej(struct l2cap_chan *chan, | |||
5467 | if (chan->max_tx && skb && | 5472 | if (chan->max_tx && skb && |
5468 | bt_cb(skb)->control.retries >= chan->max_tx) { | 5473 | bt_cb(skb)->control.retries >= chan->max_tx) { |
5469 | BT_DBG("Retry limit exceeded (%d)", chan->max_tx); | 5474 | BT_DBG("Retry limit exceeded (%d)", chan->max_tx); |
5470 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 5475 | l2cap_send_disconn_req(chan, ECONNRESET); |
5471 | return; | 5476 | return; |
5472 | } | 5477 | } |
5473 | 5478 | ||
@@ -5651,8 +5656,7 @@ static int l2cap_rx_state_recv(struct l2cap_chan *chan, | |||
5651 | break; | 5656 | break; |
5652 | case L2CAP_TXSEQ_INVALID: | 5657 | case L2CAP_TXSEQ_INVALID: |
5653 | default: | 5658 | default: |
5654 | l2cap_send_disconn_req(chan->conn, chan, | 5659 | l2cap_send_disconn_req(chan, ECONNRESET); |
5655 | ECONNRESET); | ||
5656 | break; | 5660 | break; |
5657 | } | 5661 | } |
5658 | break; | 5662 | break; |
@@ -5785,8 +5789,7 @@ static int l2cap_rx_state_srej_sent(struct l2cap_chan *chan, | |||
5785 | break; | 5789 | break; |
5786 | case L2CAP_TXSEQ_INVALID: | 5790 | case L2CAP_TXSEQ_INVALID: |
5787 | default: | 5791 | default: |
5788 | l2cap_send_disconn_req(chan->conn, chan, | 5792 | l2cap_send_disconn_req(chan, ECONNRESET); |
5789 | ECONNRESET); | ||
5790 | break; | 5793 | break; |
5791 | } | 5794 | } |
5792 | break; | 5795 | break; |
@@ -5981,7 +5984,7 @@ static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, | |||
5981 | BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d", | 5984 | BT_DBG("Invalid reqseq %d (next_tx_seq %d, expected_ack_seq %d", |
5982 | control->reqseq, chan->next_tx_seq, | 5985 | control->reqseq, chan->next_tx_seq, |
5983 | chan->expected_ack_seq); | 5986 | chan->expected_ack_seq); |
5984 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 5987 | l2cap_send_disconn_req(chan, ECONNRESET); |
5985 | } | 5988 | } |
5986 | 5989 | ||
5987 | return err; | 5990 | return err; |
@@ -6050,7 +6053,7 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) | |||
6050 | len -= L2CAP_FCS_SIZE; | 6053 | len -= L2CAP_FCS_SIZE; |
6051 | 6054 | ||
6052 | if (len > chan->mps) { | 6055 | if (len > chan->mps) { |
6053 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 6056 | l2cap_send_disconn_req(chan, ECONNRESET); |
6054 | goto drop; | 6057 | goto drop; |
6055 | } | 6058 | } |
6056 | 6059 | ||
@@ -6075,8 +6078,7 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) | |||
6075 | } | 6078 | } |
6076 | 6079 | ||
6077 | if (err) | 6080 | if (err) |
6078 | l2cap_send_disconn_req(chan->conn, chan, | 6081 | l2cap_send_disconn_req(chan, ECONNRESET); |
6079 | ECONNRESET); | ||
6080 | } else { | 6082 | } else { |
6081 | const u8 rx_func_to_event[4] = { | 6083 | const u8 rx_func_to_event[4] = { |
6082 | L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ, | 6084 | L2CAP_EV_RECV_RR, L2CAP_EV_RECV_REJ, |
@@ -6093,7 +6095,7 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) | |||
6093 | 6095 | ||
6094 | if (len != 0) { | 6096 | if (len != 0) { |
6095 | BT_ERR("Trailing bytes: %d in sframe", len); | 6097 | BT_ERR("Trailing bytes: %d in sframe", len); |
6096 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 6098 | l2cap_send_disconn_req(chan, ECONNRESET); |
6097 | goto drop; | 6099 | goto drop; |
6098 | } | 6100 | } |
6099 | 6101 | ||
@@ -6104,7 +6106,7 @@ static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) | |||
6104 | 6106 | ||
6105 | event = rx_func_to_event[control->super]; | 6107 | event = rx_func_to_event[control->super]; |
6106 | if (l2cap_rx(chan, control, skb, event)) | 6108 | if (l2cap_rx(chan, control, skb, event)) |
6107 | l2cap_send_disconn_req(chan->conn, chan, ECONNRESET); | 6109 | l2cap_send_disconn_req(chan, ECONNRESET); |
6108 | } | 6110 | } |
6109 | 6111 | ||
6110 | return 0; | 6112 | return 0; |
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 142764aec2af..f559b966279c 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c | |||
@@ -1226,7 +1226,7 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) | |||
1226 | } | 1226 | } |
1227 | 1227 | ||
1228 | val = !!cp->val; | 1228 | val = !!cp->val; |
1229 | enabled = !!lmp_host_le_capable(hdev); | 1229 | enabled = lmp_host_le_capable(hdev); |
1230 | 1230 | ||
1231 | if (!hdev_is_powered(hdev) || val == enabled) { | 1231 | if (!hdev_is_powered(hdev) || val == enabled) { |
1232 | bool changed = false; | 1232 | bool changed = false; |
@@ -1262,7 +1262,7 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) | |||
1262 | 1262 | ||
1263 | if (val) { | 1263 | if (val) { |
1264 | hci_cp.le = val; | 1264 | hci_cp.le = val; |
1265 | hci_cp.simul = !!lmp_le_br_capable(hdev); | 1265 | hci_cp.simul = lmp_le_br_capable(hdev); |
1266 | } | 1266 | } |
1267 | 1267 | ||
1268 | err = hci_send_cmd(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp), | 1268 | err = hci_send_cmd(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp), |
@@ -2926,13 +2926,13 @@ int mgmt_powered(struct hci_dev *hdev, u8 powered) | |||
2926 | struct hci_cp_write_le_host_supported cp; | 2926 | struct hci_cp_write_le_host_supported cp; |
2927 | 2927 | ||
2928 | cp.le = 1; | 2928 | cp.le = 1; |
2929 | cp.simul = !!lmp_le_br_capable(hdev); | 2929 | cp.simul = lmp_le_br_capable(hdev); |
2930 | 2930 | ||
2931 | /* Check first if we already have the right | 2931 | /* Check first if we already have the right |
2932 | * host state (host features set) | 2932 | * host state (host features set) |
2933 | */ | 2933 | */ |
2934 | if (cp.le != !!lmp_host_le_capable(hdev) || | 2934 | if (cp.le != lmp_host_le_capable(hdev) || |
2935 | cp.simul != !!lmp_host_le_br_capable(hdev)) | 2935 | cp.simul != lmp_host_le_br_capable(hdev)) |
2936 | hci_send_cmd(hdev, | 2936 | hci_send_cmd(hdev, |
2937 | HCI_OP_WRITE_LE_HOST_SUPPORTED, | 2937 | HCI_OP_WRITE_LE_HOST_SUPPORTED, |
2938 | sizeof(cp), &cp); | 2938 | sizeof(cp), &cp); |
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 4ddef57d03a7..ce3f6658f4b2 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
@@ -467,7 +467,7 @@ static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int f | |||
467 | long timeo; | 467 | long timeo; |
468 | int err = 0; | 468 | int err = 0; |
469 | 469 | ||
470 | lock_sock(sk); | 470 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
471 | 471 | ||
472 | if (sk->sk_type != SOCK_STREAM) { | 472 | if (sk->sk_type != SOCK_STREAM) { |
473 | err = -EINVAL; | 473 | err = -EINVAL; |
@@ -504,7 +504,7 @@ static int rfcomm_sock_accept(struct socket *sock, struct socket *newsock, int f | |||
504 | 504 | ||
505 | release_sock(sk); | 505 | release_sock(sk); |
506 | timeo = schedule_timeout(timeo); | 506 | timeo = schedule_timeout(timeo); |
507 | lock_sock(sk); | 507 | lock_sock_nested(sk, SINGLE_DEPTH_NESTING); |
508 | } | 508 | } |
509 | __set_current_state(TASK_RUNNING); | 509 | __set_current_state(TASK_RUNNING); |
510 | remove_wait_queue(sk_sleep(sk), &wait); | 510 | remove_wait_queue(sk_sleep(sk), &wait); |
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 450cdcd88e5c..531a93d613d4 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
@@ -131,15 +131,6 @@ static int sco_conn_del(struct hci_conn *hcon, int err) | |||
131 | sco_sock_clear_timer(sk); | 131 | sco_sock_clear_timer(sk); |
132 | sco_chan_del(sk, err); | 132 | sco_chan_del(sk, err); |
133 | bh_unlock_sock(sk); | 133 | bh_unlock_sock(sk); |
134 | |||
135 | sco_conn_lock(conn); | ||
136 | conn->sk = NULL; | ||
137 | sco_pi(sk)->conn = NULL; | ||
138 | sco_conn_unlock(conn); | ||
139 | |||
140 | if (conn->hcon) | ||
141 | hci_conn_put(conn->hcon); | ||
142 | |||
143 | sco_sock_kill(sk); | 134 | sco_sock_kill(sk); |
144 | } | 135 | } |
145 | 136 | ||
@@ -397,6 +388,7 @@ static void sco_sock_init(struct sock *sk, struct sock *parent) | |||
397 | 388 | ||
398 | if (parent) { | 389 | if (parent) { |
399 | sk->sk_type = parent->sk_type; | 390 | sk->sk_type = parent->sk_type; |
391 | bt_sk(sk)->flags = bt_sk(parent)->flags; | ||
400 | security_sk_clone(parent, sk); | 392 | security_sk_clone(parent, sk); |
401 | } | 393 | } |
402 | } | 394 | } |
@@ -662,16 +654,57 @@ static int sco_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
662 | return err; | 654 | return err; |
663 | } | 655 | } |
664 | 656 | ||
657 | static int sco_sock_recvmsg(struct kiocb *iocb, struct socket *sock, | ||
658 | struct msghdr *msg, size_t len, int flags) | ||
659 | { | ||
660 | struct sock *sk = sock->sk; | ||
661 | struct sco_pinfo *pi = sco_pi(sk); | ||
662 | |||
663 | lock_sock(sk); | ||
664 | |||
665 | if (sk->sk_state == BT_CONNECT2 && | ||
666 | test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) { | ||
667 | hci_conn_accept(pi->conn->hcon, 0); | ||
668 | sk->sk_state = BT_CONFIG; | ||
669 | |||
670 | release_sock(sk); | ||
671 | return 0; | ||
672 | } | ||
673 | |||
674 | release_sock(sk); | ||
675 | |||
676 | return bt_sock_recvmsg(iocb, sock, msg, len, flags); | ||
677 | } | ||
678 | |||
665 | static int sco_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen) | 679 | static int sco_sock_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen) |
666 | { | 680 | { |
667 | struct sock *sk = sock->sk; | 681 | struct sock *sk = sock->sk; |
668 | int err = 0; | 682 | int err = 0; |
683 | u32 opt; | ||
669 | 684 | ||
670 | BT_DBG("sk %p", sk); | 685 | BT_DBG("sk %p", sk); |
671 | 686 | ||
672 | lock_sock(sk); | 687 | lock_sock(sk); |
673 | 688 | ||
674 | switch (optname) { | 689 | switch (optname) { |
690 | |||
691 | case BT_DEFER_SETUP: | ||
692 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { | ||
693 | err = -EINVAL; | ||
694 | break; | ||
695 | } | ||
696 | |||
697 | if (get_user(opt, (u32 __user *) optval)) { | ||
698 | err = -EFAULT; | ||
699 | break; | ||
700 | } | ||
701 | |||
702 | if (opt) | ||
703 | set_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); | ||
704 | else | ||
705 | clear_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); | ||
706 | break; | ||
707 | |||
675 | default: | 708 | default: |
676 | err = -ENOPROTOOPT; | 709 | err = -ENOPROTOOPT; |
677 | break; | 710 | break; |
@@ -753,6 +786,19 @@ static int sco_sock_getsockopt(struct socket *sock, int level, int optname, char | |||
753 | lock_sock(sk); | 786 | lock_sock(sk); |
754 | 787 | ||
755 | switch (optname) { | 788 | switch (optname) { |
789 | |||
790 | case BT_DEFER_SETUP: | ||
791 | if (sk->sk_state != BT_BOUND && sk->sk_state != BT_LISTEN) { | ||
792 | err = -EINVAL; | ||
793 | break; | ||
794 | } | ||
795 | |||
796 | if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), | ||
797 | (u32 __user *) optval)) | ||
798 | err = -EFAULT; | ||
799 | |||
800 | break; | ||
801 | |||
756 | default: | 802 | default: |
757 | err = -ENOPROTOOPT; | 803 | err = -ENOPROTOOPT; |
758 | break; | 804 | break; |
@@ -830,6 +876,16 @@ static void sco_chan_del(struct sock *sk, int err) | |||
830 | 876 | ||
831 | BT_DBG("sk %p, conn %p, err %d", sk, conn, err); | 877 | BT_DBG("sk %p, conn %p, err %d", sk, conn, err); |
832 | 878 | ||
879 | if (conn) { | ||
880 | sco_conn_lock(conn); | ||
881 | conn->sk = NULL; | ||
882 | sco_pi(sk)->conn = NULL; | ||
883 | sco_conn_unlock(conn); | ||
884 | |||
885 | if (conn->hcon) | ||
886 | hci_conn_put(conn->hcon); | ||
887 | } | ||
888 | |||
833 | sk->sk_state = BT_CLOSED; | 889 | sk->sk_state = BT_CLOSED; |
834 | sk->sk_err = err; | 890 | sk->sk_err = err; |
835 | sk->sk_state_change(sk); | 891 | sk->sk_state_change(sk); |
@@ -874,7 +930,10 @@ static void sco_conn_ready(struct sco_conn *conn) | |||
874 | hci_conn_hold(conn->hcon); | 930 | hci_conn_hold(conn->hcon); |
875 | __sco_chan_add(conn, sk, parent); | 931 | __sco_chan_add(conn, sk, parent); |
876 | 932 | ||
877 | sk->sk_state = BT_CONNECTED; | 933 | if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(parent)->flags)) |
934 | sk->sk_state = BT_CONNECT2; | ||
935 | else | ||
936 | sk->sk_state = BT_CONNECTED; | ||
878 | 937 | ||
879 | /* Wake up parent */ | 938 | /* Wake up parent */ |
880 | parent->sk_data_ready(parent, 1); | 939 | parent->sk_data_ready(parent, 1); |
@@ -887,7 +946,7 @@ done: | |||
887 | } | 946 | } |
888 | 947 | ||
889 | /* ----- SCO interface with lower layer (HCI) ----- */ | 948 | /* ----- SCO interface with lower layer (HCI) ----- */ |
890 | int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr) | 949 | int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags) |
891 | { | 950 | { |
892 | struct sock *sk; | 951 | struct sock *sk; |
893 | struct hlist_node *node; | 952 | struct hlist_node *node; |
@@ -904,6 +963,9 @@ int sco_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr) | |||
904 | if (!bacmp(&bt_sk(sk)->src, &hdev->bdaddr) || | 963 | if (!bacmp(&bt_sk(sk)->src, &hdev->bdaddr) || |
905 | !bacmp(&bt_sk(sk)->src, BDADDR_ANY)) { | 964 | !bacmp(&bt_sk(sk)->src, BDADDR_ANY)) { |
906 | lm |= HCI_LM_ACCEPT; | 965 | lm |= HCI_LM_ACCEPT; |
966 | |||
967 | if (test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags)) | ||
968 | *flags |= HCI_PROTO_DEFER; | ||
907 | break; | 969 | break; |
908 | } | 970 | } |
909 | } | 971 | } |
@@ -992,7 +1054,7 @@ static const struct proto_ops sco_sock_ops = { | |||
992 | .accept = sco_sock_accept, | 1054 | .accept = sco_sock_accept, |
993 | .getname = sco_sock_getname, | 1055 | .getname = sco_sock_getname, |
994 | .sendmsg = sco_sock_sendmsg, | 1056 | .sendmsg = sco_sock_sendmsg, |
995 | .recvmsg = bt_sock_recvmsg, | 1057 | .recvmsg = sco_sock_recvmsg, |
996 | .poll = bt_sock_poll, | 1058 | .poll = bt_sock_poll, |
997 | .ioctl = bt_sock_ioctl, | 1059 | .ioctl = bt_sock_ioctl, |
998 | .mmap = sock_no_mmap, | 1060 | .mmap = sock_no_mmap, |