Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: 1) Fix dumping of nft_quota entries, from Pablo Neira Ayuso. 2) Fix out of bounds access in nf_tables discovered by KASAN, from Florian Westphal. 3) Fix IRQ enabling in dp83867 driver, from Grygorii Strashko. 4) Fix unicast filtering in be2net driver, from Ivan Vecera. 5) tg3_get_stats64() can race with driver close and ethtool reconfigurations, fix from Michael Chan. 6) Fix error handling when pass limit is reached in bpf code gen on x86. From Daniel Borkmann. 7) Don't clobber switch ops and use proper MDIO nested reads and writes in bcm_sf2 driver, from Florian Fainelli. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (21 commits) net: dsa: bcm_sf2: Utilize nested MDIO read/write net: dsa: bcm_sf2: Do not clobber b53_switch_ops net: stmmac: fix maxmtu assignment to be within valid range bpf: change back to orig prog on too many passes tg3: Fix race condition in tg3_get_stats64(). be2net: fix unicast list filling be2net: fix accesses to unicast list netlabel: add CALIPSO to the list of built-in protocols vti6: fix device register to report IFLA_INFO_KIND net: phy: dp83867: fix irq generation amd-xgbe: Fix IRQ processing when running in single IRQ mode sh_eth: R8A7740 supports packet shecksumming sh_eth: fix EESIPR values for SH77{34|63} r8169: fix the typo in the comment nl80211: fix sched scan netlink socket owner destruction bridge: netfilter: Fix dropping packets that moving through bridge interface netfilter: ipt_CLUSTERIP: check duplicate config when initializing netfilter: nft_payload: mangle ckecksum if NFT_PAYLOAD_L4CSUM_PSEUDOHDR is set netfilter: nf_tables: fix oob access netfilter: nft_queue: use raw_smp_processor_id() ...
This commit is contained in:
Коммит
c92f5bdc4b
|
@ -1172,6 +1172,8 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
|
|||
set_memory_ro((unsigned long)header, header->pages);
|
||||
prog->bpf_func = (void *)image;
|
||||
prog->jited = 1;
|
||||
} else {
|
||||
prog = orig_prog;
|
||||
}
|
||||
|
||||
out_addrs:
|
||||
|
|
|
@ -393,7 +393,7 @@ static int bcm_sf2_sw_mdio_read(struct mii_bus *bus, int addr, int regnum)
|
|||
if (addr == BRCM_PSEUDO_PHY_ADDR && priv->indir_phy_mask & BIT(addr))
|
||||
return bcm_sf2_sw_indir_rw(priv, 1, addr, regnum, 0);
|
||||
else
|
||||
return mdiobus_read(priv->master_mii_bus, addr, regnum);
|
||||
return mdiobus_read_nested(priv->master_mii_bus, addr, regnum);
|
||||
}
|
||||
|
||||
static int bcm_sf2_sw_mdio_write(struct mii_bus *bus, int addr, int regnum,
|
||||
|
@ -407,7 +407,7 @@ static int bcm_sf2_sw_mdio_write(struct mii_bus *bus, int addr, int regnum,
|
|||
if (addr == BRCM_PSEUDO_PHY_ADDR && priv->indir_phy_mask & BIT(addr))
|
||||
bcm_sf2_sw_indir_rw(priv, 0, addr, regnum, val);
|
||||
else
|
||||
mdiobus_write(priv->master_mii_bus, addr, regnum, val);
|
||||
mdiobus_write_nested(priv->master_mii_bus, addr, regnum, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -982,6 +982,7 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
|
|||
const char *reg_names[BCM_SF2_REGS_NUM] = BCM_SF2_REGS_NAME;
|
||||
struct device_node *dn = pdev->dev.of_node;
|
||||
struct b53_platform_data *pdata;
|
||||
struct dsa_switch_ops *ops;
|
||||
struct bcm_sf2_priv *priv;
|
||||
struct b53_device *dev;
|
||||
struct dsa_switch *ds;
|
||||
|
@ -995,6 +996,10 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
|
|||
if (!priv)
|
||||
return -ENOMEM;
|
||||
|
||||
ops = devm_kzalloc(&pdev->dev, sizeof(*ops), GFP_KERNEL);
|
||||
if (!ops)
|
||||
return -ENOMEM;
|
||||
|
||||
dev = b53_switch_alloc(&pdev->dev, &bcm_sf2_io_ops, priv);
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
|
@ -1014,6 +1019,8 @@ static int bcm_sf2_sw_probe(struct platform_device *pdev)
|
|||
ds = dev->ds;
|
||||
|
||||
/* Override the parts that are non-standard wrt. normal b53 devices */
|
||||
memcpy(ops, ds->ops, sizeof(*ops));
|
||||
ds->ops = ops;
|
||||
ds->ops->get_tag_protocol = bcm_sf2_sw_get_tag_protocol;
|
||||
ds->ops->setup = bcm_sf2_sw_setup;
|
||||
ds->ops->get_phy_flags = bcm_sf2_sw_get_phy_flags;
|
||||
|
|
|
@ -539,6 +539,7 @@ static irqreturn_t xgbe_isr(int irq, void *data)
|
|||
}
|
||||
}
|
||||
|
||||
isr_done:
|
||||
/* If there is not a separate AN irq, handle it here */
|
||||
if (pdata->dev_irq == pdata->an_irq)
|
||||
pdata->phy_if.an_isr(irq, pdata);
|
||||
|
@ -551,7 +552,6 @@ static irqreturn_t xgbe_isr(int irq, void *data)
|
|||
if (pdata->vdata->i2c_support && (pdata->dev_irq == pdata->i2c_irq))
|
||||
pdata->i2c_if.i2c_isr(irq, pdata);
|
||||
|
||||
isr_done:
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
|
@ -8720,11 +8720,14 @@ static void tg3_free_consistent(struct tg3 *tp)
|
|||
tg3_mem_rx_release(tp);
|
||||
tg3_mem_tx_release(tp);
|
||||
|
||||
/* Protect tg3_get_stats64() from reading freed tp->hw_stats. */
|
||||
tg3_full_lock(tp, 0);
|
||||
if (tp->hw_stats) {
|
||||
dma_free_coherent(&tp->pdev->dev, sizeof(struct tg3_hw_stats),
|
||||
tp->hw_stats, tp->stats_mapping);
|
||||
tp->hw_stats = NULL;
|
||||
}
|
||||
tg3_full_unlock(tp);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -275,8 +275,7 @@ static int be_dev_mac_add(struct be_adapter *adapter, u8 *mac)
|
|||
|
||||
/* Check if mac has already been added as part of uc-list */
|
||||
for (i = 0; i < adapter->uc_macs; i++) {
|
||||
if (ether_addr_equal((u8 *)&adapter->uc_list[i * ETH_ALEN],
|
||||
mac)) {
|
||||
if (ether_addr_equal(adapter->uc_list[i].mac, mac)) {
|
||||
/* mac already added, skip addition */
|
||||
adapter->pmac_id[0] = adapter->pmac_id[i + 1];
|
||||
return 0;
|
||||
|
@ -1655,14 +1654,12 @@ static void be_clear_mc_list(struct be_adapter *adapter)
|
|||
|
||||
static int be_uc_mac_add(struct be_adapter *adapter, int uc_idx)
|
||||
{
|
||||
if (ether_addr_equal((u8 *)&adapter->uc_list[uc_idx * ETH_ALEN],
|
||||
adapter->dev_mac)) {
|
||||
if (ether_addr_equal(adapter->uc_list[uc_idx].mac, adapter->dev_mac)) {
|
||||
adapter->pmac_id[uc_idx + 1] = adapter->pmac_id[0];
|
||||
return 0;
|
||||
}
|
||||
|
||||
return be_cmd_pmac_add(adapter,
|
||||
(u8 *)&adapter->uc_list[uc_idx * ETH_ALEN],
|
||||
return be_cmd_pmac_add(adapter, adapter->uc_list[uc_idx].mac,
|
||||
adapter->if_handle,
|
||||
&adapter->pmac_id[uc_idx + 1], 0);
|
||||
}
|
||||
|
@ -1698,9 +1695,8 @@ static void be_set_uc_list(struct be_adapter *adapter)
|
|||
}
|
||||
|
||||
if (adapter->update_uc_list) {
|
||||
i = 1; /* First slot is claimed by the Primary MAC */
|
||||
|
||||
/* cache the uc-list in adapter array */
|
||||
i = 0;
|
||||
netdev_for_each_uc_addr(ha, netdev) {
|
||||
ether_addr_copy(adapter->uc_list[i].mac, ha->addr);
|
||||
i++;
|
||||
|
|
|
@ -696,7 +696,7 @@ enum rtl_tx_desc_bit_1 {
|
|||
enum rtl_rx_desc_bit {
|
||||
/* Rx private */
|
||||
PID1 = (1 << 18), /* Protocol ID bit 1/2 */
|
||||
PID0 = (1 << 17), /* Protocol ID bit 2/2 */
|
||||
PID0 = (1 << 17), /* Protocol ID bit 0/2 */
|
||||
|
||||
#define RxProtoUDP (PID1)
|
||||
#define RxProtoTCP (PID0)
|
||||
|
|
|
@ -574,6 +574,7 @@ static struct sh_eth_cpu_data r8a7740_data = {
|
|||
.rpadir_value = 2 << 16,
|
||||
.no_trimd = 1,
|
||||
.no_ade = 1,
|
||||
.hw_crc = 1,
|
||||
.tsu = 1,
|
||||
.select_mii = 1,
|
||||
.shift_rd0 = 1,
|
||||
|
@ -802,7 +803,7 @@ static struct sh_eth_cpu_data sh7734_data = {
|
|||
|
||||
.ecsr_value = ECSR_ICD | ECSR_MPD,
|
||||
.ecsipr_value = ECSIPR_LCHNGIP | ECSIPR_ICDIP | ECSIPR_MPDIP,
|
||||
.eesipr_value = DMAC_M_RFRMER | DMAC_M_ECI | 0x003fffff,
|
||||
.eesipr_value = DMAC_M_RFRMER | DMAC_M_ECI | 0x003f07ff,
|
||||
|
||||
.tx_check = EESR_TC1 | EESR_FTC,
|
||||
.eesr_err_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_RABT |
|
||||
|
@ -832,7 +833,7 @@ static struct sh_eth_cpu_data sh7763_data = {
|
|||
|
||||
.ecsr_value = ECSR_ICD | ECSR_MPD,
|
||||
.ecsipr_value = ECSIPR_LCHNGIP | ECSIPR_ICDIP | ECSIPR_MPDIP,
|
||||
.eesipr_value = DMAC_M_RFRMER | DMAC_M_ECI | 0x003fffff,
|
||||
.eesipr_value = DMAC_M_RFRMER | DMAC_M_ECI | 0x003f07ff,
|
||||
|
||||
.tx_check = EESR_TC1 | EESR_FTC,
|
||||
.eesr_err_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_RABT |
|
||||
|
|
|
@ -3319,8 +3319,16 @@ int stmmac_dvr_probe(struct device *device,
|
|||
ndev->max_mtu = JUMBO_LEN;
|
||||
else
|
||||
ndev->max_mtu = SKB_MAX_HEAD(NET_SKB_PAD + NET_IP_ALIGN);
|
||||
if (priv->plat->maxmtu < ndev->max_mtu)
|
||||
/* Will not overwrite ndev->max_mtu if plat->maxmtu > ndev->max_mtu
|
||||
* as well as plat->maxmtu < ndev->min_mtu which is a invalid range.
|
||||
*/
|
||||
if ((priv->plat->maxmtu < ndev->max_mtu) &&
|
||||
(priv->plat->maxmtu >= ndev->min_mtu))
|
||||
ndev->max_mtu = priv->plat->maxmtu;
|
||||
else if (priv->plat->maxmtu < ndev->min_mtu)
|
||||
netdev_warn(priv->dev,
|
||||
"%s: warning: maxmtu having invalid value (%d)\n",
|
||||
__func__, priv->plat->maxmtu);
|
||||
|
||||
if (flow_ctrl)
|
||||
priv->flow_ctrl = FLOW_AUTO; /* RX/TX pause on */
|
||||
|
|
|
@ -89,6 +89,9 @@ static void stmmac_default_data(struct plat_stmmacenet_data *plat)
|
|||
|
||||
/* Set default value for unicast filter entries */
|
||||
plat->unicast_filter_entries = 1;
|
||||
|
||||
/* Set the maxmtu to a default of JUMBO_LEN */
|
||||
plat->maxmtu = JUMBO_LEN;
|
||||
}
|
||||
|
||||
static int quark_default_data(struct plat_stmmacenet_data *plat,
|
||||
|
@ -126,6 +129,9 @@ static int quark_default_data(struct plat_stmmacenet_data *plat,
|
|||
/* Set default value for unicast filter entries */
|
||||
plat->unicast_filter_entries = 1;
|
||||
|
||||
/* Set the maxmtu to a default of JUMBO_LEN */
|
||||
plat->maxmtu = JUMBO_LEN;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#define MII_DP83867_MICR 0x12
|
||||
#define MII_DP83867_ISR 0x13
|
||||
#define DP83867_CTRL 0x1f
|
||||
#define DP83867_CFG3 0x1e
|
||||
|
||||
/* Extended Registers */
|
||||
#define DP83867_RGMIICTL 0x0032
|
||||
|
@ -98,6 +99,8 @@ static int dp83867_config_intr(struct phy_device *phydev)
|
|||
micr_status |=
|
||||
(MII_DP83867_MICR_AN_ERR_INT_EN |
|
||||
MII_DP83867_MICR_SPEED_CHNG_INT_EN |
|
||||
MII_DP83867_MICR_AUTONEG_COMP_INT_EN |
|
||||
MII_DP83867_MICR_LINK_STS_CHNG_INT_EN |
|
||||
MII_DP83867_MICR_DUP_MODE_CHNG_INT_EN |
|
||||
MII_DP83867_MICR_SLEEP_MODE_CHNG_INT_EN);
|
||||
|
||||
|
@ -214,6 +217,13 @@ static int dp83867_config_init(struct phy_device *phydev)
|
|||
}
|
||||
}
|
||||
|
||||
/* Enable Interrupt output INT_OE in CFG3 register */
|
||||
if (phy_interrupt_is_valid(phydev)) {
|
||||
val = phy_read(phydev, DP83867_CFG3);
|
||||
val |= BIT(7);
|
||||
phy_write(phydev, DP83867_CFG3, val);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -399,7 +399,7 @@ bridged_dnat:
|
|||
br_nf_hook_thresh(NF_BR_PRE_ROUTING,
|
||||
net, sk, skb, skb->dev,
|
||||
NULL,
|
||||
br_nf_pre_routing_finish);
|
||||
br_nf_pre_routing_finish_bridge);
|
||||
return 0;
|
||||
}
|
||||
ether_addr_copy(eth_hdr(skb)->h_dest, dev->dev_addr);
|
||||
|
|
|
@ -144,7 +144,7 @@ clusterip_config_find_get(struct net *net, __be32 clusterip, int entry)
|
|||
rcu_read_lock_bh();
|
||||
c = __clusterip_config_find(net, clusterip);
|
||||
if (c) {
|
||||
if (unlikely(!atomic_inc_not_zero(&c->refcount)))
|
||||
if (!c->pde || unlikely(!atomic_inc_not_zero(&c->refcount)))
|
||||
c = NULL;
|
||||
else if (entry)
|
||||
atomic_inc(&c->entries);
|
||||
|
@ -166,14 +166,15 @@ clusterip_config_init_nodelist(struct clusterip_config *c,
|
|||
|
||||
static struct clusterip_config *
|
||||
clusterip_config_init(const struct ipt_clusterip_tgt_info *i, __be32 ip,
|
||||
struct net_device *dev)
|
||||
struct net_device *dev)
|
||||
{
|
||||
struct net *net = dev_net(dev);
|
||||
struct clusterip_config *c;
|
||||
struct clusterip_net *cn = net_generic(dev_net(dev), clusterip_net_id);
|
||||
struct clusterip_net *cn = net_generic(net, clusterip_net_id);
|
||||
|
||||
c = kzalloc(sizeof(*c), GFP_ATOMIC);
|
||||
if (!c)
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
c->dev = dev;
|
||||
c->clusterip = ip;
|
||||
|
@ -185,6 +186,17 @@ clusterip_config_init(const struct ipt_clusterip_tgt_info *i, __be32 ip,
|
|||
atomic_set(&c->refcount, 1);
|
||||
atomic_set(&c->entries, 1);
|
||||
|
||||
spin_lock_bh(&cn->lock);
|
||||
if (__clusterip_config_find(net, ip)) {
|
||||
spin_unlock_bh(&cn->lock);
|
||||
kfree(c);
|
||||
|
||||
return ERR_PTR(-EBUSY);
|
||||
}
|
||||
|
||||
list_add_rcu(&c->list, &cn->configs);
|
||||
spin_unlock_bh(&cn->lock);
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
{
|
||||
char buffer[16];
|
||||
|
@ -195,16 +207,16 @@ clusterip_config_init(const struct ipt_clusterip_tgt_info *i, __be32 ip,
|
|||
cn->procdir,
|
||||
&clusterip_proc_fops, c);
|
||||
if (!c->pde) {
|
||||
spin_lock_bh(&cn->lock);
|
||||
list_del_rcu(&c->list);
|
||||
spin_unlock_bh(&cn->lock);
|
||||
kfree(c);
|
||||
return NULL;
|
||||
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
spin_lock_bh(&cn->lock);
|
||||
list_add_rcu(&c->list, &cn->configs);
|
||||
spin_unlock_bh(&cn->lock);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
@ -410,9 +422,9 @@ static int clusterip_tg_check(const struct xt_tgchk_param *par)
|
|||
|
||||
config = clusterip_config_init(cipinfo,
|
||||
e->ip.dst.s_addr, dev);
|
||||
if (!config) {
|
||||
if (IS_ERR(config)) {
|
||||
dev_put(dev);
|
||||
return -ENOMEM;
|
||||
return PTR_ERR(config);
|
||||
}
|
||||
dev_mc_add(config->dev, config->clustermac);
|
||||
}
|
||||
|
|
|
@ -189,12 +189,12 @@ static int vti6_tnl_create2(struct net_device *dev)
|
|||
struct vti6_net *ip6n = net_generic(net, vti6_net_id);
|
||||
int err;
|
||||
|
||||
dev->rtnl_link_ops = &vti6_link_ops;
|
||||
err = register_netdevice(dev);
|
||||
if (err < 0)
|
||||
goto out;
|
||||
|
||||
strcpy(t->parms.name, dev->name);
|
||||
dev->rtnl_link_ops = &vti6_link_ops;
|
||||
|
||||
dev_hold(dev);
|
||||
vti6_tnl_link(ip6n, t);
|
||||
|
|
|
@ -2115,7 +2115,7 @@ static void nf_tables_rule_destroy(const struct nft_ctx *ctx,
|
|||
* is called on error from nf_tables_newrule().
|
||||
*/
|
||||
expr = nft_expr_first(rule);
|
||||
while (expr->ops && expr != nft_expr_last(rule)) {
|
||||
while (expr != nft_expr_last(rule) && expr->ops) {
|
||||
nf_tables_expr_destroy(ctx, expr);
|
||||
expr = nft_expr_next(expr);
|
||||
}
|
||||
|
|
|
@ -250,6 +250,22 @@ static int nft_payload_l4csum_update(const struct nft_pktinfo *pkt,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int nft_payload_csum_inet(struct sk_buff *skb, const u32 *src,
|
||||
__wsum fsum, __wsum tsum, int csum_offset)
|
||||
{
|
||||
__sum16 sum;
|
||||
|
||||
if (skb_copy_bits(skb, csum_offset, &sum, sizeof(sum)) < 0)
|
||||
return -1;
|
||||
|
||||
nft_csum_replace(&sum, fsum, tsum);
|
||||
if (!skb_make_writable(skb, csum_offset + sizeof(sum)) ||
|
||||
skb_store_bits(skb, csum_offset, &sum, sizeof(sum)) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void nft_payload_set_eval(const struct nft_expr *expr,
|
||||
struct nft_regs *regs,
|
||||
const struct nft_pktinfo *pkt)
|
||||
|
@ -259,7 +275,6 @@ static void nft_payload_set_eval(const struct nft_expr *expr,
|
|||
const u32 *src = ®s->data[priv->sreg];
|
||||
int offset, csum_offset;
|
||||
__wsum fsum, tsum;
|
||||
__sum16 sum;
|
||||
|
||||
switch (priv->base) {
|
||||
case NFT_PAYLOAD_LL_HEADER:
|
||||
|
@ -282,18 +297,14 @@ static void nft_payload_set_eval(const struct nft_expr *expr,
|
|||
csum_offset = offset + priv->csum_offset;
|
||||
offset += priv->offset;
|
||||
|
||||
if (priv->csum_type == NFT_PAYLOAD_CSUM_INET &&
|
||||
if ((priv->csum_type == NFT_PAYLOAD_CSUM_INET || priv->csum_flags) &&
|
||||
(priv->base != NFT_PAYLOAD_TRANSPORT_HEADER ||
|
||||
skb->ip_summed != CHECKSUM_PARTIAL)) {
|
||||
if (skb_copy_bits(skb, csum_offset, &sum, sizeof(sum)) < 0)
|
||||
goto err;
|
||||
|
||||
fsum = skb_checksum(skb, offset, priv->len, 0);
|
||||
tsum = csum_partial(src, priv->len, 0);
|
||||
nft_csum_replace(&sum, fsum, tsum);
|
||||
|
||||
if (!skb_make_writable(skb, csum_offset + sizeof(sum)) ||
|
||||
skb_store_bits(skb, csum_offset, &sum, sizeof(sum)) < 0)
|
||||
if (priv->csum_type == NFT_PAYLOAD_CSUM_INET &&
|
||||
nft_payload_csum_inet(skb, src, fsum, tsum, csum_offset))
|
||||
goto err;
|
||||
|
||||
if (priv->csum_flags &&
|
||||
|
|
|
@ -38,7 +38,7 @@ static void nft_queue_eval(const struct nft_expr *expr,
|
|||
|
||||
if (priv->queues_total > 1) {
|
||||
if (priv->flags & NFT_QUEUE_FLAG_CPU_FANOUT) {
|
||||
int cpu = smp_processor_id();
|
||||
int cpu = raw_smp_processor_id();
|
||||
|
||||
queue = priv->queuenum + cpu % priv->queues_total;
|
||||
} else {
|
||||
|
|
|
@ -110,30 +110,32 @@ static int nft_quota_obj_init(const struct nlattr * const tb[],
|
|||
static int nft_quota_do_dump(struct sk_buff *skb, struct nft_quota *priv,
|
||||
bool reset)
|
||||
{
|
||||
u64 consumed, consumed_cap;
|
||||
u32 flags = priv->flags;
|
||||
u64 consumed;
|
||||
|
||||
if (reset) {
|
||||
consumed = atomic64_xchg(&priv->consumed, 0);
|
||||
if (test_and_clear_bit(NFT_QUOTA_DEPLETED_BIT, &priv->flags))
|
||||
flags |= NFT_QUOTA_F_DEPLETED;
|
||||
} else {
|
||||
consumed = atomic64_read(&priv->consumed);
|
||||
}
|
||||
|
||||
/* Since we inconditionally increment consumed quota for each packet
|
||||
* that we see, don't go over the quota boundary in what we send to
|
||||
* userspace.
|
||||
*/
|
||||
if (consumed > priv->quota)
|
||||
consumed = priv->quota;
|
||||
consumed = atomic64_read(&priv->consumed);
|
||||
if (consumed >= priv->quota) {
|
||||
consumed_cap = priv->quota;
|
||||
flags |= NFT_QUOTA_F_DEPLETED;
|
||||
} else {
|
||||
consumed_cap = consumed;
|
||||
}
|
||||
|
||||
if (nla_put_be64(skb, NFTA_QUOTA_BYTES, cpu_to_be64(priv->quota),
|
||||
NFTA_QUOTA_PAD) ||
|
||||
nla_put_be64(skb, NFTA_QUOTA_CONSUMED, cpu_to_be64(consumed),
|
||||
nla_put_be64(skb, NFTA_QUOTA_CONSUMED, cpu_to_be64(consumed_cap),
|
||||
NFTA_QUOTA_PAD) ||
|
||||
nla_put_be32(skb, NFTA_QUOTA_FLAGS, htonl(flags)))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (reset) {
|
||||
atomic64_sub(consumed, &priv->consumed);
|
||||
clear_bit(NFT_QUOTA_DEPLETED_BIT, &priv->flags);
|
||||
}
|
||||
return 0;
|
||||
|
||||
nla_put_failure:
|
||||
|
|
|
@ -1502,10 +1502,7 @@ static int __init netlbl_init(void)
|
|||
printk(KERN_INFO "NetLabel: Initializing\n");
|
||||
printk(KERN_INFO "NetLabel: domain hash size = %u\n",
|
||||
(1 << NETLBL_DOMHSH_BITSIZE));
|
||||
printk(KERN_INFO "NetLabel: protocols ="
|
||||
" UNLABELED"
|
||||
" CIPSOv4"
|
||||
"\n");
|
||||
printk(KERN_INFO "NetLabel: protocols = UNLABELED CIPSOv4 CALIPSO\n");
|
||||
|
||||
ret_val = netlbl_domhsh_init(NETLBL_DOMHSH_BITSIZE);
|
||||
if (ret_val != 0)
|
||||
|
|
|
@ -14502,13 +14502,17 @@ static int nl80211_netlink_notify(struct notifier_block * nb,
|
|||
|
||||
list_for_each_entry_rcu(rdev, &cfg80211_rdev_list, list) {
|
||||
bool schedule_destroy_work = false;
|
||||
bool schedule_scan_stop = false;
|
||||
struct cfg80211_sched_scan_request *sched_scan_req =
|
||||
rcu_dereference(rdev->sched_scan_req);
|
||||
|
||||
if (sched_scan_req && notify->portid &&
|
||||
sched_scan_req->owner_nlportid == notify->portid)
|
||||
schedule_scan_stop = true;
|
||||
sched_scan_req->owner_nlportid == notify->portid) {
|
||||
sched_scan_req->owner_nlportid = 0;
|
||||
|
||||
if (rdev->ops->sched_scan_stop &&
|
||||
rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN)
|
||||
schedule_work(&rdev->sched_scan_stop_wk);
|
||||
}
|
||||
|
||||
list_for_each_entry_rcu(wdev, &rdev->wiphy.wdev_list, list) {
|
||||
cfg80211_mlme_unregister_socket(wdev, notify->portid);
|
||||
|
@ -14539,12 +14543,6 @@ static int nl80211_netlink_notify(struct notifier_block * nb,
|
|||
spin_unlock(&rdev->destroy_list_lock);
|
||||
schedule_work(&rdev->destroy_work);
|
||||
}
|
||||
} else if (schedule_scan_stop) {
|
||||
sched_scan_req->owner_nlportid = 0;
|
||||
|
||||
if (rdev->ops->sched_scan_stop &&
|
||||
rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN)
|
||||
schedule_work(&rdev->sched_scan_stop_wk);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче