Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless into for-davem
此提交包含在:
@@ -71,19 +71,16 @@ static const char *const bt_slock_key_strings[BT_MAX_PROTO] = {
|
||||
"slock-AF_BLUETOOTH-BTPROTO_AVDTP",
|
||||
};
|
||||
|
||||
static inline void bt_sock_reclassify_lock(struct socket *sock, int proto)
|
||||
void bt_sock_reclassify_lock(struct sock *sk, int proto)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
if (!sk)
|
||||
return;
|
||||
|
||||
BUG_ON(!sk);
|
||||
BUG_ON(sock_owned_by_user(sk));
|
||||
|
||||
sock_lock_init_class_and_name(sk,
|
||||
bt_slock_key_strings[proto], &bt_slock_key[proto],
|
||||
bt_key_strings[proto], &bt_lock_key[proto]);
|
||||
}
|
||||
EXPORT_SYMBOL(bt_sock_reclassify_lock);
|
||||
|
||||
int bt_sock_register(int proto, const struct net_proto_family *ops)
|
||||
{
|
||||
@@ -145,7 +142,8 @@ static int bt_sock_create(struct net *net, struct socket *sock, int proto,
|
||||
|
||||
if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
|
||||
err = bt_proto[proto]->create(net, sock, proto, kern);
|
||||
bt_sock_reclassify_lock(sock, proto);
|
||||
if (!err)
|
||||
bt_sock_reclassify_lock(sock->sk, proto);
|
||||
module_put(bt_proto[proto]->owner);
|
||||
}
|
||||
|
||||
|
@@ -635,6 +635,10 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
|
||||
|
||||
if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) {
|
||||
struct hci_cp_auth_requested cp;
|
||||
|
||||
/* encrypt must be pending if auth is also pending */
|
||||
set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend);
|
||||
|
||||
cp.handle = cpu_to_le16(conn->handle);
|
||||
hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
|
||||
sizeof(cp), &cp);
|
||||
|
@@ -640,7 +640,8 @@ static int hci_dev_do_close(struct hci_dev *hdev)
|
||||
/* Reset device */
|
||||
skb_queue_purge(&hdev->cmd_q);
|
||||
atomic_set(&hdev->cmd_cnt, 1);
|
||||
if (!test_bit(HCI_RAW, &hdev->flags)) {
|
||||
if (!test_bit(HCI_RAW, &hdev->flags) &&
|
||||
test_bit(HCI_QUIRK_NO_RESET, &hdev->quirks)) {
|
||||
set_bit(HCI_INIT, &hdev->flags);
|
||||
__hci_request(hdev, hci_reset_req, 0,
|
||||
msecs_to_jiffies(250));
|
||||
|
@@ -1018,10 +1018,10 @@ static void l2cap_conn_del(struct hci_conn *hcon, int err)
|
||||
hci_chan_del(conn->hchan);
|
||||
|
||||
if (conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT)
|
||||
__cancel_delayed_work(&conn->info_timer);
|
||||
cancel_delayed_work_sync(&conn->info_timer);
|
||||
|
||||
if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &hcon->pend)) {
|
||||
__cancel_delayed_work(&conn->security_timer);
|
||||
cancel_delayed_work_sync(&conn->security_timer);
|
||||
smp_chan_destroy(conn);
|
||||
}
|
||||
|
||||
@@ -1120,7 +1120,7 @@ static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm, bdaddr
|
||||
return c1;
|
||||
}
|
||||
|
||||
inline int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, bdaddr_t *dst)
|
||||
int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, bdaddr_t *dst)
|
||||
{
|
||||
struct sock *sk = chan->sk;
|
||||
bdaddr_t *src = &bt_sk(sk)->src;
|
||||
@@ -2574,7 +2574,7 @@ static inline int l2cap_command_rej(struct l2cap_conn *conn, struct l2cap_cmd_hd
|
||||
|
||||
if ((conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_SENT) &&
|
||||
cmd->ident == conn->info_ident) {
|
||||
__cancel_delayed_work(&conn->info_timer);
|
||||
cancel_delayed_work(&conn->info_timer);
|
||||
|
||||
conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
|
||||
conn->info_ident = 0;
|
||||
@@ -2970,7 +2970,8 @@ static inline int l2cap_config_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hdr
|
||||
|
||||
default:
|
||||
sk->sk_err = ECONNRESET;
|
||||
__set_chan_timer(chan, L2CAP_DISC_REJ_TIMEOUT);
|
||||
__set_chan_timer(chan,
|
||||
msecs_to_jiffies(L2CAP_DISC_REJ_TIMEOUT));
|
||||
l2cap_send_disconn_req(conn, chan, ECONNRESET);
|
||||
goto done;
|
||||
}
|
||||
@@ -3120,7 +3121,7 @@ static inline int l2cap_information_rsp(struct l2cap_conn *conn, struct l2cap_cm
|
||||
conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)
|
||||
return 0;
|
||||
|
||||
__cancel_delayed_work(&conn->info_timer);
|
||||
cancel_delayed_work(&conn->info_timer);
|
||||
|
||||
if (result != L2CAP_IR_SUCCESS) {
|
||||
conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
|
||||
@@ -4478,7 +4479,8 @@ static inline void l2cap_check_encryption(struct l2cap_chan *chan, u8 encrypt)
|
||||
if (encrypt == 0x00) {
|
||||
if (chan->sec_level == BT_SECURITY_MEDIUM) {
|
||||
__clear_chan_timer(chan);
|
||||
__set_chan_timer(chan, L2CAP_ENC_TIMEOUT);
|
||||
__set_chan_timer(chan,
|
||||
msecs_to_jiffies(L2CAP_ENC_TIMEOUT));
|
||||
} else if (chan->sec_level == BT_SECURITY_HIGH)
|
||||
l2cap_chan_close(chan, ECONNREFUSED);
|
||||
} else {
|
||||
@@ -4499,7 +4501,7 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
|
||||
|
||||
if (hcon->type == LE_LINK) {
|
||||
smp_distribute_keys(conn, 0);
|
||||
__cancel_delayed_work(&conn->security_timer);
|
||||
cancel_delayed_work(&conn->security_timer);
|
||||
}
|
||||
|
||||
rcu_read_lock();
|
||||
@@ -4546,7 +4548,8 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
|
||||
L2CAP_CONN_REQ, sizeof(req), &req);
|
||||
} else {
|
||||
__clear_chan_timer(chan);
|
||||
__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
|
||||
__set_chan_timer(chan,
|
||||
msecs_to_jiffies(L2CAP_DISC_TIMEOUT));
|
||||
}
|
||||
} else if (chan->state == BT_CONNECT2) {
|
||||
struct l2cap_conn_rsp rsp;
|
||||
@@ -4566,7 +4569,8 @@ int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
|
||||
}
|
||||
} else {
|
||||
l2cap_state_change(chan, BT_DISCONN);
|
||||
__set_chan_timer(chan, L2CAP_DISC_TIMEOUT);
|
||||
__set_chan_timer(chan,
|
||||
msecs_to_jiffies(L2CAP_DISC_TIMEOUT));
|
||||
res = L2CAP_CR_SEC_BLOCK;
|
||||
stat = L2CAP_CS_NO_INFO;
|
||||
}
|
||||
|
@@ -849,6 +849,8 @@ static struct l2cap_chan *l2cap_sock_new_connection_cb(void *data)
|
||||
if (!sk)
|
||||
return NULL;
|
||||
|
||||
bt_sock_reclassify_lock(sk, BTPROTO_L2CAP);
|
||||
|
||||
l2cap_sock_init(sk, parent);
|
||||
|
||||
return l2cap_pi(sk)->chan;
|
||||
@@ -1002,7 +1004,7 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int p
|
||||
INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
|
||||
|
||||
sk->sk_destruct = l2cap_sock_destruct;
|
||||
sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
|
||||
sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT);
|
||||
|
||||
sock_reset_flag(sk, SOCK_ZAPPED);
|
||||
|
||||
|
@@ -1164,12 +1164,18 @@ static int rfcomm_recv_ua(struct rfcomm_session *s, u8 dlci)
|
||||
break;
|
||||
|
||||
case BT_DISCONN:
|
||||
/* When socket is closed and we are not RFCOMM
|
||||
* initiator rfcomm_process_rx already calls
|
||||
* rfcomm_session_put() */
|
||||
if (s->sock->sk->sk_state != BT_CLOSED)
|
||||
if (list_empty(&s->dlcs))
|
||||
rfcomm_session_put(s);
|
||||
/* rfcomm_session_put is called later so don't do
|
||||
* anything here otherwise we will mess up the session
|
||||
* reference counter:
|
||||
*
|
||||
* (a) when we are the initiator dlc_unlink will drive
|
||||
* the reference counter to 0 (there is no initial put
|
||||
* after session_add)
|
||||
*
|
||||
* (b) when we are not the initiator rfcomm_rx_process
|
||||
* will explicitly call put to balance the initial hold
|
||||
* done after session add.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -956,6 +956,8 @@ int rfcomm_connect_ind(struct rfcomm_session *s, u8 channel, struct rfcomm_dlc *
|
||||
if (!sk)
|
||||
goto done;
|
||||
|
||||
bt_sock_reclassify_lock(sk, BTPROTO_RFCOMM);
|
||||
|
||||
rfcomm_sock_init(sk, parent);
|
||||
bacpy(&bt_sk(sk)->src, &src);
|
||||
bacpy(&bt_sk(sk)->dst, &dst);
|
||||
|
@@ -63,14 +63,14 @@ static ssize_t sta_flags_read(struct file *file, char __user *userbuf,
|
||||
test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : ""
|
||||
|
||||
int res = scnprintf(buf, sizeof(buf),
|
||||
"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||
"%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||
TEST(AUTH), TEST(ASSOC), TEST(PS_STA),
|
||||
TEST(PS_DRIVER), TEST(AUTHORIZED),
|
||||
TEST(SHORT_PREAMBLE),
|
||||
TEST(WME), TEST(WDS), TEST(CLEAR_PS_FILT),
|
||||
TEST(MFP), TEST(BLOCK_BA), TEST(PSPOLL),
|
||||
TEST(UAPSD), TEST(SP), TEST(TDLS_PEER),
|
||||
TEST(TDLS_PEER_AUTH));
|
||||
TEST(TDLS_PEER_AUTH), TEST(RATE_CONTROL));
|
||||
#undef TEST
|
||||
return simple_read_from_buffer(userbuf, count, ppos, buf, res);
|
||||
}
|
||||
|
@@ -336,7 +336,7 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
|
||||
int i;
|
||||
u32 mask;
|
||||
|
||||
if (sta) {
|
||||
if (sta && test_sta_flag(sta, WLAN_STA_RATE_CONTROL)) {
|
||||
ista = &sta->sta;
|
||||
priv_sta = sta->rate_ctrl_priv;
|
||||
}
|
||||
|
@@ -41,7 +41,7 @@ static inline void rate_control_tx_status(struct ieee80211_local *local,
|
||||
struct ieee80211_sta *ista = &sta->sta;
|
||||
void *priv_sta = sta->rate_ctrl_priv;
|
||||
|
||||
if (!ref)
|
||||
if (!ref || !test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
|
||||
return;
|
||||
|
||||
ref->ops->tx_status(ref->priv, sband, ista, priv_sta, skb);
|
||||
@@ -62,6 +62,7 @@ static inline void rate_control_rate_init(struct sta_info *sta)
|
||||
sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
|
||||
|
||||
ref->ops->rate_init(ref->priv, sband, ista, priv_sta);
|
||||
set_sta_flag(sta, WLAN_STA_RATE_CONTROL);
|
||||
}
|
||||
|
||||
static inline void rate_control_rate_update(struct ieee80211_local *local,
|
||||
|
@@ -52,6 +52,7 @@
|
||||
* @WLAN_STA_SP: Station is in a service period, so don't try to
|
||||
* reply to other uAPSD trigger frames or PS-Poll.
|
||||
* @WLAN_STA_4ADDR_EVENT: 4-addr event was already sent for this frame.
|
||||
* @WLAN_STA_RATE_CONTROL: rate control was initialized for this station.
|
||||
*/
|
||||
enum ieee80211_sta_info_flags {
|
||||
WLAN_STA_AUTH,
|
||||
@@ -71,6 +72,7 @@ enum ieee80211_sta_info_flags {
|
||||
WLAN_STA_UAPSD,
|
||||
WLAN_STA_SP,
|
||||
WLAN_STA_4ADDR_EVENT,
|
||||
WLAN_STA_RATE_CONTROL,
|
||||
};
|
||||
|
||||
enum ieee80211_sta_state {
|
||||
|
新增問題並參考
封鎖使用者