mirror of
https://github.com/joel16/android_kernel_sony_msm8994_rework.git
synced 2024-11-24 12:29:53 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking updates from David Miller: "More bug fixes, nothing gets past these guys" 1) More kernel info leaks found by Mathias Krause, this time in the IPSEC configuration layers. 2) When IPSEC policies change, we do not properly make sure that cached routes (which could now be stale) throughout the system will be revalidated. Fix this by generalizing the generation count invalidation scheme used by ipv4. From Nicolas Dichtel. 3) When repairing TCP sockets, we need to allow to restore not just the send window scale, but the receive one too. Extend the existing interface to achieve this in a backwards compatible way. From Andrey Vagin. 4) A fix for FCOE scatter gather feature validation erroneously caused scatter gather to be disabled for things like AOE too. From Ed L Cashin. 5) Several cases of mishandling of error pointers, from Mathias Krause, Wei Yongjun, and Devendra Naga. 6) Fix gianfar build, from Richard Cochran. 7) CAP_NET_* failures should return -EPERM not -EACCES, from Zhao Hongjiang. 8) Hardware reset fix in janz-ican3 CAN driver, from Ira W Snyder. 9) Fix oops during rmmod in ti_hecc CAN driver, from Marc Kleine-Budde. 10) The removal of the conditional compilation of the clk support code in the stmmac driver broke things. This is because the interfaces used are the ones that don't also perform the enable/disable of the clk. Fix from Stefan Roese. 11) The QFQ packet scheduler can record out of range virtual start times, resulting later in misbehavior and even crashes. Fix from Paolo Valente. 12) If MSG_WAITALL is used with IOAT DMA under TCP, we can wedge the receiver when the advertised receive window goes to zero. Detect this case and force the processing of the IOAT DMA queue when it happens to avoid getting stuck. Fix from Michal Kubecek. 13) batman-adv assumes that test_bit() returns only 0 or 1, but this is not true for x86 (which returns -1 or 0, via the 'sbb' instruction). Fix from Linus Lussing. 14) Fix small packet corruption in e1000, from Tushar Dave. 15) make_blackhole() in the IPSEC policy code can do one read unlock too many, fix from Li RongQing. 16) The new tcp_try_coalesce() code introduced a bug in TCP URG handling, fix from Eric Dumazet. 17) Fix memory leak in __netif_receive_skb() when doing zerocopy and when hit an OOM condition. From Michael S Tsirkin. 18) netxen blindly deferences pdev->bus->self, which is not guarenteed to be non-NULL. Fix from Nikolay Aleksandrov. 19) Fix a performance regression caused by mistakes in ipv6 checksum validation in the bnx2x driver, fix from Michal Schmidt. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (45 commits) net/stmmac: Use clk_prepare_enable and clk_disable_unprepare net: change return values from -EACCES to -EPERM net/irda: sh_sir: fix return value check in sh_sir_set_baudrate() stmmac: fix return value check in stmmac_open_ext_timer() gianfar: fix phc index build failure ipv6: fix return value check in fib6_add() bnx2x: remove false warning regarding interrupt number can: ti_hecc: fix oops during rmmod can: janz-ican3: fix support for older hardware revisions net: do not disable sg for packets requiring no checksum aoe: assert AoE packets marked as requiring no checksum at91ether: return PTR_ERR if call to clk_get fails xfrm_user: don't copy esn replay window twice for new states xfrm_user: ensure user supplied esn replay window is valid xfrm_user: fix info leak in copy_to_user_tmpl() xfrm_user: fix info leak in copy_to_user_policy() xfrm_user: fix info leak in copy_to_user_state() xfrm_user: fix info leak in copy_to_user_auth() net: qmi_wwan: adding Huawei E367, ZTE MF683 and Pantech P4200 tcp: restore rcv_wscale in a repair mode (v2) ...
This commit is contained in:
commit
abef3bd710
@ -35,6 +35,7 @@ new_skb(ulong len)
|
||||
skb_reset_mac_header(skb);
|
||||
skb_reset_network_header(skb);
|
||||
skb->protocol = __constant_htons(ETH_P_AOE);
|
||||
skb_checksum_none_assert(skb);
|
||||
}
|
||||
return skb;
|
||||
}
|
||||
|
@ -1391,7 +1391,6 @@ static irqreturn_t ican3_irq(int irq, void *dev_id)
|
||||
*/
|
||||
static int ican3_reset_module(struct ican3_dev *mod)
|
||||
{
|
||||
u8 val = 1 << mod->num;
|
||||
unsigned long start;
|
||||
u8 runold, runnew;
|
||||
|
||||
@ -1405,8 +1404,7 @@ static int ican3_reset_module(struct ican3_dev *mod)
|
||||
runold = ioread8(mod->dpm + TARGET_RUNNING);
|
||||
|
||||
/* reset the module */
|
||||
iowrite8(val, &mod->ctrl->reset_assert);
|
||||
iowrite8(val, &mod->ctrl->reset_deassert);
|
||||
iowrite8(0x00, &mod->dpmctrl->hwreset);
|
||||
|
||||
/* wait until the module has finished resetting and is running */
|
||||
start = jiffies;
|
||||
|
@ -984,12 +984,12 @@ static int __devexit ti_hecc_remove(struct platform_device *pdev)
|
||||
struct net_device *ndev = platform_get_drvdata(pdev);
|
||||
struct ti_hecc_priv *priv = netdev_priv(ndev);
|
||||
|
||||
unregister_candev(ndev);
|
||||
clk_disable(priv->clk);
|
||||
clk_put(priv->clk);
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
iounmap(priv->base);
|
||||
release_mem_region(res->start, resource_size(res));
|
||||
unregister_candev(ndev);
|
||||
free_candev(ndev);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
|
||||
|
@ -662,14 +662,16 @@ void bnx2x_csum_validate(struct sk_buff *skb, union eth_rx_cqe *cqe,
|
||||
struct bnx2x_fastpath *fp,
|
||||
struct bnx2x_eth_q_stats *qstats)
|
||||
{
|
||||
/* Do nothing if no IP/L4 csum validation was done */
|
||||
|
||||
/* Do nothing if no L4 csum validation was done.
|
||||
* We do not check whether IP csum was validated. For IPv4 we assume
|
||||
* that if the card got as far as validating the L4 csum, it also
|
||||
* validated the IP csum. IPv6 has no IP csum.
|
||||
*/
|
||||
if (cqe->fast_path_cqe.status_flags &
|
||||
(ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG |
|
||||
ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG))
|
||||
ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG)
|
||||
return;
|
||||
|
||||
/* If both IP/L4 validation were done, check if an error was found. */
|
||||
/* If L4 validation was done, check if an error was found. */
|
||||
|
||||
if (cqe->fast_path_cqe.type_error_flags &
|
||||
(ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG |
|
||||
|
@ -9831,12 +9831,13 @@ static void __devinit bnx2x_get_igu_cam_info(struct bnx2x *bp)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCI_MSI
|
||||
/*
|
||||
* It's expected that number of CAM entries for this functions is equal
|
||||
* to the number evaluated based on the MSI-X table size. We want a
|
||||
* harsh warning if these values are different!
|
||||
/* Due to new PF resource allocation by MFW T7.4 and above, it's
|
||||
* optional that number of CAM entries will not be equal to the value
|
||||
* advertised in PCI.
|
||||
* Driver should use the minimal value of both as the actual status
|
||||
* block count
|
||||
*/
|
||||
WARN_ON(bp->igu_sb_cnt != igu_sb_cnt);
|
||||
bp->igu_sb_cnt = min_t(int, bp->igu_sb_cnt, igu_sb_cnt);
|
||||
#endif
|
||||
|
||||
if (igu_sb_cnt == 0)
|
||||
|
@ -1086,7 +1086,7 @@ static int __init at91ether_probe(struct platform_device *pdev)
|
||||
/* Clock */
|
||||
lp->ether_clk = clk_get(&pdev->dev, "ether_clk");
|
||||
if (IS_ERR(lp->ether_clk)) {
|
||||
res = -ENODEV;
|
||||
res = PTR_ERR(lp->ether_clk);
|
||||
goto err_ioumap;
|
||||
}
|
||||
clk_enable(lp->ether_clk);
|
||||
|
@ -1773,6 +1773,7 @@ static int gfar_get_nfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
|
||||
}
|
||||
|
||||
int gfar_phc_index = -1;
|
||||
EXPORT_SYMBOL(gfar_phc_index);
|
||||
|
||||
static int gfar_get_ts_info(struct net_device *dev,
|
||||
struct ethtool_ts_info *info)
|
||||
|
@ -515,7 +515,7 @@ static int gianfar_ptp_probe(struct platform_device *dev)
|
||||
err = PTR_ERR(etsects->clock);
|
||||
goto no_clock;
|
||||
}
|
||||
gfar_phc_clock = ptp_clock_index(etsects->clock);
|
||||
gfar_phc_index = ptp_clock_index(etsects->clock);
|
||||
|
||||
dev_set_drvdata(&dev->dev, etsects);
|
||||
|
||||
@ -539,7 +539,7 @@ static int gianfar_ptp_remove(struct platform_device *dev)
|
||||
gfar_write(&etsects->regs->tmr_temask, 0);
|
||||
gfar_write(&etsects->regs->tmr_ctrl, 0);
|
||||
|
||||
gfar_phc_clock = -1;
|
||||
gfar_phc_index = -1;
|
||||
ptp_clock_unregister(etsects->clock);
|
||||
iounmap(etsects->regs);
|
||||
release_resource(etsects->rsrc);
|
||||
|
@ -3149,6 +3149,17 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
/* On PCI/PCI-X HW, if packet size is less than ETH_ZLEN,
|
||||
* packets may get corrupted during padding by HW.
|
||||
* To WA this issue, pad all small packets manually.
|
||||
*/
|
||||
if (skb->len < ETH_ZLEN) {
|
||||
if (skb_pad(skb, ETH_ZLEN - skb->len))
|
||||
return NETDEV_TX_OK;
|
||||
skb->len = ETH_ZLEN;
|
||||
skb_set_tail_pointer(skb, ETH_ZLEN);
|
||||
}
|
||||
|
||||
mss = skb_shinfo(skb)->gso_size;
|
||||
/* The controller does a simple calculation to
|
||||
* make sure there is enough room in the FIFO before
|
||||
|
@ -1378,6 +1378,10 @@ static void netxen_mask_aer_correctable(struct netxen_adapter *adapter)
|
||||
struct pci_dev *root = pdev->bus->self;
|
||||
u32 aer_pos;
|
||||
|
||||
/* root bus? */
|
||||
if (!root)
|
||||
return;
|
||||
|
||||
if (adapter->ahw.board_type != NETXEN_BRDTYPE_P3_4_GB_MM &&
|
||||
adapter->ahw.board_type != NETXEN_BRDTYPE_P3_10G_TP)
|
||||
return;
|
||||
|
@ -1066,7 +1066,7 @@ static int stmmac_open(struct net_device *dev)
|
||||
} else
|
||||
priv->tm->enable = 1;
|
||||
#endif
|
||||
clk_enable(priv->stmmac_clk);
|
||||
clk_prepare_enable(priv->stmmac_clk);
|
||||
|
||||
stmmac_check_ether_addr(priv);
|
||||
|
||||
@ -1188,7 +1188,7 @@ open_error:
|
||||
if (priv->phydev)
|
||||
phy_disconnect(priv->phydev);
|
||||
|
||||
clk_disable(priv->stmmac_clk);
|
||||
clk_disable_unprepare(priv->stmmac_clk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1246,7 +1246,7 @@ static int stmmac_release(struct net_device *dev)
|
||||
#ifdef CONFIG_STMMAC_DEBUG_FS
|
||||
stmmac_exit_fs();
|
||||
#endif
|
||||
clk_disable(priv->stmmac_clk);
|
||||
clk_disable_unprepare(priv->stmmac_clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -2178,7 +2178,7 @@ int stmmac_suspend(struct net_device *ndev)
|
||||
else {
|
||||
stmmac_set_mac(priv->ioaddr, false);
|
||||
/* Disable clock in case of PWM is off */
|
||||
clk_disable(priv->stmmac_clk);
|
||||
clk_disable_unprepare(priv->stmmac_clk);
|
||||
}
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
return 0;
|
||||
@ -2203,7 +2203,7 @@ int stmmac_resume(struct net_device *ndev)
|
||||
priv->hw->mac->pmt(priv->ioaddr, 0);
|
||||
else
|
||||
/* enable the clk prevously disabled */
|
||||
clk_enable(priv->stmmac_clk);
|
||||
clk_prepare_enable(priv->stmmac_clk);
|
||||
|
||||
netif_device_attach(ndev);
|
||||
|
||||
|
@ -97,19 +97,19 @@ static struct clk *timer_clock;
|
||||
static void stmmac_tmu_start(unsigned int new_freq)
|
||||
{
|
||||
clk_set_rate(timer_clock, new_freq);
|
||||
clk_enable(timer_clock);
|
||||
clk_prepare_enable(timer_clock);
|
||||
}
|
||||
|
||||
static void stmmac_tmu_stop(void)
|
||||
{
|
||||
clk_disable(timer_clock);
|
||||
clk_disable_unprepare(timer_clock);
|
||||
}
|
||||
|
||||
int stmmac_open_ext_timer(struct net_device *dev, struct stmmac_timer *tm)
|
||||
{
|
||||
timer_clock = clk_get(NULL, TMU_CHANNEL);
|
||||
|
||||
if (timer_clock == NULL)
|
||||
if (IS_ERR(timer_clock))
|
||||
return -1;
|
||||
|
||||
if (tmu2_register_user(stmmac_timer_handler, (void *)dev) < 0) {
|
||||
@ -126,7 +126,7 @@ int stmmac_open_ext_timer(struct net_device *dev, struct stmmac_timer *tm)
|
||||
|
||||
int stmmac_close_ext_timer(void)
|
||||
{
|
||||
clk_disable(timer_clock);
|
||||
clk_disable_unprepare(timer_clock);
|
||||
tmu2_unregister_user();
|
||||
clk_put(timer_clock);
|
||||
return 0;
|
||||
|
@ -280,7 +280,7 @@ static int sh_sir_set_baudrate(struct sh_sir_self *self, u32 baudrate)
|
||||
}
|
||||
|
||||
clk = clk_get(NULL, "irda_clk");
|
||||
if (!clk) {
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(dev, "can not get irda_clk\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
@ -961,6 +961,10 @@ static const struct usb_device_id products [] = {
|
||||
// DLink DUB-E100 H/W Ver B1 Alternate
|
||||
USB_DEVICE (0x2001, 0x3c05),
|
||||
.driver_info = (unsigned long) &ax88772_info,
|
||||
}, {
|
||||
// DLink DUB-E100 H/W Ver C1
|
||||
USB_DEVICE (0x2001, 0x1a02),
|
||||
.driver_info = (unsigned long) &ax88772_info,
|
||||
}, {
|
||||
// Linksys USB1000
|
||||
USB_DEVICE (0x1737, 0x0039),
|
||||
|
@ -366,16 +366,20 @@ static const struct usb_device_id products[] = {
|
||||
},
|
||||
|
||||
/* 2. Combined interface devices matching on class+protocol */
|
||||
{ /* Huawei E367 and possibly others in "Windows mode" */
|
||||
USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 7),
|
||||
.driver_info = (unsigned long)&qmi_wwan_info,
|
||||
},
|
||||
{ /* Huawei E392, E398 and possibly others in "Windows mode" */
|
||||
USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 17),
|
||||
.driver_info = (unsigned long)&qmi_wwan_shared,
|
||||
},
|
||||
{ /* Pantech UML290 */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x106c, 0x3718, USB_CLASS_VENDOR_SPEC, 0xf0, 0xff),
|
||||
{ /* Pantech UML290, P4200 and more */
|
||||
USB_VENDOR_AND_INTERFACE_INFO(0x106c, USB_CLASS_VENDOR_SPEC, 0xf0, 0xff),
|
||||
.driver_info = (unsigned long)&qmi_wwan_shared,
|
||||
},
|
||||
{ /* Pantech UML290 - newer firmware */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x106c, 0x3718, USB_CLASS_VENDOR_SPEC, 0xf1, 0xff),
|
||||
USB_VENDOR_AND_INTERFACE_INFO(0x106c, USB_CLASS_VENDOR_SPEC, 0xf1, 0xff),
|
||||
.driver_info = (unsigned long)&qmi_wwan_shared,
|
||||
},
|
||||
|
||||
@ -383,6 +387,7 @@ static const struct usb_device_id products[] = {
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0055, 1)}, /* ZTE (Vodafone) K3520-Z */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0063, 4)}, /* ZTE (Vodafone) K3565-Z */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0104, 4)}, /* ZTE (Vodafone) K4505-Z */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0157, 5)}, /* ZTE MF683 */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0167, 4)}, /* ZTE MF820D */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0326, 4)}, /* ZTE MF821D */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x1008, 4)}, /* ZTE (Vodafone) K3570-Z */
|
||||
|
@ -2982,6 +2982,10 @@ static u32 ath9k_hw_ar9300_get_eeprom(struct ath_hw *ah,
|
||||
case EEP_RX_MASK:
|
||||
return pBase->txrxMask & 0xf;
|
||||
case EEP_PAPRD:
|
||||
if (AR_SREV_9462(ah))
|
||||
return false;
|
||||
if (!ah->config.enable_paprd);
|
||||
return false;
|
||||
return !!(pBase->featureEnable & BIT(5));
|
||||
case EEP_CHAIN_MASK_REDUCE:
|
||||
return (pBase->miscConfiguration >> 0x3) & 0x1;
|
||||
|
@ -1577,6 +1577,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
sc->debug.debugfs_phy, sc, &fops_tx_chainmask);
|
||||
debugfs_create_file("disable_ani", S_IRUSR | S_IWUSR,
|
||||
sc->debug.debugfs_phy, sc, &fops_disable_ani);
|
||||
debugfs_create_bool("paprd", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
|
||||
&sc->sc_ah->config.enable_paprd);
|
||||
debugfs_create_file("regidx", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
|
||||
sc, &fops_regidx);
|
||||
debugfs_create_file("regval", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
|
||||
|
@ -2497,10 +2497,6 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
|
||||
pCap->rx_status_len = sizeof(struct ar9003_rxs);
|
||||
pCap->tx_desc_len = sizeof(struct ar9003_txc);
|
||||
pCap->txs_len = sizeof(struct ar9003_txs);
|
||||
if (!ah->config.paprd_disable &&
|
||||
ah->eep_ops->get_eeprom(ah, EEP_PAPRD) &&
|
||||
!AR_SREV_9462(ah))
|
||||
pCap->hw_caps |= ATH9K_HW_CAP_PAPRD;
|
||||
} else {
|
||||
pCap->tx_desc_len = sizeof(struct ath_desc);
|
||||
if (AR_SREV_9280_20(ah))
|
||||
|
@ -236,7 +236,6 @@ enum ath9k_hw_caps {
|
||||
ATH9K_HW_CAP_LDPC = BIT(6),
|
||||
ATH9K_HW_CAP_FASTCLOCK = BIT(7),
|
||||
ATH9K_HW_CAP_SGI_20 = BIT(8),
|
||||
ATH9K_HW_CAP_PAPRD = BIT(9),
|
||||
ATH9K_HW_CAP_ANT_DIV_COMB = BIT(10),
|
||||
ATH9K_HW_CAP_2GHZ = BIT(11),
|
||||
ATH9K_HW_CAP_5GHZ = BIT(12),
|
||||
@ -287,12 +286,12 @@ struct ath9k_ops_config {
|
||||
u8 pcie_clock_req;
|
||||
u32 pcie_waen;
|
||||
u8 analog_shiftreg;
|
||||
u8 paprd_disable;
|
||||
u32 ofdm_trig_low;
|
||||
u32 ofdm_trig_high;
|
||||
u32 cck_trig_high;
|
||||
u32 cck_trig_low;
|
||||
u32 enable_ani;
|
||||
u32 enable_paprd;
|
||||
int serialize_regmode;
|
||||
bool rx_intr_mitigation;
|
||||
bool tx_intr_mitigation;
|
||||
|
@ -423,7 +423,7 @@ set_timer:
|
||||
cal_interval = min(cal_interval, (u32)short_cal_interval);
|
||||
|
||||
mod_timer(&common->ani.timer, jiffies + msecs_to_jiffies(cal_interval));
|
||||
if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_PAPRD) && ah->caldata) {
|
||||
if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD) && ah->caldata) {
|
||||
if (!ah->caldata->paprd_done)
|
||||
ieee80211_queue_work(sc->hw, &sc->paprd_work);
|
||||
else if (!ah->paprd_table_write_done)
|
||||
|
@ -638,6 +638,8 @@ static int brcmf_sdio_pd_probe(struct platform_device *pdev)
|
||||
|
||||
oobirq_entry = kzalloc(sizeof(struct brcmf_sdio_oobirq),
|
||||
GFP_KERNEL);
|
||||
if (!oobirq_entry)
|
||||
return -ENOMEM;
|
||||
oobirq_entry->irq = res->start;
|
||||
oobirq_entry->flags = res->flags & IRQF_TRIGGER_MASK;
|
||||
list_add_tail(&oobirq_entry->list, &oobirq_lh);
|
||||
|
@ -764,8 +764,11 @@ static void brcmf_c_arp_offload_set(struct brcmf_pub *drvr, int arp_mode)
|
||||
{
|
||||
char iovbuf[32];
|
||||
int retcode;
|
||||
__le32 arp_mode_le;
|
||||
|
||||
brcmf_c_mkiovar("arp_ol", (char *)&arp_mode, 4, iovbuf, sizeof(iovbuf));
|
||||
arp_mode_le = cpu_to_le32(arp_mode);
|
||||
brcmf_c_mkiovar("arp_ol", (char *)&arp_mode_le, 4, iovbuf,
|
||||
sizeof(iovbuf));
|
||||
retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR,
|
||||
iovbuf, sizeof(iovbuf));
|
||||
retcode = retcode >= 0 ? 0 : retcode;
|
||||
@ -781,8 +784,11 @@ static void brcmf_c_arp_offload_enable(struct brcmf_pub *drvr, int arp_enable)
|
||||
{
|
||||
char iovbuf[32];
|
||||
int retcode;
|
||||
__le32 arp_enable_le;
|
||||
|
||||
brcmf_c_mkiovar("arpoe", (char *)&arp_enable, 4,
|
||||
arp_enable_le = cpu_to_le32(arp_enable);
|
||||
|
||||
brcmf_c_mkiovar("arpoe", (char *)&arp_enable_le, 4,
|
||||
iovbuf, sizeof(iovbuf));
|
||||
retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR,
|
||||
iovbuf, sizeof(iovbuf));
|
||||
@ -800,10 +806,10 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr)
|
||||
char iovbuf[BRCMF_EVENTING_MASK_LEN + 12]; /* Room for
|
||||
"event_msgs" + '\0' + bitvec */
|
||||
char buf[128], *ptr;
|
||||
u32 roaming = 1;
|
||||
uint bcn_timeout = 3;
|
||||
int scan_assoc_time = 40;
|
||||
int scan_unassoc_time = 40;
|
||||
__le32 roaming_le = cpu_to_le32(1);
|
||||
__le32 bcn_timeout_le = cpu_to_le32(3);
|
||||
__le32 scan_assoc_time_le = cpu_to_le32(40);
|
||||
__le32 scan_unassoc_time_le = cpu_to_le32(40);
|
||||
int i;
|
||||
struct brcmf_bus_dcmd *cmdlst;
|
||||
struct list_head *cur, *q;
|
||||
@ -829,14 +835,14 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr)
|
||||
|
||||
/* Setup timeout if Beacons are lost and roam is off to report
|
||||
link down */
|
||||
brcmf_c_mkiovar("bcn_timeout", (char *)&bcn_timeout, 4, iovbuf,
|
||||
brcmf_c_mkiovar("bcn_timeout", (char *)&bcn_timeout_le, 4, iovbuf,
|
||||
sizeof(iovbuf));
|
||||
brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf,
|
||||
sizeof(iovbuf));
|
||||
|
||||
/* Enable/Disable build-in roaming to allowed ext supplicant to take
|
||||
of romaing */
|
||||
brcmf_c_mkiovar("roam_off", (char *)&roaming, 4,
|
||||
brcmf_c_mkiovar("roam_off", (char *)&roaming_le, 4,
|
||||
iovbuf, sizeof(iovbuf));
|
||||
brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf,
|
||||
sizeof(iovbuf));
|
||||
@ -848,9 +854,9 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr)
|
||||
sizeof(iovbuf));
|
||||
|
||||
brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_SCAN_CHANNEL_TIME,
|
||||
(char *)&scan_assoc_time, sizeof(scan_assoc_time));
|
||||
(char *)&scan_assoc_time_le, sizeof(scan_assoc_time_le));
|
||||
brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_SCAN_UNASSOC_TIME,
|
||||
(char *)&scan_unassoc_time, sizeof(scan_unassoc_time));
|
||||
(char *)&scan_unassoc_time_le, sizeof(scan_unassoc_time_le));
|
||||
|
||||
/* Set and enable ARP offload feature */
|
||||
brcmf_c_arp_offload_set(drvr, BRCMF_ARPOL_MODE);
|
||||
|
@ -500,8 +500,10 @@ static void wl_iscan_prep(struct brcmf_scan_params_le *params_le,
|
||||
params_le->active_time = cpu_to_le32(-1);
|
||||
params_le->passive_time = cpu_to_le32(-1);
|
||||
params_le->home_time = cpu_to_le32(-1);
|
||||
if (ssid && ssid->SSID_len)
|
||||
memcpy(¶ms_le->ssid_le, ssid, sizeof(struct brcmf_ssid));
|
||||
if (ssid && ssid->SSID_len) {
|
||||
params_le->ssid_le.SSID_len = cpu_to_le32(ssid->SSID_len);
|
||||
memcpy(¶ms_le->ssid_le.SSID, ssid->SSID, ssid->SSID_len);
|
||||
}
|
||||
}
|
||||
|
||||
static s32
|
||||
|
@ -77,7 +77,7 @@
|
||||
NL80211_RRF_NO_IBSS)
|
||||
|
||||
static const struct ieee80211_regdomain brcms_regdom_x2 = {
|
||||
.n_reg_rules = 7,
|
||||
.n_reg_rules = 6,
|
||||
.alpha2 = "X2",
|
||||
.reg_rules = {
|
||||
BRCM_2GHZ_2412_2462,
|
||||
|
@ -117,6 +117,7 @@
|
||||
|
||||
#define CHIP_VER_B BIT(4)
|
||||
#define CHIP_92C_BITMASK BIT(0)
|
||||
#define CHIP_UNKNOWN BIT(7)
|
||||
#define CHIP_92C_1T2R 0x03
|
||||
#define CHIP_92C 0x01
|
||||
#define CHIP_88C 0x00
|
||||
|
@ -994,8 +994,16 @@ static enum version_8192c _rtl92ce_read_chip_version(struct ieee80211_hw *hw)
|
||||
version = (value32 & TYPE_ID) ? VERSION_A_CHIP_92C :
|
||||
VERSION_A_CHIP_88C;
|
||||
} else {
|
||||
version = (value32 & TYPE_ID) ? VERSION_B_CHIP_92C :
|
||||
VERSION_B_CHIP_88C;
|
||||
version = (enum version_8192c) (CHIP_VER_B |
|
||||
((value32 & TYPE_ID) ? CHIP_92C_BITMASK : 0) |
|
||||
((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0));
|
||||
if ((!IS_CHIP_VENDOR_UMC(version)) && (value32 &
|
||||
CHIP_VER_RTL_MASK)) {
|
||||
version = (enum version_8192c)(version |
|
||||
((((value32 & CHIP_VER_RTL_MASK) == BIT(12))
|
||||
? CHIP_VENDOR_UMC_B_CUT : CHIP_UNKNOWN) |
|
||||
CHIP_VENDOR_UMC));
|
||||
}
|
||||
}
|
||||
|
||||
switch (version) {
|
||||
|
@ -162,10 +162,12 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
|
||||
|
||||
/* request fw */
|
||||
if (IS_VENDOR_UMC_A_CUT(rtlhal->version) &&
|
||||
!IS_92C_SERIAL(rtlhal->version))
|
||||
!IS_92C_SERIAL(rtlhal->version)) {
|
||||
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU.bin";
|
||||
else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version))
|
||||
} else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) {
|
||||
rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU_B.bin";
|
||||
pr_info("****** This B_CUT device may not work with kernels 3.6 and earlier\n");
|
||||
}
|
||||
|
||||
rtlpriv->max_fw_size = 0x4000;
|
||||
pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
|
||||
|
@ -84,6 +84,8 @@ struct xfrm_replay_state {
|
||||
__u32 bitmap;
|
||||
};
|
||||
|
||||
#define XFRMA_REPLAY_ESN_MAX 4096
|
||||
|
||||
struct xfrm_replay_state_esn {
|
||||
unsigned int bmp_len;
|
||||
__u32 oseq;
|
||||
|
@ -111,9 +111,8 @@ struct rt6_info {
|
||||
struct inet6_dev *rt6i_idev;
|
||||
unsigned long _rt6i_peer;
|
||||
|
||||
#ifdef CONFIG_XFRM
|
||||
u32 rt6i_flow_cache_genid;
|
||||
#endif
|
||||
u32 rt6i_genid;
|
||||
|
||||
/* more non-fragment space at head required */
|
||||
unsigned short rt6i_nfheader_len;
|
||||
|
||||
|
@ -102,6 +102,7 @@ struct net {
|
||||
#endif
|
||||
struct netns_ipvs *ipvs;
|
||||
struct sock *diag_nlsk;
|
||||
atomic_t rt_genid;
|
||||
};
|
||||
|
||||
|
||||
@ -300,5 +301,14 @@ static inline void unregister_net_sysctl_table(struct ctl_table_header *header)
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline int rt_genid(struct net *net)
|
||||
{
|
||||
return atomic_read(&net->rt_genid);
|
||||
}
|
||||
|
||||
static inline void rt_genid_bump(struct net *net)
|
||||
{
|
||||
atomic_inc(&net->rt_genid);
|
||||
}
|
||||
|
||||
#endif /* __NET_NET_NAMESPACE_H */
|
||||
|
@ -65,7 +65,6 @@ struct netns_ipv4 {
|
||||
unsigned int sysctl_ping_group_range[2];
|
||||
long sysctl_tcp_mem[3];
|
||||
|
||||
atomic_t rt_genid;
|
||||
atomic_t dev_addr_genid;
|
||||
|
||||
#ifdef CONFIG_IP_MROUTE
|
||||
|
@ -108,7 +108,7 @@ extern struct ip_rt_acct __percpu *ip_rt_acct;
|
||||
|
||||
struct in_device;
|
||||
extern int ip_rt_init(void);
|
||||
extern void rt_cache_flush(struct net *net, int how);
|
||||
extern void rt_cache_flush(struct net *net);
|
||||
extern void rt_flush_dev(struct net_device *dev);
|
||||
extern struct rtable *__ip_route_output_key(struct net *, struct flowi4 *flp);
|
||||
extern struct rtable *ip_route_output_flow(struct net *, struct flowi4 *flp,
|
||||
|
@ -20,8 +20,8 @@
|
||||
#ifndef _NET_BATMAN_ADV_BITARRAY_H_
|
||||
#define _NET_BATMAN_ADV_BITARRAY_H_
|
||||
|
||||
/* returns true if the corresponding bit in the given seq_bits indicates true
|
||||
* and curr_seqno is within range of last_seqno
|
||||
/* Returns 1 if the corresponding bit in the given seq_bits indicates true
|
||||
* and curr_seqno is within range of last_seqno. Otherwise returns 0.
|
||||
*/
|
||||
static inline int batadv_test_bit(const unsigned long *seq_bits,
|
||||
uint32_t last_seqno, uint32_t curr_seqno)
|
||||
@ -32,7 +32,7 @@ static inline int batadv_test_bit(const unsigned long *seq_bits,
|
||||
if (diff < 0 || diff >= BATADV_TQ_LOCAL_WINDOW_SIZE)
|
||||
return 0;
|
||||
else
|
||||
return test_bit(diff, seq_bits);
|
||||
return test_bit(diff, seq_bits) != 0;
|
||||
}
|
||||
|
||||
/* turn corresponding bit on, so we can remember that we got the packet */
|
||||
|
@ -58,7 +58,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
|
||||
switch (cmd) {
|
||||
case BNEPCONNADD:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
|
||||
if (copy_from_user(&ca, argp, sizeof(ca)))
|
||||
return -EFAULT;
|
||||
@ -84,7 +84,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
|
||||
|
||||
case BNEPCONNDEL:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
|
||||
if (copy_from_user(&cd, argp, sizeof(cd)))
|
||||
return -EFAULT;
|
||||
|
@ -72,7 +72,7 @@ static int cmtp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
|
||||
switch (cmd) {
|
||||
case CMTPCONNADD:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
|
||||
if (copy_from_user(&ca, argp, sizeof(ca)))
|
||||
return -EFAULT;
|
||||
@ -97,7 +97,7 @@ static int cmtp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
|
||||
|
||||
case CMTPCONNDEL:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
|
||||
if (copy_from_user(&cd, argp, sizeof(cd)))
|
||||
return -EFAULT;
|
||||
|
@ -490,7 +490,7 @@ static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd,
|
||||
switch (cmd) {
|
||||
case HCISETRAW:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
|
||||
if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
|
||||
return -EPERM;
|
||||
@ -510,12 +510,12 @@ static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd,
|
||||
|
||||
case HCIBLOCKADDR:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
return hci_sock_blacklist_add(hdev, (void __user *) arg);
|
||||
|
||||
case HCIUNBLOCKADDR:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
return hci_sock_blacklist_del(hdev, (void __user *) arg);
|
||||
|
||||
default:
|
||||
@ -546,22 +546,22 @@ static int hci_sock_ioctl(struct socket *sock, unsigned int cmd,
|
||||
|
||||
case HCIDEVUP:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
return hci_dev_open(arg);
|
||||
|
||||
case HCIDEVDOWN:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
return hci_dev_close(arg);
|
||||
|
||||
case HCIDEVRESET:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
return hci_dev_reset(arg);
|
||||
|
||||
case HCIDEVRESTAT:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
return hci_dev_reset_stat(arg);
|
||||
|
||||
case HCISETSCAN:
|
||||
@ -573,7 +573,7 @@ static int hci_sock_ioctl(struct socket *sock, unsigned int cmd,
|
||||
case HCISETACLMTU:
|
||||
case HCISETSCOMTU:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
return hci_dev_cmd(cmd, argp);
|
||||
|
||||
case HCIINQUIRY:
|
||||
|
@ -56,7 +56,7 @@ static int hidp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
|
||||
switch (cmd) {
|
||||
case HIDPCONNADD:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
|
||||
if (copy_from_user(&ca, argp, sizeof(ca)))
|
||||
return -EFAULT;
|
||||
@ -91,7 +91,7 @@ static int hidp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long
|
||||
|
||||
case HIDPCONNDEL:
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
|
||||
if (copy_from_user(&cd, argp, sizeof(cd)))
|
||||
return -EFAULT;
|
||||
|
@ -2134,7 +2134,8 @@ static bool can_checksum_protocol(netdev_features_t features, __be16 protocol)
|
||||
static netdev_features_t harmonize_features(struct sk_buff *skb,
|
||||
__be16 protocol, netdev_features_t features)
|
||||
{
|
||||
if (!can_checksum_protocol(features, protocol)) {
|
||||
if (skb->ip_summed != CHECKSUM_NONE &&
|
||||
!can_checksum_protocol(features, protocol)) {
|
||||
features &= ~NETIF_F_ALL_CSUM;
|
||||
features &= ~NETIF_F_SG;
|
||||
} else if (illegal_highdma(skb->dev, skb)) {
|
||||
@ -3322,7 +3323,7 @@ ncls:
|
||||
|
||||
if (pt_prev) {
|
||||
if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC)))
|
||||
ret = -ENOMEM;
|
||||
goto drop;
|
||||
else
|
||||
ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev);
|
||||
} else {
|
||||
|
@ -3502,7 +3502,9 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from,
|
||||
if (!skb_cloned(from))
|
||||
skb_shinfo(from)->nr_frags = 0;
|
||||
|
||||
/* if the skb is cloned this does nothing since we set nr_frags to 0 */
|
||||
/* if the skb is not cloned this does nothing
|
||||
* since we set nr_frags to 0.
|
||||
*/
|
||||
for (i = 0; i < skb_shinfo(from)->nr_frags; i++)
|
||||
skb_frag_ref(from, i);
|
||||
|
||||
|
@ -1225,7 +1225,7 @@ static int arp_netdev_event(struct notifier_block *this, unsigned long event,
|
||||
switch (event) {
|
||||
case NETDEV_CHANGEADDR:
|
||||
neigh_changeaddr(&arp_tbl, dev);
|
||||
rt_cache_flush(dev_net(dev), 0);
|
||||
rt_cache_flush(dev_net(dev));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -725,7 +725,7 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
|
||||
break;
|
||||
|
||||
case SIOCSIFFLAGS:
|
||||
ret = -EACCES;
|
||||
ret = -EPERM;
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
goto out;
|
||||
break;
|
||||
@ -733,7 +733,7 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg)
|
||||
case SIOCSIFBRDADDR: /* Set the broadcast address */
|
||||
case SIOCSIFDSTADDR: /* Set the destination address */
|
||||
case SIOCSIFNETMASK: /* Set the netmask for the interface */
|
||||
ret = -EACCES;
|
||||
ret = -EPERM;
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
goto out;
|
||||
ret = -EINVAL;
|
||||
@ -1503,7 +1503,7 @@ static int devinet_conf_proc(ctl_table *ctl, int write,
|
||||
if (i == IPV4_DEVCONF_ACCEPT_LOCAL - 1 ||
|
||||
i == IPV4_DEVCONF_ROUTE_LOCALNET - 1)
|
||||
if ((new_value == 0) && (old_value != 0))
|
||||
rt_cache_flush(net, 0);
|
||||
rt_cache_flush(net);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -1537,7 +1537,7 @@ static int devinet_sysctl_forward(ctl_table *ctl, int write,
|
||||
dev_disable_lro(idev->dev);
|
||||
}
|
||||
rtnl_unlock();
|
||||
rt_cache_flush(net, 0);
|
||||
rt_cache_flush(net);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1554,7 +1554,7 @@ static int ipv4_doint_and_flush(ctl_table *ctl, int write,
|
||||
struct net *net = ctl->extra2;
|
||||
|
||||
if (write && *valp != val)
|
||||
rt_cache_flush(net, 0);
|
||||
rt_cache_flush(net);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -148,7 +148,7 @@ static void fib_flush(struct net *net)
|
||||
}
|
||||
|
||||
if (flushed)
|
||||
rt_cache_flush(net, -1);
|
||||
rt_cache_flush(net);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -999,11 +999,11 @@ static void nl_fib_lookup_exit(struct net *net)
|
||||
net->ipv4.fibnl = NULL;
|
||||
}
|
||||
|
||||
static void fib_disable_ip(struct net_device *dev, int force, int delay)
|
||||
static void fib_disable_ip(struct net_device *dev, int force)
|
||||
{
|
||||
if (fib_sync_down_dev(dev, force))
|
||||
fib_flush(dev_net(dev));
|
||||
rt_cache_flush(dev_net(dev), delay);
|
||||
rt_cache_flush(dev_net(dev));
|
||||
arp_ifdown(dev);
|
||||
}
|
||||
|
||||
@ -1020,7 +1020,7 @@ static int fib_inetaddr_event(struct notifier_block *this, unsigned long event,
|
||||
fib_sync_up(dev);
|
||||
#endif
|
||||
atomic_inc(&net->ipv4.dev_addr_genid);
|
||||
rt_cache_flush(dev_net(dev), -1);
|
||||
rt_cache_flush(dev_net(dev));
|
||||
break;
|
||||
case NETDEV_DOWN:
|
||||
fib_del_ifaddr(ifa, NULL);
|
||||
@ -1029,9 +1029,9 @@ static int fib_inetaddr_event(struct notifier_block *this, unsigned long event,
|
||||
/* Last address was deleted from this interface.
|
||||
* Disable IP.
|
||||
*/
|
||||
fib_disable_ip(dev, 1, 0);
|
||||
fib_disable_ip(dev, 1);
|
||||
} else {
|
||||
rt_cache_flush(dev_net(dev), -1);
|
||||
rt_cache_flush(dev_net(dev));
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1045,7 +1045,7 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo
|
||||
struct net *net = dev_net(dev);
|
||||
|
||||
if (event == NETDEV_UNREGISTER) {
|
||||
fib_disable_ip(dev, 2, -1);
|
||||
fib_disable_ip(dev, 2);
|
||||
rt_flush_dev(dev);
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
@ -1062,14 +1062,14 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo
|
||||
fib_sync_up(dev);
|
||||
#endif
|
||||
atomic_inc(&net->ipv4.dev_addr_genid);
|
||||
rt_cache_flush(dev_net(dev), -1);
|
||||
rt_cache_flush(dev_net(dev));
|
||||
break;
|
||||
case NETDEV_DOWN:
|
||||
fib_disable_ip(dev, 0, 0);
|
||||
fib_disable_ip(dev, 0);
|
||||
break;
|
||||
case NETDEV_CHANGEMTU:
|
||||
case NETDEV_CHANGE:
|
||||
rt_cache_flush(dev_net(dev), 0);
|
||||
rt_cache_flush(dev_net(dev));
|
||||
break;
|
||||
case NETDEV_UNREGISTER_BATCH:
|
||||
break;
|
||||
|
@ -259,7 +259,7 @@ static size_t fib4_rule_nlmsg_payload(struct fib_rule *rule)
|
||||
|
||||
static void fib4_rule_flush_cache(struct fib_rules_ops *ops)
|
||||
{
|
||||
rt_cache_flush(ops->fro_net, -1);
|
||||
rt_cache_flush(ops->fro_net);
|
||||
}
|
||||
|
||||
static const struct fib_rules_ops __net_initdata fib4_rules_ops_template = {
|
||||
|
@ -1286,7 +1286,7 @@ int fib_table_insert(struct fib_table *tb, struct fib_config *cfg)
|
||||
|
||||
fib_release_info(fi_drop);
|
||||
if (state & FA_S_ACCESSED)
|
||||
rt_cache_flush(cfg->fc_nlinfo.nl_net, -1);
|
||||
rt_cache_flush(cfg->fc_nlinfo.nl_net);
|
||||
rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen,
|
||||
tb->tb_id, &cfg->fc_nlinfo, NLM_F_REPLACE);
|
||||
|
||||
@ -1333,7 +1333,7 @@ int fib_table_insert(struct fib_table *tb, struct fib_config *cfg)
|
||||
list_add_tail_rcu(&new_fa->fa_list,
|
||||
(fa ? &fa->fa_list : fa_head));
|
||||
|
||||
rt_cache_flush(cfg->fc_nlinfo.nl_net, -1);
|
||||
rt_cache_flush(cfg->fc_nlinfo.nl_net);
|
||||
rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id,
|
||||
&cfg->fc_nlinfo, 0);
|
||||
succeeded:
|
||||
@ -1708,7 +1708,7 @@ int fib_table_delete(struct fib_table *tb, struct fib_config *cfg)
|
||||
trie_leaf_remove(t, l);
|
||||
|
||||
if (fa->fa_state & FA_S_ACCESSED)
|
||||
rt_cache_flush(cfg->fc_nlinfo.nl_net, -1);
|
||||
rt_cache_flush(cfg->fc_nlinfo.nl_net);
|
||||
|
||||
fib_release_info(fa->fa_info);
|
||||
alias_free_mem_rcu(fa);
|
||||
|
@ -202,11 +202,6 @@ EXPORT_SYMBOL(ip_tos2prio);
|
||||
static DEFINE_PER_CPU(struct rt_cache_stat, rt_cache_stat);
|
||||
#define RT_CACHE_STAT_INC(field) __this_cpu_inc(rt_cache_stat.field)
|
||||
|
||||
static inline int rt_genid(struct net *net)
|
||||
{
|
||||
return atomic_read(&net->ipv4.rt_genid);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
{
|
||||
@ -447,27 +442,9 @@ static inline bool rt_is_expired(const struct rtable *rth)
|
||||
return rth->rt_genid != rt_genid(dev_net(rth->dst.dev));
|
||||
}
|
||||
|
||||
/*
|
||||
* Perturbation of rt_genid by a small quantity [1..256]
|
||||
* Using 8 bits of shuffling ensure we can call rt_cache_invalidate()
|
||||
* many times (2^24) without giving recent rt_genid.
|
||||
* Jenkins hash is strong enough that litle changes of rt_genid are OK.
|
||||
*/
|
||||
static void rt_cache_invalidate(struct net *net)
|
||||
void rt_cache_flush(struct net *net)
|
||||
{
|
||||
unsigned char shuffle;
|
||||
|
||||
get_random_bytes(&shuffle, sizeof(shuffle));
|
||||
atomic_add(shuffle + 1U, &net->ipv4.rt_genid);
|
||||
}
|
||||
|
||||
/*
|
||||
* delay < 0 : invalidate cache (fast : entries will be deleted later)
|
||||
* delay >= 0 : invalidate & flush cache (can be long)
|
||||
*/
|
||||
void rt_cache_flush(struct net *net, int delay)
|
||||
{
|
||||
rt_cache_invalidate(net);
|
||||
rt_genid_bump(net);
|
||||
}
|
||||
|
||||
static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst,
|
||||
@ -2345,7 +2322,7 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
|
||||
void ip_rt_multicast_event(struct in_device *in_dev)
|
||||
{
|
||||
rt_cache_flush(dev_net(in_dev->dev), 0);
|
||||
rt_cache_flush(dev_net(in_dev->dev));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SYSCTL
|
||||
@ -2354,16 +2331,7 @@ static int ipv4_sysctl_rtcache_flush(ctl_table *__ctl, int write,
|
||||
size_t *lenp, loff_t *ppos)
|
||||
{
|
||||
if (write) {
|
||||
int flush_delay;
|
||||
ctl_table ctl;
|
||||
struct net *net;
|
||||
|
||||
memcpy(&ctl, __ctl, sizeof(ctl));
|
||||
ctl.data = &flush_delay;
|
||||
proc_dointvec(&ctl, write, buffer, lenp, ppos);
|
||||
|
||||
net = (struct net *)__ctl->extra1;
|
||||
rt_cache_flush(net, flush_delay);
|
||||
rt_cache_flush((struct net *)__ctl->extra1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2533,8 +2501,7 @@ static __net_initdata struct pernet_operations sysctl_route_ops = {
|
||||
|
||||
static __net_init int rt_genid_init(struct net *net)
|
||||
{
|
||||
get_random_bytes(&net->ipv4.rt_genid,
|
||||
sizeof(net->ipv4.rt_genid));
|
||||
atomic_set(&net->rt_genid, 0);
|
||||
get_random_bytes(&net->ipv4.dev_addr_genid,
|
||||
sizeof(net->ipv4.dev_addr_genid));
|
||||
return 0;
|
||||
|
@ -1762,8 +1762,14 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NET_DMA
|
||||
if (tp->ucopy.dma_chan)
|
||||
if (tp->ucopy.dma_chan) {
|
||||
if (tp->rcv_wnd == 0 &&
|
||||
!skb_queue_empty(&sk->sk_async_wait_queue)) {
|
||||
tcp_service_net_dma(sk, true);
|
||||
tcp_cleanup_rbuf(sk, copied);
|
||||
} else
|
||||
dma_async_memcpy_issue_pending(tp->ucopy.dma_chan);
|
||||
}
|
||||
#endif
|
||||
if (copied >= target) {
|
||||
/* Do not sleep, just process backlog. */
|
||||
@ -2325,10 +2331,17 @@ static int tcp_repair_options_est(struct tcp_sock *tp,
|
||||
tp->rx_opt.mss_clamp = opt.opt_val;
|
||||
break;
|
||||
case TCPOPT_WINDOW:
|
||||
if (opt.opt_val > 14)
|
||||
{
|
||||
u16 snd_wscale = opt.opt_val & 0xFFFF;
|
||||
u16 rcv_wscale = opt.opt_val >> 16;
|
||||
|
||||
if (snd_wscale > 14 || rcv_wscale > 14)
|
||||
return -EFBIG;
|
||||
|
||||
tp->rx_opt.snd_wscale = opt.opt_val;
|
||||
tp->rx_opt.snd_wscale = snd_wscale;
|
||||
tp->rx_opt.rcv_wscale = rcv_wscale;
|
||||
tp->rx_opt.wscale_ok = 1;
|
||||
}
|
||||
break;
|
||||
case TCPOPT_SACK_PERM:
|
||||
if (opt.opt_val != 0)
|
||||
|
@ -4661,7 +4661,7 @@ queue_and_out:
|
||||
|
||||
if (eaten > 0)
|
||||
kfree_skb_partial(skb, fragstolen);
|
||||
else if (!sock_flag(sk, SOCK_DEAD))
|
||||
if (!sock_flag(sk, SOCK_DEAD))
|
||||
sk->sk_data_ready(sk, 0);
|
||||
return;
|
||||
}
|
||||
@ -5556,7 +5556,6 @@ no_ack:
|
||||
#endif
|
||||
if (eaten)
|
||||
kfree_skb_partial(skb, fragstolen);
|
||||
else
|
||||
sk->sk_data_ready(sk, 0);
|
||||
return 0;
|
||||
}
|
||||
|
@ -175,33 +175,12 @@ void __inet6_csk_dst_store(struct sock *sk, struct dst_entry *dst,
|
||||
const struct in6_addr *saddr)
|
||||
{
|
||||
__ip6_dst_store(sk, dst, daddr, saddr);
|
||||
|
||||
#ifdef CONFIG_XFRM
|
||||
{
|
||||
struct rt6_info *rt = (struct rt6_info *)dst;
|
||||
rt->rt6i_flow_cache_genid = atomic_read(&flow_cache_genid);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline
|
||||
struct dst_entry *__inet6_csk_dst_check(struct sock *sk, u32 cookie)
|
||||
{
|
||||
struct dst_entry *dst;
|
||||
|
||||
dst = __sk_dst_check(sk, cookie);
|
||||
|
||||
#ifdef CONFIG_XFRM
|
||||
if (dst) {
|
||||
struct rt6_info *rt = (struct rt6_info *)dst;
|
||||
if (rt->rt6i_flow_cache_genid != atomic_read(&flow_cache_genid)) {
|
||||
__sk_dst_reset(sk);
|
||||
dst = NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return dst;
|
||||
return __sk_dst_check(sk, cookie);
|
||||
}
|
||||
|
||||
static struct dst_entry *inet6_csk_route_socket(struct sock *sk,
|
||||
|
@ -819,6 +819,10 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nl_info *info)
|
||||
offsetof(struct rt6_info, rt6i_src),
|
||||
allow_create, replace_required);
|
||||
|
||||
if (IS_ERR(sn)) {
|
||||
err = PTR_ERR(sn);
|
||||
sn = NULL;
|
||||
}
|
||||
if (!sn) {
|
||||
/* If it is failed, discard just allocated
|
||||
root, and then (in st_failure) stale node
|
||||
|
@ -226,7 +226,7 @@ static struct rt6_info ip6_null_entry_template = {
|
||||
.dst = {
|
||||
.__refcnt = ATOMIC_INIT(1),
|
||||
.__use = 1,
|
||||
.obsolete = -1,
|
||||
.obsolete = DST_OBSOLETE_FORCE_CHK,
|
||||
.error = -ENETUNREACH,
|
||||
.input = ip6_pkt_discard,
|
||||
.output = ip6_pkt_discard_out,
|
||||
@ -246,7 +246,7 @@ static struct rt6_info ip6_prohibit_entry_template = {
|
||||
.dst = {
|
||||
.__refcnt = ATOMIC_INIT(1),
|
||||
.__use = 1,
|
||||
.obsolete = -1,
|
||||
.obsolete = DST_OBSOLETE_FORCE_CHK,
|
||||
.error = -EACCES,
|
||||
.input = ip6_pkt_prohibit,
|
||||
.output = ip6_pkt_prohibit_out,
|
||||
@ -261,7 +261,7 @@ static struct rt6_info ip6_blk_hole_entry_template = {
|
||||
.dst = {
|
||||
.__refcnt = ATOMIC_INIT(1),
|
||||
.__use = 1,
|
||||
.obsolete = -1,
|
||||
.obsolete = DST_OBSOLETE_FORCE_CHK,
|
||||
.error = -EINVAL,
|
||||
.input = dst_discard,
|
||||
.output = dst_discard,
|
||||
@ -281,13 +281,14 @@ static inline struct rt6_info *ip6_dst_alloc(struct net *net,
|
||||
struct fib6_table *table)
|
||||
{
|
||||
struct rt6_info *rt = dst_alloc(&net->ipv6.ip6_dst_ops, dev,
|
||||
0, DST_OBSOLETE_NONE, flags);
|
||||
0, DST_OBSOLETE_FORCE_CHK, flags);
|
||||
|
||||
if (rt) {
|
||||
struct dst_entry *dst = &rt->dst;
|
||||
|
||||
memset(dst + 1, 0, sizeof(*rt) - sizeof(*dst));
|
||||
rt6_init_peer(rt, table ? &table->tb6_peers : net->ipv6.peers);
|
||||
rt->rt6i_genid = rt_genid(net);
|
||||
}
|
||||
return rt;
|
||||
}
|
||||
@ -1031,6 +1032,13 @@ static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie)
|
||||
|
||||
rt = (struct rt6_info *) dst;
|
||||
|
||||
/* All IPV6 dsts are created with ->obsolete set to the value
|
||||
* DST_OBSOLETE_FORCE_CHK which forces validation calls down
|
||||
* into this function always.
|
||||
*/
|
||||
if (rt->rt6i_genid != rt_genid(dev_net(rt->dst.dev)))
|
||||
return NULL;
|
||||
|
||||
if (rt->rt6i_node && (rt->rt6i_node->fn_sernum == cookie)) {
|
||||
if (rt->rt6i_peer_genid != rt6_peer_genid()) {
|
||||
if (!rt6_has_peer(rt))
|
||||
@ -1397,8 +1405,6 @@ int ip6_route_add(struct fib6_config *cfg)
|
||||
goto out;
|
||||
}
|
||||
|
||||
rt->dst.obsolete = -1;
|
||||
|
||||
if (cfg->fc_flags & RTF_EXPIRES)
|
||||
rt6_set_expires(rt, jiffies +
|
||||
clock_t_to_jiffies(cfg->fc_expires));
|
||||
@ -2080,7 +2086,6 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
|
||||
rt->dst.input = ip6_input;
|
||||
rt->dst.output = ip6_output;
|
||||
rt->rt6i_idev = idev;
|
||||
rt->dst.obsolete = -1;
|
||||
|
||||
rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP;
|
||||
if (anycast)
|
||||
|
@ -601,7 +601,7 @@ static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
|
||||
if (!capable(CAP_NET_BIND_SERVICE)) {
|
||||
dev_put(dev);
|
||||
release_sock(sk);
|
||||
return -EACCES;
|
||||
return -EPERM;
|
||||
}
|
||||
nr->user_addr = addr->fsa_digipeater[0];
|
||||
nr->source_addr = addr->fsa_ax25.sax25_call;
|
||||
|
@ -865,7 +865,10 @@ static void qfq_update_start(struct qfq_sched *q, struct qfq_class *cl)
|
||||
if (mask) {
|
||||
struct qfq_group *next = qfq_ffs(q, mask);
|
||||
if (qfq_gt(roundedF, next->F)) {
|
||||
if (qfq_gt(limit, next->F))
|
||||
cl->S = next->F;
|
||||
else /* preserve timestamp correctness */
|
||||
cl->S = limit;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -585,6 +585,7 @@ int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl)
|
||||
xfrm_pol_hold(policy);
|
||||
net->xfrm.policy_count[dir]++;
|
||||
atomic_inc(&flow_cache_genid);
|
||||
rt_genid_bump(net);
|
||||
if (delpol)
|
||||
__xfrm_policy_unlink(delpol, dir);
|
||||
policy->index = delpol ? delpol->index : xfrm_gen_index(net, dir);
|
||||
@ -1763,7 +1764,7 @@ static struct dst_entry *make_blackhole(struct net *net, u16 family,
|
||||
|
||||
if (!afinfo) {
|
||||
dst_release(dst_orig);
|
||||
ret = ERR_PTR(-EINVAL);
|
||||
return ERR_PTR(-EINVAL);
|
||||
} else {
|
||||
ret = afinfo->blackhole_route(net, dst_orig);
|
||||
}
|
||||
|
@ -123,10 +123,22 @@ static inline int verify_replay(struct xfrm_usersa_info *p,
|
||||
struct nlattr **attrs)
|
||||
{
|
||||
struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL];
|
||||
struct xfrm_replay_state_esn *rs;
|
||||
|
||||
if ((p->flags & XFRM_STATE_ESN) && !rt)
|
||||
if (p->flags & XFRM_STATE_ESN) {
|
||||
if (!rt)
|
||||
return -EINVAL;
|
||||
|
||||
rs = nla_data(rt);
|
||||
|
||||
if (rs->bmp_len > XFRMA_REPLAY_ESN_MAX / sizeof(rs->bmp[0]) / 8)
|
||||
return -EINVAL;
|
||||
|
||||
if (nla_len(rt) < xfrm_replay_state_esn_len(rs) &&
|
||||
nla_len(rt) != sizeof(*rs))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!rt)
|
||||
return 0;
|
||||
|
||||
@ -370,14 +382,15 @@ static inline int xfrm_replay_verify_len(struct xfrm_replay_state_esn *replay_es
|
||||
struct nlattr *rp)
|
||||
{
|
||||
struct xfrm_replay_state_esn *up;
|
||||
int ulen;
|
||||
|
||||
if (!replay_esn || !rp)
|
||||
return 0;
|
||||
|
||||
up = nla_data(rp);
|
||||
ulen = xfrm_replay_state_esn_len(up);
|
||||
|
||||
if (xfrm_replay_state_esn_len(replay_esn) !=
|
||||
xfrm_replay_state_esn_len(up))
|
||||
if (nla_len(rp) < ulen || xfrm_replay_state_esn_len(replay_esn) != ulen)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
@ -388,22 +401,28 @@ static int xfrm_alloc_replay_state_esn(struct xfrm_replay_state_esn **replay_esn
|
||||
struct nlattr *rta)
|
||||
{
|
||||
struct xfrm_replay_state_esn *p, *pp, *up;
|
||||
int klen, ulen;
|
||||
|
||||
if (!rta)
|
||||
return 0;
|
||||
|
||||
up = nla_data(rta);
|
||||
klen = xfrm_replay_state_esn_len(up);
|
||||
ulen = nla_len(rta) >= klen ? klen : sizeof(*up);
|
||||
|
||||
p = kmemdup(up, xfrm_replay_state_esn_len(up), GFP_KERNEL);
|
||||
p = kzalloc(klen, GFP_KERNEL);
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
|
||||
pp = kmemdup(up, xfrm_replay_state_esn_len(up), GFP_KERNEL);
|
||||
pp = kzalloc(klen, GFP_KERNEL);
|
||||
if (!pp) {
|
||||
kfree(p);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memcpy(p, up, ulen);
|
||||
memcpy(pp, up, ulen);
|
||||
|
||||
*replay_esn = p;
|
||||
*preplay_esn = pp;
|
||||
|
||||
@ -442,10 +461,11 @@ static void copy_from_user_state(struct xfrm_state *x, struct xfrm_usersa_info *
|
||||
* somehow made shareable and move it to xfrm_state.c - JHS
|
||||
*
|
||||
*/
|
||||
static void xfrm_update_ae_params(struct xfrm_state *x, struct nlattr **attrs)
|
||||
static void xfrm_update_ae_params(struct xfrm_state *x, struct nlattr **attrs,
|
||||
int update_esn)
|
||||
{
|
||||
struct nlattr *rp = attrs[XFRMA_REPLAY_VAL];
|
||||
struct nlattr *re = attrs[XFRMA_REPLAY_ESN_VAL];
|
||||
struct nlattr *re = update_esn ? attrs[XFRMA_REPLAY_ESN_VAL] : NULL;
|
||||
struct nlattr *lt = attrs[XFRMA_LTIME_VAL];
|
||||
struct nlattr *et = attrs[XFRMA_ETIMER_THRESH];
|
||||
struct nlattr *rt = attrs[XFRMA_REPLAY_THRESH];
|
||||
@ -555,7 +575,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,
|
||||
goto error;
|
||||
|
||||
/* override default values from above */
|
||||
xfrm_update_ae_params(x, attrs);
|
||||
xfrm_update_ae_params(x, attrs, 0);
|
||||
|
||||
return x;
|
||||
|
||||
@ -689,6 +709,7 @@ out:
|
||||
|
||||
static void copy_to_user_state(struct xfrm_state *x, struct xfrm_usersa_info *p)
|
||||
{
|
||||
memset(p, 0, sizeof(*p));
|
||||
memcpy(&p->id, &x->id, sizeof(p->id));
|
||||
memcpy(&p->sel, &x->sel, sizeof(p->sel));
|
||||
memcpy(&p->lft, &x->lft, sizeof(p->lft));
|
||||
@ -742,7 +763,7 @@ static int copy_to_user_auth(struct xfrm_algo_auth *auth, struct sk_buff *skb)
|
||||
return -EMSGSIZE;
|
||||
|
||||
algo = nla_data(nla);
|
||||
strcpy(algo->alg_name, auth->alg_name);
|
||||
strncpy(algo->alg_name, auth->alg_name, sizeof(algo->alg_name));
|
||||
memcpy(algo->alg_key, auth->alg_key, (auth->alg_key_len + 7) / 8);
|
||||
algo->alg_key_len = auth->alg_key_len;
|
||||
|
||||
@ -878,6 +899,7 @@ static struct sk_buff *xfrm_state_netlink(struct sk_buff *in_skb,
|
||||
{
|
||||
struct xfrm_dump_info info;
|
||||
struct sk_buff *skb;
|
||||
int err;
|
||||
|
||||
skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
|
||||
if (!skb)
|
||||
@ -888,9 +910,10 @@ static struct sk_buff *xfrm_state_netlink(struct sk_buff *in_skb,
|
||||
info.nlmsg_seq = seq;
|
||||
info.nlmsg_flags = 0;
|
||||
|
||||
if (dump_one_state(x, 0, &info)) {
|
||||
err = dump_one_state(x, 0, &info);
|
||||
if (err) {
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
return skb;
|
||||
@ -1317,6 +1340,7 @@ static void copy_from_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy
|
||||
|
||||
static void copy_to_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p, int dir)
|
||||
{
|
||||
memset(p, 0, sizeof(*p));
|
||||
memcpy(&p->sel, &xp->selector, sizeof(p->sel));
|
||||
memcpy(&p->lft, &xp->lft, sizeof(p->lft));
|
||||
memcpy(&p->curlft, &xp->curlft, sizeof(p->curlft));
|
||||
@ -1421,6 +1445,7 @@ static int copy_to_user_tmpl(struct xfrm_policy *xp, struct sk_buff *skb)
|
||||
struct xfrm_user_tmpl *up = &vec[i];
|
||||
struct xfrm_tmpl *kp = &xp->xfrm_vec[i];
|
||||
|
||||
memset(up, 0, sizeof(*up));
|
||||
memcpy(&up->id, &kp->id, sizeof(up->id));
|
||||
up->family = kp->encap_family;
|
||||
memcpy(&up->saddr, &kp->saddr, sizeof(up->saddr));
|
||||
@ -1546,6 +1571,7 @@ static struct sk_buff *xfrm_policy_netlink(struct sk_buff *in_skb,
|
||||
{
|
||||
struct xfrm_dump_info info;
|
||||
struct sk_buff *skb;
|
||||
int err;
|
||||
|
||||
skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
|
||||
if (!skb)
|
||||
@ -1556,9 +1582,10 @@ static struct sk_buff *xfrm_policy_netlink(struct sk_buff *in_skb,
|
||||
info.nlmsg_seq = seq;
|
||||
info.nlmsg_flags = 0;
|
||||
|
||||
if (dump_one_policy(xp, dir, 0, &info) < 0) {
|
||||
err = dump_one_policy(xp, dir, 0, &info);
|
||||
if (err) {
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
return skb;
|
||||
@ -1822,7 +1849,7 @@ static int xfrm_new_ae(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||
goto out;
|
||||
|
||||
spin_lock_bh(&x->lock);
|
||||
xfrm_update_ae_params(x, attrs);
|
||||
xfrm_update_ae_params(x, attrs, 1);
|
||||
spin_unlock_bh(&x->lock);
|
||||
|
||||
c.event = nlh->nlmsg_type;
|
||||
|
@ -51,6 +51,7 @@ int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall);
|
||||
static inline void selinux_xfrm_notify_policyload(void)
|
||||
{
|
||||
atomic_inc(&flow_cache_genid);
|
||||
rt_genid_bump(&init_net);
|
||||
}
|
||||
#else
|
||||
static inline int selinux_xfrm_enabled(void)
|
||||
|
Loading…
Reference in New Issue
Block a user