You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
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: (40 commits) tg3: Fix tg3_skb_error_unmap() net: tracepoint of net_dev_xmit sees freed skb and causes panic drivers/net/can/flexcan.c: add missing clk_put net: dm9000: Get the chip in a known good state before enabling interrupts drivers/net/davinci_emac.c: add missing clk_put af-packet: Add flag to distinguish VID 0 from no-vlan. caif: Fix race when conditionally taking rtnl lock usbnet/cdc_ncm: add missing .reset_resume hook vlan: fix typo in vlan_dev_hard_start_xmit() net/ipv4: Check for mistakenly passed in non-IPv4 address iwl4965: correctly validate temperature value bluetooth l2cap: fix locking in l2cap_global_chan_by_psm ath9k: fix two more bugs in tx power cfg80211: don't drop p2p probe responses Revert "net: fix section mismatches" drivers/net/usb/catc.c: Fix potential deadlock in catc_ctrl_run() sctp: stop pending timers and purge queues when peer restart asoc drivers/net: ks8842 Fix crash on received packet when in PIO mode. ip_options_compile: properly handle unaligned pointer iwlagn: fix incorrect PCI subsystem id for 6150 devices ...
This commit is contained in:
@@ -165,7 +165,7 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
stats->tx_packets++;
|
||||
stats->tx_bytes += len;
|
||||
u64_stats_update_begin(&stats->syncp);
|
||||
u64_stats_update_end(&stats->syncp);
|
||||
} else {
|
||||
this_cpu_inc(vlan_dev_info(dev)->vlan_pcpu_stats->tx_dropped);
|
||||
}
|
||||
|
||||
@@ -906,7 +906,7 @@ static struct l2cap_chan *l2cap_global_chan_by_psm(int state, __le16 psm, bdaddr
|
||||
if (c->psm == psm) {
|
||||
/* Exact match. */
|
||||
if (!bacmp(&bt_sk(sk)->src, src)) {
|
||||
read_unlock_bh(&chan_list_lock);
|
||||
read_unlock(&chan_list_lock);
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
+3
-6
@@ -139,17 +139,14 @@ static void close_work(struct work_struct *work)
|
||||
struct chnl_net *dev = NULL;
|
||||
struct list_head *list_node;
|
||||
struct list_head *_tmp;
|
||||
/* May be called with or without RTNL lock held */
|
||||
int islocked = rtnl_is_locked();
|
||||
if (!islocked)
|
||||
rtnl_lock();
|
||||
|
||||
rtnl_lock();
|
||||
list_for_each_safe(list_node, _tmp, &chnl_net_list) {
|
||||
dev = list_entry(list_node, struct chnl_net, list_field);
|
||||
if (dev->state == CAIF_SHUTDOWN)
|
||||
dev_close(dev->netdev);
|
||||
}
|
||||
if (!islocked)
|
||||
rtnl_unlock();
|
||||
rtnl_unlock();
|
||||
}
|
||||
static DECLARE_WORK(close_worker, close_work);
|
||||
|
||||
|
||||
+5
-2
@@ -2096,6 +2096,7 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
{
|
||||
const struct net_device_ops *ops = dev->netdev_ops;
|
||||
int rc = NETDEV_TX_OK;
|
||||
unsigned int skb_len;
|
||||
|
||||
if (likely(!skb->next)) {
|
||||
u32 features;
|
||||
@@ -2146,8 +2147,9 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
|
||||
}
|
||||
}
|
||||
|
||||
skb_len = skb->len;
|
||||
rc = ops->ndo_start_xmit(skb, dev);
|
||||
trace_net_dev_xmit(skb, rc);
|
||||
trace_net_dev_xmit(skb, rc, dev, skb_len);
|
||||
if (rc == NETDEV_TX_OK)
|
||||
txq_trans_update(txq);
|
||||
return rc;
|
||||
@@ -2167,8 +2169,9 @@ gso:
|
||||
if (dev->priv_flags & IFF_XMIT_DST_RELEASE)
|
||||
skb_dst_drop(nskb);
|
||||
|
||||
skb_len = nskb->len;
|
||||
rc = ops->ndo_start_xmit(nskb, dev);
|
||||
trace_net_dev_xmit(nskb, rc);
|
||||
trace_net_dev_xmit(nskb, rc, dev, skb_len);
|
||||
if (unlikely(rc != NETDEV_TX_OK)) {
|
||||
if (rc & ~NETDEV_TX_MASK)
|
||||
goto out_kfree_gso_skb;
|
||||
|
||||
@@ -465,6 +465,9 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
if (addr_len < sizeof(struct sockaddr_in))
|
||||
goto out;
|
||||
|
||||
if (addr->sin_family != AF_INET)
|
||||
goto out;
|
||||
|
||||
chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr);
|
||||
|
||||
/* Not specified by any standard per-se, however it breaks too
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/ip.h>
|
||||
#include <linux/icmp.h>
|
||||
@@ -350,7 +351,7 @@ int ip_options_compile(struct net *net,
|
||||
goto error;
|
||||
}
|
||||
if (optptr[2] <= optlen) {
|
||||
__be32 *timeptr = NULL;
|
||||
unsigned char *timeptr = NULL;
|
||||
if (optptr[2]+3 > optptr[1]) {
|
||||
pp_ptr = optptr + 2;
|
||||
goto error;
|
||||
@@ -359,7 +360,7 @@ int ip_options_compile(struct net *net,
|
||||
case IPOPT_TS_TSONLY:
|
||||
opt->ts = optptr - iph;
|
||||
if (skb)
|
||||
timeptr = (__be32*)&optptr[optptr[2]-1];
|
||||
timeptr = &optptr[optptr[2]-1];
|
||||
opt->ts_needtime = 1;
|
||||
optptr[2] += 4;
|
||||
break;
|
||||
@@ -371,7 +372,7 @@ int ip_options_compile(struct net *net,
|
||||
opt->ts = optptr - iph;
|
||||
if (rt) {
|
||||
memcpy(&optptr[optptr[2]-1], &rt->rt_spec_dst, 4);
|
||||
timeptr = (__be32*)&optptr[optptr[2]+3];
|
||||
timeptr = &optptr[optptr[2]+3];
|
||||
}
|
||||
opt->ts_needaddr = 1;
|
||||
opt->ts_needtime = 1;
|
||||
@@ -389,7 +390,7 @@ int ip_options_compile(struct net *net,
|
||||
if (inet_addr_type(net, addr) == RTN_UNICAST)
|
||||
break;
|
||||
if (skb)
|
||||
timeptr = (__be32*)&optptr[optptr[2]+3];
|
||||
timeptr = &optptr[optptr[2]+3];
|
||||
}
|
||||
opt->ts_needtime = 1;
|
||||
optptr[2] += 8;
|
||||
@@ -403,10 +404,10 @@ int ip_options_compile(struct net *net,
|
||||
}
|
||||
if (timeptr) {
|
||||
struct timespec tv;
|
||||
__be32 midtime;
|
||||
u32 midtime;
|
||||
getnstimeofday(&tv);
|
||||
midtime = htonl((tv.tv_sec % 86400) * MSEC_PER_SEC + tv.tv_nsec / NSEC_PER_MSEC);
|
||||
memcpy(timeptr, &midtime, sizeof(__be32));
|
||||
midtime = (tv.tv_sec % 86400) * MSEC_PER_SEC + tv.tv_nsec / NSEC_PER_MSEC;
|
||||
put_unaligned_be32(midtime, timeptr);
|
||||
opt->is_changed = 1;
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -232,6 +232,9 @@ static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata,
|
||||
WARN_ON(!ieee80211_set_channel_type(local, sdata, channel_type));
|
||||
}
|
||||
|
||||
ieee80211_stop_queues_by_reason(&sdata->local->hw,
|
||||
IEEE80211_QUEUE_STOP_REASON_CSA);
|
||||
|
||||
/* channel_type change automatically detected */
|
||||
ieee80211_hw_config(local, 0);
|
||||
|
||||
@@ -245,6 +248,9 @@ static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata,
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
ieee80211_wake_queues_by_reason(&sdata->local->hw,
|
||||
IEEE80211_QUEUE_STOP_REASON_CSA);
|
||||
|
||||
ht_opmode = le16_to_cpu(hti->operation_mode);
|
||||
|
||||
/* if bss configuration changed store the new one */
|
||||
@@ -1089,6 +1095,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||
local->hw.conf.flags &= ~IEEE80211_CONF_PS;
|
||||
config_changed |= IEEE80211_CONF_CHANGE_PS;
|
||||
}
|
||||
local->ps_sdata = NULL;
|
||||
|
||||
ieee80211_hw_config(local, config_changed);
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
#include <linux/if_arp.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
#include <linux/pm_qos_params.h>
|
||||
#include <linux/slab.h>
|
||||
#include <net/sch_generic.h>
|
||||
#include <linux/slab.h>
|
||||
#include <net/mac80211.h>
|
||||
|
||||
+12
-3
@@ -798,7 +798,12 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
getnstimeofday(&ts);
|
||||
h.h2->tp_sec = ts.tv_sec;
|
||||
h.h2->tp_nsec = ts.tv_nsec;
|
||||
h.h2->tp_vlan_tci = vlan_tx_tag_get(skb);
|
||||
if (vlan_tx_tag_present(skb)) {
|
||||
h.h2->tp_vlan_tci = vlan_tx_tag_get(skb);
|
||||
status |= TP_STATUS_VLAN_VALID;
|
||||
} else {
|
||||
h.h2->tp_vlan_tci = 0;
|
||||
}
|
||||
hdrlen = sizeof(*h.h2);
|
||||
break;
|
||||
default:
|
||||
@@ -1725,8 +1730,12 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
aux.tp_snaplen = skb->len;
|
||||
aux.tp_mac = 0;
|
||||
aux.tp_net = skb_network_offset(skb);
|
||||
aux.tp_vlan_tci = vlan_tx_tag_get(skb);
|
||||
|
||||
if (vlan_tx_tag_present(skb)) {
|
||||
aux.tp_vlan_tci = vlan_tx_tag_get(skb);
|
||||
aux.tp_status |= TP_STATUS_VLAN_VALID;
|
||||
} else {
|
||||
aux.tp_vlan_tci = 0;
|
||||
}
|
||||
put_cmsg(msg, SOL_PACKET, PACKET_AUXDATA, sizeof(aux), &aux);
|
||||
}
|
||||
|
||||
|
||||
+14
-9
@@ -444,15 +444,7 @@ void sctp_association_free(struct sctp_association *asoc)
|
||||
|
||||
asoc->peer.transport_count = 0;
|
||||
|
||||
/* Free any cached ASCONF_ACK chunk. */
|
||||
sctp_assoc_free_asconf_acks(asoc);
|
||||
|
||||
/* Free the ASCONF queue. */
|
||||
sctp_assoc_free_asconf_queue(asoc);
|
||||
|
||||
/* Free any cached ASCONF chunk. */
|
||||
if (asoc->addip_last_asconf)
|
||||
sctp_chunk_free(asoc->addip_last_asconf);
|
||||
sctp_asconf_queue_teardown(asoc);
|
||||
|
||||
/* AUTH - Free the endpoint shared keys */
|
||||
sctp_auth_destroy_keys(&asoc->endpoint_shared_keys);
|
||||
@@ -1646,3 +1638,16 @@ struct sctp_chunk *sctp_assoc_lookup_asconf_ack(
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void sctp_asconf_queue_teardown(struct sctp_association *asoc)
|
||||
{
|
||||
/* Free any cached ASCONF_ACK chunk. */
|
||||
sctp_assoc_free_asconf_acks(asoc);
|
||||
|
||||
/* Free the ASCONF queue. */
|
||||
sctp_assoc_free_asconf_queue(asoc);
|
||||
|
||||
/* Free any cached ASCONF chunk. */
|
||||
if (asoc->addip_last_asconf)
|
||||
sctp_chunk_free(asoc->addip_last_asconf);
|
||||
}
|
||||
|
||||
@@ -1670,6 +1670,9 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
|
||||
case SCTP_CMD_SEND_NEXT_ASCONF:
|
||||
sctp_cmd_send_asconf(asoc);
|
||||
break;
|
||||
case SCTP_CMD_PURGE_ASCONF_QUEUE:
|
||||
sctp_asconf_queue_teardown(asoc);
|
||||
break;
|
||||
default:
|
||||
pr_warn("Impossible command: %u, %p\n",
|
||||
cmd->verb, cmd->obj.ptr);
|
||||
|
||||
+12
-2
@@ -1718,11 +1718,21 @@ static sctp_disposition_t sctp_sf_do_dupcook_a(const struct sctp_endpoint *ep,
|
||||
return SCTP_DISPOSITION_CONSUME;
|
||||
}
|
||||
|
||||
/* For now, fail any unsent/unacked data. Consider the optional
|
||||
* choice of resending of this data.
|
||||
/* For now, stop pending T3-rtx and SACK timers, fail any unsent/unacked
|
||||
* data. Consider the optional choice of resending of this data.
|
||||
*/
|
||||
sctp_add_cmd_sf(commands, SCTP_CMD_T3_RTX_TIMERS_STOP, SCTP_NULL());
|
||||
sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
|
||||
SCTP_TO(SCTP_EVENT_TIMEOUT_SACK));
|
||||
sctp_add_cmd_sf(commands, SCTP_CMD_PURGE_OUTQUEUE, SCTP_NULL());
|
||||
|
||||
/* Stop pending T4-rto timer, teardown ASCONF queue, ASCONF-ACK queue
|
||||
* and ASCONF-ACK cache.
|
||||
*/
|
||||
sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
|
||||
SCTP_TO(SCTP_EVENT_TIMEOUT_T4_RTO));
|
||||
sctp_add_cmd_sf(commands, SCTP_CMD_PURGE_ASCONF_QUEUE, SCTP_NULL());
|
||||
|
||||
repl = sctp_make_cookie_ack(new_asoc, chunk);
|
||||
if (!repl)
|
||||
goto nomem;
|
||||
|
||||
@@ -3406,12 +3406,12 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
|
||||
i = 0;
|
||||
if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) {
|
||||
nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
|
||||
request->ssids[i].ssid_len = nla_len(attr);
|
||||
if (request->ssids[i].ssid_len > IEEE80211_MAX_SSID_LEN) {
|
||||
err = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
memcpy(request->ssids[i].ssid, nla_data(attr), nla_len(attr));
|
||||
request->ssids[i].ssid_len = nla_len(attr);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
@@ -3572,6 +3572,7 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
|
||||
if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) {
|
||||
nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS],
|
||||
tmp) {
|
||||
request->ssids[i].ssid_len = nla_len(attr);
|
||||
if (request->ssids[i].ssid_len >
|
||||
IEEE80211_MAX_SSID_LEN) {
|
||||
err = -EINVAL;
|
||||
@@ -3579,7 +3580,6 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
|
||||
}
|
||||
memcpy(request->ssids[i].ssid, nla_data(attr),
|
||||
nla_len(attr));
|
||||
request->ssids[i].ssid_len = nla_len(attr);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
+24
-19
@@ -267,13 +267,35 @@ static bool is_bss(struct cfg80211_bss *a,
|
||||
return memcmp(ssidie + 2, ssid, ssid_len) == 0;
|
||||
}
|
||||
|
||||
static bool is_mesh_bss(struct cfg80211_bss *a)
|
||||
{
|
||||
const u8 *ie;
|
||||
|
||||
if (!WLAN_CAPABILITY_IS_STA_BSS(a->capability))
|
||||
return false;
|
||||
|
||||
ie = cfg80211_find_ie(WLAN_EID_MESH_ID,
|
||||
a->information_elements,
|
||||
a->len_information_elements);
|
||||
if (!ie)
|
||||
return false;
|
||||
|
||||
ie = cfg80211_find_ie(WLAN_EID_MESH_CONFIG,
|
||||
a->information_elements,
|
||||
a->len_information_elements);
|
||||
if (!ie)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool is_mesh(struct cfg80211_bss *a,
|
||||
const u8 *meshid, size_t meshidlen,
|
||||
const u8 *meshcfg)
|
||||
{
|
||||
const u8 *ie;
|
||||
|
||||
if (!WLAN_CAPABILITY_IS_MBSS(a->capability))
|
||||
if (!WLAN_CAPABILITY_IS_STA_BSS(a->capability))
|
||||
return false;
|
||||
|
||||
ie = cfg80211_find_ie(WLAN_EID_MESH_ID,
|
||||
@@ -311,7 +333,7 @@ static int cmp_bss(struct cfg80211_bss *a,
|
||||
if (a->channel != b->channel)
|
||||
return b->channel->center_freq - a->channel->center_freq;
|
||||
|
||||
if (WLAN_CAPABILITY_IS_MBSS(a->capability | b->capability)) {
|
||||
if (is_mesh_bss(a) && is_mesh_bss(b)) {
|
||||
r = cmp_ies(WLAN_EID_MESH_ID,
|
||||
a->information_elements,
|
||||
a->len_information_elements,
|
||||
@@ -457,7 +479,6 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
|
||||
struct cfg80211_internal_bss *res)
|
||||
{
|
||||
struct cfg80211_internal_bss *found = NULL;
|
||||
const u8 *meshid, *meshcfg;
|
||||
|
||||
/*
|
||||
* The reference to "res" is donated to this function.
|
||||
@@ -470,22 +491,6 @@ cfg80211_bss_update(struct cfg80211_registered_device *dev,
|
||||
|
||||
res->ts = jiffies;
|
||||
|
||||
if (WLAN_CAPABILITY_IS_MBSS(res->pub.capability)) {
|
||||
/* must be mesh, verify */
|
||||
meshid = cfg80211_find_ie(WLAN_EID_MESH_ID,
|
||||
res->pub.information_elements,
|
||||
res->pub.len_information_elements);
|
||||
meshcfg = cfg80211_find_ie(WLAN_EID_MESH_CONFIG,
|
||||
res->pub.information_elements,
|
||||
res->pub.len_information_elements);
|
||||
if (!meshid || !meshcfg ||
|
||||
meshcfg[1] != sizeof(struct ieee80211_meshconf_ie)) {
|
||||
/* bogus mesh */
|
||||
kref_put(&res->ref, bss_release);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
spin_lock_bh(&dev->bss_lock);
|
||||
|
||||
found = rb_find_bss(dev, res);
|
||||
|
||||
Reference in New Issue
Block a user