Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: 1) Fix various build warnings in tlan/qed/xen-netback drivers, from Arnd Bergmann. 2) Propagate proper error code in strparser's strp_recv(), from Geert Uytterhoeven. 3) Fix accidental broadcast of RTM_GETTFILTER responses, from Eric Dumazret. 4) Need to use list_for_each_entry_safe() in qed driver, from Wei Yongjun. 5) Openvswitch 802.1AD bug fixes from Jiri Benc. 6) Cure BUILD_BUG_ON() in mlx5 driver, from Tom Herbert. 7) Fix UDP ipv6 checksumming in netvsc driver, from Stephen Hemminger. 8) stmmac driver fixes from Giuseppe CAVALLARO. 9) Fix access to mangled IP6CB in tcp, from Eric Dumazet. 10) Fix info leaks in tipc and rtnetlink, from Dan Carpenter. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (27 commits) net: bridge: add the multicast_flood flag attribute to brport_attrs net: axienet: Remove unused parameter from __axienet_device_reset liquidio: CN23XX: fix a loop timeout net: rtnl: info leak in rtnl_fill_vfinfo() tipc: info leak in __tipc_nl_add_udp_addr() net: ipv4: Do not drop to make_route if oif is l3mdev net: phy: Trigger state machine on state change and not polling. ipv6: tcp: restore IP6CB for pktoptions skbs netvsc: Remove mistaken udp.h inclusion. xen-netback: fix type mismatch warning stmmac: fix error check when init ptp stmmac: fix ptp init for gmac4 qed: fix old-style function definition netvsc: fix checksum on UDP IPV6 net_sched: reorder pernet ops and act ops registrations xen-netback: fix guest Rx stall detection (after guest Rx refactor) drivers/ptp: Fix kernel memory disclosure net/mlx5: Add MLX5_ARRAY_SET64 to fix BUILD_BUG_ON qmi_wwan: add support for Quectel EC21 and EC25 openvswitch: add NETIF_F_HW_VLAN_STAG_TX to internal dev ...
This commit is contained in:
@@ -217,6 +217,7 @@ static const struct brport_attribute *brport_attrs[] = {
|
||||
#endif
|
||||
&brport_attr_proxyarp,
|
||||
&brport_attr_proxyarp_wifi,
|
||||
&brport_attr_multicast_flood,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@@ -1144,6 +1144,8 @@ static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb,
|
||||
if (dev->netdev_ops->ndo_get_vf_config(dev, vfs_num, &ivi))
|
||||
return 0;
|
||||
|
||||
memset(&vf_vlan_info, 0, sizeof(vf_vlan_info));
|
||||
|
||||
vf_mac.vf =
|
||||
vf_vlan.vf =
|
||||
vf_vlan_info.vf =
|
||||
|
@@ -2265,7 +2265,8 @@ struct rtable *__ip_route_output_key_hash(struct net *net, struct flowi4 *fl4,
|
||||
if (err) {
|
||||
res.fi = NULL;
|
||||
res.table = NULL;
|
||||
if (fl4->flowi4_oif) {
|
||||
if (fl4->flowi4_oif &&
|
||||
!netif_index_is_l3_master(net, fl4->flowi4_oif)) {
|
||||
/* Apparently, routing tables are wrong. Assume,
|
||||
that the destination is on link.
|
||||
|
||||
|
@@ -1190,6 +1190,16 @@ out:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void tcp_v6_restore_cb(struct sk_buff *skb)
|
||||
{
|
||||
/* We need to move header back to the beginning if xfrm6_policy_check()
|
||||
* and tcp_v6_fill_cb() are going to be called again.
|
||||
* ip6_datagram_recv_specific_ctl() also expects IP6CB to be there.
|
||||
*/
|
||||
memmove(IP6CB(skb), &TCP_SKB_CB(skb)->header.h6,
|
||||
sizeof(struct inet6_skb_parm));
|
||||
}
|
||||
|
||||
/* The socket must have it's spinlock held when we get
|
||||
* here, unless it is a TCP_LISTEN socket.
|
||||
*
|
||||
@@ -1319,6 +1329,7 @@ ipv6_pktoptions:
|
||||
np->flow_label = ip6_flowlabel(ipv6_hdr(opt_skb));
|
||||
if (ipv6_opt_accepted(sk, opt_skb, &TCP_SKB_CB(opt_skb)->header.h6)) {
|
||||
skb_set_owner_r(opt_skb, sk);
|
||||
tcp_v6_restore_cb(opt_skb);
|
||||
opt_skb = xchg(&np->pktoptions, opt_skb);
|
||||
} else {
|
||||
__kfree_skb(opt_skb);
|
||||
@@ -1352,15 +1363,6 @@ static void tcp_v6_fill_cb(struct sk_buff *skb, const struct ipv6hdr *hdr,
|
||||
TCP_SKB_CB(skb)->sacked = 0;
|
||||
}
|
||||
|
||||
static void tcp_v6_restore_cb(struct sk_buff *skb)
|
||||
{
|
||||
/* We need to move header back to the beginning if xfrm6_policy_check()
|
||||
* and tcp_v6_fill_cb() are going to be called again.
|
||||
*/
|
||||
memmove(IP6CB(skb), &TCP_SKB_CB(skb)->header.h6,
|
||||
sizeof(struct inet6_skb_parm));
|
||||
}
|
||||
|
||||
static int tcp_v6_rcv(struct sk_buff *skb)
|
||||
{
|
||||
const struct tcphdr *th;
|
||||
|
@@ -343,7 +343,7 @@ static int parse_vlan(struct sk_buff *skb, struct sw_flow_key *key)
|
||||
key->eth.cvlan.tci = 0;
|
||||
key->eth.cvlan.tpid = 0;
|
||||
|
||||
if (likely(skb_vlan_tag_present(skb))) {
|
||||
if (skb_vlan_tag_present(skb)) {
|
||||
key->eth.vlan.tci = htons(skb->vlan_tci);
|
||||
key->eth.vlan.tpid = skb->vlan_proto;
|
||||
} else {
|
||||
|
@@ -176,7 +176,7 @@ static void do_setup(struct net_device *netdev)
|
||||
|
||||
netdev->vlan_features = netdev->features;
|
||||
netdev->hw_enc_features = netdev->features;
|
||||
netdev->features |= NETIF_F_HW_VLAN_CTAG_TX;
|
||||
netdev->features |= NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX;
|
||||
netdev->hw_features = netdev->features & ~NETIF_F_LLTX;
|
||||
|
||||
eth_hw_addr_random(netdev);
|
||||
|
@@ -485,7 +485,8 @@ static unsigned int packet_length(const struct sk_buff *skb)
|
||||
{
|
||||
unsigned int length = skb->len - ETH_HLEN;
|
||||
|
||||
if (skb_vlan_tagged(skb))
|
||||
if (!skb_vlan_tag_present(skb) &&
|
||||
eth_type_vlan(skb->protocol))
|
||||
length -= VLAN_HLEN;
|
||||
|
||||
/* Don't subtract for multiple VLAN tags. Most (all?) drivers allow
|
||||
|
@@ -341,22 +341,25 @@ int tcf_register_action(struct tc_action_ops *act,
|
||||
if (!act->act || !act->dump || !act->init || !act->walk || !act->lookup)
|
||||
return -EINVAL;
|
||||
|
||||
/* We have to register pernet ops before making the action ops visible,
|
||||
* otherwise tcf_action_init_1() could get a partially initialized
|
||||
* netns.
|
||||
*/
|
||||
ret = register_pernet_subsys(ops);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
write_lock(&act_mod_lock);
|
||||
list_for_each_entry(a, &act_base, head) {
|
||||
if (act->type == a->type || (strcmp(act->kind, a->kind) == 0)) {
|
||||
write_unlock(&act_mod_lock);
|
||||
unregister_pernet_subsys(ops);
|
||||
return -EEXIST;
|
||||
}
|
||||
}
|
||||
list_add_tail(&act->head, &act_base);
|
||||
write_unlock(&act_mod_lock);
|
||||
|
||||
ret = register_pernet_subsys(ops);
|
||||
if (ret) {
|
||||
tcf_unregister_action(act, ops);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(tcf_register_action);
|
||||
@@ -367,8 +370,6 @@ int tcf_unregister_action(struct tc_action_ops *act,
|
||||
struct tc_action_ops *a;
|
||||
int err = -ENOENT;
|
||||
|
||||
unregister_pernet_subsys(ops);
|
||||
|
||||
write_lock(&act_mod_lock);
|
||||
list_for_each_entry(a, &act_base, head) {
|
||||
if (a == act) {
|
||||
@@ -378,6 +379,8 @@ int tcf_unregister_action(struct tc_action_ops *act,
|
||||
}
|
||||
}
|
||||
write_unlock(&act_mod_lock);
|
||||
if (!err)
|
||||
unregister_pernet_subsys(ops);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(tcf_unregister_action);
|
||||
|
@@ -101,7 +101,7 @@ EXPORT_SYMBOL(unregister_tcf_proto_ops);
|
||||
|
||||
static int tfilter_notify(struct net *net, struct sk_buff *oskb,
|
||||
struct nlmsghdr *n, struct tcf_proto *tp,
|
||||
unsigned long fh, int event);
|
||||
unsigned long fh, int event, bool unicast);
|
||||
|
||||
static void tfilter_notify_chain(struct net *net, struct sk_buff *oskb,
|
||||
struct nlmsghdr *n,
|
||||
@@ -112,7 +112,7 @@ static void tfilter_notify_chain(struct net *net, struct sk_buff *oskb,
|
||||
|
||||
for (it_chain = chain; (tp = rtnl_dereference(*it_chain)) != NULL;
|
||||
it_chain = &tp->next)
|
||||
tfilter_notify(net, oskb, n, tp, 0, event);
|
||||
tfilter_notify(net, oskb, n, tp, 0, event, false);
|
||||
}
|
||||
|
||||
/* Select new prio value from the range, managed by kernel. */
|
||||
@@ -319,7 +319,8 @@ replay:
|
||||
|
||||
RCU_INIT_POINTER(*back, next);
|
||||
|
||||
tfilter_notify(net, skb, n, tp, fh, RTM_DELTFILTER);
|
||||
tfilter_notify(net, skb, n, tp, fh,
|
||||
RTM_DELTFILTER, false);
|
||||
tcf_destroy(tp, true);
|
||||
err = 0;
|
||||
goto errout;
|
||||
@@ -345,14 +346,14 @@ replay:
|
||||
struct tcf_proto *next = rtnl_dereference(tp->next);
|
||||
|
||||
tfilter_notify(net, skb, n, tp, fh,
|
||||
RTM_DELTFILTER);
|
||||
RTM_DELTFILTER, false);
|
||||
if (tcf_destroy(tp, false))
|
||||
RCU_INIT_POINTER(*back, next);
|
||||
}
|
||||
goto errout;
|
||||
case RTM_GETTFILTER:
|
||||
err = tfilter_notify(net, skb, n, tp, fh,
|
||||
RTM_NEWTFILTER);
|
||||
RTM_NEWTFILTER, true);
|
||||
goto errout;
|
||||
default:
|
||||
err = -EINVAL;
|
||||
@@ -367,7 +368,7 @@ replay:
|
||||
RCU_INIT_POINTER(tp->next, rtnl_dereference(*back));
|
||||
rcu_assign_pointer(*back, tp);
|
||||
}
|
||||
tfilter_notify(net, skb, n, tp, fh, RTM_NEWTFILTER);
|
||||
tfilter_notify(net, skb, n, tp, fh, RTM_NEWTFILTER, false);
|
||||
} else {
|
||||
if (tp_created)
|
||||
tcf_destroy(tp, true);
|
||||
@@ -419,7 +420,7 @@ nla_put_failure:
|
||||
|
||||
static int tfilter_notify(struct net *net, struct sk_buff *oskb,
|
||||
struct nlmsghdr *n, struct tcf_proto *tp,
|
||||
unsigned long fh, int event)
|
||||
unsigned long fh, int event, bool unicast)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
u32 portid = oskb ? NETLINK_CB(oskb).portid : 0;
|
||||
@@ -433,6 +434,9 @@ static int tfilter_notify(struct net *net, struct sk_buff *oskb,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (unicast)
|
||||
return netlink_unicast(net->rtnl, skb, portid, MSG_DONTWAIT);
|
||||
|
||||
return rtnetlink_send(skb, net, portid, RTNLGRP_TC,
|
||||
n->nlmsg_flags & NLM_F_ECHO);
|
||||
}
|
||||
|
@@ -246,7 +246,7 @@ static int strp_recv(read_descriptor_t *desc, struct sk_buff *orig_skb,
|
||||
} else {
|
||||
strp->rx_interrupted = 1;
|
||||
}
|
||||
strp_parser_err(strp, err, desc);
|
||||
strp_parser_err(strp, len, desc);
|
||||
break;
|
||||
} else if (len > strp->sk->sk_rcvbuf) {
|
||||
/* Message length exceeds maximum allowed */
|
||||
|
@@ -407,6 +407,7 @@ static int __tipc_nl_add_udp_addr(struct sk_buff *skb,
|
||||
if (ntohs(addr->proto) == ETH_P_IP) {
|
||||
struct sockaddr_in ip4;
|
||||
|
||||
memset(&ip4, 0, sizeof(ip4));
|
||||
ip4.sin_family = AF_INET;
|
||||
ip4.sin_port = addr->port;
|
||||
ip4.sin_addr.s_addr = addr->ipv4.s_addr;
|
||||
@@ -417,6 +418,7 @@ static int __tipc_nl_add_udp_addr(struct sk_buff *skb,
|
||||
} else if (ntohs(addr->proto) == ETH_P_IPV6) {
|
||||
struct sockaddr_in6 ip6;
|
||||
|
||||
memset(&ip6, 0, sizeof(ip6));
|
||||
ip6.sin6_family = AF_INET6;
|
||||
ip6.sin6_port = addr->port;
|
||||
memcpy(&ip6.sin6_addr, &addr->ipv6, sizeof(struct in6_addr));
|
||||
|
Reference in New Issue
Block a user