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: (34 commits) virtio_net: Add schedule check to napi_enable call x25: Do not reference freed memory. pch_can: fix tseg1/tseg2 setting issue isdn: hysdn: Kill (partially buggy) CVS regision log reporting. can: softing_cs needs slab.h pch_gbe: Fix the issue which a driver locks when rx offload is set by ethtool netfilter: nf_conntrack: set conntrack templates again if we return NF_REPEAT pch_can: fix module reload issue with MSI pch_can: fix rmmod issue pch_can: fix 800k comms issue net: Fix lockdep regression caused by initializing netdev queues too early. net/caif: Fix dangling list pointer in freed object on error. USB CDC NCM errata updates for cdc_ncm host driver CDC NCM errata updates for cdc.h ixgbe: update version string ixgbe: cleanup variable initialization ixgbe: limit VF access to network traffic ixgbe: fix for 82599 erratum on Header Splitting ixgbe: fix variable set but not used warnings by gcc 4.6 e1000: add support for Marvell Alaska M88E1118R PHY ...
This commit is contained in:
@@ -50,12 +50,12 @@ static struct sk_buff *frag_merge_packet(struct list_head *head,
|
||||
skb = tfp->skb;
|
||||
}
|
||||
|
||||
if (skb_linearize(skb) < 0 || skb_linearize(tmp_skb) < 0)
|
||||
goto err;
|
||||
|
||||
skb_pull(tmp_skb, sizeof(struct unicast_frag_packet));
|
||||
if (pskb_expand_head(skb, 0, tmp_skb->len, GFP_ATOMIC) < 0) {
|
||||
/* free buffered skb, skb will be freed later */
|
||||
kfree_skb(tfp->skb);
|
||||
return NULL;
|
||||
}
|
||||
if (pskb_expand_head(skb, 0, tmp_skb->len, GFP_ATOMIC) < 0)
|
||||
goto err;
|
||||
|
||||
/* move free entry to end */
|
||||
tfp->skb = NULL;
|
||||
@@ -70,6 +70,11 @@ static struct sk_buff *frag_merge_packet(struct list_head *head,
|
||||
unicast_packet->packet_type = BAT_UNICAST;
|
||||
|
||||
return skb;
|
||||
|
||||
err:
|
||||
/* free buffered skb, skb will be freed later */
|
||||
kfree_skb(tfp->skb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void frag_create_entry(struct list_head *head, struct sk_buff *skb)
|
||||
|
@@ -394,9 +394,7 @@ static void ipcaif_net_setup(struct net_device *dev)
|
||||
priv->conn_req.sockaddr.u.dgm.connection_id = -1;
|
||||
priv->flowenabled = false;
|
||||
|
||||
ASSERT_RTNL();
|
||||
init_waitqueue_head(&priv->netmgmt_wq);
|
||||
list_add(&priv->list_field, &chnl_net_list);
|
||||
}
|
||||
|
||||
|
||||
@@ -453,6 +451,8 @@ static int ipcaif_newlink(struct net *src_net, struct net_device *dev,
|
||||
ret = register_netdevice(dev);
|
||||
if (ret)
|
||||
pr_warn("device rtml registration failed\n");
|
||||
else
|
||||
list_add(&caifdev->list_field, &chnl_net_list);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@@ -5660,18 +5660,6 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
|
||||
|
||||
dev_net_set(dev, &init_net);
|
||||
|
||||
dev->num_tx_queues = txqs;
|
||||
dev->real_num_tx_queues = txqs;
|
||||
if (netif_alloc_netdev_queues(dev))
|
||||
goto free_pcpu;
|
||||
|
||||
#ifdef CONFIG_RPS
|
||||
dev->num_rx_queues = rxqs;
|
||||
dev->real_num_rx_queues = rxqs;
|
||||
if (netif_alloc_rx_queues(dev))
|
||||
goto free_pcpu;
|
||||
#endif
|
||||
|
||||
dev->gso_max_size = GSO_MAX_SIZE;
|
||||
|
||||
INIT_LIST_HEAD(&dev->ethtool_ntuple_list.list);
|
||||
@@ -5681,9 +5669,26 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
|
||||
INIT_LIST_HEAD(&dev->link_watch_list);
|
||||
dev->priv_flags = IFF_XMIT_DST_RELEASE;
|
||||
setup(dev);
|
||||
|
||||
dev->num_tx_queues = txqs;
|
||||
dev->real_num_tx_queues = txqs;
|
||||
if (netif_alloc_netdev_queues(dev))
|
||||
goto free_all;
|
||||
|
||||
#ifdef CONFIG_RPS
|
||||
dev->num_rx_queues = rxqs;
|
||||
dev->real_num_rx_queues = rxqs;
|
||||
if (netif_alloc_rx_queues(dev))
|
||||
goto free_all;
|
||||
#endif
|
||||
|
||||
strcpy(dev->name, name);
|
||||
return dev;
|
||||
|
||||
free_all:
|
||||
free_netdev(dev);
|
||||
return NULL;
|
||||
|
||||
free_pcpu:
|
||||
free_percpu(dev->pcpu_refcnt);
|
||||
kfree(dev->_tx);
|
||||
|
@@ -1822,6 +1822,7 @@ static int ieee80211_mgmt_tx(struct wiphy *wiphy, struct net_device *dev,
|
||||
*cookie ^= 2;
|
||||
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_TX_OFFCHAN;
|
||||
local->hw_roc_skb = skb;
|
||||
local->hw_roc_skb_for_status = skb;
|
||||
mutex_unlock(&local->mtx);
|
||||
|
||||
return 0;
|
||||
@@ -1875,6 +1876,7 @@ static int ieee80211_mgmt_tx_cancel_wait(struct wiphy *wiphy,
|
||||
if (ret == 0) {
|
||||
kfree_skb(local->hw_roc_skb);
|
||||
local->hw_roc_skb = NULL;
|
||||
local->hw_roc_skb_for_status = NULL;
|
||||
}
|
||||
|
||||
mutex_unlock(&local->mtx);
|
||||
|
@@ -953,7 +953,7 @@ struct ieee80211_local {
|
||||
|
||||
struct ieee80211_channel *hw_roc_channel;
|
||||
struct net_device *hw_roc_dev;
|
||||
struct sk_buff *hw_roc_skb;
|
||||
struct sk_buff *hw_roc_skb, *hw_roc_skb_for_status;
|
||||
struct work_struct hw_roc_start, hw_roc_done;
|
||||
enum nl80211_channel_type hw_roc_channel_type;
|
||||
unsigned int hw_roc_duration;
|
||||
|
@@ -323,6 +323,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||
|
||||
if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) {
|
||||
struct ieee80211_work *wk;
|
||||
u64 cookie = (unsigned long)skb;
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(wk, &local->work_list, list) {
|
||||
@@ -334,8 +335,12 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||
break;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
if (local->hw_roc_skb_for_status == skb) {
|
||||
cookie = local->hw_roc_cookie ^ 2;
|
||||
local->hw_roc_skb_for_status = NULL;
|
||||
}
|
||||
cfg80211_mgmt_tx_status(
|
||||
skb->dev, (unsigned long) skb, skb->data, skb->len,
|
||||
skb->dev, cookie, skb->data, skb->len,
|
||||
!!(info->flags & IEEE80211_TX_STAT_ACK), GFP_ATOMIC);
|
||||
}
|
||||
|
||||
|
@@ -1547,7 +1547,7 @@ static int ieee80211_skb_resize(struct ieee80211_local *local,
|
||||
skb_orphan(skb);
|
||||
}
|
||||
|
||||
if (skb_header_cloned(skb))
|
||||
if (skb_cloned(skb))
|
||||
I802_DEBUG_INC(local->tx_expand_skb_head_cloned);
|
||||
else if (head_need || tail_need)
|
||||
I802_DEBUG_INC(local->tx_expand_skb_head);
|
||||
|
@@ -942,8 +942,15 @@ nf_conntrack_in(struct net *net, u_int8_t pf, unsigned int hooknum,
|
||||
if (set_reply && !test_and_set_bit(IPS_SEEN_REPLY_BIT, &ct->status))
|
||||
nf_conntrack_event_cache(IPCT_REPLY, ct);
|
||||
out:
|
||||
if (tmpl)
|
||||
nf_ct_put(tmpl);
|
||||
if (tmpl) {
|
||||
/* Special case: we have to repeat this hook, assign the
|
||||
* template again to this packet. We assume that this packet
|
||||
* has no conntrack assigned. This is used by nf_ct_tcp. */
|
||||
if (ret == NF_REPEAT)
|
||||
skb->nfct = (struct nf_conntrack *)tmpl;
|
||||
else
|
||||
nf_ct_put(tmpl);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@@ -27,9 +27,19 @@
|
||||
#include <net/sock.h>
|
||||
#include <net/x25.h>
|
||||
|
||||
/*
|
||||
* Parse a set of facilities into the facilities structures. Unrecognised
|
||||
* facilities are written to the debug log file.
|
||||
/**
|
||||
* x25_parse_facilities - Parse facilities from skb into the facilities structs
|
||||
*
|
||||
* @skb: sk_buff to parse
|
||||
* @facilities: Regular facilites, updated as facilities are found
|
||||
* @dte_facs: ITU DTE facilities, updated as DTE facilities are found
|
||||
* @vc_fac_mask: mask is updated with all facilities found
|
||||
*
|
||||
* Return codes:
|
||||
* -1 - Parsing error, caller should drop call and clean up
|
||||
* 0 - Parse OK, this skb has no facilities
|
||||
* >0 - Parse OK, returns the length of the facilities header
|
||||
*
|
||||
*/
|
||||
int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities,
|
||||
struct x25_dte_facilities *dte_facs, unsigned long *vc_fac_mask)
|
||||
@@ -62,7 +72,7 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities,
|
||||
switch (*p & X25_FAC_CLASS_MASK) {
|
||||
case X25_FAC_CLASS_A:
|
||||
if (len < 2)
|
||||
return 0;
|
||||
return -1;
|
||||
switch (*p) {
|
||||
case X25_FAC_REVERSE:
|
||||
if((p[1] & 0x81) == 0x81) {
|
||||
@@ -107,7 +117,7 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities,
|
||||
break;
|
||||
case X25_FAC_CLASS_B:
|
||||
if (len < 3)
|
||||
return 0;
|
||||
return -1;
|
||||
switch (*p) {
|
||||
case X25_FAC_PACKET_SIZE:
|
||||
facilities->pacsize_in = p[1];
|
||||
@@ -130,7 +140,7 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities,
|
||||
break;
|
||||
case X25_FAC_CLASS_C:
|
||||
if (len < 4)
|
||||
return 0;
|
||||
return -1;
|
||||
printk(KERN_DEBUG "X.25: unknown facility %02X, "
|
||||
"values %02X, %02X, %02X\n",
|
||||
p[0], p[1], p[2], p[3]);
|
||||
@@ -139,18 +149,18 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities,
|
||||
break;
|
||||
case X25_FAC_CLASS_D:
|
||||
if (len < p[1] + 2)
|
||||
return 0;
|
||||
return -1;
|
||||
switch (*p) {
|
||||
case X25_FAC_CALLING_AE:
|
||||
if (p[1] > X25_MAX_DTE_FACIL_LEN || p[1] <= 1)
|
||||
return 0;
|
||||
return -1;
|
||||
dte_facs->calling_len = p[2];
|
||||
memcpy(dte_facs->calling_ae, &p[3], p[1] - 1);
|
||||
*vc_fac_mask |= X25_MASK_CALLING_AE;
|
||||
break;
|
||||
case X25_FAC_CALLED_AE:
|
||||
if (p[1] > X25_MAX_DTE_FACIL_LEN || p[1] <= 1)
|
||||
return 0;
|
||||
return -1;
|
||||
dte_facs->called_len = p[2];
|
||||
memcpy(dte_facs->called_ae, &p[3], p[1] - 1);
|
||||
*vc_fac_mask |= X25_MASK_CALLED_AE;
|
||||
|
@@ -91,10 +91,10 @@ static int x25_state1_machine(struct sock *sk, struct sk_buff *skb, int frametyp
|
||||
{
|
||||
struct x25_address source_addr, dest_addr;
|
||||
int len;
|
||||
struct x25_sock *x25 = x25_sk(sk);
|
||||
|
||||
switch (frametype) {
|
||||
case X25_CALL_ACCEPTED: {
|
||||
struct x25_sock *x25 = x25_sk(sk);
|
||||
|
||||
x25_stop_timer(sk);
|
||||
x25->condition = 0x00;
|
||||
@@ -113,14 +113,16 @@ static int x25_state1_machine(struct sock *sk, struct sk_buff *skb, int frametyp
|
||||
&dest_addr);
|
||||
if (len > 0)
|
||||
skb_pull(skb, len);
|
||||
else if (len < 0)
|
||||
goto out_clear;
|
||||
|
||||
len = x25_parse_facilities(skb, &x25->facilities,
|
||||
&x25->dte_facilities,
|
||||
&x25->vc_facil_mask);
|
||||
if (len > 0)
|
||||
skb_pull(skb, len);
|
||||
else
|
||||
return -1;
|
||||
else if (len < 0)
|
||||
goto out_clear;
|
||||
/*
|
||||
* Copy any Call User Data.
|
||||
*/
|
||||
@@ -144,6 +146,12 @@ static int x25_state1_machine(struct sock *sk, struct sk_buff *skb, int frametyp
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
out_clear:
|
||||
x25_write_internal(sk, X25_CLEAR_REQUEST);
|
||||
x25->state = X25_STATE_2;
|
||||
x25_start_t23timer(sk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -396,9 +396,12 @@ void __exit x25_link_free(void)
|
||||
write_lock_bh(&x25_neigh_list_lock);
|
||||
|
||||
list_for_each_safe(entry, tmp, &x25_neigh_list) {
|
||||
struct net_device *dev;
|
||||
|
||||
nb = list_entry(entry, struct x25_neigh, node);
|
||||
dev = nb->dev;
|
||||
__x25_remove_neigh(nb);
|
||||
dev_put(nb->dev);
|
||||
dev_put(dev);
|
||||
}
|
||||
write_unlock_bh(&x25_neigh_list_lock);
|
||||
}
|
||||
|
Reference in New Issue
Block a user