Commit 660ca531 authored by Linus Torvalds's avatar Linus Torvalds

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
parents e7bc15a9 f34d1955
...@@ -21,4 +21,6 @@ extern struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp; ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment