Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: 1) TCP can chop up SACK'd SKBs below below the unacked send sequence and that breaks lots of stuff. Fix from Neal Cardwell. 2) There is code in ipv6 to properly join and leave the all-routers multicast code when the forwarding setting is changed, but once forwarding is turned on, we don't do the join for newly registered devices. Fix from Li Wei. 3) Netfilter's NAT module autoload in ctnetlink drops a spinlock around a sleeping call, problem is this code path doesn't actually hold that lock. Fix from Pablo Neira Ayuso. 4) TG3 uses the wrong interfaces to hook into the new byte queue limit support. It uses the device level interfaces, which is fine for single queue devices, but on more recent chips this driver supports multiqueue so we have to use the multiqueue BQL APIs. Fix from Tom Herbert. 5) r8169 resume fix from Francois Romieu. 6) Add some cxgb4 device IDs, from Vipul Pandya. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: IPv6: Fix not join all-router mcast group when forwarding set. caif-hsi: Set default MTU to 4096 cxgb4vf: Add support for Chelsio's T480-CR and T440-LP-CR adapters cxgb4: Add support for Chelsio's T480-CR and T440-LP-CR adapters mlx4_core: remove buggy sched_queue masking netfilter: nf_conntrack: fix early_drop with reliable event delivery bridge: netfilter: don't call iptables on vlan packets if sysctl is off netfilter: bridge: fix wrong pointer dereference netfilter: ctnetlink: remove incorrect spin_[un]lock_bh on NAT module autoload netfilter: ebtables: fix wrong name length while copying to user-space r8169: runtime resume before shutdown. tcp: fix tcp_shift_skb_data() to not shift SACKed data below snd_una tg3: Fix to use multi queue BQL interfaces
This commit is contained in:
commit
dac12d1f5e
|
@ -978,7 +978,7 @@ static void cfhsi_setup(struct net_device *dev)
|
|||
dev->netdev_ops = &cfhsi_ops;
|
||||
dev->type = ARPHRD_CAIF;
|
||||
dev->flags = IFF_POINTOPOINT | IFF_NOARP;
|
||||
dev->mtu = CFHSI_MAX_PAYLOAD_SZ;
|
||||
dev->mtu = CFHSI_MAX_CAIF_FRAME_SZ;
|
||||
dev->tx_queue_len = 0;
|
||||
dev->destructor = free_netdev;
|
||||
skb_queue_head_init(&cfhsi->qhead);
|
||||
|
|
|
@ -5352,7 +5352,7 @@ static void tg3_tx(struct tg3_napi *tnapi)
|
|||
}
|
||||
}
|
||||
|
||||
netdev_completed_queue(tp->dev, pkts_compl, bytes_compl);
|
||||
netdev_tx_completed_queue(txq, pkts_compl, bytes_compl);
|
||||
|
||||
tnapi->tx_cons = sw_idx;
|
||||
|
||||
|
@ -6793,7 +6793,7 @@ static netdev_tx_t tg3_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
}
|
||||
|
||||
skb_tx_timestamp(skb);
|
||||
netdev_sent_queue(tp->dev, skb->len);
|
||||
netdev_tx_sent_queue(txq, skb->len);
|
||||
|
||||
/* Packets are ready, update Tx producer idx local and on card. */
|
||||
tw32_tx_mbox(tnapi->prodmbox, entry);
|
||||
|
@ -7275,8 +7275,8 @@ static void tg3_free_rings(struct tg3 *tp)
|
|||
|
||||
dev_kfree_skb_any(skb);
|
||||
}
|
||||
netdev_tx_reset_queue(netdev_get_tx_queue(tp->dev, j));
|
||||
}
|
||||
netdev_reset_queue(tp->dev);
|
||||
}
|
||||
|
||||
/* Initialize tx/rx rings for packet processing.
|
||||
|
|
|
@ -196,6 +196,8 @@ static DEFINE_PCI_DEVICE_TABLE(cxgb4_pci_tbl) = {
|
|||
CH_DEVICE(0x4408, 4),
|
||||
CH_DEVICE(0x4409, 4),
|
||||
CH_DEVICE(0x440a, 4),
|
||||
CH_DEVICE(0x440d, 4),
|
||||
CH_DEVICE(0x440e, 4),
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
@ -2892,6 +2892,8 @@ static struct pci_device_id cxgb4vf_pci_tbl[] = {
|
|||
CH_DEVICE(0x4808, 0), /* T420-cx */
|
||||
CH_DEVICE(0x4809, 0), /* T420-bt */
|
||||
CH_DEVICE(0x480a, 0), /* T404-bt */
|
||||
CH_DEVICE(0x480d, 0), /* T480-cr */
|
||||
CH_DEVICE(0x480e, 0), /* T440-lp-cr */
|
||||
{ 0, }
|
||||
};
|
||||
|
||||
|
|
|
@ -151,11 +151,6 @@ static int __mlx4_qp_modify(struct mlx4_dev *dev, struct mlx4_mtt *mtt,
|
|||
context->log_page_size = mtt->page_shift - MLX4_ICM_PAGE_SHIFT;
|
||||
}
|
||||
|
||||
port = ((context->pri_path.sched_queue >> 6) & 1) + 1;
|
||||
if (dev->caps.port_type[port] == MLX4_PORT_TYPE_ETH)
|
||||
context->pri_path.sched_queue = (context->pri_path.sched_queue &
|
||||
0xc3);
|
||||
|
||||
*(__be32 *) mailbox->buf = cpu_to_be32(optpar);
|
||||
memcpy(mailbox->buf + 8, context, sizeof *context);
|
||||
|
||||
|
|
|
@ -6194,6 +6194,9 @@ static void rtl_shutdown(struct pci_dev *pdev)
|
|||
{
|
||||
struct net_device *dev = pci_get_drvdata(pdev);
|
||||
struct rtl8169_private *tp = netdev_priv(dev);
|
||||
struct device *d = &pdev->dev;
|
||||
|
||||
pm_runtime_get_sync(d);
|
||||
|
||||
rtl8169_net_suspend(dev);
|
||||
|
||||
|
@ -6215,6 +6218,8 @@ static void rtl_shutdown(struct pci_dev *pdev)
|
|||
pci_wake_from_d3(pdev, true);
|
||||
pci_set_power_state(pdev, PCI_D3hot);
|
||||
}
|
||||
|
||||
pm_runtime_put_noidle(d);
|
||||
}
|
||||
|
||||
static struct pci_driver rtl8169_pci_driver = {
|
||||
|
|
|
@ -62,6 +62,15 @@ static int brnf_filter_pppoe_tagged __read_mostly = 0;
|
|||
#define brnf_filter_pppoe_tagged 0
|
||||
#endif
|
||||
|
||||
#define IS_IP(skb) \
|
||||
(!vlan_tx_tag_present(skb) && skb->protocol == htons(ETH_P_IP))
|
||||
|
||||
#define IS_IPV6(skb) \
|
||||
(!vlan_tx_tag_present(skb) && skb->protocol == htons(ETH_P_IPV6))
|
||||
|
||||
#define IS_ARP(skb) \
|
||||
(!vlan_tx_tag_present(skb) && skb->protocol == htons(ETH_P_ARP))
|
||||
|
||||
static inline __be16 vlan_proto(const struct sk_buff *skb)
|
||||
{
|
||||
if (vlan_tx_tag_present(skb))
|
||||
|
@ -639,8 +648,7 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff *skb,
|
|||
return NF_DROP;
|
||||
br = p->br;
|
||||
|
||||
if (skb->protocol == htons(ETH_P_IPV6) || IS_VLAN_IPV6(skb) ||
|
||||
IS_PPPOE_IPV6(skb)) {
|
||||
if (IS_IPV6(skb) || IS_VLAN_IPV6(skb) || IS_PPPOE_IPV6(skb)) {
|
||||
if (!brnf_call_ip6tables && !br->nf_call_ip6tables)
|
||||
return NF_ACCEPT;
|
||||
|
||||
|
@ -651,8 +659,7 @@ static unsigned int br_nf_pre_routing(unsigned int hook, struct sk_buff *skb,
|
|||
if (!brnf_call_iptables && !br->nf_call_iptables)
|
||||
return NF_ACCEPT;
|
||||
|
||||
if (skb->protocol != htons(ETH_P_IP) && !IS_VLAN_IP(skb) &&
|
||||
!IS_PPPOE_IP(skb))
|
||||
if (!IS_IP(skb) && !IS_VLAN_IP(skb) && !IS_PPPOE_IP(skb))
|
||||
return NF_ACCEPT;
|
||||
|
||||
nf_bridge_pull_encap_header_rcsum(skb);
|
||||
|
@ -701,7 +708,7 @@ static int br_nf_forward_finish(struct sk_buff *skb)
|
|||
struct nf_bridge_info *nf_bridge = skb->nf_bridge;
|
||||
struct net_device *in;
|
||||
|
||||
if (skb->protocol != htons(ETH_P_ARP) && !IS_VLAN_ARP(skb)) {
|
||||
if (!IS_ARP(skb) && !IS_VLAN_ARP(skb)) {
|
||||
in = nf_bridge->physindev;
|
||||
if (nf_bridge->mask & BRNF_PKT_TYPE) {
|
||||
skb->pkt_type = PACKET_OTHERHOST;
|
||||
|
@ -718,6 +725,7 @@ static int br_nf_forward_finish(struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* This is the 'purely bridged' case. For IP, we pass the packet to
|
||||
* netfilter with indev and outdev set to the bridge device,
|
||||
* but we are still able to filter on the 'real' indev/outdev
|
||||
|
@ -744,11 +752,9 @@ static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff *skb,
|
|||
if (!parent)
|
||||
return NF_DROP;
|
||||
|
||||
if (skb->protocol == htons(ETH_P_IP) || IS_VLAN_IP(skb) ||
|
||||
IS_PPPOE_IP(skb))
|
||||
if (IS_IP(skb) || IS_VLAN_IP(skb) || IS_PPPOE_IP(skb))
|
||||
pf = PF_INET;
|
||||
else if (skb->protocol == htons(ETH_P_IPV6) || IS_VLAN_IPV6(skb) ||
|
||||
IS_PPPOE_IPV6(skb))
|
||||
else if (IS_IPV6(skb) || IS_VLAN_IPV6(skb) || IS_PPPOE_IPV6(skb))
|
||||
pf = PF_INET6;
|
||||
else
|
||||
return NF_ACCEPT;
|
||||
|
@ -795,7 +801,7 @@ static unsigned int br_nf_forward_arp(unsigned int hook, struct sk_buff *skb,
|
|||
if (!brnf_call_arptables && !br->nf_call_arptables)
|
||||
return NF_ACCEPT;
|
||||
|
||||
if (skb->protocol != htons(ETH_P_ARP)) {
|
||||
if (!IS_ARP(skb)) {
|
||||
if (!IS_VLAN_ARP(skb))
|
||||
return NF_ACCEPT;
|
||||
nf_bridge_pull_encap_header(skb);
|
||||
|
@ -853,11 +859,9 @@ static unsigned int br_nf_post_routing(unsigned int hook, struct sk_buff *skb,
|
|||
if (!realoutdev)
|
||||
return NF_DROP;
|
||||
|
||||
if (skb->protocol == htons(ETH_P_IP) || IS_VLAN_IP(skb) ||
|
||||
IS_PPPOE_IP(skb))
|
||||
if (IS_IP(skb) || IS_VLAN_IP(skb) || IS_PPPOE_IP(skb))
|
||||
pf = PF_INET;
|
||||
else if (skb->protocol == htons(ETH_P_IPV6) || IS_VLAN_IPV6(skb) ||
|
||||
IS_PPPOE_IPV6(skb))
|
||||
else if (IS_IPV6(skb) || IS_VLAN_IPV6(skb) || IS_PPPOE_IPV6(skb))
|
||||
pf = PF_INET6;
|
||||
else
|
||||
return NF_ACCEPT;
|
||||
|
|
|
@ -1335,7 +1335,12 @@ static inline int ebt_make_matchname(const struct ebt_entry_match *m,
|
|||
const char *base, char __user *ubase)
|
||||
{
|
||||
char __user *hlp = ubase + ((char *)m - base);
|
||||
if (copy_to_user(hlp, m->u.match->name, EBT_FUNCTION_MAXNAMELEN))
|
||||
char name[EBT_FUNCTION_MAXNAMELEN] = {};
|
||||
|
||||
/* ebtables expects 32 bytes long names but xt_match names are 29 bytes
|
||||
long. Copy 29 bytes and fill remaining bytes with zeroes. */
|
||||
strncpy(name, m->u.match->name, sizeof(name));
|
||||
if (copy_to_user(hlp, name, EBT_FUNCTION_MAXNAMELEN))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
@ -1344,7 +1349,10 @@ static inline int ebt_make_watchername(const struct ebt_entry_watcher *w,
|
|||
const char *base, char __user *ubase)
|
||||
{
|
||||
char __user *hlp = ubase + ((char *)w - base);
|
||||
if (copy_to_user(hlp , w->u.watcher->name, EBT_FUNCTION_MAXNAMELEN))
|
||||
char name[EBT_FUNCTION_MAXNAMELEN] = {};
|
||||
|
||||
strncpy(name, w->u.watcher->name, sizeof(name));
|
||||
if (copy_to_user(hlp , name, EBT_FUNCTION_MAXNAMELEN))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
@ -1355,6 +1363,7 @@ ebt_make_names(struct ebt_entry *e, const char *base, char __user *ubase)
|
|||
int ret;
|
||||
char __user *hlp;
|
||||
const struct ebt_entry_target *t;
|
||||
char name[EBT_FUNCTION_MAXNAMELEN] = {};
|
||||
|
||||
if (e->bitmask == 0)
|
||||
return 0;
|
||||
|
@ -1368,7 +1377,8 @@ ebt_make_names(struct ebt_entry *e, const char *base, char __user *ubase)
|
|||
ret = EBT_WATCHER_ITERATE(e, ebt_make_watchername, base, ubase);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
if (copy_to_user(hlp, t->u.target->name, EBT_FUNCTION_MAXNAMELEN))
|
||||
strncpy(name, t->u.target->name, sizeof(name));
|
||||
if (copy_to_user(hlp, name, EBT_FUNCTION_MAXNAMELEN))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1585,6 +1585,10 @@ static struct sk_buff *tcp_shift_skb_data(struct sock *sk, struct sk_buff *skb,
|
|||
}
|
||||
}
|
||||
|
||||
/* tcp_sacktag_one() won't SACK-tag ranges below snd_una */
|
||||
if (!after(TCP_SKB_CB(skb)->seq + len, tp->snd_una))
|
||||
goto fallback;
|
||||
|
||||
if (!skb_shift(prev, skb, len))
|
||||
goto fallback;
|
||||
if (!tcp_shifted_skb(sk, skb, state, pcount, len, mss, dup_sack))
|
||||
|
|
|
@ -434,6 +434,10 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev)
|
|||
/* Join all-node multicast group */
|
||||
ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes);
|
||||
|
||||
/* Join all-router multicast group if forwarding is set */
|
||||
if (ndev->cnf.forwarding && dev && (dev->flags & IFF_MULTICAST))
|
||||
ipv6_dev_mc_inc(dev, &in6addr_linklocal_allrouters);
|
||||
|
||||
return ndev;
|
||||
}
|
||||
|
||||
|
|
|
@ -635,8 +635,12 @@ static noinline int early_drop(struct net *net, unsigned int hash)
|
|||
|
||||
if (del_timer(&ct->timeout)) {
|
||||
death_by_timeout((unsigned long)ct);
|
||||
dropped = 1;
|
||||
NF_CT_STAT_INC_ATOMIC(net, early_drop);
|
||||
/* Check if we indeed killed this entry. Reliable event
|
||||
delivery may have inserted it into the dying list. */
|
||||
if (test_bit(IPS_DYING_BIT, &ct->status)) {
|
||||
dropped = 1;
|
||||
NF_CT_STAT_INC_ATOMIC(net, early_drop);
|
||||
}
|
||||
}
|
||||
nf_ct_put(ct);
|
||||
return dropped;
|
||||
|
|
|
@ -1041,16 +1041,13 @@ ctnetlink_parse_nat_setup(struct nf_conn *ct,
|
|||
if (!parse_nat_setup) {
|
||||
#ifdef CONFIG_MODULES
|
||||
rcu_read_unlock();
|
||||
spin_unlock_bh(&nf_conntrack_lock);
|
||||
nfnl_unlock();
|
||||
if (request_module("nf-nat-ipv4") < 0) {
|
||||
nfnl_lock();
|
||||
spin_lock_bh(&nf_conntrack_lock);
|
||||
rcu_read_lock();
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
nfnl_lock();
|
||||
spin_lock_bh(&nf_conntrack_lock);
|
||||
rcu_read_lock();
|
||||
if (nfnetlink_parse_nat_setup_hook)
|
||||
return -EAGAIN;
|
||||
|
|
Loading…
Reference in New Issue