Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c The bnx2x gso_type setting bug fix in 'net' conflicted with changes in 'net-next' that broke the gso_* setting logic out into a seperate function, which also fixes the bug in question. Thus, use the 'net-next' version. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
9f6d98c298
|
@ -1399,6 +1399,7 @@ static void ixgbe_set_rsc_gso_size(struct ixgbe_ring *ring,
|
|||
/* set gso_size to avoid messing up TCP MSS */
|
||||
skb_shinfo(skb)->gso_size = DIV_ROUND_UP((skb->len - hdr_len),
|
||||
IXGBE_CB(skb)->append_cnt);
|
||||
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
|
||||
}
|
||||
|
||||
static void ixgbe_update_rsc_stats(struct ixgbe_ring *rx_ring,
|
||||
|
|
|
@ -1043,8 +1043,13 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter,
|
|||
th->seq = htonl(seq_number);
|
||||
length = skb->len;
|
||||
|
||||
if (adapter->flags & QLCNIC_FW_LRO_MSS_CAP)
|
||||
if (adapter->flags & QLCNIC_FW_LRO_MSS_CAP) {
|
||||
skb_shinfo(skb)->gso_size = qlcnic_get_lro_sts_mss(sts_data1);
|
||||
if (skb->protocol == htons(ETH_P_IPV6))
|
||||
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
|
||||
else
|
||||
skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
|
||||
}
|
||||
|
||||
if (vid != 0xffff)
|
||||
__vlan_hwaccel_put_tag(skb, vid);
|
||||
|
|
|
@ -450,7 +450,6 @@ enum rtl8168_registers {
|
|||
#define PWM_EN (1 << 22)
|
||||
#define RXDV_GATED_EN (1 << 19)
|
||||
#define EARLY_TALLY_EN (1 << 16)
|
||||
#define FORCE_CLK (1 << 15) /* force clock request */
|
||||
};
|
||||
|
||||
enum rtl_register_content {
|
||||
|
@ -514,7 +513,6 @@ enum rtl_register_content {
|
|||
PMEnable = (1 << 0), /* Power Management Enable */
|
||||
|
||||
/* Config2 register p. 25 */
|
||||
ClkReqEn = (1 << 7), /* Clock Request Enable */
|
||||
MSIEnable = (1 << 5), /* 8169 only. Reserved in the 8168. */
|
||||
PCI_Clock_66MHz = 0x01,
|
||||
PCI_Clock_33MHz = 0x00,
|
||||
|
@ -535,7 +533,6 @@ enum rtl_register_content {
|
|||
Spi_en = (1 << 3),
|
||||
LanWake = (1 << 1), /* LanWake enable/disable */
|
||||
PMEStatus = (1 << 0), /* PME status can be reset by PCI RST# */
|
||||
ASPM_en = (1 << 0), /* ASPM enable */
|
||||
|
||||
/* TBICSR p.28 */
|
||||
TBIReset = 0x80000000,
|
||||
|
@ -684,7 +681,6 @@ enum features {
|
|||
RTL_FEATURE_WOL = (1 << 0),
|
||||
RTL_FEATURE_MSI = (1 << 1),
|
||||
RTL_FEATURE_GMII = (1 << 2),
|
||||
RTL_FEATURE_FW_LOADED = (1 << 3),
|
||||
};
|
||||
|
||||
struct rtl8169_counters {
|
||||
|
@ -2388,10 +2384,8 @@ static void rtl_apply_firmware(struct rtl8169_private *tp)
|
|||
struct rtl_fw *rtl_fw = tp->rtl_fw;
|
||||
|
||||
/* TODO: release firmware once rtl_phy_write_fw signals failures. */
|
||||
if (!IS_ERR_OR_NULL(rtl_fw)) {
|
||||
if (!IS_ERR_OR_NULL(rtl_fw))
|
||||
rtl_phy_write_fw(tp, rtl_fw);
|
||||
tp->features |= RTL_FEATURE_FW_LOADED;
|
||||
}
|
||||
}
|
||||
|
||||
static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)
|
||||
|
@ -2402,31 +2396,6 @@ static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)
|
|||
rtl_apply_firmware(tp);
|
||||
}
|
||||
|
||||
static void r810x_aldps_disable(struct rtl8169_private *tp)
|
||||
{
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_writephy(tp, 0x18, 0x0310);
|
||||
msleep(100);
|
||||
}
|
||||
|
||||
static void r810x_aldps_enable(struct rtl8169_private *tp)
|
||||
{
|
||||
if (!(tp->features & RTL_FEATURE_FW_LOADED))
|
||||
return;
|
||||
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_writephy(tp, 0x18, 0x8310);
|
||||
}
|
||||
|
||||
static void r8168_aldps_enable_1(struct rtl8169_private *tp)
|
||||
{
|
||||
if (!(tp->features & RTL_FEATURE_FW_LOADED))
|
||||
return;
|
||||
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_w1w0_phy(tp, 0x15, 0x1000, 0x0000);
|
||||
}
|
||||
|
||||
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp)
|
||||
{
|
||||
static const struct phy_reg phy_reg_init[] = {
|
||||
|
@ -3217,8 +3186,6 @@ static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)
|
|||
rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
|
||||
r8168_aldps_enable_1(tp);
|
||||
|
||||
/* Broken BIOS workaround: feed GigaMAC registers with MAC address. */
|
||||
rtl_rar_exgmac_set(tp, tp->dev->dev_addr);
|
||||
}
|
||||
|
@ -3293,8 +3260,6 @@ static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp)
|
|||
rtl_writephy(tp, 0x05, 0x8b85);
|
||||
rtl_w1w0_phy(tp, 0x06, 0x4000, 0x0000);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
|
||||
r8168_aldps_enable_1(tp);
|
||||
}
|
||||
|
||||
static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp)
|
||||
|
@ -3302,8 +3267,6 @@ static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp)
|
|||
rtl_apply_firmware(tp);
|
||||
|
||||
rtl8168f_hw_phy_config(tp);
|
||||
|
||||
r8168_aldps_enable_1(tp);
|
||||
}
|
||||
|
||||
static void rtl8411_hw_phy_config(struct rtl8169_private *tp)
|
||||
|
@ -3401,8 +3364,6 @@ static void rtl8411_hw_phy_config(struct rtl8169_private *tp)
|
|||
rtl_w1w0_phy(tp, 0x19, 0x0000, 0x0001);
|
||||
rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
|
||||
r8168_aldps_enable_1(tp);
|
||||
}
|
||||
|
||||
static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp)
|
||||
|
@ -3488,19 +3449,21 @@ static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)
|
|||
};
|
||||
|
||||
/* Disable ALDPS before ram code */
|
||||
r810x_aldps_disable(tp);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_writephy(tp, 0x18, 0x0310);
|
||||
msleep(100);
|
||||
|
||||
rtl_apply_firmware(tp);
|
||||
|
||||
rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
|
||||
|
||||
r810x_aldps_enable(tp);
|
||||
}
|
||||
|
||||
static void rtl8402_hw_phy_config(struct rtl8169_private *tp)
|
||||
{
|
||||
/* Disable ALDPS before setting firmware */
|
||||
r810x_aldps_disable(tp);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_writephy(tp, 0x18, 0x0310);
|
||||
msleep(20);
|
||||
|
||||
rtl_apply_firmware(tp);
|
||||
|
||||
|
@ -3510,8 +3473,6 @@ static void rtl8402_hw_phy_config(struct rtl8169_private *tp)
|
|||
rtl_writephy(tp, 0x10, 0x401f);
|
||||
rtl_writephy(tp, 0x19, 0x7030);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
|
||||
r810x_aldps_enable(tp);
|
||||
}
|
||||
|
||||
static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)
|
||||
|
@ -3524,7 +3485,9 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)
|
|||
};
|
||||
|
||||
/* Disable ALDPS before ram code */
|
||||
r810x_aldps_disable(tp);
|
||||
rtl_writephy(tp, 0x1f, 0x0000);
|
||||
rtl_writephy(tp, 0x18, 0x0310);
|
||||
msleep(100);
|
||||
|
||||
rtl_apply_firmware(tp);
|
||||
|
||||
|
@ -3532,8 +3495,6 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)
|
|||
rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));
|
||||
|
||||
rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
|
||||
|
||||
r810x_aldps_enable(tp);
|
||||
}
|
||||
|
||||
static void rtl_hw_phy_config(struct net_device *dev)
|
||||
|
@ -5050,6 +5011,8 @@ static void rtl_hw_start_8168e_2(struct rtl8169_private *tp)
|
|||
|
||||
RTL_W8(MaxTxPacketSize, EarlySize);
|
||||
|
||||
rtl_disable_clock_request(pdev);
|
||||
|
||||
RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
|
||||
RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
|
||||
|
||||
|
@ -5058,8 +5021,7 @@ static void rtl_hw_start_8168e_2(struct rtl8169_private *tp)
|
|||
|
||||
RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
|
||||
RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
|
||||
RTL_W8(Config5, (RTL_R8(Config5) & ~Spi_en) | ASPM_en);
|
||||
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
|
||||
RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
|
||||
}
|
||||
|
||||
static void rtl_hw_start_8168f(struct rtl8169_private *tp)
|
||||
|
@ -5084,12 +5046,13 @@ static void rtl_hw_start_8168f(struct rtl8169_private *tp)
|
|||
|
||||
RTL_W8(MaxTxPacketSize, EarlySize);
|
||||
|
||||
rtl_disable_clock_request(pdev);
|
||||
|
||||
RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
|
||||
RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
|
||||
RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
|
||||
RTL_W32(MISC, RTL_R32(MISC) | PWM_EN | FORCE_CLK);
|
||||
RTL_W8(Config5, (RTL_R8(Config5) & ~Spi_en) | ASPM_en);
|
||||
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
|
||||
RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
|
||||
RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
|
||||
}
|
||||
|
||||
static void rtl_hw_start_8168f_1(struct rtl8169_private *tp)
|
||||
|
@ -5146,10 +5109,8 @@ static void rtl_hw_start_8168g_1(struct rtl8169_private *tp)
|
|||
rtl_w1w0_eri(tp, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, ERIAR_EXGMAC);
|
||||
|
||||
RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
|
||||
RTL_W32(MISC, (RTL_R32(MISC) | FORCE_CLK) & ~RXDV_GATED_EN);
|
||||
RTL_W32(MISC, RTL_R32(MISC) & ~RXDV_GATED_EN);
|
||||
RTL_W8(MaxTxPacketSize, EarlySize);
|
||||
RTL_W8(Config5, RTL_R8(Config5) | ASPM_en);
|
||||
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
|
||||
|
||||
rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
|
||||
rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
|
||||
|
@ -5365,9 +5326,6 @@ static void rtl_hw_start_8105e_1(struct rtl8169_private *tp)
|
|||
|
||||
RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
|
||||
RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
|
||||
RTL_W8(Config5, RTL_R8(Config5) | ASPM_en);
|
||||
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
|
||||
RTL_W32(MISC, RTL_R32(MISC) | FORCE_CLK);
|
||||
|
||||
rtl_ephy_init(tp, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1));
|
||||
}
|
||||
|
@ -5393,9 +5351,6 @@ static void rtl_hw_start_8402(struct rtl8169_private *tp)
|
|||
|
||||
RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
|
||||
RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
|
||||
RTL_W8(Config5, RTL_R8(Config5) | ASPM_en);
|
||||
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
|
||||
RTL_W32(MISC, RTL_R32(MISC) | FORCE_CLK);
|
||||
|
||||
rtl_ephy_init(tp, e_info_8402, ARRAY_SIZE(e_info_8402));
|
||||
|
||||
|
@ -5417,10 +5372,7 @@ static void rtl_hw_start_8106(struct rtl8169_private *tp)
|
|||
/* Force LAN exit from ASPM if Rx/Tx are not idle */
|
||||
RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800);
|
||||
|
||||
RTL_W32(MISC,
|
||||
(RTL_R32(MISC) | DISABLE_LAN_EN | FORCE_CLK) & ~EARLY_TALLY_EN);
|
||||
RTL_W8(Config5, RTL_R8(Config5) | ASPM_en);
|
||||
RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);
|
||||
RTL_W32(MISC, (RTL_R32(MISC) | DISABLE_LAN_EN) & ~EARLY_TALLY_EN);
|
||||
RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
|
||||
RTL_W8(DLLPR, RTL_R8(DLLPR) & ~PFM_EN);
|
||||
}
|
||||
|
|
|
@ -69,7 +69,7 @@
|
|||
|
||||
#undef STMMAC_XMIT_DEBUG
|
||||
/*#define STMMAC_XMIT_DEBUG*/
|
||||
#ifdef STMMAC_TX_DEBUG
|
||||
#ifdef STMMAC_XMIT_DEBUG
|
||||
#define TX_DBG(fmt, args...) printk(fmt, ## args)
|
||||
#else
|
||||
#define TX_DBG(fmt, args...) do { } while (0)
|
||||
|
|
|
@ -188,8 +188,6 @@ int stmmac_mdio_register(struct net_device *ndev)
|
|||
goto bus_register_fail;
|
||||
}
|
||||
|
||||
priv->mii = new_bus;
|
||||
|
||||
found = 0;
|
||||
for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
|
||||
struct phy_device *phydev = new_bus->phy_map[addr];
|
||||
|
@ -237,8 +235,14 @@ int stmmac_mdio_register(struct net_device *ndev)
|
|||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
if (!found) {
|
||||
pr_warning("%s: No PHY found\n", ndev->name);
|
||||
mdiobus_unregister(new_bus);
|
||||
mdiobus_free(new_bus);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
priv->mii = new_bus;
|
||||
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -411,6 +411,7 @@ static const struct usb_device_id products[] = {
|
|||
},
|
||||
|
||||
/* 3. Combined interface devices matching on interface number */
|
||||
{QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */
|
||||
{QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0002, 1)},
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0012, 1)},
|
||||
|
|
|
@ -334,20 +334,20 @@ struct mwl8k_sta {
|
|||
#define MWL8K_STA(_sta) ((struct mwl8k_sta *)&((_sta)->drv_priv))
|
||||
|
||||
static const struct ieee80211_channel mwl8k_channels_24[] = {
|
||||
{ .center_freq = 2412, .hw_value = 1, },
|
||||
{ .center_freq = 2417, .hw_value = 2, },
|
||||
{ .center_freq = 2422, .hw_value = 3, },
|
||||
{ .center_freq = 2427, .hw_value = 4, },
|
||||
{ .center_freq = 2432, .hw_value = 5, },
|
||||
{ .center_freq = 2437, .hw_value = 6, },
|
||||
{ .center_freq = 2442, .hw_value = 7, },
|
||||
{ .center_freq = 2447, .hw_value = 8, },
|
||||
{ .center_freq = 2452, .hw_value = 9, },
|
||||
{ .center_freq = 2457, .hw_value = 10, },
|
||||
{ .center_freq = 2462, .hw_value = 11, },
|
||||
{ .center_freq = 2467, .hw_value = 12, },
|
||||
{ .center_freq = 2472, .hw_value = 13, },
|
||||
{ .center_freq = 2484, .hw_value = 14, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2412, .hw_value = 1, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2417, .hw_value = 2, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2422, .hw_value = 3, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2427, .hw_value = 4, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2432, .hw_value = 5, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2437, .hw_value = 6, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2442, .hw_value = 7, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2447, .hw_value = 8, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2452, .hw_value = 9, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2457, .hw_value = 10, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2462, .hw_value = 11, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2467, .hw_value = 12, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2472, .hw_value = 13, },
|
||||
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2484, .hw_value = 14, },
|
||||
};
|
||||
|
||||
static const struct ieee80211_rate mwl8k_rates_24[] = {
|
||||
|
@ -368,10 +368,10 @@ static const struct ieee80211_rate mwl8k_rates_24[] = {
|
|||
};
|
||||
|
||||
static const struct ieee80211_channel mwl8k_channels_50[] = {
|
||||
{ .center_freq = 5180, .hw_value = 36, },
|
||||
{ .center_freq = 5200, .hw_value = 40, },
|
||||
{ .center_freq = 5220, .hw_value = 44, },
|
||||
{ .center_freq = 5240, .hw_value = 48, },
|
||||
{ .band = IEEE80211_BAND_5GHZ, .center_freq = 5180, .hw_value = 36, },
|
||||
{ .band = IEEE80211_BAND_5GHZ, .center_freq = 5200, .hw_value = 40, },
|
||||
{ .band = IEEE80211_BAND_5GHZ, .center_freq = 5220, .hw_value = 44, },
|
||||
{ .band = IEEE80211_BAND_5GHZ, .center_freq = 5240, .hw_value = 48, },
|
||||
};
|
||||
|
||||
static const struct ieee80211_rate mwl8k_rates_50[] = {
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/etherdevice.h>
|
||||
#include <linux/llc.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/pkt_sched.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <net/llc.h>
|
||||
#include <net/llc_pdu.h>
|
||||
|
@ -40,6 +41,7 @@ static void br_send_bpdu(struct net_bridge_port *p,
|
|||
|
||||
skb->dev = p->dev;
|
||||
skb->protocol = htons(ETH_P_802_2);
|
||||
skb->priority = TC_PRIO_CONTROL;
|
||||
|
||||
skb_reserve(skb, LLC_RESERVE);
|
||||
memcpy(__skb_put(skb, length), data, length);
|
||||
|
|
|
@ -187,7 +187,7 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags,
|
|||
skb_queue_walk(queue, skb) {
|
||||
*peeked = skb->peeked;
|
||||
if (flags & MSG_PEEK) {
|
||||
if (*off >= skb->len) {
|
||||
if (*off >= skb->len && skb->len) {
|
||||
*off -= skb->len;
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -928,24 +928,25 @@ static void parp_redo(struct sk_buff *skb)
|
|||
static int arp_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
struct packet_type *pt, struct net_device *orig_dev)
|
||||
{
|
||||
struct arphdr *arp;
|
||||
const struct arphdr *arp;
|
||||
|
||||
if (dev->flags & IFF_NOARP ||
|
||||
skb->pkt_type == PACKET_OTHERHOST ||
|
||||
skb->pkt_type == PACKET_LOOPBACK)
|
||||
goto freeskb;
|
||||
|
||||
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||
if (!skb)
|
||||
goto out_of_mem;
|
||||
|
||||
/* ARP header, plus 2 device addresses, plus 2 IP addresses. */
|
||||
if (!pskb_may_pull(skb, arp_hdr_len(dev)))
|
||||
goto freeskb;
|
||||
|
||||
arp = arp_hdr(skb);
|
||||
if (arp->ar_hln != dev->addr_len ||
|
||||
dev->flags & IFF_NOARP ||
|
||||
skb->pkt_type == PACKET_OTHERHOST ||
|
||||
skb->pkt_type == PACKET_LOOPBACK ||
|
||||
arp->ar_pln != 4)
|
||||
if (arp->ar_hln != dev->addr_len || arp->ar_pln != 4)
|
||||
goto freeskb;
|
||||
|
||||
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||
if (skb == NULL)
|
||||
goto out_of_mem;
|
||||
|
||||
memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
|
||||
|
||||
return NF_HOOK(NFPROTO_ARP, NF_ARP_IN, skb, dev, NULL, arp_process);
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/ipv6.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <linux/netfilter.h>
|
||||
#include <linux/netfilter_ipv6.h>
|
||||
#include <linux/netfilter_ipv6/ip6t_NPT.h>
|
||||
|
@ -18,11 +19,20 @@ static int ip6t_npt_checkentry(const struct xt_tgchk_param *par)
|
|||
{
|
||||
struct ip6t_npt_tginfo *npt = par->targinfo;
|
||||
__wsum src_sum = 0, dst_sum = 0;
|
||||
struct in6_addr pfx;
|
||||
unsigned int i;
|
||||
|
||||
if (npt->src_pfx_len > 64 || npt->dst_pfx_len > 64)
|
||||
return -EINVAL;
|
||||
|
||||
/* Ensure that LSB of prefix is zero */
|
||||
ipv6_addr_prefix(&pfx, &npt->src_pfx.in6, npt->src_pfx_len);
|
||||
if (!ipv6_addr_equal(&pfx, &npt->src_pfx.in6))
|
||||
return -EINVAL;
|
||||
ipv6_addr_prefix(&pfx, &npt->dst_pfx.in6, npt->dst_pfx_len);
|
||||
if (!ipv6_addr_equal(&pfx, &npt->dst_pfx.in6))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(npt->src_pfx.in6.s6_addr16); i++) {
|
||||
src_sum = csum_add(src_sum,
|
||||
(__force __wsum)npt->src_pfx.in6.s6_addr16[i]);
|
||||
|
@ -30,7 +40,7 @@ static int ip6t_npt_checkentry(const struct xt_tgchk_param *par)
|
|||
(__force __wsum)npt->dst_pfx.in6.s6_addr16[i]);
|
||||
}
|
||||
|
||||
npt->adjustment = (__force __sum16) csum_sub(src_sum, dst_sum);
|
||||
npt->adjustment = ~csum_fold(csum_sub(src_sum, dst_sum));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -51,7 +61,7 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt,
|
|||
|
||||
idx = i / 32;
|
||||
addr->s6_addr32[idx] &= mask;
|
||||
addr->s6_addr32[idx] |= npt->dst_pfx.in6.s6_addr32[idx];
|
||||
addr->s6_addr32[idx] |= ~mask & npt->dst_pfx.in6.s6_addr32[idx];
|
||||
}
|
||||
|
||||
if (pfx_len <= 48)
|
||||
|
@ -66,8 +76,8 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt,
|
|||
return false;
|
||||
}
|
||||
|
||||
sum = (__force __sum16) csum_add((__force __wsum)addr->s6_addr16[idx],
|
||||
npt->adjustment);
|
||||
sum = ~csum_fold(csum_add(csum_unfold((__force __sum16)addr->s6_addr16[idx]),
|
||||
csum_unfold(npt->adjustment)));
|
||||
if (sum == CSUM_MANGLED_0)
|
||||
sum = 0;
|
||||
*(__force __sum16 *)&addr->s6_addr16[idx] = sum;
|
||||
|
|
|
@ -2058,7 +2058,8 @@ static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev,
|
|||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
|
||||
memcpy(sdata->vif.bss_conf.mcast_rate, rate, sizeof(rate));
|
||||
memcpy(sdata->vif.bss_conf.mcast_rate, rate,
|
||||
sizeof(int) * IEEE80211_NUM_BANDS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -3422,6 +3422,7 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
|
|||
|
||||
ret = 0;
|
||||
|
||||
out:
|
||||
while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef,
|
||||
IEEE80211_CHAN_DISABLED)) {
|
||||
if (WARN_ON(chandef->width == NL80211_CHAN_WIDTH_20_NOHT)) {
|
||||
|
@ -3430,14 +3431,13 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
|
|||
goto out;
|
||||
}
|
||||
|
||||
ret = chandef_downgrade(chandef);
|
||||
ret |= chandef_downgrade(chandef);
|
||||
}
|
||||
|
||||
if (chandef->width != vht_chandef.width)
|
||||
sdata_info(sdata,
|
||||
"local regulatory prevented using AP HT/VHT configuration, downgraded\n");
|
||||
"capabilities/regulatory prevented using AP HT/VHT configuration, downgraded\n");
|
||||
|
||||
out:
|
||||
WARN_ON_ONCE(!cfg80211_chandef_valid(chandef));
|
||||
return ret;
|
||||
}
|
||||
|
@ -3551,8 +3551,11 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
|
|||
*/
|
||||
ret = ieee80211_vif_use_channel(sdata, &chandef,
|
||||
IEEE80211_CHANCTX_SHARED);
|
||||
while (ret && chandef.width != NL80211_CHAN_WIDTH_20_NOHT)
|
||||
while (ret && chandef.width != NL80211_CHAN_WIDTH_20_NOHT) {
|
||||
ifmgd->flags |= chandef_downgrade(&chandef);
|
||||
ret = ieee80211_vif_use_channel(sdata, &chandef,
|
||||
IEEE80211_CHANCTX_SHARED);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -61,14 +61,27 @@ sctp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static void sctp_nat_csum(struct sk_buff *skb, sctp_sctphdr_t *sctph,
|
||||
unsigned int sctphoff)
|
||||
{
|
||||
__u32 crc32;
|
||||
struct sk_buff *iter;
|
||||
|
||||
crc32 = sctp_start_cksum((__u8 *)sctph, skb_headlen(skb) - sctphoff);
|
||||
skb_walk_frags(skb, iter)
|
||||
crc32 = sctp_update_cksum((u8 *) iter->data,
|
||||
skb_headlen(iter), crc32);
|
||||
sctph->checksum = sctp_end_cksum(crc32);
|
||||
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
}
|
||||
|
||||
static int
|
||||
sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
||||
struct ip_vs_conn *cp, struct ip_vs_iphdr *iph)
|
||||
{
|
||||
sctp_sctphdr_t *sctph;
|
||||
unsigned int sctphoff = iph->len;
|
||||
struct sk_buff *iter;
|
||||
__be32 crc32;
|
||||
|
||||
#ifdef CONFIG_IP_VS_IPV6
|
||||
if (cp->af == AF_INET6 && iph->fragoffs)
|
||||
|
@ -92,13 +105,7 @@ sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
|||
sctph = (void *) skb_network_header(skb) + sctphoff;
|
||||
sctph->source = cp->vport;
|
||||
|
||||
/* Calculate the checksum */
|
||||
crc32 = sctp_start_cksum((u8 *) sctph, skb_headlen(skb) - sctphoff);
|
||||
skb_walk_frags(skb, iter)
|
||||
crc32 = sctp_update_cksum((u8 *) iter->data, skb_headlen(iter),
|
||||
crc32);
|
||||
crc32 = sctp_end_cksum(crc32);
|
||||
sctph->checksum = crc32;
|
||||
sctp_nat_csum(skb, sctph, sctphoff);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -109,8 +116,6 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
|||
{
|
||||
sctp_sctphdr_t *sctph;
|
||||
unsigned int sctphoff = iph->len;
|
||||
struct sk_buff *iter;
|
||||
__be32 crc32;
|
||||
|
||||
#ifdef CONFIG_IP_VS_IPV6
|
||||
if (cp->af == AF_INET6 && iph->fragoffs)
|
||||
|
@ -134,13 +139,7 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
|
|||
sctph = (void *) skb_network_header(skb) + sctphoff;
|
||||
sctph->dest = cp->dport;
|
||||
|
||||
/* Calculate the checksum */
|
||||
crc32 = sctp_start_cksum((u8 *) sctph, skb_headlen(skb) - sctphoff);
|
||||
skb_walk_frags(skb, iter)
|
||||
crc32 = sctp_update_cksum((u8 *) iter->data, skb_headlen(iter),
|
||||
crc32);
|
||||
crc32 = sctp_end_cksum(crc32);
|
||||
sctph->checksum = crc32;
|
||||
sctp_nat_csum(skb, sctph, sctphoff);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -1795,6 +1795,8 @@ int start_sync_thread(struct net *net, int state, char *mcast_ifn, __u8 syncid)
|
|||
GFP_KERNEL);
|
||||
if (!tinfo->buf)
|
||||
goto outtinfo;
|
||||
} else {
|
||||
tinfo->buf = NULL;
|
||||
}
|
||||
tinfo->id = id;
|
||||
|
||||
|
|
|
@ -1135,9 +1135,9 @@ static int htb_dump_class(struct Qdisc *sch, unsigned long arg,
|
|||
memset(&opt, 0, sizeof(opt));
|
||||
|
||||
opt.rate.rate = cl->rate.rate_bps >> 3;
|
||||
opt.buffer = cl->buffer;
|
||||
opt.buffer = PSCHED_NS2TICKS(cl->buffer);
|
||||
opt.ceil.rate = cl->ceil.rate_bps >> 3;
|
||||
opt.cbuffer = cl->cbuffer;
|
||||
opt.cbuffer = PSCHED_NS2TICKS(cl->cbuffer);
|
||||
opt.quantum = cl->quantum;
|
||||
opt.prio = cl->prio;
|
||||
opt.level = cl->level;
|
||||
|
|
Загрузка…
Ссылка в новой задаче