Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
The MSCC bug fix in 'net' had to be slightly adjusted because the register accesses are done slightly differently in net-next. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -918,7 +918,6 @@ int ip_valid_fib_dump_req(struct net *net, const struct nlmsghdr *nlh,
|
||||
else
|
||||
filter->dump_exceptions = false;
|
||||
|
||||
filter->dump_all_families = (rtm->rtm_family == AF_UNSPEC);
|
||||
filter->flags = rtm->rtm_flags;
|
||||
filter->protocol = rtm->rtm_protocol;
|
||||
filter->rt_type = rtm->rtm_type;
|
||||
@@ -990,7 +989,7 @@ static int inet_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
if (filter.table_id) {
|
||||
tb = fib_get_table(net, filter.table_id);
|
||||
if (!tb) {
|
||||
if (filter.dump_all_families)
|
||||
if (rtnl_msg_family(cb->nlh) != PF_INET)
|
||||
return skb->len;
|
||||
|
||||
NL_SET_ERR_MSG(cb->extack, "ipv4: FIB table does not exist");
|
||||
|
@@ -24,17 +24,19 @@
|
||||
#include <net/addrconf.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
/* match_wildcard == true: IPV6_ADDR_ANY equals to any IPv6 addresses if IPv6
|
||||
* only, and any IPv4 addresses if not IPv6 only
|
||||
* match_wildcard == false: addresses must be exactly the same, i.e.
|
||||
* IPV6_ADDR_ANY only equals to IPV6_ADDR_ANY,
|
||||
* and 0.0.0.0 equals to 0.0.0.0 only
|
||||
/* match_sk*_wildcard == true: IPV6_ADDR_ANY equals to any IPv6 addresses
|
||||
* if IPv6 only, and any IPv4 addresses
|
||||
* if not IPv6 only
|
||||
* match_sk*_wildcard == false: addresses must be exactly the same, i.e.
|
||||
* IPV6_ADDR_ANY only equals to IPV6_ADDR_ANY,
|
||||
* and 0.0.0.0 equals to 0.0.0.0 only
|
||||
*/
|
||||
static bool ipv6_rcv_saddr_equal(const struct in6_addr *sk1_rcv_saddr6,
|
||||
const struct in6_addr *sk2_rcv_saddr6,
|
||||
__be32 sk1_rcv_saddr, __be32 sk2_rcv_saddr,
|
||||
bool sk1_ipv6only, bool sk2_ipv6only,
|
||||
bool match_wildcard)
|
||||
bool match_sk1_wildcard,
|
||||
bool match_sk2_wildcard)
|
||||
{
|
||||
int addr_type = ipv6_addr_type(sk1_rcv_saddr6);
|
||||
int addr_type2 = sk2_rcv_saddr6 ? ipv6_addr_type(sk2_rcv_saddr6) : IPV6_ADDR_MAPPED;
|
||||
@@ -44,8 +46,8 @@ static bool ipv6_rcv_saddr_equal(const struct in6_addr *sk1_rcv_saddr6,
|
||||
if (!sk2_ipv6only) {
|
||||
if (sk1_rcv_saddr == sk2_rcv_saddr)
|
||||
return true;
|
||||
if (!sk1_rcv_saddr || !sk2_rcv_saddr)
|
||||
return match_wildcard;
|
||||
return (match_sk1_wildcard && !sk1_rcv_saddr) ||
|
||||
(match_sk2_wildcard && !sk2_rcv_saddr);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -53,11 +55,11 @@ static bool ipv6_rcv_saddr_equal(const struct in6_addr *sk1_rcv_saddr6,
|
||||
if (addr_type == IPV6_ADDR_ANY && addr_type2 == IPV6_ADDR_ANY)
|
||||
return true;
|
||||
|
||||
if (addr_type2 == IPV6_ADDR_ANY && match_wildcard &&
|
||||
if (addr_type2 == IPV6_ADDR_ANY && match_sk2_wildcard &&
|
||||
!(sk2_ipv6only && addr_type == IPV6_ADDR_MAPPED))
|
||||
return true;
|
||||
|
||||
if (addr_type == IPV6_ADDR_ANY && match_wildcard &&
|
||||
if (addr_type == IPV6_ADDR_ANY && match_sk1_wildcard &&
|
||||
!(sk1_ipv6only && addr_type2 == IPV6_ADDR_MAPPED))
|
||||
return true;
|
||||
|
||||
@@ -69,18 +71,19 @@ static bool ipv6_rcv_saddr_equal(const struct in6_addr *sk1_rcv_saddr6,
|
||||
}
|
||||
#endif
|
||||
|
||||
/* match_wildcard == true: 0.0.0.0 equals to any IPv4 addresses
|
||||
* match_wildcard == false: addresses must be exactly the same, i.e.
|
||||
* 0.0.0.0 only equals to 0.0.0.0
|
||||
/* match_sk*_wildcard == true: 0.0.0.0 equals to any IPv4 addresses
|
||||
* match_sk*_wildcard == false: addresses must be exactly the same, i.e.
|
||||
* 0.0.0.0 only equals to 0.0.0.0
|
||||
*/
|
||||
static bool ipv4_rcv_saddr_equal(__be32 sk1_rcv_saddr, __be32 sk2_rcv_saddr,
|
||||
bool sk2_ipv6only, bool match_wildcard)
|
||||
bool sk2_ipv6only, bool match_sk1_wildcard,
|
||||
bool match_sk2_wildcard)
|
||||
{
|
||||
if (!sk2_ipv6only) {
|
||||
if (sk1_rcv_saddr == sk2_rcv_saddr)
|
||||
return true;
|
||||
if (!sk1_rcv_saddr || !sk2_rcv_saddr)
|
||||
return match_wildcard;
|
||||
return (match_sk1_wildcard && !sk1_rcv_saddr) ||
|
||||
(match_sk2_wildcard && !sk2_rcv_saddr);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -96,10 +99,12 @@ bool inet_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2,
|
||||
sk2->sk_rcv_saddr,
|
||||
ipv6_only_sock(sk),
|
||||
ipv6_only_sock(sk2),
|
||||
match_wildcard,
|
||||
match_wildcard);
|
||||
#endif
|
||||
return ipv4_rcv_saddr_equal(sk->sk_rcv_saddr, sk2->sk_rcv_saddr,
|
||||
ipv6_only_sock(sk2), match_wildcard);
|
||||
ipv6_only_sock(sk2), match_wildcard,
|
||||
match_wildcard);
|
||||
}
|
||||
EXPORT_SYMBOL(inet_rcv_saddr_equal);
|
||||
|
||||
@@ -285,10 +290,10 @@ static inline int sk_reuseport_match(struct inet_bind_bucket *tb,
|
||||
tb->fast_rcv_saddr,
|
||||
sk->sk_rcv_saddr,
|
||||
tb->fast_ipv6_only,
|
||||
ipv6_only_sock(sk), true);
|
||||
ipv6_only_sock(sk), true, false);
|
||||
#endif
|
||||
return ipv4_rcv_saddr_equal(tb->fast_rcv_saddr, sk->sk_rcv_saddr,
|
||||
ipv6_only_sock(sk), true);
|
||||
ipv6_only_sock(sk), true, false);
|
||||
}
|
||||
|
||||
/* Obtain a reference to a local port for the given sock,
|
||||
|
@@ -686,7 +686,7 @@ out:
|
||||
|
||||
rtnl_link_failed:
|
||||
#if IS_ENABLED(CONFIG_MPLS)
|
||||
xfrm4_tunnel_deregister(&mplsip_handler, AF_INET);
|
||||
xfrm4_tunnel_deregister(&mplsip_handler, AF_MPLS);
|
||||
xfrm_tunnel_mplsip_failed:
|
||||
|
||||
#endif
|
||||
|
@@ -2577,7 +2577,7 @@ static int ipmr_rtm_dumproute(struct sk_buff *skb, struct netlink_callback *cb)
|
||||
|
||||
mrt = ipmr_get_table(sock_net(skb->sk), filter.table_id);
|
||||
if (!mrt) {
|
||||
if (filter.dump_all_families)
|
||||
if (rtnl_msg_family(cb->nlh) != RTNL_FAMILY_IPMR)
|
||||
return skb->len;
|
||||
|
||||
NL_SET_ERR_MSG(cb->extack, "ipv4: MR table does not exist");
|
||||
|
@@ -292,6 +292,7 @@ out:
|
||||
return 0;
|
||||
|
||||
nla_put_failure:
|
||||
nlmsg_cancel(skb, nlh);
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
@@ -482,7 +483,7 @@ static int nh_check_attr_group(struct net *net, struct nlattr *tb[],
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
for (i = NHA_GROUP + 1; i < __NHA_MAX; ++i) {
|
||||
for (i = NHA_GROUP_TYPE + 1; i < __NHA_MAX; ++i) {
|
||||
if (!tb[i])
|
||||
continue;
|
||||
if (tb[NHA_FDB])
|
||||
|
@@ -491,18 +491,16 @@ u32 ip_idents_reserve(u32 hash, int segs)
|
||||
atomic_t *p_id = ip_idents + hash % IP_IDENTS_SZ;
|
||||
u32 old = READ_ONCE(*p_tstamp);
|
||||
u32 now = (u32)jiffies;
|
||||
u32 new, delta = 0;
|
||||
u32 delta = 0;
|
||||
|
||||
if (old != now && cmpxchg(p_tstamp, old, now) == old)
|
||||
delta = prandom_u32_max(now - old);
|
||||
|
||||
/* Do not use atomic_add_return() as it makes UBSAN unhappy */
|
||||
do {
|
||||
old = (u32)atomic_read(p_id);
|
||||
new = old + delta + segs;
|
||||
} while (atomic_cmpxchg(p_id, old, new) != old);
|
||||
|
||||
return new - segs;
|
||||
/* If UBSAN reports an error there, please make sure your compiler
|
||||
* supports -fno-strict-overflow before reporting it that was a bug
|
||||
* in UBSAN, and it has been fixed in GCC-8.
|
||||
*/
|
||||
return atomic_add_return(segs + delta, p_id) - segs;
|
||||
}
|
||||
EXPORT_SYMBOL(ip_idents_reserve);
|
||||
|
||||
|
Reference in New Issue
Block a user