Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: [TCP]: H-TCP maxRTT estimation at startup [NETFILTER]: nf_nat: add symbolic dependency on IPv4 conntrack [NETFILTER]: ctnetlink: return EEXIST instead of EINVAL for existing nat'ed conntracks [NETFILTER]: ipt_recent: avoid a possible NULL pointer deref in recent_seq_open() [NET] net/core/utils: fix sparse warning [NetLabel]: add missing rcu_dereference() calls in the LSM domain mapping hash table [PATCH] mac80211: don't allow scanning in monitor mode [PATCH] mac80211: Fix sparse error for sta_last_seq_ctrl_read [PATCH] mac80211: use do { } while (0) for multi-line macros [PATCH] mac80211: missing dev_put in ieee80211_master_start_xmit
This commit is contained in:
@@ -21,4 +21,6 @@ extern struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp;
|
|||||||
extern int nf_conntrack_ipv4_compat_init(void);
|
extern int nf_conntrack_ipv4_compat_init(void);
|
||||||
extern void nf_conntrack_ipv4_compat_fini(void);
|
extern void nf_conntrack_ipv4_compat_fini(void);
|
||||||
|
|
||||||
|
extern void need_ipv4_conntrack(void);
|
||||||
|
|
||||||
#endif /*_NF_CONNTRACK_IPV4_H*/
|
#endif /*_NF_CONNTRACK_IPV4_H*/
|
||||||
|
@@ -25,6 +25,7 @@
|
|||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
#include <linux/percpu.h>
|
#include <linux/percpu.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <net/sock.h>
|
||||||
|
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
@@ -387,12 +387,17 @@ static int recent_seq_open(struct inode *inode, struct file *file)
|
|||||||
st = kzalloc(sizeof(*st), GFP_KERNEL);
|
st = kzalloc(sizeof(*st), GFP_KERNEL);
|
||||||
if (st == NULL)
|
if (st == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
ret = seq_open(file, &recent_seq_ops);
|
ret = seq_open(file, &recent_seq_ops);
|
||||||
if (ret)
|
if (ret) {
|
||||||
kfree(st);
|
kfree(st);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
st->table = pde->data;
|
st->table = pde->data;
|
||||||
seq = file->private_data;
|
seq = file->private_data;
|
||||||
seq->private = st;
|
seq->private = st;
|
||||||
|
out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -509,3 +509,9 @@ static void __exit nf_conntrack_l3proto_ipv4_fini(void)
|
|||||||
|
|
||||||
module_init(nf_conntrack_l3proto_ipv4_init);
|
module_init(nf_conntrack_l3proto_ipv4_init);
|
||||||
module_exit(nf_conntrack_l3proto_ipv4_fini);
|
module_exit(nf_conntrack_l3proto_ipv4_fini);
|
||||||
|
|
||||||
|
void need_ipv4_conntrack(void)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(need_ipv4_conntrack);
|
||||||
|
@@ -328,7 +328,7 @@ static int __init nf_nat_standalone_init(void)
|
|||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
need_conntrack();
|
need_ipv4_conntrack();
|
||||||
|
|
||||||
#ifdef CONFIG_XFRM
|
#ifdef CONFIG_XFRM
|
||||||
BUG_ON(ip_nat_decode_session != NULL);
|
BUG_ON(ip_nat_decode_session != NULL);
|
||||||
|
@@ -79,7 +79,6 @@ static u32 htcp_cwnd_undo(struct sock *sk)
|
|||||||
static inline void measure_rtt(struct sock *sk, u32 srtt)
|
static inline void measure_rtt(struct sock *sk, u32 srtt)
|
||||||
{
|
{
|
||||||
const struct inet_connection_sock *icsk = inet_csk(sk);
|
const struct inet_connection_sock *icsk = inet_csk(sk);
|
||||||
const struct tcp_sock *tp = tcp_sk(sk);
|
|
||||||
struct htcp *ca = inet_csk_ca(sk);
|
struct htcp *ca = inet_csk_ca(sk);
|
||||||
|
|
||||||
/* keep track of minimum RTT seen so far, minRTT is zero at first */
|
/* keep track of minimum RTT seen so far, minRTT is zero at first */
|
||||||
@@ -87,8 +86,7 @@ static inline void measure_rtt(struct sock *sk, u32 srtt)
|
|||||||
ca->minRTT = srtt;
|
ca->minRTT = srtt;
|
||||||
|
|
||||||
/* max RTT */
|
/* max RTT */
|
||||||
if (icsk->icsk_ca_state == TCP_CA_Open
|
if (icsk->icsk_ca_state == TCP_CA_Open) {
|
||||||
&& tp->snd_ssthresh < 0xFFFF && htcp_ccount(ca) > 3) {
|
|
||||||
if (ca->maxRTT < ca->minRTT)
|
if (ca->maxRTT < ca->minRTT)
|
||||||
ca->maxRTT = ca->minRTT;
|
ca->maxRTT = ca->minRTT;
|
||||||
if (ca->maxRTT < srtt
|
if (ca->maxRTT < srtt
|
||||||
|
@@ -271,9 +271,11 @@ static void add_files(struct ieee80211_sub_if_data *sdata)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEBUGFS_DEL(name, type)\
|
#define DEBUGFS_DEL(name, type) \
|
||||||
debugfs_remove(sdata->debugfs.type.name);\
|
do { \
|
||||||
sdata->debugfs.type.name = NULL;
|
debugfs_remove(sdata->debugfs.type.name); \
|
||||||
|
sdata->debugfs.type.name = NULL; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
static void del_sta_files(struct ieee80211_sub_if_data *sdata)
|
static void del_sta_files(struct ieee80211_sub_if_data *sdata)
|
||||||
{
|
{
|
||||||
|
@@ -157,7 +157,7 @@ static ssize_t sta_last_seq_ctrl_read(struct file *file, char __user *userbuf,
|
|||||||
struct sta_info *sta = file->private_data;
|
struct sta_info *sta = file->private_data;
|
||||||
for (i = 0; i < NUM_RX_DATA_QUEUES; i++)
|
for (i = 0; i < NUM_RX_DATA_QUEUES; i++)
|
||||||
p += scnprintf(p, sizeof(buf)+buf-p, "%x ",
|
p += scnprintf(p, sizeof(buf)+buf-p, "%x ",
|
||||||
sta->last_seq_ctrl[i]);
|
le16_to_cpu(sta->last_seq_ctrl[i]));
|
||||||
p += scnprintf(p, sizeof(buf)+buf-p, "\n");
|
p += scnprintf(p, sizeof(buf)+buf-p, "\n");
|
||||||
return simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
|
return simple_read_from_buffer(userbuf, count, ppos, buf, p - buf);
|
||||||
}
|
}
|
||||||
|
@@ -1650,6 +1650,7 @@ static int ieee80211_master_start_xmit(struct sk_buff *skb,
|
|||||||
if (skb_headroom(skb) < headroom) {
|
if (skb_headroom(skb) < headroom) {
|
||||||
if (pskb_expand_head(skb, headroom, 0, GFP_ATOMIC)) {
|
if (pskb_expand_head(skb, headroom, 0, GFP_ATOMIC)) {
|
||||||
dev_kfree_skb(skb);
|
dev_kfree_skb(skb);
|
||||||
|
dev_put(odev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -697,17 +697,24 @@ static int ieee80211_ioctl_siwscan(struct net_device *dev,
|
|||||||
if (!netif_running(dev))
|
if (!netif_running(dev))
|
||||||
return -ENETDOWN;
|
return -ENETDOWN;
|
||||||
|
|
||||||
if (local->scan_flags & IEEE80211_SCAN_MATCH_SSID) {
|
switch (sdata->type) {
|
||||||
if (sdata->type == IEEE80211_IF_TYPE_STA ||
|
case IEEE80211_IF_TYPE_STA:
|
||||||
sdata->type == IEEE80211_IF_TYPE_IBSS) {
|
case IEEE80211_IF_TYPE_IBSS:
|
||||||
|
if (local->scan_flags & IEEE80211_SCAN_MATCH_SSID) {
|
||||||
ssid = sdata->u.sta.ssid;
|
ssid = sdata->u.sta.ssid;
|
||||||
ssid_len = sdata->u.sta.ssid_len;
|
ssid_len = sdata->u.sta.ssid_len;
|
||||||
} else if (sdata->type == IEEE80211_IF_TYPE_AP) {
|
}
|
||||||
|
break;
|
||||||
|
case IEEE80211_IF_TYPE_AP:
|
||||||
|
if (local->scan_flags & IEEE80211_SCAN_MATCH_SSID) {
|
||||||
ssid = sdata->u.ap.ssid;
|
ssid = sdata->u.ap.ssid;
|
||||||
ssid_len = sdata->u.ap.ssid_len;
|
ssid_len = sdata->u.ap.ssid_len;
|
||||||
} else
|
}
|
||||||
return -EINVAL;
|
break;
|
||||||
|
default:
|
||||||
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ieee80211_sta_req_scan(dev, ssid, ssid_len);
|
return ieee80211_sta_req_scan(dev, ssid, ssid_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1052,17 +1052,18 @@ ctnetlink_new_conntrack(struct sock *ctnl, struct sk_buff *skb,
|
|||||||
}
|
}
|
||||||
/* implicit 'else' */
|
/* implicit 'else' */
|
||||||
|
|
||||||
/* we only allow nat config for new conntracks */
|
|
||||||
if (cda[CTA_NAT_SRC-1] || cda[CTA_NAT_DST-1]) {
|
|
||||||
err = -EINVAL;
|
|
||||||
goto out_unlock;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We manipulate the conntrack inside the global conntrack table lock,
|
/* We manipulate the conntrack inside the global conntrack table lock,
|
||||||
* so there's no need to increase the refcount */
|
* so there's no need to increase the refcount */
|
||||||
err = -EEXIST;
|
err = -EEXIST;
|
||||||
if (!(nlh->nlmsg_flags & NLM_F_EXCL))
|
if (!(nlh->nlmsg_flags & NLM_F_EXCL)) {
|
||||||
err = ctnetlink_change_conntrack(nf_ct_tuplehash_to_ctrack(h), cda);
|
/* we only allow nat config for new conntracks */
|
||||||
|
if (cda[CTA_NAT_SRC-1] || cda[CTA_NAT_DST-1]) {
|
||||||
|
err = -EINVAL;
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
err = ctnetlink_change_conntrack(nf_ct_tuplehash_to_ctrack(h),
|
||||||
|
cda);
|
||||||
|
}
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
write_unlock_bh(&nf_conntrack_lock);
|
write_unlock_bh(&nf_conntrack_lock);
|
||||||
|
@@ -126,7 +126,9 @@ static struct netlbl_dom_map *netlbl_domhsh_search(const char *domain, u32 def)
|
|||||||
|
|
||||||
if (domain != NULL) {
|
if (domain != NULL) {
|
||||||
bkt = netlbl_domhsh_hash(domain);
|
bkt = netlbl_domhsh_hash(domain);
|
||||||
list_for_each_entry_rcu(iter, &netlbl_domhsh->tbl[bkt], list)
|
list_for_each_entry_rcu(iter,
|
||||||
|
&rcu_dereference(netlbl_domhsh)->tbl[bkt],
|
||||||
|
list)
|
||||||
if (iter->valid && strcmp(iter->domain, domain) == 0)
|
if (iter->valid && strcmp(iter->domain, domain) == 0)
|
||||||
return iter;
|
return iter;
|
||||||
}
|
}
|
||||||
@@ -227,7 +229,7 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry,
|
|||||||
spin_lock(&netlbl_domhsh_lock);
|
spin_lock(&netlbl_domhsh_lock);
|
||||||
if (netlbl_domhsh_search(entry->domain, 0) == NULL)
|
if (netlbl_domhsh_search(entry->domain, 0) == NULL)
|
||||||
list_add_tail_rcu(&entry->list,
|
list_add_tail_rcu(&entry->list,
|
||||||
&netlbl_domhsh->tbl[bkt]);
|
&rcu_dereference(netlbl_domhsh)->tbl[bkt]);
|
||||||
else
|
else
|
||||||
ret_val = -EEXIST;
|
ret_val = -EEXIST;
|
||||||
spin_unlock(&netlbl_domhsh_lock);
|
spin_unlock(&netlbl_domhsh_lock);
|
||||||
@@ -423,8 +425,8 @@ int netlbl_domhsh_walk(u32 *skip_bkt,
|
|||||||
iter_bkt < rcu_dereference(netlbl_domhsh)->size;
|
iter_bkt < rcu_dereference(netlbl_domhsh)->size;
|
||||||
iter_bkt++, chain_cnt = 0) {
|
iter_bkt++, chain_cnt = 0) {
|
||||||
list_for_each_entry_rcu(iter_entry,
|
list_for_each_entry_rcu(iter_entry,
|
||||||
&netlbl_domhsh->tbl[iter_bkt],
|
&rcu_dereference(netlbl_domhsh)->tbl[iter_bkt],
|
||||||
list)
|
list)
|
||||||
if (iter_entry->valid) {
|
if (iter_entry->valid) {
|
||||||
if (chain_cnt++ < *skip_chain)
|
if (chain_cnt++ < *skip_chain)
|
||||||
continue;
|
continue;
|
||||||
|
Reference in New Issue
Block a user