Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (21 commits) mac80211: check interface is down before type change cfg80211: fix NULL ptr deref libertas if_usb: Fix crash on 64-bit machines mac80211: fix reason code output endianness mac80211: fix addba timer ath9k: fix misplaced semicolon on rate control b43: Fix DMA TX bounce buffer copying mac80211: fix BSS leak rt73usb.c : more ids ipw2200: fix oops on missing firmware gre: Fix dev_addr clobbering for gretap sky2: set carrier off in probe net: fix sk_forward_alloc corruption pcnet_cs: add cis of PreMax PE-200 ethernet pcmcia card r8169: Fix card drop incoming VLAN tagged MTU byte large jumbo frames ibmtr: possible Read buffer overflow? net: Fix RPF to work with policy routing net: fix kmemcheck annotations e1000e: rework disable K1 at 1000Mbps for 82577/82578 e1000e: config PHY via software after resets ...
This commit is contained in:
@@ -224,6 +224,15 @@ void skb_free_datagram(struct sock *sk, struct sk_buff *skb)
|
||||
consume_skb(skb);
|
||||
sk_mem_reclaim_partial(sk);
|
||||
}
|
||||
EXPORT_SYMBOL(skb_free_datagram);
|
||||
|
||||
void skb_free_datagram_locked(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
lock_sock(sk);
|
||||
skb_free_datagram(sk, skb);
|
||||
release_sock(sk);
|
||||
}
|
||||
EXPORT_SYMBOL(skb_free_datagram_locked);
|
||||
|
||||
/**
|
||||
* skb_kill_datagram - Free a datagram skbuff forcibly
|
||||
@@ -752,5 +761,4 @@ unsigned int datagram_poll(struct file *file, struct socket *sock,
|
||||
EXPORT_SYMBOL(datagram_poll);
|
||||
EXPORT_SYMBOL(skb_copy_and_csum_datagram_iovec);
|
||||
EXPORT_SYMBOL(skb_copy_datagram_iovec);
|
||||
EXPORT_SYMBOL(skb_free_datagram);
|
||||
EXPORT_SYMBOL(skb_recv_datagram);
|
||||
|
@@ -229,14 +229,17 @@ unsigned int inet_dev_addr_type(struct net *net, const struct net_device *dev,
|
||||
*/
|
||||
|
||||
int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
|
||||
struct net_device *dev, __be32 *spec_dst, u32 *itag)
|
||||
struct net_device *dev, __be32 *spec_dst,
|
||||
u32 *itag, u32 mark)
|
||||
{
|
||||
struct in_device *in_dev;
|
||||
struct flowi fl = { .nl_u = { .ip4_u =
|
||||
{ .daddr = src,
|
||||
.saddr = dst,
|
||||
.tos = tos } },
|
||||
.mark = mark,
|
||||
.iif = oif };
|
||||
|
||||
struct fib_result res;
|
||||
int no_addr, rpf;
|
||||
int ret;
|
||||
|
@@ -1464,7 +1464,7 @@ static void ipgre_tap_setup(struct net_device *dev)
|
||||
|
||||
ether_setup(dev);
|
||||
|
||||
dev->netdev_ops = &ipgre_netdev_ops;
|
||||
dev->netdev_ops = &ipgre_tap_netdev_ops;
|
||||
dev->destructor = free_netdev;
|
||||
|
||||
dev->iflink = 0;
|
||||
@@ -1525,25 +1525,29 @@ static int ipgre_changelink(struct net_device *dev, struct nlattr *tb[],
|
||||
if (t->dev != dev)
|
||||
return -EEXIST;
|
||||
} else {
|
||||
unsigned nflags = 0;
|
||||
|
||||
t = nt;
|
||||
|
||||
if (ipv4_is_multicast(p.iph.daddr))
|
||||
nflags = IFF_BROADCAST;
|
||||
else if (p.iph.daddr)
|
||||
nflags = IFF_POINTOPOINT;
|
||||
if (dev->type != ARPHRD_ETHER) {
|
||||
unsigned nflags = 0;
|
||||
|
||||
if ((dev->flags ^ nflags) &
|
||||
(IFF_POINTOPOINT | IFF_BROADCAST))
|
||||
return -EINVAL;
|
||||
if (ipv4_is_multicast(p.iph.daddr))
|
||||
nflags = IFF_BROADCAST;
|
||||
else if (p.iph.daddr)
|
||||
nflags = IFF_POINTOPOINT;
|
||||
|
||||
if ((dev->flags ^ nflags) &
|
||||
(IFF_POINTOPOINT | IFF_BROADCAST))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ipgre_tunnel_unlink(ign, t);
|
||||
t->parms.iph.saddr = p.iph.saddr;
|
||||
t->parms.iph.daddr = p.iph.daddr;
|
||||
t->parms.i_key = p.i_key;
|
||||
memcpy(dev->dev_addr, &p.iph.saddr, 4);
|
||||
memcpy(dev->broadcast, &p.iph.daddr, 4);
|
||||
if (dev->type != ARPHRD_ETHER) {
|
||||
memcpy(dev->dev_addr, &p.iph.saddr, 4);
|
||||
memcpy(dev->broadcast, &p.iph.daddr, 4);
|
||||
}
|
||||
ipgre_tunnel_link(ign, t);
|
||||
netdev_state_change(dev);
|
||||
}
|
||||
|
@@ -1854,7 +1854,7 @@ static int ip_route_input_mc(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
goto e_inval;
|
||||
spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK);
|
||||
} else if (fib_validate_source(saddr, 0, tos, 0,
|
||||
dev, &spec_dst, &itag) < 0)
|
||||
dev, &spec_dst, &itag, 0) < 0)
|
||||
goto e_inval;
|
||||
|
||||
rth = dst_alloc(&ipv4_dst_ops);
|
||||
@@ -1967,7 +1967,7 @@ static int __mkroute_input(struct sk_buff *skb,
|
||||
|
||||
|
||||
err = fib_validate_source(saddr, daddr, tos, FIB_RES_OIF(*res),
|
||||
in_dev->dev, &spec_dst, &itag);
|
||||
in_dev->dev, &spec_dst, &itag, skb->mark);
|
||||
if (err < 0) {
|
||||
ip_handle_martian_source(in_dev->dev, in_dev, skb, daddr,
|
||||
saddr);
|
||||
@@ -2141,7 +2141,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
int result;
|
||||
result = fib_validate_source(saddr, daddr, tos,
|
||||
net->loopback_dev->ifindex,
|
||||
dev, &spec_dst, &itag);
|
||||
dev, &spec_dst, &itag, skb->mark);
|
||||
if (result < 0)
|
||||
goto martian_source;
|
||||
if (result)
|
||||
@@ -2170,7 +2170,7 @@ brd_input:
|
||||
spec_dst = inet_select_addr(dev, 0, RT_SCOPE_LINK);
|
||||
else {
|
||||
err = fib_validate_source(saddr, 0, tos, 0, dev, &spec_dst,
|
||||
&itag);
|
||||
&itag, skb->mark);
|
||||
if (err < 0)
|
||||
goto martian_source;
|
||||
if (err)
|
||||
|
@@ -999,9 +999,7 @@ try_again:
|
||||
err = ulen;
|
||||
|
||||
out_free:
|
||||
lock_sock(sk);
|
||||
skb_free_datagram(sk, skb);
|
||||
release_sock(sk);
|
||||
skb_free_datagram_locked(sk, skb);
|
||||
out:
|
||||
return err;
|
||||
|
||||
|
@@ -288,9 +288,7 @@ try_again:
|
||||
err = ulen;
|
||||
|
||||
out_free:
|
||||
lock_sock(sk);
|
||||
skb_free_datagram(sk, skb);
|
||||
release_sock(sk);
|
||||
skb_free_datagram_locked(sk, skb);
|
||||
out:
|
||||
return err;
|
||||
|
||||
|
@@ -666,26 +666,25 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
|
||||
|
||||
state = &sta->ampdu_mlme.tid_state_tx[tid];
|
||||
|
||||
del_timer_sync(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
|
||||
|
||||
spin_lock_bh(&sta->lock);
|
||||
|
||||
if (!(*state & HT_ADDBA_REQUESTED_MSK)) {
|
||||
spin_unlock_bh(&sta->lock);
|
||||
return;
|
||||
}
|
||||
if (!(*state & HT_ADDBA_REQUESTED_MSK))
|
||||
goto timer_still_needed;
|
||||
|
||||
if (mgmt->u.action.u.addba_resp.dialog_token !=
|
||||
sta->ampdu_mlme.tid_tx[tid]->dialog_token) {
|
||||
spin_unlock_bh(&sta->lock);
|
||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||
printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid);
|
||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||
return;
|
||||
goto timer_still_needed;
|
||||
}
|
||||
|
||||
del_timer_sync(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
|
||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||
printk(KERN_DEBUG "switched off addBA timer for tid %d \n", tid);
|
||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||
|
||||
if (le16_to_cpu(mgmt->u.action.u.addba_resp.status)
|
||||
== WLAN_STATUS_SUCCESS) {
|
||||
u8 curstate = *state;
|
||||
@@ -699,5 +698,11 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
|
||||
} else {
|
||||
___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR);
|
||||
}
|
||||
|
||||
goto out;
|
||||
|
||||
timer_still_needed:
|
||||
add_timer(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
|
||||
out:
|
||||
spin_unlock_bh(&sta->lock);
|
||||
}
|
||||
|
@@ -72,6 +72,9 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
int ret;
|
||||
|
||||
if (netif_running(dev))
|
||||
return -EBUSY;
|
||||
|
||||
if (!nl80211_type_check(type))
|
||||
return -EINVAL;
|
||||
|
||||
@@ -81,9 +84,6 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (netif_running(sdata->dev))
|
||||
return -EBUSY;
|
||||
|
||||
if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len)
|
||||
ieee80211_sdata_set_mesh_id(sdata,
|
||||
params->mesh_id_len,
|
||||
|
@@ -153,7 +153,7 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata,
|
||||
if (net_ratelimit())
|
||||
printk(KERN_DEBUG "delba from %pM (%s) tid %d reason code %d\n",
|
||||
mgmt->sa, initiator ? "initiator" : "recipient", tid,
|
||||
mgmt->u.action.u.delba.reason_code);
|
||||
le16_to_cpu(mgmt->u.action.u.delba.reason_code));
|
||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||
|
||||
if (initiator == WLAN_BACK_INITIATOR)
|
||||
|
@@ -73,6 +73,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_mgmt *mgmt;
|
||||
u8 *pos;
|
||||
struct ieee80211_supported_band *sband;
|
||||
struct cfg80211_bss *bss;
|
||||
u32 bss_change;
|
||||
u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
|
||||
|
||||
@@ -177,8 +178,9 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||
mod_timer(&ifibss->timer,
|
||||
round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
|
||||
|
||||
cfg80211_inform_bss_frame(local->hw.wiphy, local->hw.conf.channel,
|
||||
mgmt, skb->len, 0, GFP_KERNEL);
|
||||
bss = cfg80211_inform_bss_frame(local->hw.wiphy, local->hw.conf.channel,
|
||||
mgmt, skb->len, 0, GFP_KERNEL);
|
||||
cfg80211_put_bss(bss);
|
||||
cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL);
|
||||
}
|
||||
|
||||
|
@@ -111,7 +111,7 @@ static void svc_release_skb(struct svc_rqst *rqstp)
|
||||
rqstp->rq_xprt_ctxt = NULL;
|
||||
|
||||
dprintk("svc: service %p, releasing skb %p\n", rqstp, skb);
|
||||
skb_free_datagram(svsk->sk_sk, skb);
|
||||
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -578,7 +578,7 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
|
||||
"svc: received unknown control message %d/%d; "
|
||||
"dropping RPC reply datagram\n",
|
||||
cmh->cmsg_level, cmh->cmsg_type);
|
||||
skb_free_datagram(svsk->sk_sk, skb);
|
||||
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -588,18 +588,18 @@ static int svc_udp_recvfrom(struct svc_rqst *rqstp)
|
||||
if (csum_partial_copy_to_xdr(&rqstp->rq_arg, skb)) {
|
||||
local_bh_enable();
|
||||
/* checksum error */
|
||||
skb_free_datagram(svsk->sk_sk, skb);
|
||||
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||
return 0;
|
||||
}
|
||||
local_bh_enable();
|
||||
skb_free_datagram(svsk->sk_sk, skb);
|
||||
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||
} else {
|
||||
/* we can use it in-place */
|
||||
rqstp->rq_arg.head[0].iov_base = skb->data +
|
||||
sizeof(struct udphdr);
|
||||
rqstp->rq_arg.head[0].iov_len = len;
|
||||
if (skb_checksum_complete(skb)) {
|
||||
skb_free_datagram(svsk->sk_sk, skb);
|
||||
skb_free_datagram_locked(svsk->sk_sk, skb);
|
||||
return 0;
|
||||
}
|
||||
rqstp->rq_xprt_ctxt = skb;
|
||||
|
@@ -165,7 +165,7 @@ void cfg80211_conn_work(struct work_struct *work)
|
||||
struct cfg80211_registered_device *rdev =
|
||||
container_of(work, struct cfg80211_registered_device, conn_work);
|
||||
struct wireless_dev *wdev;
|
||||
u8 bssid[ETH_ALEN];
|
||||
u8 bssid_buf[ETH_ALEN], *bssid = NULL;
|
||||
|
||||
rtnl_lock();
|
||||
cfg80211_lock_rdev(rdev);
|
||||
@@ -181,7 +181,10 @@ void cfg80211_conn_work(struct work_struct *work)
|
||||
wdev_unlock(wdev);
|
||||
continue;
|
||||
}
|
||||
memcpy(bssid, wdev->conn->params.bssid, ETH_ALEN);
|
||||
if (wdev->conn->params.bssid) {
|
||||
memcpy(bssid_buf, wdev->conn->params.bssid, ETH_ALEN);
|
||||
bssid = bssid_buf;
|
||||
}
|
||||
if (cfg80211_conn_do_work(wdev))
|
||||
__cfg80211_connect_result(
|
||||
wdev->netdev, bssid,
|
||||
|
Reference in New Issue
Block a user