Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
04124681
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
04124681
编写于
3月 08, 2012
作者:
G
Gustavo F. Padovan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Bluetooth: fix conding style issues all over the tree
Signed-off-by:
N
Gustavo F. Padovan
<
padovan@profusion.mobi
>
上级
f64b993f
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
384 addition
and
398 deletion
+384
-398
drivers/bluetooth/btmrvl_debugfs.c
drivers/bluetooth/btmrvl_debugfs.c
+12
-11
include/net/bluetooth/hci_core.h
include/net/bluetooth/hci_core.h
+33
-34
net/bluetooth/hci_core.c
net/bluetooth/hci_core.c
+22
-27
net/bluetooth/hci_event.c
net/bluetooth/hci_event.c
+53
-57
net/bluetooth/l2cap_core.c
net/bluetooth/l2cap_core.c
+7
-4
net/bluetooth/l2cap_sock.c
net/bluetooth/l2cap_sock.c
+2
-1
net/bluetooth/mgmt.c
net/bluetooth/mgmt.c
+242
-247
net/bluetooth/smp.c
net/bluetooth/smp.c
+13
-17
未找到文件。
drivers/bluetooth/btmrvl_debugfs.c
浏览文件 @
04124681
...
@@ -401,28 +401,29 @@ void btmrvl_debugfs_init(struct hci_dev *hdev)
...
@@ -401,28 +401,29 @@ void btmrvl_debugfs_init(struct hci_dev *hdev)
dbg
->
config_dir
=
debugfs_create_dir
(
"config"
,
hdev
->
debugfs
);
dbg
->
config_dir
=
debugfs_create_dir
(
"config"
,
hdev
->
debugfs
);
dbg
->
psmode
=
debugfs_create_file
(
"psmode"
,
0644
,
dbg
->
config_dir
,
dbg
->
psmode
=
debugfs_create_file
(
"psmode"
,
0644
,
dbg
->
config_dir
,
priv
,
&
btmrvl_psmode_fops
);
priv
,
&
btmrvl_psmode_fops
);
dbg
->
pscmd
=
debugfs_create_file
(
"pscmd"
,
0644
,
dbg
->
config_dir
,
dbg
->
pscmd
=
debugfs_create_file
(
"pscmd"
,
0644
,
dbg
->
config_dir
,
priv
,
&
btmrvl_pscmd_fops
);
priv
,
&
btmrvl_pscmd_fops
);
dbg
->
gpiogap
=
debugfs_create_file
(
"gpiogap"
,
0644
,
dbg
->
config_dir
,
dbg
->
gpiogap
=
debugfs_create_file
(
"gpiogap"
,
0644
,
dbg
->
config_dir
,
priv
,
&
btmrvl_gpiogap_fops
);
priv
,
&
btmrvl_gpiogap_fops
);
dbg
->
hsmode
=
debugfs_create_file
(
"hsmode"
,
0644
,
dbg
->
config_dir
,
dbg
->
hsmode
=
debugfs_create_file
(
"hsmode"
,
0644
,
dbg
->
config_dir
,
priv
,
&
btmrvl_hsmode_fops
);
priv
,
&
btmrvl_hsmode_fops
);
dbg
->
hscmd
=
debugfs_create_file
(
"hscmd"
,
0644
,
dbg
->
config_dir
,
dbg
->
hscmd
=
debugfs_create_file
(
"hscmd"
,
0644
,
dbg
->
config_dir
,
priv
,
&
btmrvl_hscmd_fops
);
priv
,
&
btmrvl_hscmd_fops
);
dbg
->
hscfgcmd
=
debugfs_create_file
(
"hscfgcmd"
,
0644
,
dbg
->
config_dir
,
dbg
->
hscfgcmd
=
debugfs_create_file
(
"hscfgcmd"
,
0644
,
dbg
->
config_dir
,
priv
,
&
btmrvl_hscfgcmd_fops
);
priv
,
&
btmrvl_hscfgcmd_fops
);
dbg
->
status_dir
=
debugfs_create_dir
(
"status"
,
hdev
->
debugfs
);
dbg
->
status_dir
=
debugfs_create_dir
(
"status"
,
hdev
->
debugfs
);
dbg
->
curpsmode
=
debugfs_create_file
(
"curpsmode"
,
0444
,
dbg
->
curpsmode
=
debugfs_create_file
(
"curpsmode"
,
0444
,
dbg
->
status_dir
,
priv
,
&
btmrvl_curpsmode_fops
);
dbg
->
status_dir
,
priv
,
&
btmrvl_curpsmode_fops
);
dbg
->
psstate
=
debugfs_create_file
(
"psstate"
,
0444
,
dbg
->
status_dir
,
dbg
->
psstate
=
debugfs_create_file
(
"psstate"
,
0444
,
dbg
->
status_dir
,
priv
,
&
btmrvl_psstate_fops
);
priv
,
&
btmrvl_psstate_fops
);
dbg
->
hsstate
=
debugfs_create_file
(
"hsstate"
,
0444
,
dbg
->
status_dir
,
dbg
->
hsstate
=
debugfs_create_file
(
"hsstate"
,
0444
,
dbg
->
status_dir
,
priv
,
&
btmrvl_hsstate_fops
);
priv
,
&
btmrvl_hsstate_fops
);
dbg
->
txdnldready
=
debugfs_create_file
(
"txdnldready"
,
0444
,
dbg
->
txdnldready
=
debugfs_create_file
(
"txdnldready"
,
0444
,
dbg
->
status_dir
,
priv
,
dbg
->
status_dir
,
priv
,
&
btmrvl_txdnldready_fops
);
&
btmrvl_txdnldready_fops
);
}
}
void
btmrvl_debugfs_remove
(
struct
hci_dev
*
hdev
)
void
btmrvl_debugfs_remove
(
struct
hci_dev
*
hdev
)
...
...
include/net/bluetooth/hci_core.h
浏览文件 @
04124681
...
@@ -398,16 +398,16 @@ static inline long inquiry_entry_age(struct inquiry_entry *e)
...
@@ -398,16 +398,16 @@ static inline long inquiry_entry_age(struct inquiry_entry *e)
}
}
struct
inquiry_entry
*
hci_inquiry_cache_lookup
(
struct
hci_dev
*
hdev
,
struct
inquiry_entry
*
hci_inquiry_cache_lookup
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
);
bdaddr_t
*
bdaddr
);
struct
inquiry_entry
*
hci_inquiry_cache_lookup_unknown
(
struct
hci_dev
*
hdev
,
struct
inquiry_entry
*
hci_inquiry_cache_lookup_unknown
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
);
bdaddr_t
*
bdaddr
);
struct
inquiry_entry
*
hci_inquiry_cache_lookup_resolve
(
struct
hci_dev
*
hdev
,
struct
inquiry_entry
*
hci_inquiry_cache_lookup_resolve
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
bdaddr_t
*
bdaddr
,
int
state
);
int
state
);
void
hci_inquiry_cache_update_resolve
(
struct
hci_dev
*
hdev
,
void
hci_inquiry_cache_update_resolve
(
struct
hci_dev
*
hdev
,
struct
inquiry_entry
*
ie
);
struct
inquiry_entry
*
ie
);
bool
hci_inquiry_cache_update
(
struct
hci_dev
*
hdev
,
struct
inquiry_data
*
data
,
bool
hci_inquiry_cache_update
(
struct
hci_dev
*
hdev
,
struct
inquiry_data
*
data
,
bool
name_known
,
bool
*
ssp
);
bool
name_known
,
bool
*
ssp
);
/* ----- HCI Connections ----- */
/* ----- HCI Connections ----- */
enum
{
enum
{
...
@@ -669,13 +669,13 @@ int hci_uuids_clear(struct hci_dev *hdev);
...
@@ -669,13 +669,13 @@ int hci_uuids_clear(struct hci_dev *hdev);
int
hci_link_keys_clear
(
struct
hci_dev
*
hdev
);
int
hci_link_keys_clear
(
struct
hci_dev
*
hdev
);
struct
link_key
*
hci_find_link_key
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
);
struct
link_key
*
hci_find_link_key
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
);
int
hci_add_link_key
(
struct
hci_dev
*
hdev
,
struct
hci_conn
*
conn
,
int
new_key
,
int
hci_add_link_key
(
struct
hci_dev
*
hdev
,
struct
hci_conn
*
conn
,
int
new_key
,
bdaddr_t
*
bdaddr
,
u8
*
val
,
u8
type
,
u8
pin_len
);
bdaddr_t
*
bdaddr
,
u8
*
val
,
u8
type
,
u8
pin_len
);
struct
smp_ltk
*
hci_find_ltk
(
struct
hci_dev
*
hdev
,
__le16
ediv
,
u8
rand
[
8
]);
struct
smp_ltk
*
hci_find_ltk
(
struct
hci_dev
*
hdev
,
__le16
ediv
,
u8
rand
[
8
]);
int
hci_add_ltk
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
addr_type
,
u8
type
,
int
hci_add_ltk
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
addr_type
,
u8
type
,
int
new_key
,
u8
authenticated
,
u8
tk
[
16
]
,
int
new_key
,
u8
authenticated
,
u8
tk
[
16
],
u8
enc_size
,
u16
ediv
,
u8
enc_size
,
u16
ediv
,
u8
rand
[
8
]);
u8
rand
[
8
]);
struct
smp_ltk
*
hci_find_ltk_by_addr
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
struct
smp_ltk
*
hci_find_ltk_by_addr
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
addr_type
);
u8
addr_type
);
int
hci_remove_ltk
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
);
int
hci_remove_ltk
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
);
int
hci_smp_ltks_clear
(
struct
hci_dev
*
hdev
);
int
hci_smp_ltks_clear
(
struct
hci_dev
*
hdev
);
int
hci_remove_link_key
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
);
int
hci_remove_link_key
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
);
...
@@ -931,7 +931,7 @@ static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type)
...
@@ -931,7 +931,7 @@ static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type)
}
}
static
inline
u16
eir_append_data
(
u8
*
eir
,
u16
eir_len
,
u8
type
,
u8
*
data
,
static
inline
u16
eir_append_data
(
u8
*
eir
,
u16
eir_len
,
u8
type
,
u8
*
data
,
u8
data_len
)
u8
data_len
)
{
{
eir
[
eir_len
++
]
=
sizeof
(
type
)
+
data_len
;
eir
[
eir_len
++
]
=
sizeof
(
type
)
+
data_len
;
eir
[
eir_len
++
]
=
type
;
eir
[
eir_len
++
]
=
type
;
...
@@ -978,50 +978,49 @@ int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable);
...
@@ -978,50 +978,49 @@ int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable);
int
mgmt_connectable
(
struct
hci_dev
*
hdev
,
u8
connectable
);
int
mgmt_connectable
(
struct
hci_dev
*
hdev
,
u8
connectable
);
int
mgmt_write_scan_failed
(
struct
hci_dev
*
hdev
,
u8
scan
,
u8
status
);
int
mgmt_write_scan_failed
(
struct
hci_dev
*
hdev
,
u8
scan
,
u8
status
);
int
mgmt_new_link_key
(
struct
hci_dev
*
hdev
,
struct
link_key
*
key
,
int
mgmt_new_link_key
(
struct
hci_dev
*
hdev
,
struct
link_key
*
key
,
u8
persistent
);
u8
persistent
);
int
mgmt_device_connected
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
int
mgmt_device_connected
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u32
flags
,
u8
*
name
,
u8
addr_type
,
u32
flags
,
u8
*
name
,
u8
name_len
,
u8
name_len
,
u8
*
dev_class
);
u8
*
dev_class
);
int
mgmt_device_disconnected
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_device_disconnected
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
);
u8
link_type
,
u8
addr_type
);
int
mgmt_disconnect_failed
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_disconnect_failed
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
);
u8
link_type
,
u8
addr_type
,
u8
status
);
int
mgmt_connect_failed
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
int
mgmt_connect_failed
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
);
u8
addr_type
,
u8
status
);
int
mgmt_pin_code_request
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
secure
);
int
mgmt_pin_code_request
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
secure
);
int
mgmt_pin_code_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_pin_code_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
status
);
u8
status
);
int
mgmt_pin_code_neg_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_pin_code_neg_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
status
);
u8
status
);
int
mgmt_user_confirm_request
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_user_confirm_request
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
__le32
value
,
u8
link_type
,
u8
addr_type
,
__le32
value
,
u8
confirm_hint
);
u8
confirm_hint
);
int
mgmt_user_confirm_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_user_confirm_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
);
u8
link_type
,
u8
addr_type
,
u8
status
);
int
mgmt_user_confirm_neg_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_user_confirm_neg_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
);
u8
link_type
,
u8
addr_type
,
u8
status
);
int
mgmt_user_passkey_request
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_user_passkey_request
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
);
u8
link_type
,
u8
addr_type
);
int
mgmt_user_passkey_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_user_passkey_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
);
u8
link_type
,
u8
addr_type
,
u8
status
);
int
mgmt_user_passkey_neg_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_user_passkey_neg_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
);
u8
link_type
,
u8
addr_type
,
u8
status
);
int
mgmt_auth_failed
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
int
mgmt_auth_failed
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
);
u8
addr_type
,
u8
status
);
int
mgmt_auth_enable_complete
(
struct
hci_dev
*
hdev
,
u8
status
);
int
mgmt_auth_enable_complete
(
struct
hci_dev
*
hdev
,
u8
status
);
int
mgmt_ssp_enable_complete
(
struct
hci_dev
*
hdev
,
u8
enable
,
u8
status
);
int
mgmt_ssp_enable_complete
(
struct
hci_dev
*
hdev
,
u8
enable
,
u8
status
);
int
mgmt_set_class_of_dev_complete
(
struct
hci_dev
*
hdev
,
u8
*
dev_class
,
int
mgmt_set_class_of_dev_complete
(
struct
hci_dev
*
hdev
,
u8
*
dev_class
,
u8
status
);
u8
status
);
int
mgmt_set_local_name_complete
(
struct
hci_dev
*
hdev
,
u8
*
name
,
u8
status
);
int
mgmt_set_local_name_complete
(
struct
hci_dev
*
hdev
,
u8
*
name
,
u8
status
);
int
mgmt_read_local_oob_data_reply_complete
(
struct
hci_dev
*
hdev
,
u8
*
hash
,
int
mgmt_read_local_oob_data_reply_complete
(
struct
hci_dev
*
hdev
,
u8
*
hash
,
u8
*
randomizer
,
u8
status
);
u8
*
randomizer
,
u8
status
);
int
mgmt_le_enable_complete
(
struct
hci_dev
*
hdev
,
u8
enable
,
u8
status
);
int
mgmt_le_enable_complete
(
struct
hci_dev
*
hdev
,
u8
enable
,
u8
status
);
int
mgmt_device_found
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
int
mgmt_device_found
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
*
dev_class
,
s8
rssi
,
u8
addr_type
,
u8
*
dev_class
,
s8
rssi
,
u8
cfm_name
,
u8
cfm_name
,
u8
ssp
,
u8
*
eir
,
u8
ssp
,
u8
*
eir
,
u16
eir_len
);
u16
eir_len
);
int
mgmt_remote_name
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
int
mgmt_remote_name
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
s8
rssi
,
u8
*
name
,
u8
name_len
);
u8
addr_type
,
s8
rssi
,
u8
*
name
,
u8
name_len
);
int
mgmt_start_discovery_failed
(
struct
hci_dev
*
hdev
,
u8
status
);
int
mgmt_start_discovery_failed
(
struct
hci_dev
*
hdev
,
u8
status
);
int
mgmt_stop_discovery_failed
(
struct
hci_dev
*
hdev
,
u8
status
);
int
mgmt_stop_discovery_failed
(
struct
hci_dev
*
hdev
,
u8
status
);
int
mgmt_discovering
(
struct
hci_dev
*
hdev
,
u8
discovering
);
int
mgmt_discovering
(
struct
hci_dev
*
hdev
,
u8
discovering
);
...
@@ -1071,6 +1070,6 @@ void hci_le_ltk_neg_reply(struct hci_conn *conn);
...
@@ -1071,6 +1070,6 @@ void hci_le_ltk_neg_reply(struct hci_conn *conn);
int
hci_do_inquiry
(
struct
hci_dev
*
hdev
,
u8
length
);
int
hci_do_inquiry
(
struct
hci_dev
*
hdev
,
u8
length
);
int
hci_cancel_inquiry
(
struct
hci_dev
*
hdev
);
int
hci_cancel_inquiry
(
struct
hci_dev
*
hdev
);
int
hci_le_scan
(
struct
hci_dev
*
hdev
,
u8
type
,
u16
interval
,
u16
window
,
int
hci_le_scan
(
struct
hci_dev
*
hdev
,
u8
type
,
u16
interval
,
u16
window
,
int
timeout
);
int
timeout
);
#endif
/* __HCI_CORE_H */
#endif
/* __HCI_CORE_H */
net/bluetooth/hci_core.c
浏览文件 @
04124681
...
@@ -431,7 +431,7 @@ struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev, bdaddr_t *b
...
@@ -431,7 +431,7 @@ struct inquiry_entry *hci_inquiry_cache_lookup(struct hci_dev *hdev, bdaddr_t *b
}
}
struct
inquiry_entry
*
hci_inquiry_cache_lookup_unknown
(
struct
hci_dev
*
hdev
,
struct
inquiry_entry
*
hci_inquiry_cache_lookup_unknown
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
)
bdaddr_t
*
bdaddr
)
{
{
struct
discovery_state
*
cache
=
&
hdev
->
discovery
;
struct
discovery_state
*
cache
=
&
hdev
->
discovery
;
struct
inquiry_entry
*
e
;
struct
inquiry_entry
*
e
;
...
@@ -447,8 +447,8 @@ struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
...
@@ -447,8 +447,8 @@ struct inquiry_entry *hci_inquiry_cache_lookup_unknown(struct hci_dev *hdev,
}
}
struct
inquiry_entry
*
hci_inquiry_cache_lookup_resolve
(
struct
hci_dev
*
hdev
,
struct
inquiry_entry
*
hci_inquiry_cache_lookup_resolve
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
bdaddr_t
*
bdaddr
,
int
state
)
int
state
)
{
{
struct
discovery_state
*
cache
=
&
hdev
->
discovery
;
struct
discovery_state
*
cache
=
&
hdev
->
discovery
;
struct
inquiry_entry
*
e
;
struct
inquiry_entry
*
e
;
...
@@ -466,7 +466,7 @@ struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
...
@@ -466,7 +466,7 @@ struct inquiry_entry *hci_inquiry_cache_lookup_resolve(struct hci_dev *hdev,
}
}
void
hci_inquiry_cache_update_resolve
(
struct
hci_dev
*
hdev
,
void
hci_inquiry_cache_update_resolve
(
struct
hci_dev
*
hdev
,
struct
inquiry_entry
*
ie
)
struct
inquiry_entry
*
ie
)
{
{
struct
discovery_state
*
cache
=
&
hdev
->
discovery
;
struct
discovery_state
*
cache
=
&
hdev
->
discovery
;
struct
list_head
*
pos
=
&
cache
->
resolve
;
struct
list_head
*
pos
=
&
cache
->
resolve
;
...
@@ -485,7 +485,7 @@ void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
...
@@ -485,7 +485,7 @@ void hci_inquiry_cache_update_resolve(struct hci_dev *hdev,
}
}
bool
hci_inquiry_cache_update
(
struct
hci_dev
*
hdev
,
struct
inquiry_data
*
data
,
bool
hci_inquiry_cache_update
(
struct
hci_dev
*
hdev
,
struct
inquiry_data
*
data
,
bool
name_known
,
bool
*
ssp
)
bool
name_known
,
bool
*
ssp
)
{
{
struct
discovery_state
*
cache
=
&
hdev
->
discovery
;
struct
discovery_state
*
cache
=
&
hdev
->
discovery
;
struct
inquiry_entry
*
ie
;
struct
inquiry_entry
*
ie
;
...
@@ -1264,7 +1264,7 @@ struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, u8 rand[8])
...
@@ -1264,7 +1264,7 @@ struct smp_ltk *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, u8 rand[8])
EXPORT_SYMBOL
(
hci_find_ltk
);
EXPORT_SYMBOL
(
hci_find_ltk
);
struct
smp_ltk
*
hci_find_ltk_by_addr
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
struct
smp_ltk
*
hci_find_ltk_by_addr
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
addr_type
)
u8
addr_type
)
{
{
struct
smp_ltk
*
k
;
struct
smp_ltk
*
k
;
...
@@ -1278,7 +1278,7 @@ struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -1278,7 +1278,7 @@ struct smp_ltk *hci_find_ltk_by_addr(struct hci_dev *hdev, bdaddr_t *bdaddr,
EXPORT_SYMBOL
(
hci_find_ltk_by_addr
);
EXPORT_SYMBOL
(
hci_find_ltk_by_addr
);
int
hci_add_link_key
(
struct
hci_dev
*
hdev
,
struct
hci_conn
*
conn
,
int
new_key
,
int
hci_add_link_key
(
struct
hci_dev
*
hdev
,
struct
hci_conn
*
conn
,
int
new_key
,
bdaddr_t
*
bdaddr
,
u8
*
val
,
u8
type
,
u8
pin_len
)
bdaddr_t
*
bdaddr
,
u8
*
val
,
u8
type
,
u8
pin_len
)
{
{
struct
link_key
*
key
,
*
old_key
;
struct
link_key
*
key
,
*
old_key
;
u8
old_key_type
,
persistent
;
u8
old_key_type
,
persistent
;
...
@@ -1333,8 +1333,8 @@ int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
...
@@ -1333,8 +1333,8 @@ int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
}
}
int
hci_add_ltk
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
addr_type
,
u8
type
,
int
hci_add_ltk
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
addr_type
,
u8
type
,
int
new_key
,
u8
authenticated
,
u8
tk
[
16
],
int
new_key
,
u8
authenticated
,
u8
tk
[
16
],
u8
enc_size
,
u16
u8
enc_size
,
u16
ediv
,
u8
rand
[
8
])
ediv
,
u8
rand
[
8
])
{
{
struct
smp_ltk
*
key
,
*
old_key
;
struct
smp_ltk
*
key
,
*
old_key
;
...
@@ -1413,7 +1413,7 @@ static void hci_cmd_timer(unsigned long arg)
...
@@ -1413,7 +1413,7 @@ static void hci_cmd_timer(unsigned long arg)
}
}
struct
oob_data
*
hci_find_remote_oob_data
(
struct
hci_dev
*
hdev
,
struct
oob_data
*
hci_find_remote_oob_data
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
)
bdaddr_t
*
bdaddr
)
{
{
struct
oob_data
*
data
;
struct
oob_data
*
data
;
...
@@ -1453,7 +1453,7 @@ int hci_remote_oob_data_clear(struct hci_dev *hdev)
...
@@ -1453,7 +1453,7 @@ int hci_remote_oob_data_clear(struct hci_dev *hdev)
}
}
int
hci_add_remote_oob_data
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
*
hash
,
int
hci_add_remote_oob_data
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
*
hash
,
u8
*
randomizer
)
u8
*
randomizer
)
{
{
struct
oob_data
*
data
;
struct
oob_data
*
data
;
...
@@ -1476,8 +1476,7 @@ int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
...
@@ -1476,8 +1476,7 @@ int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
return
0
;
return
0
;
}
}
struct
bdaddr_list
*
hci_blacklist_lookup
(
struct
hci_dev
*
hdev
,
struct
bdaddr_list
*
hci_blacklist_lookup
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
)
bdaddr_t
*
bdaddr
)
{
{
struct
bdaddr_list
*
b
;
struct
bdaddr_list
*
b
;
...
@@ -1545,7 +1544,7 @@ int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
...
@@ -1545,7 +1544,7 @@ int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
static
void
hci_clear_adv_cache
(
struct
work_struct
*
work
)
static
void
hci_clear_adv_cache
(
struct
work_struct
*
work
)
{
{
struct
hci_dev
*
hdev
=
container_of
(
work
,
struct
hci_dev
,
struct
hci_dev
*
hdev
=
container_of
(
work
,
struct
hci_dev
,
adv_work
.
work
);
adv_work
.
work
);
hci_dev_lock
(
hdev
);
hci_dev_lock
(
hdev
);
...
@@ -1588,11 +1587,7 @@ static inline int is_connectable_adv(u8 evt_type)
...
@@ -1588,11 +1587,7 @@ static inline int is_connectable_adv(u8 evt_type)
}
}
int
hci_add_adv_entry
(
struct
hci_dev
*
hdev
,
int
hci_add_adv_entry
(
struct
hci_dev
*
hdev
,
struct
hci_ev_le_advertising_info
*
ev
)
struct
hci_ev_le_advertising_info
*
ev
)
{
struct
adv_entry
*
entry
;
if
(
!
is_connectable_adv
(
ev
->
evt_type
))
{
struct
adv_entry
*
entry
;
if
(
!
is_connectable_adv
(
ev
->
evt_type
))
return
-
EINVAL
;
return
-
EINVAL
;
/* Only new entries should be added to adv_entries. So, if
/* Only new entries should be added to adv_entries. So, if
...
@@ -1639,7 +1634,7 @@ static void le_scan_enable_req(struct hci_dev *hdev, unsigned long opt)
...
@@ -1639,7 +1634,7 @@ static void le_scan_enable_req(struct hci_dev *hdev, unsigned long opt)
}
}
static
int
hci_do_le_scan
(
struct
hci_dev
*
hdev
,
u8
type
,
u16
interval
,
static
int
hci_do_le_scan
(
struct
hci_dev
*
hdev
,
u8
type
,
u16
interval
,
u16
window
,
int
timeout
)
u16
window
,
int
timeout
)
{
{
long
timeo
=
msecs_to_jiffies
(
3000
);
long
timeo
=
msecs_to_jiffies
(
3000
);
struct
le_scan_params
param
;
struct
le_scan_params
param
;
...
@@ -1657,7 +1652,7 @@ static int hci_do_le_scan(struct hci_dev *hdev, u8 type, u16 interval,
...
@@ -1657,7 +1652,7 @@ static int hci_do_le_scan(struct hci_dev *hdev, u8 type, u16 interval,
hci_req_lock
(
hdev
);
hci_req_lock
(
hdev
);
err
=
__hci_request
(
hdev
,
le_scan_param_req
,
(
unsigned
long
)
&
param
,
err
=
__hci_request
(
hdev
,
le_scan_param_req
,
(
unsigned
long
)
&
param
,
timeo
);
timeo
);
if
(
!
err
)
if
(
!
err
)
err
=
__hci_request
(
hdev
,
le_scan_enable_req
,
0
,
timeo
);
err
=
__hci_request
(
hdev
,
le_scan_enable_req
,
0
,
timeo
);
...
@@ -1667,7 +1662,7 @@ static int hci_do_le_scan(struct hci_dev *hdev, u8 type, u16 interval,
...
@@ -1667,7 +1662,7 @@ static int hci_do_le_scan(struct hci_dev *hdev, u8 type, u16 interval,
return
err
;
return
err
;
schedule_delayed_work
(
&
hdev
->
le_scan_disable
,
schedule_delayed_work
(
&
hdev
->
le_scan_disable
,
msecs_to_jiffies
(
timeout
));
msecs_to_jiffies
(
timeout
));
return
0
;
return
0
;
}
}
...
@@ -1675,7 +1670,7 @@ static int hci_do_le_scan(struct hci_dev *hdev, u8 type, u16 interval,
...
@@ -1675,7 +1670,7 @@ static int hci_do_le_scan(struct hci_dev *hdev, u8 type, u16 interval,
static
void
le_scan_disable_work
(
struct
work_struct
*
work
)
static
void
le_scan_disable_work
(
struct
work_struct
*
work
)
{
{
struct
hci_dev
*
hdev
=
container_of
(
work
,
struct
hci_dev
,
struct
hci_dev
*
hdev
=
container_of
(
work
,
struct
hci_dev
,
le_scan_disable
.
work
);
le_scan_disable
.
work
);
struct
hci_cp_le_set_scan_enable
cp
;
struct
hci_cp_le_set_scan_enable
cp
;
BT_DBG
(
"%s"
,
hdev
->
name
);
BT_DBG
(
"%s"
,
hdev
->
name
);
...
@@ -1692,12 +1687,12 @@ static void le_scan_work(struct work_struct *work)
...
@@ -1692,12 +1687,12 @@ static void le_scan_work(struct work_struct *work)
BT_DBG
(
"%s"
,
hdev
->
name
);
BT_DBG
(
"%s"
,
hdev
->
name
);
hci_do_le_scan
(
hdev
,
param
->
type
,
param
->
interval
,
hci_do_le_scan
(
hdev
,
param
->
type
,
param
->
interval
,
param
->
window
,
param
->
window
,
param
->
timeout
);
param
->
timeout
);
}
}
int
hci_le_scan
(
struct
hci_dev
*
hdev
,
u8
type
,
u16
interval
,
u16
window
,
int
hci_le_scan
(
struct
hci_dev
*
hdev
,
u8
type
,
u16
interval
,
u16
window
,
int
timeout
)
int
timeout
)
{
{
struct
le_scan_params
*
param
=
&
hdev
->
le_scan_params
;
struct
le_scan_params
*
param
=
&
hdev
->
le_scan_params
;
...
@@ -2558,7 +2553,7 @@ static inline void hci_sched_acl_pkt(struct hci_dev *hdev)
...
@@ -2558,7 +2553,7 @@ static inline void hci_sched_acl_pkt(struct hci_dev *hdev)
skb
=
skb_dequeue
(
&
chan
->
data_q
);
skb
=
skb_dequeue
(
&
chan
->
data_q
);
hci_conn_enter_active_mode
(
chan
->
conn
,
hci_conn_enter_active_mode
(
chan
->
conn
,
bt_cb
(
skb
)
->
force_active
);
bt_cb
(
skb
)
->
force_active
);
hci_send_frame
(
skb
);
hci_send_frame
(
skb
);
hdev
->
acl_last_tx
=
jiffies
;
hdev
->
acl_last_tx
=
jiffies
;
...
...
net/bluetooth/hci_event.c
浏览文件 @
04124681
...
@@ -556,7 +556,7 @@ static void hci_setup(struct hci_dev *hdev)
...
@@ -556,7 +556,7 @@ static void hci_setup(struct hci_dev *hdev)
if
(
test_bit
(
HCI_SSP_ENABLED
,
&
hdev
->
dev_flags
))
{
if
(
test_bit
(
HCI_SSP_ENABLED
,
&
hdev
->
dev_flags
))
{
u8
mode
=
0x01
;
u8
mode
=
0x01
;
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_SSP_MODE
,
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_SSP_MODE
,
sizeof
(
mode
),
&
mode
);
sizeof
(
mode
),
&
mode
);
}
else
{
}
else
{
struct
hci_cp_write_eir
cp
;
struct
hci_cp_write_eir
cp
;
...
@@ -577,14 +577,14 @@ static void hci_setup(struct hci_dev *hdev)
...
@@ -577,14 +577,14 @@ static void hci_setup(struct hci_dev *hdev)
struct
hci_cp_read_local_ext_features
cp
;
struct
hci_cp_read_local_ext_features
cp
;
cp
.
page
=
0x01
;
cp
.
page
=
0x01
;
hci_send_cmd
(
hdev
,
HCI_OP_READ_LOCAL_EXT_FEATURES
,
hci_send_cmd
(
hdev
,
HCI_OP_READ_LOCAL_EXT_FEATURES
,
sizeof
(
cp
),
sizeof
(
cp
),
&
cp
);
&
cp
);
}
}
if
(
test_bit
(
HCI_LINK_SECURITY
,
&
hdev
->
dev_flags
))
{
if
(
test_bit
(
HCI_LINK_SECURITY
,
&
hdev
->
dev_flags
))
{
u8
enable
=
1
;
u8
enable
=
1
;
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_AUTH_ENABLE
,
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_AUTH_ENABLE
,
sizeof
(
enable
),
sizeof
(
enable
),
&
enable
);
&
enable
);
}
}
}
}
...
@@ -628,8 +628,8 @@ static void hci_setup_link_policy(struct hci_dev *hdev)
...
@@ -628,8 +628,8 @@ static void hci_setup_link_policy(struct hci_dev *hdev)
link_policy
|=
HCI_LP_PARK
;
link_policy
|=
HCI_LP_PARK
;
link_policy
=
cpu_to_le16
(
link_policy
);
link_policy
=
cpu_to_le16
(
link_policy
);
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_DEF_LINK_POLICY
,
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_DEF_LINK_POLICY
,
sizeof
(
link_policy
),
sizeof
(
link_policy
),
&
link_policy
);
&
link_policy
);
}
}
static
void
hci_cc_read_local_commands
(
struct
hci_dev
*
hdev
,
struct
sk_buff
*
skb
)
static
void
hci_cc_read_local_commands
(
struct
hci_dev
*
hdev
,
struct
sk_buff
*
skb
)
...
@@ -717,8 +717,8 @@ static void hci_set_le_support(struct hci_dev *hdev)
...
@@ -717,8 +717,8 @@ static void hci_set_le_support(struct hci_dev *hdev)
}
}
if
(
cp
.
le
!=
!!
(
hdev
->
host_features
[
0
]
&
LMP_HOST_LE
))
if
(
cp
.
le
!=
!!
(
hdev
->
host_features
[
0
]
&
LMP_HOST_LE
))
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_LE_HOST_SUPPORTED
,
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_LE_HOST_SUPPORTED
,
sizeof
(
cp
),
sizeof
(
cp
),
&
cp
);
&
cp
);
}
}
static
void
hci_cc_read_local_ext_features
(
struct
hci_dev
*
hdev
,
static
void
hci_cc_read_local_ext_features
(
struct
hci_dev
*
hdev
,
...
@@ -976,8 +976,8 @@ static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
...
@@ -976,8 +976,8 @@ static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb)
hci_dev_lock
(
hdev
);
hci_dev_lock
(
hdev
);
if
(
test_bit
(
HCI_MGMT
,
&
hdev
->
dev_flags
))
if
(
test_bit
(
HCI_MGMT
,
&
hdev
->
dev_flags
))
mgmt_user_confirm_reply_complete
(
hdev
,
&
rp
->
bdaddr
,
ACL_LINK
,
mgmt_user_confirm_reply_complete
(
hdev
,
&
rp
->
bdaddr
,
ACL_LINK
,
0
,
0
,
rp
->
status
);
rp
->
status
);
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
}
}
...
@@ -993,8 +993,7 @@ static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
...
@@ -993,8 +993,7 @@ static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev,
if
(
test_bit
(
HCI_MGMT
,
&
hdev
->
dev_flags
))
if
(
test_bit
(
HCI_MGMT
,
&
hdev
->
dev_flags
))
mgmt_user_confirm_neg_reply_complete
(
hdev
,
&
rp
->
bdaddr
,
mgmt_user_confirm_neg_reply_complete
(
hdev
,
&
rp
->
bdaddr
,
ACL_LINK
,
0
,
ACL_LINK
,
0
,
rp
->
status
);
rp
->
status
);
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
}
}
...
@@ -1009,7 +1008,7 @@ static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
...
@@ -1009,7 +1008,7 @@ static void hci_cc_user_passkey_reply(struct hci_dev *hdev, struct sk_buff *skb)
if
(
test_bit
(
HCI_MGMT
,
&
hdev
->
dev_flags
))
if
(
test_bit
(
HCI_MGMT
,
&
hdev
->
dev_flags
))
mgmt_user_passkey_reply_complete
(
hdev
,
&
rp
->
bdaddr
,
ACL_LINK
,
mgmt_user_passkey_reply_complete
(
hdev
,
&
rp
->
bdaddr
,
ACL_LINK
,
0
,
rp
->
status
);
0
,
rp
->
status
);
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
}
}
...
@@ -1025,8 +1024,7 @@ static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
...
@@ -1025,8 +1024,7 @@ static void hci_cc_user_passkey_neg_reply(struct hci_dev *hdev,
if
(
test_bit
(
HCI_MGMT
,
&
hdev
->
dev_flags
))
if
(
test_bit
(
HCI_MGMT
,
&
hdev
->
dev_flags
))
mgmt_user_passkey_neg_reply_complete
(
hdev
,
&
rp
->
bdaddr
,
mgmt_user_passkey_neg_reply_complete
(
hdev
,
&
rp
->
bdaddr
,
ACL_LINK
,
0
,
ACL_LINK
,
0
,
rp
->
status
);
rp
->
status
);
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
}
}
...
@@ -1337,7 +1335,7 @@ static int hci_outgoing_auth_needed(struct hci_dev *hdev,
...
@@ -1337,7 +1335,7 @@ static int hci_outgoing_auth_needed(struct hci_dev *hdev,
}
}
static
inline
int
hci_resolve_name
(
struct
hci_dev
*
hdev
,
static
inline
int
hci_resolve_name
(
struct
hci_dev
*
hdev
,
struct
inquiry_entry
*
e
)
struct
inquiry_entry
*
e
)
{
{
struct
hci_cp_remote_name_req
cp
;
struct
hci_cp_remote_name_req
cp
;
...
@@ -1369,14 +1367,14 @@ static bool hci_resolve_next_name(struct hci_dev *hdev)
...
@@ -1369,14 +1367,14 @@ static bool hci_resolve_next_name(struct hci_dev *hdev)
}
}
static
void
hci_check_pending_name
(
struct
hci_dev
*
hdev
,
struct
hci_conn
*
conn
,
static
void
hci_check_pending_name
(
struct
hci_dev
*
hdev
,
struct
hci_conn
*
conn
,
bdaddr_t
*
bdaddr
,
u8
*
name
,
u8
name_len
)
bdaddr_t
*
bdaddr
,
u8
*
name
,
u8
name_len
)
{
{
struct
discovery_state
*
discov
=
&
hdev
->
discovery
;
struct
discovery_state
*
discov
=
&
hdev
->
discovery
;
struct
inquiry_entry
*
e
;
struct
inquiry_entry
*
e
;
if
(
conn
&&
!
test_and_set_bit
(
HCI_CONN_MGMT_CONNECTED
,
&
conn
->
flags
))
if
(
conn
&&
!
test_and_set_bit
(
HCI_CONN_MGMT_CONNECTED
,
&
conn
->
flags
))
mgmt_device_connected
(
hdev
,
bdaddr
,
ACL_LINK
,
0x00
,
0
,
mgmt_device_connected
(
hdev
,
bdaddr
,
ACL_LINK
,
0x00
,
0
,
name
,
name
,
name_len
,
conn
->
dev_class
);
name_len
,
conn
->
dev_class
);
if
(
discov
->
state
==
DISCOVERY_STOPPED
)
if
(
discov
->
state
==
DISCOVERY_STOPPED
)
return
;
return
;
...
@@ -1393,7 +1391,7 @@ static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
...
@@ -1393,7 +1391,7 @@ static void hci_check_pending_name(struct hci_dev *hdev, struct hci_conn *conn,
list_del
(
&
e
->
list
);
list_del
(
&
e
->
list
);
if
(
name
)
if
(
name
)
mgmt_remote_name
(
hdev
,
bdaddr
,
ACL_LINK
,
0x00
,
mgmt_remote_name
(
hdev
,
bdaddr
,
ACL_LINK
,
0x00
,
e
->
data
.
rssi
,
name
,
name_len
);
e
->
data
.
rssi
,
name
,
name_len
);
}
}
if
(
hci_resolve_next_name
(
hdev
))
if
(
hci_resolve_next_name
(
hdev
))
...
@@ -1602,7 +1600,7 @@ static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
...
@@ -1602,7 +1600,7 @@ static void hci_cs_disconnect(struct hci_dev *hdev, u8 status)
conn
=
hci_conn_hash_lookup_handle
(
hdev
,
__le16_to_cpu
(
cp
->
handle
));
conn
=
hci_conn_hash_lookup_handle
(
hdev
,
__le16_to_cpu
(
cp
->
handle
));
if
(
conn
)
if
(
conn
)
mgmt_disconnect_failed
(
hdev
,
&
conn
->
dst
,
conn
->
type
,
mgmt_disconnect_failed
(
hdev
,
&
conn
->
dst
,
conn
->
type
,
conn
->
dst_type
,
status
);
conn
->
dst_type
,
status
);
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
}
}
...
@@ -1718,8 +1716,8 @@ static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *
...
@@ -1718,8 +1716,8 @@ static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *
name_known
=
hci_inquiry_cache_update
(
hdev
,
&
data
,
false
,
&
ssp
);
name_known
=
hci_inquiry_cache_update
(
hdev
,
&
data
,
false
,
&
ssp
);
mgmt_device_found
(
hdev
,
&
info
->
bdaddr
,
ACL_LINK
,
0x00
,
mgmt_device_found
(
hdev
,
&
info
->
bdaddr
,
ACL_LINK
,
0x00
,
info
->
dev_class
,
0
,
!
name_known
,
ssp
,
info
->
dev_class
,
0
,
!
name_known
,
ssp
,
NULL
,
NULL
,
0
);
0
);
}
}
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
...
@@ -1770,7 +1768,7 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s
...
@@ -1770,7 +1768,7 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s
struct
hci_cp_read_remote_features
cp
;
struct
hci_cp_read_remote_features
cp
;
cp
.
handle
=
ev
->
handle
;
cp
.
handle
=
ev
->
handle
;
hci_send_cmd
(
hdev
,
HCI_OP_READ_REMOTE_FEATURES
,
hci_send_cmd
(
hdev
,
HCI_OP_READ_REMOTE_FEATURES
,
sizeof
(
cp
),
&
cp
);
sizeof
(
cp
),
&
cp
);
}
}
/* Set packet type for incoming connection */
/* Set packet type for incoming connection */
...
@@ -1778,14 +1776,14 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s
...
@@ -1778,14 +1776,14 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s
struct
hci_cp_change_conn_ptype
cp
;
struct
hci_cp_change_conn_ptype
cp
;
cp
.
handle
=
ev
->
handle
;
cp
.
handle
=
ev
->
handle
;
cp
.
pkt_type
=
cpu_to_le16
(
conn
->
pkt_type
);
cp
.
pkt_type
=
cpu_to_le16
(
conn
->
pkt_type
);
hci_send_cmd
(
hdev
,
HCI_OP_CHANGE_CONN_PTYPE
,
hci_send_cmd
(
hdev
,
HCI_OP_CHANGE_CONN_PTYPE
,
sizeof
(
cp
),
sizeof
(
cp
),
&
cp
);
&
cp
);
}
}
}
else
{
}
else
{
conn
->
state
=
BT_CLOSED
;
conn
->
state
=
BT_CLOSED
;
if
(
conn
->
type
==
ACL_LINK
)
if
(
conn
->
type
==
ACL_LINK
)
mgmt_connect_failed
(
hdev
,
&
ev
->
bdaddr
,
conn
->
type
,
mgmt_connect_failed
(
hdev
,
&
ev
->
bdaddr
,
conn
->
type
,
conn
->
dst_type
,
ev
->
status
);
conn
->
dst_type
,
ev
->
status
);
}
}
if
(
conn
->
type
==
ACL_LINK
)
if
(
conn
->
type
==
ACL_LINK
)
...
@@ -1850,8 +1848,8 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk
...
@@ -1850,8 +1848,8 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk
else
else
cp
.
role
=
0x01
;
/* Remain slave */
cp
.
role
=
0x01
;
/* Remain slave */
hci_send_cmd
(
hdev
,
HCI_OP_ACCEPT_CONN_REQ
,
hci_send_cmd
(
hdev
,
HCI_OP_ACCEPT_CONN_REQ
,
sizeof
(
cp
),
sizeof
(
cp
),
&
cp
);
&
cp
);
}
else
{
}
else
{
struct
hci_cp_accept_sync_conn_req
cp
;
struct
hci_cp_accept_sync_conn_req
cp
;
...
@@ -1865,7 +1863,7 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk
...
@@ -1865,7 +1863,7 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk
cp
.
retrans_effort
=
0xff
;
cp
.
retrans_effort
=
0xff
;
hci_send_cmd
(
hdev
,
HCI_OP_ACCEPT_SYNC_CONN_REQ
,
hci_send_cmd
(
hdev
,
HCI_OP_ACCEPT_SYNC_CONN_REQ
,
sizeof
(
cp
),
&
cp
);
sizeof
(
cp
),
&
cp
);
}
}
}
else
{
}
else
{
/* Connection rejected */
/* Connection rejected */
...
@@ -1900,7 +1898,7 @@ static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff
...
@@ -1900,7 +1898,7 @@ static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff
conn
->
dst_type
,
ev
->
status
);
conn
->
dst_type
,
ev
->
status
);
else
else
mgmt_device_disconnected
(
hdev
,
&
conn
->
dst
,
conn
->
type
,
mgmt_device_disconnected
(
hdev
,
&
conn
->
dst
,
conn
->
type
,
conn
->
dst_type
);
conn
->
dst_type
);
}
}
if
(
ev
->
status
==
0
)
{
if
(
ev
->
status
==
0
)
{
...
@@ -1935,7 +1933,7 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s
...
@@ -1935,7 +1933,7 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s
}
}
}
else
{
}
else
{
mgmt_auth_failed
(
hdev
,
&
conn
->
dst
,
conn
->
type
,
conn
->
dst_type
,
mgmt_auth_failed
(
hdev
,
&
conn
->
dst
,
conn
->
type
,
conn
->
dst_type
,
ev
->
status
);
ev
->
status
);
}
}
clear_bit
(
HCI_CONN_AUTH_PEND
,
&
conn
->
flags
);
clear_bit
(
HCI_CONN_AUTH_PEND
,
&
conn
->
flags
);
...
@@ -1996,7 +1994,7 @@ static inline void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb
...
@@ -1996,7 +1994,7 @@ static inline void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb
if
(
ev
->
status
==
0
)
if
(
ev
->
status
==
0
)
hci_check_pending_name
(
hdev
,
conn
,
&
ev
->
bdaddr
,
ev
->
name
,
hci_check_pending_name
(
hdev
,
conn
,
&
ev
->
bdaddr
,
ev
->
name
,
strnlen
(
ev
->
name
,
HCI_MAX_NAME_LENGTH
));
strnlen
(
ev
->
name
,
HCI_MAX_NAME_LENGTH
));
else
else
hci_check_pending_name
(
hdev
,
conn
,
&
ev
->
bdaddr
,
NULL
,
0
);
hci_check_pending_name
(
hdev
,
conn
,
&
ev
->
bdaddr
,
NULL
,
0
);
...
@@ -2111,8 +2109,8 @@ static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff
...
@@ -2111,8 +2109,8 @@ static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff
hci_send_cmd
(
hdev
,
HCI_OP_REMOTE_NAME_REQ
,
sizeof
(
cp
),
&
cp
);
hci_send_cmd
(
hdev
,
HCI_OP_REMOTE_NAME_REQ
,
sizeof
(
cp
),
&
cp
);
}
else
if
(
!
test_and_set_bit
(
HCI_CONN_MGMT_CONNECTED
,
&
conn
->
flags
))
}
else
if
(
!
test_and_set_bit
(
HCI_CONN_MGMT_CONNECTED
,
&
conn
->
flags
))
mgmt_device_connected
(
hdev
,
&
conn
->
dst
,
conn
->
type
,
mgmt_device_connected
(
hdev
,
&
conn
->
dst
,
conn
->
type
,
conn
->
dst_type
,
0
,
NULL
,
0
,
conn
->
dst_type
,
0
,
NULL
,
0
,
conn
->
dev_class
);
conn
->
dev_class
);
if
(
!
hci_outgoing_auth_needed
(
hdev
,
conn
))
{
if
(
!
hci_outgoing_auth_needed
(
hdev
,
conn
))
{
conn
->
state
=
BT_CONNECTED
;
conn
->
state
=
BT_CONNECTED
;
...
@@ -2524,7 +2522,7 @@ static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *s
...
@@ -2524,7 +2522,7 @@ static inline void hci_num_comp_pkts_evt(struct hci_dev *hdev, struct sk_buff *s
}
}
static
inline
void
hci_num_comp_blocks_evt
(
struct
hci_dev
*
hdev
,
static
inline
void
hci_num_comp_blocks_evt
(
struct
hci_dev
*
hdev
,
struct
sk_buff
*
skb
)
struct
sk_buff
*
skb
)
{
{
struct
hci_ev_num_comp_blocks
*
ev
=
(
void
*
)
skb
->
data
;
struct
hci_ev_num_comp_blocks
*
ev
=
(
void
*
)
skb
->
data
;
int
i
;
int
i
;
...
@@ -2816,10 +2814,10 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct
...
@@ -2816,10 +2814,10 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct
data
.
ssp_mode
=
0x00
;
data
.
ssp_mode
=
0x00
;
name_known
=
hci_inquiry_cache_update
(
hdev
,
&
data
,
name_known
=
hci_inquiry_cache_update
(
hdev
,
&
data
,
false
,
&
ssp
);
false
,
&
ssp
);
mgmt_device_found
(
hdev
,
&
info
->
bdaddr
,
ACL_LINK
,
0x00
,
mgmt_device_found
(
hdev
,
&
info
->
bdaddr
,
ACL_LINK
,
0x00
,
info
->
dev_class
,
info
->
rssi
,
info
->
dev_class
,
info
->
rssi
,
!
name_known
,
ssp
,
NULL
,
0
);
!
name_known
,
ssp
,
NULL
,
0
);
}
}
}
else
{
}
else
{
struct
inquiry_info_with_rssi
*
info
=
(
void
*
)
(
skb
->
data
+
1
);
struct
inquiry_info_with_rssi
*
info
=
(
void
*
)
(
skb
->
data
+
1
);
...
@@ -2834,10 +2832,10 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct
...
@@ -2834,10 +2832,10 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct
data
.
rssi
=
info
->
rssi
;
data
.
rssi
=
info
->
rssi
;
data
.
ssp_mode
=
0x00
;
data
.
ssp_mode
=
0x00
;
name_known
=
hci_inquiry_cache_update
(
hdev
,
&
data
,
name_known
=
hci_inquiry_cache_update
(
hdev
,
&
data
,
false
,
&
ssp
);
false
,
&
ssp
);
mgmt_device_found
(
hdev
,
&
info
->
bdaddr
,
ACL_LINK
,
0x00
,
mgmt_device_found
(
hdev
,
&
info
->
bdaddr
,
ACL_LINK
,
0x00
,
info
->
dev_class
,
info
->
rssi
,
info
->
dev_class
,
info
->
rssi
,
!
name_known
,
ssp
,
NULL
,
0
);
!
name_known
,
ssp
,
NULL
,
0
);
}
}
}
}
...
@@ -2879,8 +2877,8 @@ static inline void hci_remote_ext_features_evt(struct hci_dev *hdev, struct sk_b
...
@@ -2879,8 +2877,8 @@ static inline void hci_remote_ext_features_evt(struct hci_dev *hdev, struct sk_b
hci_send_cmd
(
hdev
,
HCI_OP_REMOTE_NAME_REQ
,
sizeof
(
cp
),
&
cp
);
hci_send_cmd
(
hdev
,
HCI_OP_REMOTE_NAME_REQ
,
sizeof
(
cp
),
&
cp
);
}
else
if
(
!
test_and_set_bit
(
HCI_CONN_MGMT_CONNECTED
,
&
conn
->
flags
))
}
else
if
(
!
test_and_set_bit
(
HCI_CONN_MGMT_CONNECTED
,
&
conn
->
flags
))
mgmt_device_connected
(
hdev
,
&
conn
->
dst
,
conn
->
type
,
mgmt_device_connected
(
hdev
,
&
conn
->
dst
,
conn
->
type
,
conn
->
dst_type
,
0
,
NULL
,
0
,
conn
->
dst_type
,
0
,
NULL
,
0
,
conn
->
dev_class
);
conn
->
dev_class
);
if
(
!
hci_outgoing_auth_needed
(
hdev
,
conn
))
{
if
(
!
hci_outgoing_auth_needed
(
hdev
,
conn
))
{
conn
->
state
=
BT_CONNECTED
;
conn
->
state
=
BT_CONNECTED
;
...
@@ -2986,17 +2984,16 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct
...
@@ -2986,17 +2984,16 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct
if
(
test_bit
(
HCI_MGMT
,
&
hdev
->
dev_flags
))
if
(
test_bit
(
HCI_MGMT
,
&
hdev
->
dev_flags
))
name_known
=
eir_has_data_type
(
info
->
data
,
name_known
=
eir_has_data_type
(
info
->
data
,
sizeof
(
info
->
data
),
sizeof
(
info
->
data
),
EIR_NAME_COMPLETE
);
EIR_NAME_COMPLETE
);
else
else
name_known
=
true
;
name_known
=
true
;
name_known
=
hci_inquiry_cache_update
(
hdev
,
&
data
,
name_known
,
name_known
=
hci_inquiry_cache_update
(
hdev
,
&
data
,
name_known
,
&
ssp
);
&
ssp
);
mgmt_device_found
(
hdev
,
&
info
->
bdaddr
,
ACL_LINK
,
0x00
,
mgmt_device_found
(
hdev
,
&
info
->
bdaddr
,
ACL_LINK
,
0x00
,
info
->
dev_class
,
info
->
rssi
,
info
->
dev_class
,
info
->
rssi
,
!
name_known
,
!
name_known
,
ssp
,
info
->
data
,
ssp
,
info
->
data
,
sizeof
(
info
->
data
));
sizeof
(
info
->
data
));
}
}
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
...
@@ -3157,7 +3154,7 @@ static inline void hci_user_confirm_request_evt(struct hci_dev *hdev,
...
@@ -3157,7 +3154,7 @@ static inline void hci_user_confirm_request_evt(struct hci_dev *hdev,
confirm:
confirm:
mgmt_user_confirm_request
(
hdev
,
&
ev
->
bdaddr
,
ACL_LINK
,
0
,
ev
->
passkey
,
mgmt_user_confirm_request
(
hdev
,
&
ev
->
bdaddr
,
ACL_LINK
,
0
,
ev
->
passkey
,
confirm_hint
);
confirm_hint
);
unlock:
unlock:
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
...
@@ -3198,7 +3195,7 @@ static inline void hci_simple_pair_complete_evt(struct hci_dev *hdev, struct sk_
...
@@ -3198,7 +3195,7 @@ static inline void hci_simple_pair_complete_evt(struct hci_dev *hdev, struct sk_
* the mgmt_auth_failed event */
* the mgmt_auth_failed event */
if
(
!
test_bit
(
HCI_CONN_AUTH_PEND
,
&
conn
->
flags
)
&&
ev
->
status
!=
0
)
if
(
!
test_bit
(
HCI_CONN_AUTH_PEND
,
&
conn
->
flags
)
&&
ev
->
status
!=
0
)
mgmt_auth_failed
(
hdev
,
&
conn
->
dst
,
conn
->
type
,
conn
->
dst_type
,
mgmt_auth_failed
(
hdev
,
&
conn
->
dst
,
conn
->
type
,
conn
->
dst_type
,
ev
->
status
);
ev
->
status
);
hci_conn_put
(
conn
);
hci_conn_put
(
conn
);
...
@@ -3223,7 +3220,7 @@ static inline void hci_remote_host_features_evt(struct hci_dev *hdev, struct sk_
...
@@ -3223,7 +3220,7 @@ static inline void hci_remote_host_features_evt(struct hci_dev *hdev, struct sk_
}
}
static
inline
void
hci_remote_oob_data_request_evt
(
struct
hci_dev
*
hdev
,
static
inline
void
hci_remote_oob_data_request_evt
(
struct
hci_dev
*
hdev
,
struct
sk_buff
*
skb
)
struct
sk_buff
*
skb
)
{
{
struct
hci_ev_remote_oob_data_request
*
ev
=
(
void
*
)
skb
->
data
;
struct
hci_ev_remote_oob_data_request
*
ev
=
(
void
*
)
skb
->
data
;
struct
oob_data
*
data
;
struct
oob_data
*
data
;
...
@@ -3289,7 +3286,7 @@ static inline void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff
...
@@ -3289,7 +3286,7 @@ static inline void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff
if
(
!
test_and_set_bit
(
HCI_CONN_MGMT_CONNECTED
,
&
conn
->
flags
))
if
(
!
test_and_set_bit
(
HCI_CONN_MGMT_CONNECTED
,
&
conn
->
flags
))
mgmt_device_connected
(
hdev
,
&
ev
->
bdaddr
,
conn
->
type
,
mgmt_device_connected
(
hdev
,
&
ev
->
bdaddr
,
conn
->
type
,
conn
->
dst_type
,
0
,
NULL
,
0
,
NULL
);
conn
->
dst_type
,
0
,
NULL
,
0
,
NULL
);
conn
->
sec_level
=
BT_SECURITY_LOW
;
conn
->
sec_level
=
BT_SECURITY_LOW
;
conn
->
handle
=
__le16_to_cpu
(
ev
->
handle
);
conn
->
handle
=
__le16_to_cpu
(
ev
->
handle
);
...
@@ -3320,8 +3317,7 @@ static inline void hci_le_adv_report_evt(struct hci_dev *hdev,
...
@@ -3320,8 +3317,7 @@ static inline void hci_le_adv_report_evt(struct hci_dev *hdev,
rssi
=
ev
->
data
[
ev
->
length
];
rssi
=
ev
->
data
[
ev
->
length
];
mgmt_device_found
(
hdev
,
&
ev
->
bdaddr
,
LE_LINK
,
ev
->
bdaddr_type
,
mgmt_device_found
(
hdev
,
&
ev
->
bdaddr
,
LE_LINK
,
ev
->
bdaddr_type
,
NULL
,
rssi
,
0
,
1
,
ev
->
data
,
NULL
,
rssi
,
0
,
1
,
ev
->
data
,
ev
->
length
);
ev
->
length
);
ptr
+=
sizeof
(
*
ev
)
+
ev
->
length
+
1
;
ptr
+=
sizeof
(
*
ev
)
+
ev
->
length
+
1
;
}
}
...
...
net/bluetooth/l2cap_core.c
浏览文件 @
04124681
...
@@ -1546,7 +1546,9 @@ static void l2cap_send_srejtail(struct l2cap_chan *chan)
...
@@ -1546,7 +1546,9 @@ static void l2cap_send_srejtail(struct l2cap_chan *chan)
l2cap_send_sframe
(
chan
,
control
);
l2cap_send_sframe
(
chan
,
control
);
}
}
static
inline
int
l2cap_skbuff_fromiovec
(
struct
l2cap_chan
*
chan
,
struct
msghdr
*
msg
,
int
len
,
int
count
,
struct
sk_buff
*
skb
)
static
inline
int
l2cap_skbuff_fromiovec
(
struct
l2cap_chan
*
chan
,
struct
msghdr
*
msg
,
int
len
,
int
count
,
struct
sk_buff
*
skb
)
{
{
struct
l2cap_conn
*
conn
=
chan
->
conn
;
struct
l2cap_conn
*
conn
=
chan
->
conn
;
struct
sk_buff
**
frag
;
struct
sk_buff
**
frag
;
...
@@ -1564,7 +1566,8 @@ static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan, struct msghdr
...
@@ -1564,7 +1566,8 @@ static inline int l2cap_skbuff_fromiovec(struct l2cap_chan *chan, struct msghdr
count
=
min_t
(
unsigned
int
,
conn
->
mtu
,
len
);
count
=
min_t
(
unsigned
int
,
conn
->
mtu
,
len
);
*
frag
=
chan
->
ops
->
alloc_skb
(
chan
,
count
,
*
frag
=
chan
->
ops
->
alloc_skb
(
chan
,
count
,
msg
->
msg_flags
&
MSG_DONTWAIT
,
&
err
);
msg
->
msg_flags
&
MSG_DONTWAIT
,
&
err
);
if
(
!*
frag
)
if
(
!*
frag
)
return
err
;
return
err
;
...
@@ -1596,7 +1599,7 @@ static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
...
@@ -1596,7 +1599,7 @@ static struct sk_buff *l2cap_create_connless_pdu(struct l2cap_chan *chan,
count
=
min_t
(
unsigned
int
,
(
conn
->
mtu
-
hlen
),
len
);
count
=
min_t
(
unsigned
int
,
(
conn
->
mtu
-
hlen
),
len
);
skb
=
chan
->
ops
->
alloc_skb
(
chan
,
count
+
hlen
,
skb
=
chan
->
ops
->
alloc_skb
(
chan
,
count
+
hlen
,
msg
->
msg_flags
&
MSG_DONTWAIT
,
&
err
);
msg
->
msg_flags
&
MSG_DONTWAIT
,
&
err
);
if
(
!
skb
)
if
(
!
skb
)
return
ERR_PTR
(
err
);
return
ERR_PTR
(
err
);
...
@@ -1631,7 +1634,7 @@ static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
...
@@ -1631,7 +1634,7 @@ static struct sk_buff *l2cap_create_basic_pdu(struct l2cap_chan *chan,
count
=
min_t
(
unsigned
int
,
(
conn
->
mtu
-
hlen
),
len
);
count
=
min_t
(
unsigned
int
,
(
conn
->
mtu
-
hlen
),
len
);
skb
=
chan
->
ops
->
alloc_skb
(
chan
,
count
+
hlen
,
skb
=
chan
->
ops
->
alloc_skb
(
chan
,
count
+
hlen
,
msg
->
msg_flags
&
MSG_DONTWAIT
,
&
err
);
msg
->
msg_flags
&
MSG_DONTWAIT
,
&
err
);
if
(
!
skb
)
if
(
!
skb
)
return
ERR_PTR
(
err
);
return
ERR_PTR
(
err
);
...
...
net/bluetooth/l2cap_sock.c
浏览文件 @
04124681
...
@@ -926,7 +926,8 @@ static void l2cap_sock_state_change_cb(void *data, int state)
...
@@ -926,7 +926,8 @@ static void l2cap_sock_state_change_cb(void *data, int state)
}
}
static
struct
sk_buff
*
l2cap_sock_alloc_skb_cb
(
struct
l2cap_chan
*
chan
,
static
struct
sk_buff
*
l2cap_sock_alloc_skb_cb
(
struct
l2cap_chan
*
chan
,
unsigned
long
len
,
int
nb
,
int
*
err
)
unsigned
long
len
,
int
nb
,
int
*
err
)
{
{
struct
sock
*
sk
=
chan
->
sk
;
struct
sock
*
sk
=
chan
->
sk
;
...
...
net/bluetooth/mgmt.c
浏览文件 @
04124681
...
@@ -234,7 +234,7 @@ static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
...
@@ -234,7 +234,7 @@ static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
}
}
static
int
cmd_complete
(
struct
sock
*
sk
,
u16
index
,
u16
cmd
,
u8
status
,
static
int
cmd_complete
(
struct
sock
*
sk
,
u16
index
,
u16
cmd
,
u8
status
,
void
*
rp
,
size_t
rp_len
)
void
*
rp
,
size_t
rp_len
)
{
{
struct
sk_buff
*
skb
;
struct
sk_buff
*
skb
;
struct
mgmt_hdr
*
hdr
;
struct
mgmt_hdr
*
hdr
;
...
@@ -267,8 +267,8 @@ static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status,
...
@@ -267,8 +267,8 @@ static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status,
return
err
;
return
err
;
}
}
static
int
read_version
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
read_version
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
void
*
data
,
u16
data_len
)
u16
data_len
)
{
{
struct
mgmt_rp_read_version
rp
;
struct
mgmt_rp_read_version
rp
;
...
@@ -278,11 +278,11 @@ static int read_version(struct sock *sk, struct hci_dev *hdev,
...
@@ -278,11 +278,11 @@ static int read_version(struct sock *sk, struct hci_dev *hdev,
put_unaligned_le16
(
MGMT_REVISION
,
&
rp
.
revision
);
put_unaligned_le16
(
MGMT_REVISION
,
&
rp
.
revision
);
return
cmd_complete
(
sk
,
MGMT_INDEX_NONE
,
MGMT_OP_READ_VERSION
,
0
,
&
rp
,
return
cmd_complete
(
sk
,
MGMT_INDEX_NONE
,
MGMT_OP_READ_VERSION
,
0
,
&
rp
,
sizeof
(
rp
));
sizeof
(
rp
));
}
}
static
int
read_commands
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
read_commands
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
void
*
data
,
u16
data_len
)
u16
data_len
)
{
{
struct
mgmt_rp_read_commands
*
rp
;
struct
mgmt_rp_read_commands
*
rp
;
u16
num_commands
=
ARRAY_SIZE
(
mgmt_commands
);
u16
num_commands
=
ARRAY_SIZE
(
mgmt_commands
);
...
@@ -309,14 +309,14 @@ static int read_commands(struct sock *sk, struct hci_dev *hdev,
...
@@ -309,14 +309,14 @@ static int read_commands(struct sock *sk, struct hci_dev *hdev,
put_unaligned_le16
(
mgmt_events
[
i
],
opcode
);
put_unaligned_le16
(
mgmt_events
[
i
],
opcode
);
err
=
cmd_complete
(
sk
,
MGMT_INDEX_NONE
,
MGMT_OP_READ_COMMANDS
,
0
,
rp
,
err
=
cmd_complete
(
sk
,
MGMT_INDEX_NONE
,
MGMT_OP_READ_COMMANDS
,
0
,
rp
,
rp_size
);
rp_size
);
kfree
(
rp
);
kfree
(
rp
);
return
err
;
return
err
;
}
}
static
int
read_index_list
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
read_index_list
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
void
*
data
,
u16
data_len
)
u16
data_len
)
{
{
struct
mgmt_rp_read_index_list
*
rp
;
struct
mgmt_rp_read_index_list
*
rp
;
struct
list_head
*
p
;
struct
list_head
*
p
;
...
@@ -355,7 +355,7 @@ static int read_index_list(struct sock *sk, struct hci_dev *hdev,
...
@@ -355,7 +355,7 @@ static int read_index_list(struct sock *sk, struct hci_dev *hdev,
read_unlock
(
&
hci_dev_list_lock
);
read_unlock
(
&
hci_dev_list_lock
);
err
=
cmd_complete
(
sk
,
MGMT_INDEX_NONE
,
MGMT_OP_READ_INDEX_LIST
,
0
,
rp
,
err
=
cmd_complete
(
sk
,
MGMT_INDEX_NONE
,
MGMT_OP_READ_INDEX_LIST
,
0
,
rp
,
rp_len
);
rp_len
);
kfree
(
rp
);
kfree
(
rp
);
...
@@ -600,7 +600,7 @@ static int update_class(struct hci_dev *hdev)
...
@@ -600,7 +600,7 @@ static int update_class(struct hci_dev *hdev)
static
void
service_cache_off
(
struct
work_struct
*
work
)
static
void
service_cache_off
(
struct
work_struct
*
work
)
{
{
struct
hci_dev
*
hdev
=
container_of
(
work
,
struct
hci_dev
,
struct
hci_dev
*
hdev
=
container_of
(
work
,
struct
hci_dev
,
service_cache
.
work
);
service_cache
.
work
);
if
(
!
test_and_clear_bit
(
HCI_SERVICE_CACHE
,
&
hdev
->
dev_flags
))
if
(
!
test_and_clear_bit
(
HCI_SERVICE_CACHE
,
&
hdev
->
dev_flags
))
return
;
return
;
...
@@ -629,7 +629,7 @@ static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
...
@@ -629,7 +629,7 @@ static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
}
}
static
int
read_controller_info
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
read_controller_info
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
data_len
)
void
*
data
,
u16
data_len
)
{
{
struct
mgmt_rp_read_info
rp
;
struct
mgmt_rp_read_info
rp
;
...
@@ -656,7 +656,7 @@ static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
...
@@ -656,7 +656,7 @@ static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
return
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_READ_INFO
,
0
,
&
rp
,
return
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_READ_INFO
,
0
,
&
rp
,
sizeof
(
rp
));
sizeof
(
rp
));
}
}
static
void
mgmt_pending_free
(
struct
pending_cmd
*
cmd
)
static
void
mgmt_pending_free
(
struct
pending_cmd
*
cmd
)
...
@@ -667,8 +667,8 @@ static void mgmt_pending_free(struct pending_cmd *cmd)
...
@@ -667,8 +667,8 @@ static void mgmt_pending_free(struct pending_cmd *cmd)
}
}
static
struct
pending_cmd
*
mgmt_pending_add
(
struct
sock
*
sk
,
u16
opcode
,
static
struct
pending_cmd
*
mgmt_pending_add
(
struct
sock
*
sk
,
u16
opcode
,
struct
hci_dev
*
hdev
,
struct
hci_dev
*
hdev
,
void
*
data
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
...
@@ -697,8 +697,8 @@ static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
...
@@ -697,8 +697,8 @@ static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
}
}
static
void
mgmt_pending_foreach
(
u16
opcode
,
struct
hci_dev
*
hdev
,
static
void
mgmt_pending_foreach
(
u16
opcode
,
struct
hci_dev
*
hdev
,
void
(
*
cb
)(
struct
pending_cmd
*
cmd
,
void
*
data
),
void
(
*
cb
)(
struct
pending_cmd
*
cmd
,
void
*
data
),
void
*
data
)
void
*
data
)
{
{
struct
list_head
*
p
,
*
n
;
struct
list_head
*
p
,
*
n
;
...
@@ -737,11 +737,11 @@ static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
...
@@ -737,11 +737,11 @@ static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
__le32
settings
=
cpu_to_le32
(
get_current_settings
(
hdev
));
__le32
settings
=
cpu_to_le32
(
get_current_settings
(
hdev
));
return
cmd_complete
(
sk
,
hdev
->
id
,
opcode
,
0
,
&
settings
,
return
cmd_complete
(
sk
,
hdev
->
id
,
opcode
,
0
,
&
settings
,
sizeof
(
settings
));
sizeof
(
settings
));
}
}
static
int
set_powered
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
set_powered
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_mode
*
cp
=
data
;
struct
mgmt_mode
*
cp
=
data
;
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
...
@@ -768,7 +768,7 @@ static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -768,7 +768,7 @@ static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
mgmt_pending_find
(
MGMT_OP_SET_POWERED
,
hdev
))
{
if
(
mgmt_pending_find
(
MGMT_OP_SET_POWERED
,
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_POWERED
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_POWERED
,
MGMT_STATUS_BUSY
);
MGMT_STATUS_BUSY
);
goto
failed
;
goto
failed
;
}
}
...
@@ -790,8 +790,8 @@ static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -790,8 +790,8 @@ static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
return
err
;
return
err
;
}
}
static
int
mgmt_event
(
u16
event
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
mgmt_event
(
u16
event
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
data_len
,
u16
data_len
,
struct
sock
*
skip_sk
)
struct
sock
*
skip_sk
)
{
{
struct
sk_buff
*
skb
;
struct
sk_buff
*
skb
;
struct
mgmt_hdr
*
hdr
;
struct
mgmt_hdr
*
hdr
;
...
@@ -830,7 +830,7 @@ static int new_settings(struct hci_dev *hdev, struct sock *skip)
...
@@ -830,7 +830,7 @@ static int new_settings(struct hci_dev *hdev, struct sock *skip)
}
}
static
int
set_discoverable
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
set_discoverable
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_set_discoverable
*
cp
=
data
;
struct
mgmt_cp_set_discoverable
*
cp
=
data
;
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
...
@@ -843,26 +843,26 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -843,26 +843,26 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
timeout
=
get_unaligned_le16
(
&
cp
->
timeout
);
timeout
=
get_unaligned_le16
(
&
cp
->
timeout
);
if
(
!
cp
->
val
&&
timeout
>
0
)
if
(
!
cp
->
val
&&
timeout
>
0
)
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DISCOVERABLE
,
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DISCOVERABLE
,
MGMT_STATUS_INVALID_PARAMS
);
MGMT_STATUS_INVALID_PARAMS
);
hci_dev_lock
(
hdev
);
hci_dev_lock
(
hdev
);
if
(
!
hdev_is_powered
(
hdev
)
&&
timeout
>
0
)
{
if
(
!
hdev_is_powered
(
hdev
)
&&
timeout
>
0
)
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DISCOVERABLE
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DISCOVERABLE
,
MGMT_STATUS_NOT_POWERED
);
MGMT_STATUS_NOT_POWERED
);
goto
failed
;
goto
failed
;
}
}
if
(
mgmt_pending_find
(
MGMT_OP_SET_DISCOVERABLE
,
hdev
)
||
if
(
mgmt_pending_find
(
MGMT_OP_SET_DISCOVERABLE
,
hdev
)
||
mgmt_pending_find
(
MGMT_OP_SET_CONNECTABLE
,
hdev
))
{
mgmt_pending_find
(
MGMT_OP_SET_CONNECTABLE
,
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DISCOVERABLE
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DISCOVERABLE
,
MGMT_STATUS_BUSY
);
MGMT_STATUS_BUSY
);
goto
failed
;
goto
failed
;
}
}
if
(
!
test_bit
(
HCI_CONNECTABLE
,
&
hdev
->
dev_flags
))
{
if
(
!
test_bit
(
HCI_CONNECTABLE
,
&
hdev
->
dev_flags
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DISCOVERABLE
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DISCOVERABLE
,
MGMT_STATUS_REJECTED
);
MGMT_STATUS_REJECTED
);
goto
failed
;
goto
failed
;
}
}
...
@@ -926,7 +926,7 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -926,7 +926,7 @@ static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
}
}
static
int
set_connectable
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
set_connectable
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_mode
*
cp
=
data
;
struct
mgmt_mode
*
cp
=
data
;
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
...
@@ -963,7 +963,7 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -963,7 +963,7 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
mgmt_pending_find
(
MGMT_OP_SET_DISCOVERABLE
,
hdev
)
||
if
(
mgmt_pending_find
(
MGMT_OP_SET_DISCOVERABLE
,
hdev
)
||
mgmt_pending_find
(
MGMT_OP_SET_CONNECTABLE
,
hdev
))
{
mgmt_pending_find
(
MGMT_OP_SET_CONNECTABLE
,
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_CONNECTABLE
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_CONNECTABLE
,
MGMT_STATUS_BUSY
);
MGMT_STATUS_BUSY
);
goto
failed
;
goto
failed
;
}
}
...
@@ -998,7 +998,7 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -998,7 +998,7 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
}
}
static
int
set_pairable
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
set_pairable
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_mode
*
cp
=
data
;
struct
mgmt_mode
*
cp
=
data
;
int
err
;
int
err
;
...
@@ -1023,8 +1023,8 @@ static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1023,8 +1023,8 @@ static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
return
err
;
return
err
;
}
}
static
int
set_link_security
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
set_link_security
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_mode
*
cp
=
data
;
struct
mgmt_mode
*
cp
=
data
;
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
...
@@ -1056,7 +1056,7 @@ static int set_link_security(struct sock *sk, struct hci_dev *hdev,
...
@@ -1056,7 +1056,7 @@ static int set_link_security(struct sock *sk, struct hci_dev *hdev,
if
(
mgmt_pending_find
(
MGMT_OP_SET_LINK_SECURITY
,
hdev
))
{
if
(
mgmt_pending_find
(
MGMT_OP_SET_LINK_SECURITY
,
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_LINK_SECURITY
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_LINK_SECURITY
,
MGMT_STATUS_BUSY
);
MGMT_STATUS_BUSY
);
goto
failed
;
goto
failed
;
}
}
...
@@ -1097,7 +1097,7 @@ static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
...
@@ -1097,7 +1097,7 @@ static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
if
(
!
(
hdev
->
features
[
6
]
&
LMP_SIMPLE_PAIR
))
{
if
(
!
(
hdev
->
features
[
6
]
&
LMP_SIMPLE_PAIR
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_SSP
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_SSP
,
MGMT_STATUS_NOT_SUPPORTED
);
MGMT_STATUS_NOT_SUPPORTED
);
goto
failed
;
goto
failed
;
}
}
...
@@ -1122,8 +1122,8 @@ static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
...
@@ -1122,8 +1122,8 @@ static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
}
}
if
(
mgmt_pending_find
(
MGMT_OP_SET_SSP
,
hdev
))
{
if
(
mgmt_pending_find
(
MGMT_OP_SET_SSP
,
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_SSP
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_SSP
,
MGMT_STATUS_BUSY
);
MGMT_STATUS_BUSY
);
goto
failed
;
goto
failed
;
}
}
...
@@ -1157,7 +1157,7 @@ static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
...
@@ -1157,7 +1157,7 @@ static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
if
(
!
enable_hs
)
if
(
!
enable_hs
)
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_HS
,
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_HS
,
MGMT_STATUS_NOT_SUPPORTED
);
MGMT_STATUS_NOT_SUPPORTED
);
if
(
cp
->
val
)
if
(
cp
->
val
)
set_bit
(
HCI_HS_ENABLED
,
&
hdev
->
dev_flags
);
set_bit
(
HCI_HS_ENABLED
,
&
hdev
->
dev_flags
);
...
@@ -1181,7 +1181,7 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
...
@@ -1181,7 +1181,7 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
if
(
!
enable_le
||
!
(
hdev
->
features
[
4
]
&
LMP_LE
))
{
if
(
!
enable_le
||
!
(
hdev
->
features
[
4
]
&
LMP_LE
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_LE
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_LE
,
MGMT_STATUS_NOT_SUPPORTED
);
MGMT_STATUS_NOT_SUPPORTED
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1208,7 +1208,7 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
...
@@ -1208,7 +1208,7 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
if
(
mgmt_pending_find
(
MGMT_OP_SET_LE
,
hdev
))
{
if
(
mgmt_pending_find
(
MGMT_OP_SET_LE
,
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_LE
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_LE
,
MGMT_STATUS_BUSY
);
MGMT_STATUS_BUSY
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1225,8 +1225,8 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
...
@@ -1225,8 +1225,8 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
hci_cp
.
simul
=
!!
(
hdev
->
features
[
6
]
&
LMP_SIMUL_LE_BR
);
hci_cp
.
simul
=
!!
(
hdev
->
features
[
6
]
&
LMP_SIMUL_LE_BR
);
}
}
err
=
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_LE_HOST_SUPPORTED
,
err
=
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_LE_HOST_SUPPORTED
,
sizeof
(
hci_cp
),
sizeof
(
hci_cp
),
&
hci_cp
);
&
hci_cp
);
if
(
err
<
0
)
{
if
(
err
<
0
)
{
mgmt_pending_remove
(
cmd
);
mgmt_pending_remove
(
cmd
);
goto
unlock
;
goto
unlock
;
...
@@ -1250,7 +1250,7 @@ static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
...
@@ -1250,7 +1250,7 @@ static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
if
(
test_bit
(
HCI_PENDING_CLASS
,
&
hdev
->
dev_flags
))
{
if
(
test_bit
(
HCI_PENDING_CLASS
,
&
hdev
->
dev_flags
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_ADD_UUID
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_ADD_UUID
,
MGMT_STATUS_BUSY
);
MGMT_STATUS_BUSY
);
goto
failed
;
goto
failed
;
}
}
...
@@ -1275,7 +1275,7 @@ static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
...
@@ -1275,7 +1275,7 @@ static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
if
(
!
test_bit
(
HCI_PENDING_CLASS
,
&
hdev
->
dev_flags
))
{
if
(
!
test_bit
(
HCI_PENDING_CLASS
,
&
hdev
->
dev_flags
))
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_ADD_UUID
,
0
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_ADD_UUID
,
0
,
hdev
->
dev_class
,
3
);
hdev
->
dev_class
,
3
);
goto
failed
;
goto
failed
;
}
}
...
@@ -1318,7 +1318,7 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1318,7 +1318,7 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
test_bit
(
HCI_PENDING_CLASS
,
&
hdev
->
dev_flags
))
{
if
(
test_bit
(
HCI_PENDING_CLASS
,
&
hdev
->
dev_flags
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_REMOVE_UUID
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_REMOVE_UUID
,
MGMT_STATUS_BUSY
);
MGMT_STATUS_BUSY
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1327,7 +1327,7 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1327,7 +1327,7 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
enable_service_cache
(
hdev
))
{
if
(
enable_service_cache
(
hdev
))
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_REMOVE_UUID
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_REMOVE_UUID
,
0
,
hdev
->
dev_class
,
3
);
0
,
hdev
->
dev_class
,
3
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1348,7 +1348,7 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1348,7 +1348,7 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
found
==
0
)
{
if
(
found
==
0
)
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_REMOVE_UUID
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_REMOVE_UUID
,
MGMT_STATUS_INVALID_PARAMS
);
MGMT_STATUS_INVALID_PARAMS
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1363,7 +1363,7 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1363,7 +1363,7 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
!
test_bit
(
HCI_PENDING_CLASS
,
&
hdev
->
dev_flags
))
{
if
(
!
test_bit
(
HCI_PENDING_CLASS
,
&
hdev
->
dev_flags
))
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_REMOVE_UUID
,
0
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_REMOVE_UUID
,
0
,
hdev
->
dev_class
,
3
);
hdev
->
dev_class
,
3
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1379,7 +1379,7 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1379,7 +1379,7 @@ static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
}
}
static
int
set_dev_class
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
set_dev_class
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_set_dev_class
*
cp
=
data
;
struct
mgmt_cp_set_dev_class
*
cp
=
data
;
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
...
@@ -1391,7 +1391,7 @@ static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1391,7 +1391,7 @@ static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
test_bit
(
HCI_PENDING_CLASS
,
&
hdev
->
dev_flags
))
{
if
(
test_bit
(
HCI_PENDING_CLASS
,
&
hdev
->
dev_flags
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DEV_CLASS
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DEV_CLASS
,
MGMT_STATUS_BUSY
);
MGMT_STATUS_BUSY
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1400,7 +1400,7 @@ static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1400,7 +1400,7 @@ static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
!
hdev_is_powered
(
hdev
))
{
if
(
!
hdev_is_powered
(
hdev
))
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DEV_CLASS
,
0
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DEV_CLASS
,
0
,
hdev
->
dev_class
,
3
);
hdev
->
dev_class
,
3
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1417,7 +1417,7 @@ static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1417,7 +1417,7 @@ static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
!
test_bit
(
HCI_PENDING_CLASS
,
&
hdev
->
dev_flags
))
{
if
(
!
test_bit
(
HCI_PENDING_CLASS
,
&
hdev
->
dev_flags
))
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DEV_CLASS
,
0
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_SET_DEV_CLASS
,
0
,
hdev
->
dev_class
,
3
);
hdev
->
dev_class
,
3
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1447,7 +1447,7 @@ static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1447,7 +1447,7 @@ static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
BT_ERR
(
"load_link_keys: expected %u bytes, got %u bytes"
,
BT_ERR
(
"load_link_keys: expected %u bytes, got %u bytes"
,
len
,
expected_len
);
len
,
expected_len
);
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_LOAD_LINK_KEYS
,
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_LOAD_LINK_KEYS
,
MGMT_STATUS_INVALID_PARAMS
);
MGMT_STATUS_INVALID_PARAMS
);
}
}
BT_DBG
(
"%s debug_keys %u key_count %u"
,
hdev
->
name
,
cp
->
debug_keys
,
BT_DBG
(
"%s debug_keys %u key_count %u"
,
hdev
->
name
,
cp
->
debug_keys
,
...
@@ -1468,7 +1468,7 @@ static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1468,7 +1468,7 @@ static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
struct
mgmt_link_key_info
*
key
=
&
cp
->
keys
[
i
];
struct
mgmt_link_key_info
*
key
=
&
cp
->
keys
[
i
];
hci_add_link_key
(
hdev
,
NULL
,
0
,
&
key
->
addr
.
bdaddr
,
key
->
val
,
hci_add_link_key
(
hdev
,
NULL
,
0
,
&
key
->
addr
.
bdaddr
,
key
->
val
,
key
->
type
,
key
->
pin_len
);
key
->
type
,
key
->
pin_len
);
}
}
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_LOAD_LINK_KEYS
,
0
,
NULL
,
0
);
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_LOAD_LINK_KEYS
,
0
,
NULL
,
0
);
...
@@ -1479,7 +1479,7 @@ static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1479,7 +1479,7 @@ static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
}
}
static
int
device_unpaired
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
static
int
device_unpaired
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
addr_type
,
struct
sock
*
skip_sk
)
u8
addr_type
,
struct
sock
*
skip_sk
)
{
{
struct
mgmt_ev_device_unpaired
ev
;
struct
mgmt_ev_device_unpaired
ev
;
...
@@ -1487,11 +1487,11 @@ static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -1487,11 +1487,11 @@ static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
ev
.
addr
.
type
=
addr_type
;
ev
.
addr
.
type
=
addr_type
;
return
mgmt_event
(
MGMT_EV_DEVICE_UNPAIRED
,
hdev
,
&
ev
,
sizeof
(
ev
),
return
mgmt_event
(
MGMT_EV_DEVICE_UNPAIRED
,
hdev
,
&
ev
,
sizeof
(
ev
),
skip_sk
);
skip_sk
);
}
}
static
int
unpair_device
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
unpair_device
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_unpair_device
*
cp
=
data
;
struct
mgmt_cp_unpair_device
*
cp
=
data
;
struct
mgmt_rp_unpair_device
rp
;
struct
mgmt_rp_unpair_device
rp
;
...
@@ -1508,8 +1508,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1508,8 +1508,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
!
hdev_is_powered
(
hdev
))
{
if
(
!
hdev_is_powered
(
hdev
))
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_UNPAIR_DEVICE
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_UNPAIR_DEVICE
,
MGMT_STATUS_NOT_POWERED
,
MGMT_STATUS_NOT_POWERED
,
&
rp
,
sizeof
(
rp
));
&
rp
,
sizeof
(
rp
));
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1520,8 +1519,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1520,8 +1519,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
err
<
0
)
{
if
(
err
<
0
)
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_UNPAIR_DEVICE
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_UNPAIR_DEVICE
,
MGMT_STATUS_NOT_PAIRED
,
MGMT_STATUS_NOT_PAIRED
,
&
rp
,
sizeof
(
rp
));
&
rp
,
sizeof
(
rp
));
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1538,13 +1536,13 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1538,13 +1536,13 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
!
conn
)
{
if
(
!
conn
)
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_UNPAIR_DEVICE
,
0
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_UNPAIR_DEVICE
,
0
,
&
rp
,
sizeof
(
rp
));
&
rp
,
sizeof
(
rp
));
device_unpaired
(
hdev
,
&
cp
->
addr
.
bdaddr
,
cp
->
addr
.
type
,
sk
);
device_unpaired
(
hdev
,
&
cp
->
addr
.
bdaddr
,
cp
->
addr
.
type
,
sk
);
goto
unlock
;
goto
unlock
;
}
}
cmd
=
mgmt_pending_add
(
sk
,
MGMT_OP_UNPAIR_DEVICE
,
hdev
,
cp
,
cmd
=
mgmt_pending_add
(
sk
,
MGMT_OP_UNPAIR_DEVICE
,
hdev
,
cp
,
sizeof
(
*
cp
));
sizeof
(
*
cp
));
if
(
!
cmd
)
{
if
(
!
cmd
)
{
err
=
-
ENOMEM
;
err
=
-
ENOMEM
;
goto
unlock
;
goto
unlock
;
...
@@ -1562,7 +1560,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1562,7 +1560,7 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
}
}
static
int
disconnect
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
disconnect
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_disconnect
*
cp
=
data
;
struct
mgmt_cp_disconnect
*
cp
=
data
;
struct
hci_cp_disconnect
dc
;
struct
hci_cp_disconnect
dc
;
...
@@ -1576,13 +1574,13 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1576,13 +1574,13 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
!
test_bit
(
HCI_UP
,
&
hdev
->
flags
))
{
if
(
!
test_bit
(
HCI_UP
,
&
hdev
->
flags
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_DISCONNECT
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_DISCONNECT
,
MGMT_STATUS_NOT_POWERED
);
MGMT_STATUS_NOT_POWERED
);
goto
failed
;
goto
failed
;
}
}
if
(
mgmt_pending_find
(
MGMT_OP_DISCONNECT
,
hdev
))
{
if
(
mgmt_pending_find
(
MGMT_OP_DISCONNECT
,
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_DISCONNECT
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_DISCONNECT
,
MGMT_STATUS_BUSY
);
MGMT_STATUS_BUSY
);
goto
failed
;
goto
failed
;
}
}
...
@@ -1593,7 +1591,7 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1593,7 +1591,7 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
!
conn
)
{
if
(
!
conn
)
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_DISCONNECT
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_DISCONNECT
,
MGMT_STATUS_NOT_CONNECTED
);
MGMT_STATUS_NOT_CONNECTED
);
goto
failed
;
goto
failed
;
}
}
...
@@ -1634,8 +1632,8 @@ static u8 link_to_mgmt(u8 link_type, u8 addr_type)
...
@@ -1634,8 +1632,8 @@ static u8 link_to_mgmt(u8 link_type, u8 addr_type)
}
}
}
}
static
int
get_connections
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
get_connections
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
void
*
data
,
u16
data_len
)
u16
data_len
)
{
{
struct
mgmt_rp_get_connections
*
rp
;
struct
mgmt_rp_get_connections
*
rp
;
struct
hci_conn
*
c
;
struct
hci_conn
*
c
;
...
@@ -1649,7 +1647,7 @@ static int get_connections(struct sock *sk, struct hci_dev *hdev,
...
@@ -1649,7 +1647,7 @@ static int get_connections(struct sock *sk, struct hci_dev *hdev,
if
(
!
hdev_is_powered
(
hdev
))
{
if
(
!
hdev_is_powered
(
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_GET_CONNECTIONS
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_GET_CONNECTIONS
,
MGMT_STATUS_NOT_POWERED
);
MGMT_STATUS_NOT_POWERED
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1683,7 +1681,7 @@ static int get_connections(struct sock *sk, struct hci_dev *hdev,
...
@@ -1683,7 +1681,7 @@ static int get_connections(struct sock *sk, struct hci_dev *hdev,
rp_len
=
sizeof
(
*
rp
)
+
(
i
*
sizeof
(
struct
mgmt_addr_info
));
rp_len
=
sizeof
(
*
rp
)
+
(
i
*
sizeof
(
struct
mgmt_addr_info
));
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_GET_CONNECTIONS
,
0
,
rp
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_GET_CONNECTIONS
,
0
,
rp
,
rp_len
);
rp_len
);
kfree
(
rp
);
kfree
(
rp
);
...
@@ -1693,18 +1691,18 @@ static int get_connections(struct sock *sk, struct hci_dev *hdev,
...
@@ -1693,18 +1691,18 @@ static int get_connections(struct sock *sk, struct hci_dev *hdev,
}
}
static
int
send_pin_code_neg_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
send_pin_code_neg_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
struct
mgmt_cp_pin_code_neg_reply
*
cp
)
struct
mgmt_cp_pin_code_neg_reply
*
cp
)
{
{
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
int
err
;
int
err
;
cmd
=
mgmt_pending_add
(
sk
,
MGMT_OP_PIN_CODE_NEG_REPLY
,
hdev
,
cp
,
cmd
=
mgmt_pending_add
(
sk
,
MGMT_OP_PIN_CODE_NEG_REPLY
,
hdev
,
cp
,
sizeof
(
*
cp
));
sizeof
(
*
cp
));
if
(
!
cmd
)
if
(
!
cmd
)
return
-
ENOMEM
;
return
-
ENOMEM
;
err
=
hci_send_cmd
(
hdev
,
HCI_OP_PIN_CODE_NEG_REPLY
,
err
=
hci_send_cmd
(
hdev
,
HCI_OP_PIN_CODE_NEG_REPLY
,
sizeof
(
cp
->
addr
.
bdaddr
),
&
cp
->
addr
.
bdaddr
);
sizeof
(
cp
->
addr
.
bdaddr
),
&
cp
->
addr
.
bdaddr
);
if
(
err
<
0
)
if
(
err
<
0
)
mgmt_pending_remove
(
cmd
);
mgmt_pending_remove
(
cmd
);
...
@@ -1712,7 +1710,7 @@ static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
...
@@ -1712,7 +1710,7 @@ static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
}
}
static
int
pin_code_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
pin_code_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
hci_conn
*
conn
;
struct
hci_conn
*
conn
;
struct
mgmt_cp_pin_code_reply
*
cp
=
data
;
struct
mgmt_cp_pin_code_reply
*
cp
=
data
;
...
@@ -1726,14 +1724,14 @@ static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1726,14 +1724,14 @@ static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
!
hdev_is_powered
(
hdev
))
{
if
(
!
hdev_is_powered
(
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_PIN_CODE_REPLY
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_PIN_CODE_REPLY
,
MGMT_STATUS_NOT_POWERED
);
MGMT_STATUS_NOT_POWERED
);
goto
failed
;
goto
failed
;
}
}
conn
=
hci_conn_hash_lookup_ba
(
hdev
,
ACL_LINK
,
&
cp
->
addr
.
bdaddr
);
conn
=
hci_conn_hash_lookup_ba
(
hdev
,
ACL_LINK
,
&
cp
->
addr
.
bdaddr
);
if
(
!
conn
)
{
if
(
!
conn
)
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_PIN_CODE_REPLY
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_PIN_CODE_REPLY
,
MGMT_STATUS_NOT_CONNECTED
);
MGMT_STATUS_NOT_CONNECTED
);
goto
failed
;
goto
failed
;
}
}
...
@@ -1747,7 +1745,7 @@ static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1747,7 +1745,7 @@ static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
err
=
send_pin_code_neg_reply
(
sk
,
hdev
,
&
ncp
);
err
=
send_pin_code_neg_reply
(
sk
,
hdev
,
&
ncp
);
if
(
err
>=
0
)
if
(
err
>=
0
)
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_PIN_CODE_REPLY
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_PIN_CODE_REPLY
,
MGMT_STATUS_INVALID_PARAMS
);
MGMT_STATUS_INVALID_PARAMS
);
goto
failed
;
goto
failed
;
}
}
...
@@ -1772,7 +1770,7 @@ static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1772,7 +1770,7 @@ static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
}
}
static
int
pin_code_neg_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
pin_code_neg_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
void
*
data
,
u16
len
)
{
{
struct
mgmt_cp_pin_code_neg_reply
*
cp
=
data
;
struct
mgmt_cp_pin_code_neg_reply
*
cp
=
data
;
int
err
;
int
err
;
...
@@ -1783,7 +1781,7 @@ static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
...
@@ -1783,7 +1781,7 @@ static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
if
(
!
hdev_is_powered
(
hdev
))
{
if
(
!
hdev_is_powered
(
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_PIN_CODE_NEG_REPLY
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_PIN_CODE_NEG_REPLY
,
MGMT_STATUS_NOT_POWERED
);
MGMT_STATUS_NOT_POWERED
);
goto
failed
;
goto
failed
;
}
}
...
@@ -1794,8 +1792,8 @@ static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
...
@@ -1794,8 +1792,8 @@ static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
return
err
;
return
err
;
}
}
static
int
set_io_capability
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
set_io_capability
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_set_io_capability
*
cp
=
data
;
struct
mgmt_cp_set_io_capability
*
cp
=
data
;
...
@@ -1810,8 +1808,8 @@ static int set_io_capability(struct sock *sk, struct hci_dev *hdev,
...
@@ -1810,8 +1808,8 @@ static int set_io_capability(struct sock *sk, struct hci_dev *hdev,
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
return
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_SET_IO_CAPABILITY
,
0
,
return
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_SET_IO_CAPABILITY
,
0
,
NULL
,
NULL
,
0
);
0
);
}
}
static
inline
struct
pending_cmd
*
find_pairing
(
struct
hci_conn
*
conn
)
static
inline
struct
pending_cmd
*
find_pairing
(
struct
hci_conn
*
conn
)
...
@@ -1841,7 +1839,7 @@ static void pairing_complete(struct pending_cmd *cmd, u8 status)
...
@@ -1841,7 +1839,7 @@ static void pairing_complete(struct pending_cmd *cmd, u8 status)
rp
.
addr
.
type
=
link_to_mgmt
(
conn
->
type
,
conn
->
dst_type
);
rp
.
addr
.
type
=
link_to_mgmt
(
conn
->
type
,
conn
->
dst_type
);
cmd_complete
(
cmd
->
sk
,
cmd
->
index
,
MGMT_OP_PAIR_DEVICE
,
status
,
cmd_complete
(
cmd
->
sk
,
cmd
->
index
,
MGMT_OP_PAIR_DEVICE
,
status
,
&
rp
,
sizeof
(
rp
));
&
rp
,
sizeof
(
rp
));
/* So we don't get further callbacks for this connection */
/* So we don't get further callbacks for this connection */
conn
->
connect_cfm_cb
=
NULL
;
conn
->
connect_cfm_cb
=
NULL
;
...
@@ -1867,7 +1865,7 @@ static void pairing_complete_cb(struct hci_conn *conn, u8 status)
...
@@ -1867,7 +1865,7 @@ static void pairing_complete_cb(struct hci_conn *conn, u8 status)
}
}
static
int
pair_device
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
pair_device
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_pair_device
*
cp
=
data
;
struct
mgmt_cp_pair_device
*
cp
=
data
;
struct
mgmt_rp_pair_device
rp
;
struct
mgmt_rp_pair_device
rp
;
...
@@ -1882,7 +1880,7 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1882,7 +1880,7 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
!
hdev_is_powered
(
hdev
))
{
if
(
!
hdev_is_powered
(
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_PAIR_DEVICE
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_PAIR_DEVICE
,
MGMT_STATUS_NOT_POWERED
);
MGMT_STATUS_NOT_POWERED
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1894,10 +1892,10 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1894,10 +1892,10 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
cp
->
addr
.
type
==
MGMT_ADDR_BREDR
)
if
(
cp
->
addr
.
type
==
MGMT_ADDR_BREDR
)
conn
=
hci_connect
(
hdev
,
ACL_LINK
,
&
cp
->
addr
.
bdaddr
,
sec_level
,
conn
=
hci_connect
(
hdev
,
ACL_LINK
,
&
cp
->
addr
.
bdaddr
,
sec_level
,
auth_type
);
auth_type
);
else
else
conn
=
hci_connect
(
hdev
,
LE_LINK
,
&
cp
->
addr
.
bdaddr
,
sec_level
,
conn
=
hci_connect
(
hdev
,
LE_LINK
,
&
cp
->
addr
.
bdaddr
,
sec_level
,
auth_type
);
auth_type
);
memset
(
&
rp
,
0
,
sizeof
(
rp
));
memset
(
&
rp
,
0
,
sizeof
(
rp
));
bacpy
(
&
rp
.
addr
.
bdaddr
,
&
cp
->
addr
.
bdaddr
);
bacpy
(
&
rp
.
addr
.
bdaddr
,
&
cp
->
addr
.
bdaddr
);
...
@@ -1905,15 +1903,15 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1905,15 +1903,15 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
IS_ERR
(
conn
))
{
if
(
IS_ERR
(
conn
))
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_PAIR_DEVICE
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_PAIR_DEVICE
,
MGMT_STATUS_CONNECT_FAILED
,
MGMT_STATUS_CONNECT_FAILED
,
&
rp
,
&
rp
,
sizeof
(
rp
));
sizeof
(
rp
));
goto
unlock
;
goto
unlock
;
}
}
if
(
conn
->
connect_cfm_cb
)
{
if
(
conn
->
connect_cfm_cb
)
{
hci_conn_put
(
conn
);
hci_conn_put
(
conn
);
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_PAIR_DEVICE
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_PAIR_DEVICE
,
MGMT_STATUS_BUSY
,
&
rp
,
sizeof
(
rp
));
MGMT_STATUS_BUSY
,
&
rp
,
sizeof
(
rp
));
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1944,8 +1942,8 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -1944,8 +1942,8 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
return
err
;
return
err
;
}
}
static
int
cancel_pair_device
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
cancel_pair_device
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_addr_info
*
addr
=
data
;
struct
mgmt_addr_info
*
addr
=
data
;
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
...
@@ -1958,14 +1956,14 @@ static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev,
...
@@ -1958,14 +1956,14 @@ static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev,
if
(
!
hdev_is_powered
(
hdev
))
{
if
(
!
hdev_is_powered
(
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_CANCEL_PAIR_DEVICE
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_CANCEL_PAIR_DEVICE
,
MGMT_STATUS_NOT_POWERED
);
MGMT_STATUS_NOT_POWERED
);
goto
unlock
;
goto
unlock
;
}
}
cmd
=
mgmt_pending_find
(
MGMT_OP_PAIR_DEVICE
,
hdev
);
cmd
=
mgmt_pending_find
(
MGMT_OP_PAIR_DEVICE
,
hdev
);
if
(
!
cmd
)
{
if
(
!
cmd
)
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_CANCEL_PAIR_DEVICE
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_CANCEL_PAIR_DEVICE
,
MGMT_STATUS_INVALID_PARAMS
);
MGMT_STATUS_INVALID_PARAMS
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -1973,22 +1971,22 @@ static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev,
...
@@ -1973,22 +1971,22 @@ static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev,
if
(
bacmp
(
&
addr
->
bdaddr
,
&
conn
->
dst
)
!=
0
)
{
if
(
bacmp
(
&
addr
->
bdaddr
,
&
conn
->
dst
)
!=
0
)
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_CANCEL_PAIR_DEVICE
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_CANCEL_PAIR_DEVICE
,
MGMT_STATUS_INVALID_PARAMS
);
MGMT_STATUS_INVALID_PARAMS
);
goto
unlock
;
goto
unlock
;
}
}
pairing_complete
(
cmd
,
MGMT_STATUS_CANCELLED
);
pairing_complete
(
cmd
,
MGMT_STATUS_CANCELLED
);
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_CANCEL_PAIR_DEVICE
,
0
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_CANCEL_PAIR_DEVICE
,
0
,
addr
,
sizeof
(
*
addr
));
addr
,
sizeof
(
*
addr
));
unlock:
unlock:
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
return
err
;
return
err
;
}
}
static
int
user_pairing_resp
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
user_pairing_resp
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
type
,
u16
mgmt_op
,
bdaddr_t
*
bdaddr
,
u8
type
,
u16
mgmt_op
,
u16
hci_op
,
__le32
passkey
)
u16
hci_op
,
__le32
passkey
)
{
{
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
struct
hci_conn
*
conn
;
struct
hci_conn
*
conn
;
...
@@ -1998,7 +1996,7 @@ static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
...
@@ -1998,7 +1996,7 @@ static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
if
(
!
hdev_is_powered
(
hdev
))
{
if
(
!
hdev_is_powered
(
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
mgmt_op
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
mgmt_op
,
MGMT_STATUS_NOT_POWERED
);
MGMT_STATUS_NOT_POWERED
);
goto
done
;
goto
done
;
}
}
...
@@ -2009,7 +2007,7 @@ static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
...
@@ -2009,7 +2007,7 @@ static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
if
(
!
conn
)
{
if
(
!
conn
)
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
mgmt_op
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
mgmt_op
,
MGMT_STATUS_NOT_CONNECTED
);
MGMT_STATUS_NOT_CONNECTED
);
goto
done
;
goto
done
;
}
}
...
@@ -2019,10 +2017,10 @@ static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
...
@@ -2019,10 +2017,10 @@ static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
if
(
!
err
)
if
(
!
err
)
err
=
cmd_status
(
sk
,
hdev
->
id
,
mgmt_op
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
mgmt_op
,
MGMT_STATUS_SUCCESS
);
MGMT_STATUS_SUCCESS
);
else
else
err
=
cmd_status
(
sk
,
hdev
->
id
,
mgmt_op
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
mgmt_op
,
MGMT_STATUS_FAILED
);
MGMT_STATUS_FAILED
);
goto
done
;
goto
done
;
}
}
...
@@ -2051,8 +2049,8 @@ static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
...
@@ -2051,8 +2049,8 @@ static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
return
err
;
return
err
;
}
}
static
int
user_confirm_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
user_confirm_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_user_confirm_reply
*
cp
=
data
;
struct
mgmt_cp_user_confirm_reply
*
cp
=
data
;
...
@@ -2060,48 +2058,47 @@ static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev,
...
@@ -2060,48 +2058,47 @@ static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev,
if
(
len
!=
sizeof
(
*
cp
))
if
(
len
!=
sizeof
(
*
cp
))
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_USER_CONFIRM_REPLY
,
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_USER_CONFIRM_REPLY
,
MGMT_STATUS_INVALID_PARAMS
);
MGMT_STATUS_INVALID_PARAMS
);
return
user_pairing_resp
(
sk
,
hdev
,
&
cp
->
addr
.
bdaddr
,
cp
->
addr
.
type
,
return
user_pairing_resp
(
sk
,
hdev
,
&
cp
->
addr
.
bdaddr
,
cp
->
addr
.
type
,
MGMT_OP_USER_CONFIRM_REPLY
,
MGMT_OP_USER_CONFIRM_REPLY
,
HCI_OP_USER_CONFIRM_REPLY
,
0
);
HCI_OP_USER_CONFIRM_REPLY
,
0
);
}
}
static
int
user_confirm_neg_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
user_confirm_neg_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
void
*
data
,
u16
len
)
{
{
struct
mgmt_cp_user_confirm_neg_reply
*
cp
=
data
;
struct
mgmt_cp_user_confirm_neg_reply
*
cp
=
data
;
BT_DBG
(
""
);
BT_DBG
(
""
);
return
user_pairing_resp
(
sk
,
hdev
,
&
cp
->
addr
.
bdaddr
,
cp
->
addr
.
type
,
return
user_pairing_resp
(
sk
,
hdev
,
&
cp
->
addr
.
bdaddr
,
cp
->
addr
.
type
,
MGMT_OP_USER_CONFIRM_NEG_REPLY
,
MGMT_OP_USER_CONFIRM_NEG_REPLY
,
HCI_OP_USER_CONFIRM_NEG_REPLY
,
0
);
HCI_OP_USER_CONFIRM_NEG_REPLY
,
0
);
}
}
static
int
user_passkey_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
user_passkey_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_user_passkey_reply
*
cp
=
data
;
struct
mgmt_cp_user_passkey_reply
*
cp
=
data
;
BT_DBG
(
""
);
BT_DBG
(
""
);
return
user_pairing_resp
(
sk
,
hdev
,
&
cp
->
addr
.
bdaddr
,
cp
->
addr
.
type
,
return
user_pairing_resp
(
sk
,
hdev
,
&
cp
->
addr
.
bdaddr
,
cp
->
addr
.
type
,
MGMT_OP_USER_PASSKEY_REPLY
,
MGMT_OP_USER_PASSKEY_REPLY
,
HCI_OP_USER_PASSKEY_REPLY
,
HCI_OP_USER_PASSKEY_REPLY
,
cp
->
passkey
);
cp
->
passkey
);
}
}
static
int
user_passkey_neg_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
user_passkey_neg_reply
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
void
*
data
,
u16
len
)
{
{
struct
mgmt_cp_user_passkey_neg_reply
*
cp
=
data
;
struct
mgmt_cp_user_passkey_neg_reply
*
cp
=
data
;
BT_DBG
(
""
);
BT_DBG
(
""
);
return
user_pairing_resp
(
sk
,
hdev
,
&
cp
->
addr
.
bdaddr
,
cp
->
addr
.
type
,
return
user_pairing_resp
(
sk
,
hdev
,
&
cp
->
addr
.
bdaddr
,
cp
->
addr
.
type
,
MGMT_OP_USER_PASSKEY_NEG_REPLY
,
MGMT_OP_USER_PASSKEY_NEG_REPLY
,
HCI_OP_USER_PASSKEY_NEG_REPLY
,
0
);
HCI_OP_USER_PASSKEY_NEG_REPLY
,
0
);
}
}
static
int
update_name
(
struct
hci_dev
*
hdev
,
const
char
*
name
)
static
int
update_name
(
struct
hci_dev
*
hdev
,
const
char
*
name
)
...
@@ -2114,7 +2111,7 @@ static int update_name(struct hci_dev *hdev, const char *name)
...
@@ -2114,7 +2111,7 @@ static int update_name(struct hci_dev *hdev, const char *name)
}
}
static
int
set_local_name
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
set_local_name
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_set_local_name
*
cp
=
data
;
struct
mgmt_cp_set_local_name
*
cp
=
data
;
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
...
@@ -2130,12 +2127,12 @@ static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -2130,12 +2127,12 @@ static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
memcpy
(
hdev
->
dev_name
,
cp
->
name
,
sizeof
(
hdev
->
dev_name
));
memcpy
(
hdev
->
dev_name
,
cp
->
name
,
sizeof
(
hdev
->
dev_name
));
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_SET_LOCAL_NAME
,
0
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_SET_LOCAL_NAME
,
0
,
data
,
len
);
data
,
len
);
if
(
err
<
0
)
if
(
err
<
0
)
goto
failed
;
goto
failed
;
err
=
mgmt_event
(
MGMT_EV_LOCAL_NAME_CHANGED
,
hdev
,
data
,
len
,
err
=
mgmt_event
(
MGMT_EV_LOCAL_NAME_CHANGED
,
hdev
,
data
,
len
,
sk
);
sk
);
goto
failed
;
goto
failed
;
}
}
...
@@ -2156,7 +2153,7 @@ static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -2156,7 +2153,7 @@ static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
}
}
static
int
read_local_oob_data
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
read_local_oob_data
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
data_len
)
void
*
data
,
u16
data_len
)
{
{
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
int
err
;
int
err
;
...
@@ -2167,19 +2164,19 @@ static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
...
@@ -2167,19 +2164,19 @@ static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
if
(
!
hdev_is_powered
(
hdev
))
{
if
(
!
hdev_is_powered
(
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_READ_LOCAL_OOB_DATA
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_READ_LOCAL_OOB_DATA
,
MGMT_STATUS_NOT_POWERED
);
MGMT_STATUS_NOT_POWERED
);
goto
unlock
;
goto
unlock
;
}
}
if
(
!
(
hdev
->
features
[
6
]
&
LMP_SIMPLE_PAIR
))
{
if
(
!
(
hdev
->
features
[
6
]
&
LMP_SIMPLE_PAIR
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_READ_LOCAL_OOB_DATA
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_READ_LOCAL_OOB_DATA
,
MGMT_STATUS_NOT_SUPPORTED
);
MGMT_STATUS_NOT_SUPPORTED
);
goto
unlock
;
goto
unlock
;
}
}
if
(
mgmt_pending_find
(
MGMT_OP_READ_LOCAL_OOB_DATA
,
hdev
))
{
if
(
mgmt_pending_find
(
MGMT_OP_READ_LOCAL_OOB_DATA
,
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_READ_LOCAL_OOB_DATA
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_READ_LOCAL_OOB_DATA
,
MGMT_STATUS_BUSY
);
MGMT_STATUS_BUSY
);
goto
unlock
;
goto
unlock
;
}
}
...
@@ -2199,7 +2196,7 @@ static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
...
@@ -2199,7 +2196,7 @@ static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
}
}
static
int
add_remote_oob_data
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
add_remote_oob_data
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
void
*
data
,
u16
len
)
{
{
struct
mgmt_cp_add_remote_oob_data
*
cp
=
data
;
struct
mgmt_cp_add_remote_oob_data
*
cp
=
data
;
u8
status
;
u8
status
;
...
@@ -2211,20 +2208,20 @@ static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
...
@@ -2211,20 +2208,20 @@ static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
if
(
!
hdev_is_powered
(
hdev
))
{
if
(
!
hdev_is_powered
(
hdev
))
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_ADD_REMOTE_OOB_DATA
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_ADD_REMOTE_OOB_DATA
,
MGMT_STATUS_NOT_POWERED
,
MGMT_STATUS_NOT_POWERED
,
&
cp
->
addr
,
&
cp
->
addr
,
sizeof
(
cp
->
addr
));
sizeof
(
cp
->
addr
));
goto
unlock
;
goto
unlock
;
}
}
err
=
hci_add_remote_oob_data
(
hdev
,
&
cp
->
addr
.
bdaddr
,
cp
->
hash
,
err
=
hci_add_remote_oob_data
(
hdev
,
&
cp
->
addr
.
bdaddr
,
cp
->
hash
,
cp
->
randomizer
);
cp
->
randomizer
);
if
(
err
<
0
)
if
(
err
<
0
)
status
=
MGMT_STATUS_FAILED
;
status
=
MGMT_STATUS_FAILED
;
else
else
status
=
0
;
status
=
0
;
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_ADD_REMOTE_OOB_DATA
,
status
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_ADD_REMOTE_OOB_DATA
,
status
,
&
cp
->
addr
,
sizeof
(
cp
->
addr
));
&
cp
->
addr
,
sizeof
(
cp
->
addr
));
unlock:
unlock:
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
...
@@ -2244,9 +2241,9 @@ static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
...
@@ -2244,9 +2241,9 @@ static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
if
(
!
hdev_is_powered
(
hdev
))
{
if
(
!
hdev_is_powered
(
hdev
))
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
MGMT_STATUS_NOT_POWERED
,
MGMT_STATUS_NOT_POWERED
,
&
cp
->
addr
,
&
cp
->
addr
,
sizeof
(
cp
->
addr
));
sizeof
(
cp
->
addr
));
goto
unlock
;
goto
unlock
;
}
}
...
@@ -2257,7 +2254,7 @@ static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
...
@@ -2257,7 +2254,7 @@ static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
status
=
0
;
status
=
0
;
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_REMOVE_REMOTE_OOB_DATA
,
status
,
&
cp
->
addr
,
sizeof
(
cp
->
addr
));
status
,
&
cp
->
addr
,
sizeof
(
cp
->
addr
));
unlock:
unlock:
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
...
@@ -2282,7 +2279,7 @@ int mgmt_interleaved_discovery(struct hci_dev *hdev)
...
@@ -2282,7 +2279,7 @@ int mgmt_interleaved_discovery(struct hci_dev *hdev)
}
}
static
int
start_discovery
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
start_discovery
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
void
*
data
,
u16
len
)
{
{
struct
mgmt_cp_start_discovery
*
cp
=
data
;
struct
mgmt_cp_start_discovery
*
cp
=
data
;
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
...
@@ -2294,13 +2291,13 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
...
@@ -2294,13 +2291,13 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
if
(
!
hdev_is_powered
(
hdev
))
{
if
(
!
hdev_is_powered
(
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_START_DISCOVERY
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_START_DISCOVERY
,
MGMT_STATUS_NOT_POWERED
);
MGMT_STATUS_NOT_POWERED
);
goto
failed
;
goto
failed
;
}
}
if
(
hdev
->
discovery
.
state
!=
DISCOVERY_STOPPED
)
{
if
(
hdev
->
discovery
.
state
!=
DISCOVERY_STOPPED
)
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_START_DISCOVERY
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_START_DISCOVERY
,
MGMT_STATUS_BUSY
);
MGMT_STATUS_BUSY
);
goto
failed
;
goto
failed
;
}
}
...
@@ -2323,7 +2320,7 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
...
@@ -2323,7 +2320,7 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
case
DISCOV_TYPE_LE
:
case
DISCOV_TYPE_LE
:
if
(
lmp_host_le_capable
(
hdev
))
if
(
lmp_host_le_capable
(
hdev
))
err
=
hci_le_scan
(
hdev
,
LE_SCAN_TYPE
,
LE_SCAN_INT
,
err
=
hci_le_scan
(
hdev
,
LE_SCAN_TYPE
,
LE_SCAN_INT
,
LE_SCAN_WIN
,
LE_SCAN_TIMEOUT_LE_ONLY
);
LE_SCAN_WIN
,
LE_SCAN_TIMEOUT_LE_ONLY
);
else
else
err
=
-
ENOTSUPP
;
err
=
-
ENOTSUPP
;
break
;
break
;
...
@@ -2331,7 +2328,8 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
...
@@ -2331,7 +2328,8 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
case
DISCOV_TYPE_INTERLEAVED
:
case
DISCOV_TYPE_INTERLEAVED
:
if
(
lmp_host_le_capable
(
hdev
)
&&
lmp_bredr_capable
(
hdev
))
if
(
lmp_host_le_capable
(
hdev
)
&&
lmp_bredr_capable
(
hdev
))
err
=
hci_le_scan
(
hdev
,
LE_SCAN_TYPE
,
LE_SCAN_INT
,
err
=
hci_le_scan
(
hdev
,
LE_SCAN_TYPE
,
LE_SCAN_INT
,
LE_SCAN_WIN
,
LE_SCAN_TIMEOUT_BREDR_LE
);
LE_SCAN_WIN
,
LE_SCAN_TIMEOUT_BREDR_LE
);
else
else
err
=
-
ENOTSUPP
;
err
=
-
ENOTSUPP
;
break
;
break
;
...
@@ -2351,7 +2349,7 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
...
@@ -2351,7 +2349,7 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev,
}
}
static
int
stop_discovery
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
stop_discovery
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_stop_discovery
*
mgmt_cp
=
data
;
struct
mgmt_cp_stop_discovery
*
mgmt_cp
=
data
;
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
...
@@ -2365,15 +2363,15 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -2365,15 +2363,15 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
!
hci_discovery_active
(
hdev
))
{
if
(
!
hci_discovery_active
(
hdev
))
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_STOP_DISCOVERY
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_STOP_DISCOVERY
,
MGMT_STATUS_REJECTED
,
MGMT_STATUS_REJECTED
,
&
mgmt_cp
->
type
,
&
mgmt_cp
->
type
,
sizeof
(
mgmt_cp
->
type
));
sizeof
(
mgmt_cp
->
type
));
goto
unlock
;
goto
unlock
;
}
}
if
(
hdev
->
discovery
.
type
!=
mgmt_cp
->
type
)
{
if
(
hdev
->
discovery
.
type
!=
mgmt_cp
->
type
)
{
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_STOP_DISCOVERY
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_STOP_DISCOVERY
,
MGMT_STATUS_INVALID_PARAMS
,
MGMT_STATUS_INVALID_PARAMS
,
&
mgmt_cp
->
type
,
&
mgmt_cp
->
type
,
sizeof
(
mgmt_cp
->
type
));
sizeof
(
mgmt_cp
->
type
));
goto
unlock
;
goto
unlock
;
}
}
...
@@ -2396,14 +2394,14 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -2396,14 +2394,14 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
!
e
)
{
if
(
!
e
)
{
mgmt_pending_remove
(
cmd
);
mgmt_pending_remove
(
cmd
);
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_STOP_DISCOVERY
,
0
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_STOP_DISCOVERY
,
0
,
&
mgmt_cp
->
type
,
sizeof
(
mgmt_cp
->
type
));
&
mgmt_cp
->
type
,
sizeof
(
mgmt_cp
->
type
));
hci_discovery_set_state
(
hdev
,
DISCOVERY_STOPPED
);
hci_discovery_set_state
(
hdev
,
DISCOVERY_STOPPED
);
goto
unlock
;
goto
unlock
;
}
}
bacpy
(
&
cp
.
bdaddr
,
&
e
->
data
.
bdaddr
);
bacpy
(
&
cp
.
bdaddr
,
&
e
->
data
.
bdaddr
);
err
=
hci_send_cmd
(
hdev
,
HCI_OP_REMOTE_NAME_REQ_CANCEL
,
err
=
hci_send_cmd
(
hdev
,
HCI_OP_REMOTE_NAME_REQ_CANCEL
,
sizeof
(
cp
),
sizeof
(
cp
),
&
cp
);
&
cp
);
if
(
err
<
0
)
if
(
err
<
0
)
mgmt_pending_remove
(
cmd
);
mgmt_pending_remove
(
cmd
);
else
else
...
@@ -2415,7 +2413,7 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -2415,7 +2413,7 @@ static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
}
}
static
int
confirm_name
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
confirm_name
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_confirm_name
*
cp
=
data
;
struct
mgmt_cp_confirm_name
*
cp
=
data
;
struct
inquiry_entry
*
e
;
struct
inquiry_entry
*
e
;
...
@@ -2427,14 +2425,14 @@ static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -2427,14 +2425,14 @@ static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
if
(
!
hci_discovery_active
(
hdev
))
{
if
(
!
hci_discovery_active
(
hdev
))
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_CONFIRM_NAME
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_CONFIRM_NAME
,
MGMT_STATUS_FAILED
);
MGMT_STATUS_FAILED
);
goto
failed
;
goto
failed
;
}
}
e
=
hci_inquiry_cache_lookup_unknown
(
hdev
,
&
cp
->
addr
.
bdaddr
);
e
=
hci_inquiry_cache_lookup_unknown
(
hdev
,
&
cp
->
addr
.
bdaddr
);
if
(
!
e
)
{
if
(
!
e
)
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_CONFIRM_NAME
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_CONFIRM_NAME
,
MGMT_STATUS_INVALID_PARAMS
);
MGMT_STATUS_INVALID_PARAMS
);
goto
failed
;
goto
failed
;
}
}
...
@@ -2454,7 +2452,7 @@ static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -2454,7 +2452,7 @@ static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
}
}
static
int
block_device
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
block_device
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_block_device
*
cp
=
data
;
struct
mgmt_cp_block_device
*
cp
=
data
;
u8
status
;
u8
status
;
...
@@ -2471,7 +2469,7 @@ static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -2471,7 +2469,7 @@ static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
status
=
0
;
status
=
0
;
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_BLOCK_DEVICE
,
status
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_BLOCK_DEVICE
,
status
,
&
cp
->
addr
,
sizeof
(
cp
->
addr
));
&
cp
->
addr
,
sizeof
(
cp
->
addr
));
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
...
@@ -2479,7 +2477,7 @@ static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -2479,7 +2477,7 @@ static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
}
}
static
int
unblock_device
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
static
int
unblock_device
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
u16
len
)
{
{
struct
mgmt_cp_unblock_device
*
cp
=
data
;
struct
mgmt_cp_unblock_device
*
cp
=
data
;
u8
status
;
u8
status
;
...
@@ -2496,7 +2494,7 @@ static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -2496,7 +2494,7 @@ static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
status
=
0
;
status
=
0
;
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_UNBLOCK_DEVICE
,
status
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_UNBLOCK_DEVICE
,
status
,
&
cp
->
addr
,
sizeof
(
cp
->
addr
));
&
cp
->
addr
,
sizeof
(
cp
->
addr
));
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
...
@@ -2504,7 +2502,7 @@ static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
...
@@ -2504,7 +2502,7 @@ static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
}
}
static
int
set_fast_connectable
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
set_fast_connectable
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
u16
len
)
void
*
data
,
u16
len
)
{
{
struct
mgmt_mode
*
cp
=
data
;
struct
mgmt_mode
*
cp
=
data
;
struct
hci_cp_write_page_scan_activity
acp
;
struct
hci_cp_write_page_scan_activity
acp
;
...
@@ -2515,11 +2513,11 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
...
@@ -2515,11 +2513,11 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
if
(
!
hdev_is_powered
(
hdev
))
if
(
!
hdev_is_powered
(
hdev
))
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_FAST_CONNECTABLE
,
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_FAST_CONNECTABLE
,
MGMT_STATUS_NOT_POWERED
);
MGMT_STATUS_NOT_POWERED
);
if
(
!
test_bit
(
HCI_CONNECTABLE
,
&
hdev
->
dev_flags
))
if
(
!
test_bit
(
HCI_CONNECTABLE
,
&
hdev
->
dev_flags
))
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_FAST_CONNECTABLE
,
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_FAST_CONNECTABLE
,
MGMT_STATUS_REJECTED
);
MGMT_STATUS_REJECTED
);
hci_dev_lock
(
hdev
);
hci_dev_lock
(
hdev
);
...
@@ -2533,30 +2531,30 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
...
@@ -2533,30 +2531,30 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
acp
.
window
=
0x0012
;
/* default 11.25 msec page scan window */
acp
.
window
=
0x0012
;
/* default 11.25 msec page scan window */
err
=
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_PAGE_SCAN_ACTIVITY
,
err
=
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_PAGE_SCAN_ACTIVITY
,
sizeof
(
acp
),
sizeof
(
acp
),
&
acp
);
&
acp
);
if
(
err
<
0
)
{
if
(
err
<
0
)
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_FAST_CONNECTABLE
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_FAST_CONNECTABLE
,
MGMT_STATUS_FAILED
);
MGMT_STATUS_FAILED
);
goto
done
;
goto
done
;
}
}
err
=
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_PAGE_SCAN_TYPE
,
1
,
&
type
);
err
=
hci_send_cmd
(
hdev
,
HCI_OP_WRITE_PAGE_SCAN_TYPE
,
1
,
&
type
);
if
(
err
<
0
)
{
if
(
err
<
0
)
{
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_FAST_CONNECTABLE
,
err
=
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_SET_FAST_CONNECTABLE
,
MGMT_STATUS_FAILED
);
MGMT_STATUS_FAILED
);
goto
done
;
goto
done
;
}
}
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_SET_FAST_CONNECTABLE
,
0
,
err
=
cmd_complete
(
sk
,
hdev
->
id
,
MGMT_OP_SET_FAST_CONNECTABLE
,
0
,
NULL
,
0
);
NULL
,
0
);
done:
done:
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
return
err
;
return
err
;
}
}
static
int
load_long_term_keys
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
static
int
load_long_term_keys
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
cp_data
,
u16
len
)
void
*
cp_data
,
u16
len
)
{
{
struct
mgmt_cp_load_long_term_keys
*
cp
=
cp_data
;
struct
mgmt_cp_load_long_term_keys
*
cp
=
cp_data
;
u16
key_count
,
expected_len
;
u16
key_count
,
expected_len
;
...
@@ -2570,7 +2568,7 @@ static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
...
@@ -2570,7 +2568,7 @@ static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
BT_ERR
(
"load_keys: expected %u bytes, got %u bytes"
,
BT_ERR
(
"load_keys: expected %u bytes, got %u bytes"
,
len
,
expected_len
);
len
,
expected_len
);
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_LOAD_LONG_TERM_KEYS
,
return
cmd_status
(
sk
,
hdev
->
id
,
MGMT_OP_LOAD_LONG_TERM_KEYS
,
EINVAL
);
EINVAL
);
}
}
BT_DBG
(
"%s key_count %u"
,
hdev
->
name
,
key_count
);
BT_DBG
(
"%s key_count %u"
,
hdev
->
name
,
key_count
);
...
@@ -2589,8 +2587,8 @@ static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
...
@@ -2589,8 +2587,8 @@ static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
type
=
HCI_SMP_LTK_SLAVE
;
type
=
HCI_SMP_LTK_SLAVE
;
hci_add_ltk
(
hdev
,
&
key
->
addr
.
bdaddr
,
key
->
addr
.
type
,
hci_add_ltk
(
hdev
,
&
key
->
addr
.
bdaddr
,
key
->
addr
.
type
,
type
,
0
,
key
->
authenticated
,
key
->
val
,
type
,
0
,
key
->
authenticated
,
key
->
val
,
key
->
enc_size
,
key
->
ediv
,
key
->
rand
);
key
->
enc_size
,
key
->
ediv
,
key
->
rand
);
}
}
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
...
@@ -2599,8 +2597,8 @@ static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
...
@@ -2599,8 +2597,8 @@ static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
}
}
struct
mgmt_handler
{
struct
mgmt_handler
{
int
(
*
func
)
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
int
(
*
func
)
(
struct
sock
*
sk
,
struct
hci_dev
*
hdev
,
void
*
data
,
void
*
data
,
u16
data_len
);
u16
data_len
);
bool
var_len
;
bool
var_len
;
size_t
data_len
;
size_t
data_len
;
}
mgmt_handlers
[]
=
{
}
mgmt_handlers
[]
=
{
...
@@ -2685,7 +2683,7 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
...
@@ -2685,7 +2683,7 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
hdev
=
hci_dev_get
(
index
);
hdev
=
hci_dev_get
(
index
);
if
(
!
hdev
)
{
if
(
!
hdev
)
{
err
=
cmd_status
(
sk
,
index
,
opcode
,
err
=
cmd_status
(
sk
,
index
,
opcode
,
MGMT_STATUS_INVALID_INDEX
);
MGMT_STATUS_INVALID_INDEX
);
goto
done
;
goto
done
;
}
}
}
}
...
@@ -2694,14 +2692,14 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
...
@@ -2694,14 +2692,14 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
mgmt_handlers
[
opcode
].
func
==
NULL
)
{
mgmt_handlers
[
opcode
].
func
==
NULL
)
{
BT_DBG
(
"Unknown op %u"
,
opcode
);
BT_DBG
(
"Unknown op %u"
,
opcode
);
err
=
cmd_status
(
sk
,
index
,
opcode
,
err
=
cmd_status
(
sk
,
index
,
opcode
,
MGMT_STATUS_UNKNOWN_COMMAND
);
MGMT_STATUS_UNKNOWN_COMMAND
);
goto
done
;
goto
done
;
}
}
if
((
hdev
&&
opcode
<
MGMT_OP_READ_INFO
)
||
if
((
hdev
&&
opcode
<
MGMT_OP_READ_INFO
)
||
(
!
hdev
&&
opcode
>=
MGMT_OP_READ_INFO
))
{
(
!
hdev
&&
opcode
>=
MGMT_OP_READ_INFO
))
{
err
=
cmd_status
(
sk
,
index
,
opcode
,
err
=
cmd_status
(
sk
,
index
,
opcode
,
MGMT_STATUS_INVALID_INDEX
);
MGMT_STATUS_INVALID_INDEX
);
goto
done
;
goto
done
;
}
}
...
@@ -2710,7 +2708,7 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
...
@@ -2710,7 +2708,7 @@ int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
if
((
handler
->
var_len
&&
len
<
handler
->
data_len
)
||
if
((
handler
->
var_len
&&
len
<
handler
->
data_len
)
||
(
!
handler
->
var_len
&&
len
!=
handler
->
data_len
))
{
(
!
handler
->
var_len
&&
len
!=
handler
->
data_len
))
{
err
=
cmd_status
(
sk
,
index
,
opcode
,
err
=
cmd_status
(
sk
,
index
,
opcode
,
MGMT_STATUS_INVALID_PARAMS
);
MGMT_STATUS_INVALID_PARAMS
);
goto
done
;
goto
done
;
}
}
...
@@ -2829,7 +2827,7 @@ int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
...
@@ -2829,7 +2827,7 @@ int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
}
}
mgmt_pending_foreach
(
MGMT_OP_SET_DISCOVERABLE
,
hdev
,
settings_rsp
,
mgmt_pending_foreach
(
MGMT_OP_SET_DISCOVERABLE
,
hdev
,
settings_rsp
,
&
match
);
&
match
);
if
(
changed
)
if
(
changed
)
err
=
new_settings
(
hdev
,
match
.
sk
);
err
=
new_settings
(
hdev
,
match
.
sk
);
...
@@ -2855,7 +2853,7 @@ int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
...
@@ -2855,7 +2853,7 @@ int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
}
}
mgmt_pending_foreach
(
MGMT_OP_SET_CONNECTABLE
,
hdev
,
settings_rsp
,
mgmt_pending_foreach
(
MGMT_OP_SET_CONNECTABLE
,
hdev
,
settings_rsp
,
&
match
);
&
match
);
if
(
changed
)
if
(
changed
)
err
=
new_settings
(
hdev
,
match
.
sk
);
err
=
new_settings
(
hdev
,
match
.
sk
);
...
@@ -2872,17 +2870,16 @@ int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
...
@@ -2872,17 +2870,16 @@ int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
if
(
scan
&
SCAN_PAGE
)
if
(
scan
&
SCAN_PAGE
)
mgmt_pending_foreach
(
MGMT_OP_SET_CONNECTABLE
,
hdev
,
mgmt_pending_foreach
(
MGMT_OP_SET_CONNECTABLE
,
hdev
,
cmd_status_rsp
,
&
mgmt_err
);
cmd_status_rsp
,
&
mgmt_err
);
if
(
scan
&
SCAN_INQUIRY
)
if
(
scan
&
SCAN_INQUIRY
)
mgmt_pending_foreach
(
MGMT_OP_SET_DISCOVERABLE
,
hdev
,
mgmt_pending_foreach
(
MGMT_OP_SET_DISCOVERABLE
,
hdev
,
cmd_status_rsp
,
&
mgmt_err
);
cmd_status_rsp
,
&
mgmt_err
);
return
0
;
return
0
;
}
}
int
mgmt_new_link_key
(
struct
hci_dev
*
hdev
,
struct
link_key
*
key
,
int
mgmt_new_link_key
(
struct
hci_dev
*
hdev
,
struct
link_key
*
key
,
u8
persistent
)
u8
persistent
)
{
{
struct
mgmt_ev_new_link_key
ev
;
struct
mgmt_ev_new_link_key
ev
;
...
@@ -2917,13 +2914,13 @@ int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent)
...
@@ -2917,13 +2914,13 @@ int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent)
memcpy
(
ev
.
key
.
rand
,
key
->
rand
,
sizeof
(
key
->
rand
));
memcpy
(
ev
.
key
.
rand
,
key
->
rand
,
sizeof
(
key
->
rand
));
memcpy
(
ev
.
key
.
val
,
key
->
val
,
sizeof
(
key
->
val
));
memcpy
(
ev
.
key
.
val
,
key
->
val
,
sizeof
(
key
->
val
));
return
mgmt_event
(
MGMT_EV_NEW_LONG_TERM_KEY
,
hdev
,
return
mgmt_event
(
MGMT_EV_NEW_LONG_TERM_KEY
,
hdev
,
&
ev
,
sizeof
(
ev
),
&
ev
,
sizeof
(
ev
),
NULL
);
NULL
);
}
}
int
mgmt_device_connected
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
int
mgmt_device_connected
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u32
flags
,
u8
*
name
,
u8
addr_type
,
u32
flags
,
u8
*
name
,
u8
name_len
,
u8
name_len
,
u8
*
dev_class
)
u8
*
dev_class
)
{
{
char
buf
[
512
];
char
buf
[
512
];
struct
mgmt_ev_device_connected
*
ev
=
(
void
*
)
buf
;
struct
mgmt_ev_device_connected
*
ev
=
(
void
*
)
buf
;
...
@@ -2936,16 +2933,16 @@ int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
...
@@ -2936,16 +2933,16 @@ int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
if
(
name_len
>
0
)
if
(
name_len
>
0
)
eir_len
=
eir_append_data
(
ev
->
eir
,
0
,
EIR_NAME_COMPLETE
,
eir_len
=
eir_append_data
(
ev
->
eir
,
0
,
EIR_NAME_COMPLETE
,
name
,
name_len
);
name
,
name_len
);
if
(
dev_class
&&
memcmp
(
dev_class
,
"
\0\0\0
"
,
3
)
!=
0
)
if
(
dev_class
&&
memcmp
(
dev_class
,
"
\0\0\0
"
,
3
)
!=
0
)
eir_len
=
eir_append_data
(
&
ev
->
eir
[
eir_len
],
eir_len
,
eir_len
=
eir_append_data
(
&
ev
->
eir
[
eir_len
],
eir_len
,
EIR_CLASS_OF_DEV
,
dev_class
,
3
);
EIR_CLASS_OF_DEV
,
dev_class
,
3
);
put_unaligned_le16
(
eir_len
,
&
ev
->
eir_len
);
put_unaligned_le16
(
eir_len
,
&
ev
->
eir_len
);
return
mgmt_event
(
MGMT_EV_DEVICE_CONNECTED
,
hdev
,
buf
,
return
mgmt_event
(
MGMT_EV_DEVICE_CONNECTED
,
hdev
,
buf
,
sizeof
(
*
ev
)
+
eir_len
,
NULL
);
sizeof
(
*
ev
)
+
eir_len
,
NULL
);
}
}
static
void
disconnect_rsp
(
struct
pending_cmd
*
cmd
,
void
*
data
)
static
void
disconnect_rsp
(
struct
pending_cmd
*
cmd
,
void
*
data
)
...
@@ -2958,7 +2955,7 @@ static void disconnect_rsp(struct pending_cmd *cmd, void *data)
...
@@ -2958,7 +2955,7 @@ static void disconnect_rsp(struct pending_cmd *cmd, void *data)
rp
.
addr
.
type
=
cp
->
addr
.
type
;
rp
.
addr
.
type
=
cp
->
addr
.
type
;
cmd_complete
(
cmd
->
sk
,
cmd
->
index
,
MGMT_OP_DISCONNECT
,
0
,
&
rp
,
cmd_complete
(
cmd
->
sk
,
cmd
->
index
,
MGMT_OP_DISCONNECT
,
0
,
&
rp
,
sizeof
(
rp
));
sizeof
(
rp
));
*
sk
=
cmd
->
sk
;
*
sk
=
cmd
->
sk
;
sock_hold
(
*
sk
);
sock_hold
(
*
sk
);
...
@@ -2984,7 +2981,7 @@ static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
...
@@ -2984,7 +2981,7 @@ static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
}
}
int
mgmt_device_disconnected
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_device_disconnected
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
)
u8
link_type
,
u8
addr_type
)
{
{
struct
mgmt_addr_info
ev
;
struct
mgmt_addr_info
ev
;
struct
sock
*
sk
=
NULL
;
struct
sock
*
sk
=
NULL
;
...
@@ -2996,19 +2993,19 @@ int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -2996,19 +2993,19 @@ int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
ev
.
type
=
link_to_mgmt
(
link_type
,
addr_type
);
ev
.
type
=
link_to_mgmt
(
link_type
,
addr_type
);
err
=
mgmt_event
(
MGMT_EV_DEVICE_DISCONNECTED
,
hdev
,
&
ev
,
sizeof
(
ev
),
err
=
mgmt_event
(
MGMT_EV_DEVICE_DISCONNECTED
,
hdev
,
&
ev
,
sizeof
(
ev
),
sk
);
sk
);
if
(
sk
)
if
(
sk
)
sock_put
(
sk
);
sock_put
(
sk
);
mgmt_pending_foreach
(
MGMT_OP_UNPAIR_DEVICE
,
hdev
,
unpair_device_rsp
,
mgmt_pending_foreach
(
MGMT_OP_UNPAIR_DEVICE
,
hdev
,
unpair_device_rsp
,
hdev
);
hdev
);
return
err
;
return
err
;
}
}
int
mgmt_disconnect_failed
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_disconnect_failed
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
)
u8
link_type
,
u8
addr_type
,
u8
status
)
{
{
struct
mgmt_rp_disconnect
rp
;
struct
mgmt_rp_disconnect
rp
;
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
...
@@ -3022,7 +3019,7 @@ int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -3022,7 +3019,7 @@ int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
rp
.
addr
.
type
=
link_to_mgmt
(
link_type
,
addr_type
);
rp
.
addr
.
type
=
link_to_mgmt
(
link_type
,
addr_type
);
err
=
cmd_complete
(
cmd
->
sk
,
cmd
->
index
,
MGMT_OP_DISCONNECT
,
err
=
cmd_complete
(
cmd
->
sk
,
cmd
->
index
,
MGMT_OP_DISCONNECT
,
mgmt_status
(
status
),
&
rp
,
sizeof
(
rp
));
mgmt_status
(
status
),
&
rp
,
sizeof
(
rp
));
mgmt_pending_remove
(
cmd
);
mgmt_pending_remove
(
cmd
);
...
@@ -3032,7 +3029,7 @@ int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -3032,7 +3029,7 @@ int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
}
}
int
mgmt_connect_failed
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
int
mgmt_connect_failed
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
)
u8
addr_type
,
u8
status
)
{
{
struct
mgmt_ev_connect_failed
ev
;
struct
mgmt_ev_connect_failed
ev
;
...
@@ -3052,11 +3049,11 @@ int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
...
@@ -3052,11 +3049,11 @@ int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
ev
.
secure
=
secure
;
ev
.
secure
=
secure
;
return
mgmt_event
(
MGMT_EV_PIN_CODE_REQUEST
,
hdev
,
&
ev
,
sizeof
(
ev
),
return
mgmt_event
(
MGMT_EV_PIN_CODE_REQUEST
,
hdev
,
&
ev
,
sizeof
(
ev
),
NULL
);
NULL
);
}
}
int
mgmt_pin_code_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_pin_code_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
status
)
u8
status
)
{
{
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
struct
mgmt_rp_pin_code_reply
rp
;
struct
mgmt_rp_pin_code_reply
rp
;
...
@@ -3070,7 +3067,7 @@ int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -3070,7 +3067,7 @@ int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
rp
.
addr
.
type
=
MGMT_ADDR_BREDR
;
rp
.
addr
.
type
=
MGMT_ADDR_BREDR
;
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
MGMT_OP_PIN_CODE_REPLY
,
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
MGMT_OP_PIN_CODE_REPLY
,
mgmt_status
(
status
),
&
rp
,
sizeof
(
rp
));
mgmt_status
(
status
),
&
rp
,
sizeof
(
rp
));
mgmt_pending_remove
(
cmd
);
mgmt_pending_remove
(
cmd
);
...
@@ -3078,7 +3075,7 @@ int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -3078,7 +3075,7 @@ int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
}
}
int
mgmt_pin_code_neg_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_pin_code_neg_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
status
)
u8
status
)
{
{
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
struct
mgmt_rp_pin_code_reply
rp
;
struct
mgmt_rp_pin_code_reply
rp
;
...
@@ -3092,7 +3089,7 @@ int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -3092,7 +3089,7 @@ int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
rp
.
addr
.
type
=
MGMT_ADDR_BREDR
;
rp
.
addr
.
type
=
MGMT_ADDR_BREDR
;
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
MGMT_OP_PIN_CODE_NEG_REPLY
,
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
MGMT_OP_PIN_CODE_NEG_REPLY
,
mgmt_status
(
status
),
&
rp
,
sizeof
(
rp
));
mgmt_status
(
status
),
&
rp
,
sizeof
(
rp
));
mgmt_pending_remove
(
cmd
);
mgmt_pending_remove
(
cmd
);
...
@@ -3100,8 +3097,8 @@ int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -3100,8 +3097,8 @@ int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
}
}
int
mgmt_user_confirm_request
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_user_confirm_request
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
__le32
value
,
u8
link_type
,
u8
addr_type
,
__le32
value
,
u8
confirm_hint
)
u8
confirm_hint
)
{
{
struct
mgmt_ev_user_confirm_request
ev
;
struct
mgmt_ev_user_confirm_request
ev
;
...
@@ -3113,7 +3110,7 @@ int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -3113,7 +3110,7 @@ int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
put_unaligned_le32
(
value
,
&
ev
.
value
);
put_unaligned_le32
(
value
,
&
ev
.
value
);
return
mgmt_event
(
MGMT_EV_USER_CONFIRM_REQUEST
,
hdev
,
&
ev
,
sizeof
(
ev
),
return
mgmt_event
(
MGMT_EV_USER_CONFIRM_REQUEST
,
hdev
,
&
ev
,
sizeof
(
ev
),
NULL
);
NULL
);
}
}
int
mgmt_user_passkey_request
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_user_passkey_request
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
...
@@ -3127,7 +3124,7 @@ int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -3127,7 +3124,7 @@ int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
ev
.
addr
.
type
=
link_to_mgmt
(
link_type
,
addr_type
);
ev
.
addr
.
type
=
link_to_mgmt
(
link_type
,
addr_type
);
return
mgmt_event
(
MGMT_EV_USER_PASSKEY_REQUEST
,
hdev
,
&
ev
,
sizeof
(
ev
),
return
mgmt_event
(
MGMT_EV_USER_PASSKEY_REQUEST
,
hdev
,
&
ev
,
sizeof
(
ev
),
NULL
);
NULL
);
}
}
static
int
user_pairing_resp_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
static
int
user_pairing_resp_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
...
@@ -3145,7 +3142,7 @@ static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -3145,7 +3142,7 @@ static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
bacpy
(
&
rp
.
addr
.
bdaddr
,
bdaddr
);
bacpy
(
&
rp
.
addr
.
bdaddr
,
bdaddr
);
rp
.
addr
.
type
=
link_to_mgmt
(
link_type
,
addr_type
);
rp
.
addr
.
type
=
link_to_mgmt
(
link_type
,
addr_type
);
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
opcode
,
mgmt_status
(
status
),
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
opcode
,
mgmt_status
(
status
),
&
rp
,
sizeof
(
rp
));
&
rp
,
sizeof
(
rp
));
mgmt_pending_remove
(
cmd
);
mgmt_pending_remove
(
cmd
);
...
@@ -3153,35 +3150,35 @@ static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
...
@@ -3153,35 +3150,35 @@ static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
}
}
int
mgmt_user_confirm_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_user_confirm_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
)
u8
link_type
,
u8
addr_type
,
u8
status
)
{
{
return
user_pairing_resp_complete
(
hdev
,
bdaddr
,
link_type
,
addr_type
,
return
user_pairing_resp_complete
(
hdev
,
bdaddr
,
link_type
,
addr_type
,
status
,
MGMT_OP_USER_CONFIRM_REPLY
);
status
,
MGMT_OP_USER_CONFIRM_REPLY
);
}
}
int
mgmt_user_confirm_neg_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_user_confirm_neg_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
)
u8
link_type
,
u8
addr_type
,
u8
status
)
{
{
return
user_pairing_resp_complete
(
hdev
,
bdaddr
,
link_type
,
addr_type
,
return
user_pairing_resp_complete
(
hdev
,
bdaddr
,
link_type
,
addr_type
,
status
,
MGMT_OP_USER_CONFIRM_NEG_REPLY
);
status
,
MGMT_OP_USER_CONFIRM_NEG_REPLY
);
}
}
int
mgmt_user_passkey_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_user_passkey_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
)
u8
link_type
,
u8
addr_type
,
u8
status
)
{
{
return
user_pairing_resp_complete
(
hdev
,
bdaddr
,
link_type
,
addr_type
,
return
user_pairing_resp_complete
(
hdev
,
bdaddr
,
link_type
,
addr_type
,
status
,
MGMT_OP_USER_PASSKEY_REPLY
);
status
,
MGMT_OP_USER_PASSKEY_REPLY
);
}
}
int
mgmt_user_passkey_neg_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
int
mgmt_user_passkey_neg_reply_complete
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
)
u8
link_type
,
u8
addr_type
,
u8
status
)
{
{
return
user_pairing_resp_complete
(
hdev
,
bdaddr
,
link_type
,
addr_type
,
return
user_pairing_resp_complete
(
hdev
,
bdaddr
,
link_type
,
addr_type
,
status
,
MGMT_OP_USER_PASSKEY_NEG_REPLY
);
status
,
MGMT_OP_USER_PASSKEY_NEG_REPLY
);
}
}
int
mgmt_auth_failed
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
int
mgmt_auth_failed
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
status
)
u8
addr_type
,
u8
status
)
{
{
struct
mgmt_ev_auth_failed
ev
;
struct
mgmt_ev_auth_failed
ev
;
...
@@ -3201,7 +3198,7 @@ int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
...
@@ -3201,7 +3198,7 @@ int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
if
(
status
)
{
if
(
status
)
{
u8
mgmt_err
=
mgmt_status
(
status
);
u8
mgmt_err
=
mgmt_status
(
status
);
mgmt_pending_foreach
(
MGMT_OP_SET_LINK_SECURITY
,
hdev
,
mgmt_pending_foreach
(
MGMT_OP_SET_LINK_SECURITY
,
hdev
,
cmd_status_rsp
,
&
mgmt_err
);
cmd_status_rsp
,
&
mgmt_err
);
return
0
;
return
0
;
}
}
...
@@ -3214,7 +3211,7 @@ int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
...
@@ -3214,7 +3211,7 @@ int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
}
}
mgmt_pending_foreach
(
MGMT_OP_SET_LINK_SECURITY
,
hdev
,
settings_rsp
,
mgmt_pending_foreach
(
MGMT_OP_SET_LINK_SECURITY
,
hdev
,
settings_rsp
,
&
match
);
&
match
);
if
(
changed
)
if
(
changed
)
err
=
new_settings
(
hdev
,
match
.
sk
);
err
=
new_settings
(
hdev
,
match
.
sk
);
...
@@ -3249,11 +3246,11 @@ int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
...
@@ -3249,11 +3246,11 @@ int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
u8
mgmt_err
=
mgmt_status
(
status
);
u8
mgmt_err
=
mgmt_status
(
status
);
if
(
enable
&&
test_and_clear_bit
(
HCI_SSP_ENABLED
,
if
(
enable
&&
test_and_clear_bit
(
HCI_SSP_ENABLED
,
&
hdev
->
dev_flags
))
&
hdev
->
dev_flags
))
err
=
new_settings
(
hdev
,
NULL
);
err
=
new_settings
(
hdev
,
NULL
);
mgmt_pending_foreach
(
MGMT_OP_SET_SSP
,
hdev
,
mgmt_pending_foreach
(
MGMT_OP_SET_SSP
,
hdev
,
cmd_status_rsp
,
cmd_status_rsp
,
&
mgmt_err
);
&
mgmt_err
);
return
err
;
return
err
;
}
}
...
@@ -3287,7 +3284,7 @@ static void class_rsp(struct pending_cmd *cmd, void *data)
...
@@ -3287,7 +3284,7 @@ static void class_rsp(struct pending_cmd *cmd, void *data)
struct
cmd_lookup
*
match
=
data
;
struct
cmd_lookup
*
match
=
data
;
cmd_complete
(
cmd
->
sk
,
cmd
->
index
,
cmd
->
opcode
,
match
->
mgmt_status
,
cmd_complete
(
cmd
->
sk
,
cmd
->
index
,
cmd
->
opcode
,
match
->
mgmt_status
,
match
->
hdev
->
dev_class
,
3
);
match
->
hdev
->
dev_class
,
3
);
list_del
(
&
cmd
->
list
);
list_del
(
&
cmd
->
list
);
...
@@ -3300,7 +3297,7 @@ static void class_rsp(struct pending_cmd *cmd, void *data)
...
@@ -3300,7 +3297,7 @@ static void class_rsp(struct pending_cmd *cmd, void *data)
}
}
int
mgmt_set_class_of_dev_complete
(
struct
hci_dev
*
hdev
,
u8
*
dev_class
,
int
mgmt_set_class_of_dev_complete
(
struct
hci_dev
*
hdev
,
u8
*
dev_class
,
u8
status
)
u8
status
)
{
{
struct
cmd_lookup
match
=
{
NULL
,
hdev
,
mgmt_status
(
status
)
};
struct
cmd_lookup
match
=
{
NULL
,
hdev
,
mgmt_status
(
status
)
};
int
err
=
0
;
int
err
=
0
;
...
@@ -3312,8 +3309,8 @@ int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
...
@@ -3312,8 +3309,8 @@ int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
mgmt_pending_foreach
(
MGMT_OP_REMOVE_UUID
,
hdev
,
class_rsp
,
&
match
);
mgmt_pending_foreach
(
MGMT_OP_REMOVE_UUID
,
hdev
,
class_rsp
,
&
match
);
if
(
!
status
)
if
(
!
status
)
err
=
mgmt_event
(
MGMT_EV_CLASS_OF_DEV_CHANGED
,
hdev
,
err
=
mgmt_event
(
MGMT_EV_CLASS_OF_DEV_CHANGED
,
hdev
,
dev_class
,
dev_class
,
3
,
NULL
);
3
,
NULL
);
if
(
match
.
sk
)
if
(
match
.
sk
)
sock_put
(
match
.
sk
);
sock_put
(
match
.
sk
);
...
@@ -3347,19 +3344,19 @@ int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
...
@@ -3347,19 +3344,19 @@ int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
if
(
status
)
{
if
(
status
)
{
err
=
cmd_status
(
cmd
->
sk
,
hdev
->
id
,
MGMT_OP_SET_LOCAL_NAME
,
err
=
cmd_status
(
cmd
->
sk
,
hdev
->
id
,
MGMT_OP_SET_LOCAL_NAME
,
mgmt_status
(
status
));
mgmt_status
(
status
));
goto
failed
;
goto
failed
;
}
}
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
MGMT_OP_SET_LOCAL_NAME
,
0
,
&
ev
,
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
MGMT_OP_SET_LOCAL_NAME
,
0
,
&
ev
,
sizeof
(
ev
));
sizeof
(
ev
));
if
(
err
<
0
)
if
(
err
<
0
)
goto
failed
;
goto
failed
;
send_event:
send_event:
if
(
changed
)
if
(
changed
)
err
=
mgmt_event
(
MGMT_EV_LOCAL_NAME_CHANGED
,
hdev
,
&
ev
,
err
=
mgmt_event
(
MGMT_EV_LOCAL_NAME_CHANGED
,
hdev
,
&
ev
,
sizeof
(
ev
),
cmd
?
cmd
->
sk
:
NULL
);
sizeof
(
ev
),
cmd
?
cmd
->
sk
:
NULL
);
update_eir
(
hdev
);
update_eir
(
hdev
);
...
@@ -3370,7 +3367,7 @@ int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
...
@@ -3370,7 +3367,7 @@ int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
}
}
int
mgmt_read_local_oob_data_reply_complete
(
struct
hci_dev
*
hdev
,
u8
*
hash
,
int
mgmt_read_local_oob_data_reply_complete
(
struct
hci_dev
*
hdev
,
u8
*
hash
,
u8
*
randomizer
,
u8
status
)
u8
*
randomizer
,
u8
status
)
{
{
struct
pending_cmd
*
cmd
;
struct
pending_cmd
*
cmd
;
int
err
;
int
err
;
...
@@ -3382,9 +3379,8 @@ int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
...
@@ -3382,9 +3379,8 @@ int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
return
-
ENOENT
;
return
-
ENOENT
;
if
(
status
)
{
if
(
status
)
{
err
=
cmd_status
(
cmd
->
sk
,
hdev
->
id
,
err
=
cmd_status
(
cmd
->
sk
,
hdev
->
id
,
MGMT_OP_READ_LOCAL_OOB_DATA
,
MGMT_OP_READ_LOCAL_OOB_DATA
,
mgmt_status
(
status
));
mgmt_status
(
status
));
}
else
{
}
else
{
struct
mgmt_rp_read_local_oob_data
rp
;
struct
mgmt_rp_read_local_oob_data
rp
;
...
@@ -3392,8 +3388,8 @@ int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
...
@@ -3392,8 +3388,8 @@ int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
memcpy
(
rp
.
randomizer
,
randomizer
,
sizeof
(
rp
.
randomizer
));
memcpy
(
rp
.
randomizer
,
randomizer
,
sizeof
(
rp
.
randomizer
));
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
MGMT_OP_READ_LOCAL_OOB_DATA
,
MGMT_OP_READ_LOCAL_OOB_DATA
,
0
,
&
rp
,
0
,
&
rp
,
sizeof
(
rp
));
sizeof
(
rp
));
}
}
mgmt_pending_remove
(
cmd
);
mgmt_pending_remove
(
cmd
);
...
@@ -3411,11 +3407,11 @@ int mgmt_le_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
...
@@ -3411,11 +3407,11 @@ int mgmt_le_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
u8
mgmt_err
=
mgmt_status
(
status
);
u8
mgmt_err
=
mgmt_status
(
status
);
if
(
enable
&&
test_and_clear_bit
(
HCI_LE_ENABLED
,
if
(
enable
&&
test_and_clear_bit
(
HCI_LE_ENABLED
,
&
hdev
->
dev_flags
))
&
hdev
->
dev_flags
))
err
=
new_settings
(
hdev
,
NULL
);
err
=
new_settings
(
hdev
,
NULL
);
mgmt_pending_foreach
(
MGMT_OP_SET_LE
,
hdev
,
mgmt_pending_foreach
(
MGMT_OP_SET_LE
,
hdev
,
cmd_status_rsp
,
&
mgmt_err
);
cmd_status_rsp
,
&
mgmt_err
);
return
err
;
return
err
;
}
}
...
@@ -3440,8 +3436,8 @@ int mgmt_le_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
...
@@ -3440,8 +3436,8 @@ int mgmt_le_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
}
}
int
mgmt_device_found
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
int
mgmt_device_found
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
u8
*
dev_class
,
s8
rssi
,
u8
addr_type
,
u8
*
dev_class
,
s8
rssi
,
u8
cfm_name
,
u8
u8
cfm_name
,
u8
ssp
,
u8
*
eir
,
u16
eir_len
)
ssp
,
u8
*
eir
,
u16
eir_len
)
{
{
char
buf
[
512
];
char
buf
[
512
];
struct
mgmt_ev_device_found
*
ev
=
(
void
*
)
buf
;
struct
mgmt_ev_device_found
*
ev
=
(
void
*
)
buf
;
...
@@ -3466,7 +3462,7 @@ int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
...
@@ -3466,7 +3462,7 @@ int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
if
(
dev_class
&&
!
eir_has_data_type
(
ev
->
eir
,
eir_len
,
EIR_CLASS_OF_DEV
))
if
(
dev_class
&&
!
eir_has_data_type
(
ev
->
eir
,
eir_len
,
EIR_CLASS_OF_DEV
))
eir_len
=
eir_append_data
(
ev
->
eir
,
eir_len
,
EIR_CLASS_OF_DEV
,
eir_len
=
eir_append_data
(
ev
->
eir
,
eir_len
,
EIR_CLASS_OF_DEV
,
dev_class
,
3
);
dev_class
,
3
);
put_unaligned_le16
(
eir_len
,
&
ev
->
eir_len
);
put_unaligned_le16
(
eir_len
,
&
ev
->
eir_len
);
...
@@ -3476,7 +3472,7 @@ int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
...
@@ -3476,7 +3472,7 @@ int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
}
}
int
mgmt_remote_name
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
int
mgmt_remote_name
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
link_type
,
u8
addr_type
,
s8
rssi
,
u8
*
name
,
u8
name_len
)
u8
addr_type
,
s8
rssi
,
u8
*
name
,
u8
name_len
)
{
{
struct
mgmt_ev_device_found
*
ev
;
struct
mgmt_ev_device_found
*
ev
;
char
buf
[
sizeof
(
*
ev
)
+
HCI_MAX_NAME_LENGTH
+
2
];
char
buf
[
sizeof
(
*
ev
)
+
HCI_MAX_NAME_LENGTH
+
2
];
...
@@ -3491,12 +3487,12 @@ int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
...
@@ -3491,12 +3487,12 @@ int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
ev
->
rssi
=
rssi
;
ev
->
rssi
=
rssi
;
eir_len
=
eir_append_data
(
ev
->
eir
,
0
,
EIR_NAME_COMPLETE
,
name
,
eir_len
=
eir_append_data
(
ev
->
eir
,
0
,
EIR_NAME_COMPLETE
,
name
,
name_len
);
name_len
);
put_unaligned_le16
(
eir_len
,
&
ev
->
eir_len
);
put_unaligned_le16
(
eir_len
,
&
ev
->
eir_len
);
return
mgmt_event
(
MGMT_EV_DEVICE_FOUND
,
hdev
,
ev
,
return
mgmt_event
(
MGMT_EV_DEVICE_FOUND
,
hdev
,
ev
,
sizeof
(
*
ev
)
+
eir_len
,
NULL
);
sizeof
(
*
ev
)
+
eir_len
,
NULL
);
}
}
int
mgmt_start_discovery_failed
(
struct
hci_dev
*
hdev
,
u8
status
)
int
mgmt_start_discovery_failed
(
struct
hci_dev
*
hdev
,
u8
status
)
...
@@ -3514,7 +3510,7 @@ int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
...
@@ -3514,7 +3510,7 @@ int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
type
=
hdev
->
discovery
.
type
;
type
=
hdev
->
discovery
.
type
;
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
cmd
->
opcode
,
mgmt_status
(
status
),
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
cmd
->
opcode
,
mgmt_status
(
status
),
&
type
,
sizeof
(
type
));
&
type
,
sizeof
(
type
));
mgmt_pending_remove
(
cmd
);
mgmt_pending_remove
(
cmd
);
return
err
;
return
err
;
...
@@ -3530,8 +3526,7 @@ int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
...
@@ -3530,8 +3526,7 @@ int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
return
-
ENOENT
;
return
-
ENOENT
;
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
cmd
->
opcode
,
mgmt_status
(
status
),
err
=
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
cmd
->
opcode
,
mgmt_status
(
status
),
&
hdev
->
discovery
.
type
,
&
hdev
->
discovery
.
type
,
sizeof
(
hdev
->
discovery
.
type
));
sizeof
(
hdev
->
discovery
.
type
));
mgmt_pending_remove
(
cmd
);
mgmt_pending_remove
(
cmd
);
return
err
;
return
err
;
...
@@ -3552,8 +3547,8 @@ int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
...
@@ -3552,8 +3547,8 @@ int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
if
(
cmd
!=
NULL
)
{
if
(
cmd
!=
NULL
)
{
u8
type
=
hdev
->
discovery
.
type
;
u8
type
=
hdev
->
discovery
.
type
;
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
cmd
->
opcode
,
0
,
cmd_complete
(
cmd
->
sk
,
hdev
->
id
,
cmd
->
opcode
,
0
,
&
type
,
&
type
,
sizeof
(
type
));
sizeof
(
type
));
mgmt_pending_remove
(
cmd
);
mgmt_pending_remove
(
cmd
);
}
}
...
@@ -3575,7 +3570,7 @@ int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
...
@@ -3575,7 +3570,7 @@ int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
ev
.
addr
.
type
=
type
;
ev
.
addr
.
type
=
type
;
return
mgmt_event
(
MGMT_EV_DEVICE_BLOCKED
,
hdev
,
&
ev
,
sizeof
(
ev
),
return
mgmt_event
(
MGMT_EV_DEVICE_BLOCKED
,
hdev
,
&
ev
,
sizeof
(
ev
),
cmd
?
cmd
->
sk
:
NULL
);
cmd
?
cmd
->
sk
:
NULL
);
}
}
int
mgmt_device_unblocked
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
type
)
int
mgmt_device_unblocked
(
struct
hci_dev
*
hdev
,
bdaddr_t
*
bdaddr
,
u8
type
)
...
@@ -3589,7 +3584,7 @@ int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
...
@@ -3589,7 +3584,7 @@ int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
ev
.
addr
.
type
=
type
;
ev
.
addr
.
type
=
type
;
return
mgmt_event
(
MGMT_EV_DEVICE_UNBLOCKED
,
hdev
,
&
ev
,
sizeof
(
ev
),
return
mgmt_event
(
MGMT_EV_DEVICE_UNBLOCKED
,
hdev
,
&
ev
,
sizeof
(
ev
),
cmd
?
cmd
->
sk
:
NULL
);
cmd
?
cmd
->
sk
:
NULL
);
}
}
module_param
(
enable_hs
,
bool
,
0644
);
module_param
(
enable_hs
,
bool
,
0644
);
...
...
net/bluetooth/smp.c
浏览文件 @
04124681
...
@@ -264,7 +264,7 @@ static void smp_failure(struct l2cap_conn *conn, u8 reason, u8 send)
...
@@ -264,7 +264,7 @@ static void smp_failure(struct l2cap_conn *conn, u8 reason, u8 send)
clear_bit
(
HCI_CONN_ENCRYPT_PEND
,
&
conn
->
hcon
->
flags
);
clear_bit
(
HCI_CONN_ENCRYPT_PEND
,
&
conn
->
hcon
->
flags
);
mgmt_auth_failed
(
conn
->
hcon
->
hdev
,
conn
->
dst
,
hcon
->
type
,
mgmt_auth_failed
(
conn
->
hcon
->
hdev
,
conn
->
dst
,
hcon
->
type
,
hcon
->
dst_type
,
reason
);
hcon
->
dst_type
,
reason
);
if
(
test_and_clear_bit
(
HCI_CONN_LE_SMP_PEND
,
&
conn
->
hcon
->
flags
))
{
if
(
test_and_clear_bit
(
HCI_CONN_LE_SMP_PEND
,
&
conn
->
hcon
->
flags
))
{
cancel_delayed_work_sync
(
&
conn
->
security_timer
);
cancel_delayed_work_sync
(
&
conn
->
security_timer
);
...
@@ -384,12 +384,11 @@ static void confirm_work(struct work_struct *work)
...
@@ -384,12 +384,11 @@ static void confirm_work(struct work_struct *work)
if
(
conn
->
hcon
->
out
)
if
(
conn
->
hcon
->
out
)
ret
=
smp_c1
(
tfm
,
smp
->
tk
,
smp
->
prnd
,
smp
->
preq
,
smp
->
prsp
,
0
,
ret
=
smp_c1
(
tfm
,
smp
->
tk
,
smp
->
prnd
,
smp
->
preq
,
smp
->
prsp
,
0
,
conn
->
src
,
conn
->
hcon
->
dst_type
,
conn
->
dst
,
conn
->
src
,
conn
->
hcon
->
dst_type
,
conn
->
dst
,
res
);
res
);
else
else
ret
=
smp_c1
(
tfm
,
smp
->
tk
,
smp
->
prnd
,
smp
->
preq
,
smp
->
prsp
,
ret
=
smp_c1
(
tfm
,
smp
->
tk
,
smp
->
prnd
,
smp
->
preq
,
smp
->
prsp
,
conn
->
hcon
->
dst_type
,
conn
->
dst
,
0
,
conn
->
src
,
conn
->
hcon
->
dst_type
,
conn
->
dst
,
0
,
conn
->
src
,
res
);
res
);
if
(
ret
)
{
if
(
ret
)
{
reason
=
SMP_UNSPECIFIED
;
reason
=
SMP_UNSPECIFIED
;
goto
error
;
goto
error
;
...
@@ -424,12 +423,10 @@ static void random_work(struct work_struct *work)
...
@@ -424,12 +423,10 @@ static void random_work(struct work_struct *work)
if
(
hcon
->
out
)
if
(
hcon
->
out
)
ret
=
smp_c1
(
tfm
,
smp
->
tk
,
smp
->
rrnd
,
smp
->
preq
,
smp
->
prsp
,
0
,
ret
=
smp_c1
(
tfm
,
smp
->
tk
,
smp
->
rrnd
,
smp
->
preq
,
smp
->
prsp
,
0
,
conn
->
src
,
hcon
->
dst_type
,
conn
->
dst
,
conn
->
src
,
hcon
->
dst_type
,
conn
->
dst
,
res
);
res
);
else
else
ret
=
smp_c1
(
tfm
,
smp
->
tk
,
smp
->
rrnd
,
smp
->
preq
,
smp
->
prsp
,
ret
=
smp_c1
(
tfm
,
smp
->
tk
,
smp
->
rrnd
,
smp
->
preq
,
smp
->
prsp
,
hcon
->
dst_type
,
conn
->
dst
,
0
,
conn
->
src
,
hcon
->
dst_type
,
conn
->
dst
,
0
,
conn
->
src
,
res
);
res
);
if
(
ret
)
{
if
(
ret
)
{
reason
=
SMP_UNSPECIFIED
;
reason
=
SMP_UNSPECIFIED
;
goto
error
;
goto
error
;
...
@@ -454,7 +451,7 @@ static void random_work(struct work_struct *work)
...
@@ -454,7 +451,7 @@ static void random_work(struct work_struct *work)
swap128
(
key
,
stk
);
swap128
(
key
,
stk
);
memset
(
stk
+
smp
->
enc_key_size
,
0
,
memset
(
stk
+
smp
->
enc_key_size
,
0
,
SMP_MAX_ENC_KEY_SIZE
-
smp
->
enc_key_size
);
SMP_MAX_ENC_KEY_SIZE
-
smp
->
enc_key_size
);
if
(
test_and_set_bit
(
HCI_CONN_ENCRYPT_PEND
,
&
hcon
->
flags
))
{
if
(
test_and_set_bit
(
HCI_CONN_ENCRYPT_PEND
,
&
hcon
->
flags
))
{
reason
=
SMP_UNSPECIFIED
;
reason
=
SMP_UNSPECIFIED
;
...
@@ -480,8 +477,8 @@ static void random_work(struct work_struct *work)
...
@@ -480,8 +477,8 @@ static void random_work(struct work_struct *work)
SMP_MAX_ENC_KEY_SIZE
-
smp
->
enc_key_size
);
SMP_MAX_ENC_KEY_SIZE
-
smp
->
enc_key_size
);
hci_add_ltk
(
hcon
->
hdev
,
conn
->
dst
,
hcon
->
dst_type
,
hci_add_ltk
(
hcon
->
hdev
,
conn
->
dst
,
hcon
->
dst_type
,
HCI_SMP_STK_SLAVE
,
0
,
0
,
stk
,
HCI_SMP_STK_SLAVE
,
0
,
0
,
stk
,
smp
->
enc_key_size
,
smp
->
enc_key_size
,
ediv
,
rand
);
ediv
,
rand
);
}
}
return
;
return
;
...
@@ -829,8 +826,8 @@ static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
...
@@ -829,8 +826,8 @@ static int smp_cmd_master_ident(struct l2cap_conn *conn, struct sk_buff *skb)
hci_dev_lock
(
hdev
);
hci_dev_lock
(
hdev
);
authenticated
=
(
conn
->
hcon
->
sec_level
==
BT_SECURITY_HIGH
);
authenticated
=
(
conn
->
hcon
->
sec_level
==
BT_SECURITY_HIGH
);
hci_add_ltk
(
conn
->
hcon
->
hdev
,
conn
->
dst
,
hcon
->
dst_type
,
hci_add_ltk
(
conn
->
hcon
->
hdev
,
conn
->
dst
,
hcon
->
dst_type
,
HCI_SMP_LTK
,
1
,
authenticated
,
smp
->
tk
,
HCI_SMP_LTK
,
1
,
authenticated
,
smp
->
tk
,
smp
->
enc_key_size
,
smp
->
enc_key_size
,
rp
->
ediv
,
rp
->
rand
);
rp
->
ediv
,
rp
->
rand
);
smp_distribute_keys
(
conn
,
1
);
smp_distribute_keys
(
conn
,
1
);
hci_dev_unlock
(
hdev
);
hci_dev_unlock
(
hdev
);
...
@@ -954,9 +951,8 @@ int smp_distribute_keys(struct l2cap_conn *conn, __u8 force)
...
@@ -954,9 +951,8 @@ int smp_distribute_keys(struct l2cap_conn *conn, __u8 force)
authenticated
=
hcon
->
sec_level
==
BT_SECURITY_HIGH
;
authenticated
=
hcon
->
sec_level
==
BT_SECURITY_HIGH
;
hci_add_ltk
(
conn
->
hcon
->
hdev
,
conn
->
dst
,
hcon
->
dst_type
,
hci_add_ltk
(
conn
->
hcon
->
hdev
,
conn
->
dst
,
hcon
->
dst_type
,
HCI_SMP_LTK_SLAVE
,
1
,
authenticated
,
HCI_SMP_LTK_SLAVE
,
1
,
authenticated
,
enc
.
ltk
,
smp
->
enc_key_size
,
enc
.
ltk
,
smp
->
enc_key_size
,
ediv
,
ident
.
rand
);
ediv
,
ident
.
rand
);
ident
.
ediv
=
cpu_to_le16
(
ediv
);
ident
.
ediv
=
cpu_to_le16
(
ediv
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录