You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:
1) nfnetlink timestamp taken from wrong skb, fix from Florian Westphal.
2) Revert some msleep conversions in rtlwifi as these spots are in
atomic context, from Larry Finger.
3) Validate that NFTA_SET_TABLE attribute is actually specified when we
call nf_tables_getset(). From Phil Turnbull.
4) Don't do mdio_reset in stmmac driver with spinlock held as that can
sleep, from Vincent Palatin.
5) sk_filter() does things other than run a BPF filter, so we should
not elide it's call just because sk->sk_filter is NULL. Fix from
Eric Dumazet.
6) Fix missing backlog updates in several packet schedulers, from Cong
Wang.
7) bnx2x driver should allow VLAN add/remove while the interface is
down, from Michal Schmidt.
8) Several RDS/TCP race fixes from Sowmini Varadhan.
9) fq_codel scheduler doesn't return correct queue length in dumps,
from Eric Dumazet.
10) Fix TCP stats for tail loss probe and early retransmit in ipv6, from
Yuchung Cheng.
11) Properly initialize udp_tunnel_socket_cfg in l2tp_tunnel_create(),
from Guillaume Nault.
12) qfq scheduler leaks SKBs if a kzalloc fails, fix from Florian
Westphal.
13) sock_fprog passed into PACKET_FANOUT_DATA needs compat handling,
from Willem de Bruijn.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (85 commits)
vmxnet3: segCnt can be 1 for LRO packets
packet: compat support for sock_fprog
stmmac: fix parameter to dwmac4_set_umac_addr()
net/mlx5e: Fix blue flame quota logic
net/mlx5e: Use ndo_stop explicitly at shutdown flow
net/mlx5: E-Switch, always set mc_promisc for allmulti vports
net/mlx5: E-Switch, Modify node guid on vf set MAC
net/mlx5: E-Switch, Fix vport enable flow
net/mlx5: E-Switch, Use the correct error check on returned pointers
net/mlx5: E-Switch, Use the correct free() function
net/mlx5: Fix E-Switch flow steering capabilities check
net/mlx5: Fix flow steering NIC capabilities check
net/mlx5: Fix root flow table update
net/mlx5: Fix MLX5_CMD_OP_MAX to be defined correctly
net/mlx5: Fix masking of reserved bits in XRCD number
net/mlx5: Fix the size of modify QP mailbox
mlxsw: spectrum: Don't sleep during ndo_get_phys_port_name()
mlxsw: spectrum: Make split flow match firmware requirements
wext: Fix 32 bit iwpriv compatibility issue with 64 bit Kernel
cfg80211: remove get/set antenna and tx power warnings
...
This commit is contained in:
@@ -279,6 +279,8 @@ void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr)
|
||||
* change from under us.
|
||||
*/
|
||||
list_for_each_entry(v, &vg->vlan_list, vlist) {
|
||||
if (!br_vlan_should_use(v))
|
||||
continue;
|
||||
f = __br_fdb_get(br, br->dev->dev_addr, v->vid);
|
||||
if (f && f->is_local && !f->dst)
|
||||
fdb_delete_local(br, NULL, f);
|
||||
|
||||
+17
-3
@@ -309,8 +309,8 @@ void scm_detach_fds_compat(struct msghdr *kmsg, struct scm_cookie *scm)
|
||||
__scm_destroy(scm);
|
||||
}
|
||||
|
||||
static int do_set_attach_filter(struct socket *sock, int level, int optname,
|
||||
char __user *optval, unsigned int optlen)
|
||||
/* allocate a 64-bit sock_fprog on the user stack for duration of syscall. */
|
||||
struct sock_fprog __user *get_compat_bpf_fprog(char __user *optval)
|
||||
{
|
||||
struct compat_sock_fprog __user *fprog32 = (struct compat_sock_fprog __user *)optval;
|
||||
struct sock_fprog __user *kfprog = compat_alloc_user_space(sizeof(struct sock_fprog));
|
||||
@@ -323,6 +323,19 @@ static int do_set_attach_filter(struct socket *sock, int level, int optname,
|
||||
__get_user(ptr, &fprog32->filter) ||
|
||||
__put_user(len, &kfprog->len) ||
|
||||
__put_user(compat_ptr(ptr), &kfprog->filter))
|
||||
return NULL;
|
||||
|
||||
return kfprog;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_compat_bpf_fprog);
|
||||
|
||||
static int do_set_attach_filter(struct socket *sock, int level, int optname,
|
||||
char __user *optval, unsigned int optlen)
|
||||
{
|
||||
struct sock_fprog __user *kfprog;
|
||||
|
||||
kfprog = get_compat_bpf_fprog(optval);
|
||||
if (!kfprog)
|
||||
return -EFAULT;
|
||||
|
||||
return sock_setsockopt(sock, level, optname, (char __user *)kfprog,
|
||||
@@ -354,7 +367,8 @@ static int do_set_sock_timeout(struct socket *sock, int level,
|
||||
static int compat_sock_setsockopt(struct socket *sock, int level, int optname,
|
||||
char __user *optval, unsigned int optlen)
|
||||
{
|
||||
if (optname == SO_ATTACH_FILTER)
|
||||
if (optname == SO_ATTACH_FILTER ||
|
||||
optname == SO_ATTACH_REUSEPORT_CBPF)
|
||||
return do_set_attach_filter(sock, level, optname,
|
||||
optval, optlen);
|
||||
if (optname == SO_RCVTIMEO || optname == SO_SNDTIMEO)
|
||||
|
||||
@@ -47,6 +47,7 @@ nla_put_failure:
|
||||
* @xstats_type: TLV type for backward compatibility xstats TLV
|
||||
* @lock: statistics lock
|
||||
* @d: dumping handle
|
||||
* @padattr: padding attribute
|
||||
*
|
||||
* Initializes the dumping handle, grabs the statistic lock and appends
|
||||
* an empty TLV header to the socket buffer for use a container for all
|
||||
@@ -87,6 +88,7 @@ EXPORT_SYMBOL(gnet_stats_start_copy_compat);
|
||||
* @type: TLV type for top level statistic TLV
|
||||
* @lock: statistics lock
|
||||
* @d: dumping handle
|
||||
* @padattr: padding attribute
|
||||
*
|
||||
* Initializes the dumping handle, grabs the statistic lock and appends
|
||||
* an empty TLV header to the socket buffer for use a container for all
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_net.h>
|
||||
|
||||
#include "net-sysfs.h"
|
||||
|
||||
|
||||
+5
-5
@@ -1618,12 +1618,12 @@ int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
||||
}
|
||||
}
|
||||
|
||||
if (rcu_access_pointer(sk->sk_filter)) {
|
||||
if (udp_lib_checksum_complete(skb))
|
||||
if (rcu_access_pointer(sk->sk_filter) &&
|
||||
udp_lib_checksum_complete(skb))
|
||||
goto csum_error;
|
||||
if (sk_filter(sk, skb))
|
||||
goto drop;
|
||||
}
|
||||
|
||||
if (sk_filter(sk, skb))
|
||||
goto drop;
|
||||
|
||||
udp_csum_pull_header(skb);
|
||||
if (sk_rcvqueues_full(sk, sk->sk_rcvbuf)) {
|
||||
|
||||
@@ -1256,6 +1256,8 @@ static int ip6gre_tap_init(struct net_device *dev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
||||
|
||||
tunnel = netdev_priv(dev);
|
||||
|
||||
ip6gre_tnl_link_config(tunnel, 1);
|
||||
@@ -1289,6 +1291,7 @@ static void ip6gre_tap_setup(struct net_device *dev)
|
||||
|
||||
dev->features |= NETIF_F_NETNS_LOCAL;
|
||||
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
||||
dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
|
||||
}
|
||||
|
||||
static bool ip6gre_netlink_encap_parms(struct nlattr *data[],
|
||||
|
||||
@@ -1071,17 +1071,12 @@ struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
|
||||
const struct in6_addr *final_dst)
|
||||
{
|
||||
struct dst_entry *dst = sk_dst_check(sk, inet6_sk(sk)->dst_cookie);
|
||||
int err;
|
||||
|
||||
dst = ip6_sk_dst_check(sk, dst, fl6);
|
||||
if (!dst)
|
||||
dst = ip6_dst_lookup_flow(sk, fl6, final_dst);
|
||||
|
||||
err = ip6_dst_lookup_tail(sock_net(sk), sk, &dst, fl6);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
if (final_dst)
|
||||
fl6->daddr = *final_dst;
|
||||
|
||||
return xfrm_lookup_route(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
|
||||
return dst;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip6_sk_dst_lookup_flow);
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ static bool nf_dup_ipv6_route(struct net *net, struct sk_buff *skb,
|
||||
fl6.daddr = *gw;
|
||||
fl6.flowlabel = (__force __be32)(((iph->flow_lbl[0] & 0xF) << 16) |
|
||||
(iph->flow_lbl[1] << 8) | iph->flow_lbl[2]);
|
||||
fl6.flowi6_flags = FLOWI_FLAG_KNOWN_NH;
|
||||
dst = ip6_route_output(net, NULL, &fl6);
|
||||
if (dst->error) {
|
||||
dst_release(dst);
|
||||
|
||||
+3
-1
@@ -1721,7 +1721,9 @@ static void get_tcp6_sock(struct seq_file *seq, struct sock *sp, int i)
|
||||
destp = ntohs(inet->inet_dport);
|
||||
srcp = ntohs(inet->inet_sport);
|
||||
|
||||
if (icsk->icsk_pending == ICSK_TIME_RETRANS) {
|
||||
if (icsk->icsk_pending == ICSK_TIME_RETRANS ||
|
||||
icsk->icsk_pending == ICSK_TIME_EARLY_RETRANS ||
|
||||
icsk->icsk_pending == ICSK_TIME_LOSS_PROBE) {
|
||||
timer_active = 1;
|
||||
timer_expires = icsk->icsk_timeout;
|
||||
} else if (icsk->icsk_pending == ICSK_TIME_PROBE0) {
|
||||
|
||||
+6
-6
@@ -653,12 +653,12 @@ int udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
||||
}
|
||||
}
|
||||
|
||||
if (rcu_access_pointer(sk->sk_filter)) {
|
||||
if (udp_lib_checksum_complete(skb))
|
||||
goto csum_error;
|
||||
if (sk_filter(sk, skb))
|
||||
goto drop;
|
||||
}
|
||||
if (rcu_access_pointer(sk->sk_filter) &&
|
||||
udp_lib_checksum_complete(skb))
|
||||
goto csum_error;
|
||||
|
||||
if (sk_filter(sk, skb))
|
||||
goto drop;
|
||||
|
||||
udp_csum_pull_header(skb);
|
||||
if (sk_rcvqueues_full(sk, sk->sk_rcvbuf)) {
|
||||
|
||||
@@ -1581,7 +1581,7 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32
|
||||
/* Mark socket as an encapsulation socket. See net/ipv4/udp.c */
|
||||
tunnel->encap = encap;
|
||||
if (encap == L2TP_ENCAPTYPE_UDP) {
|
||||
struct udp_tunnel_sock_cfg udp_cfg;
|
||||
struct udp_tunnel_sock_cfg udp_cfg = { };
|
||||
|
||||
udp_cfg.sk_user_data = tunnel;
|
||||
udp_cfg.encap_type = UDP_ENCAP_L2TPINUDP;
|
||||
|
||||
@@ -161,6 +161,10 @@ void mesh_sta_cleanup(struct sta_info *sta)
|
||||
del_timer_sync(&sta->mesh->plink_timer);
|
||||
}
|
||||
|
||||
/* make sure no readers can access nexthop sta from here on */
|
||||
mesh_path_flush_by_nexthop(sta);
|
||||
synchronize_net();
|
||||
|
||||
if (changed)
|
||||
ieee80211_mbss_info_change_notify(sdata, changed);
|
||||
}
|
||||
|
||||
@@ -280,7 +280,7 @@ struct ieee80211_fast_tx {
|
||||
u8 sa_offs, da_offs, pn_offs;
|
||||
u8 band;
|
||||
u8 hdr[30 + 2 + IEEE80211_FAST_XMIT_MAX_IV +
|
||||
sizeof(rfc1042_header)];
|
||||
sizeof(rfc1042_header)] __aligned(2);
|
||||
|
||||
struct rcu_head rcu_head;
|
||||
};
|
||||
|
||||
@@ -762,7 +762,7 @@ static int expire_quiescent_template(struct netns_ipvs *ipvs,
|
||||
* If available, return 1, otherwise invalidate this connection
|
||||
* template and return 0.
|
||||
*/
|
||||
int ip_vs_check_template(struct ip_vs_conn *ct)
|
||||
int ip_vs_check_template(struct ip_vs_conn *ct, struct ip_vs_dest *cdest)
|
||||
{
|
||||
struct ip_vs_dest *dest = ct->dest;
|
||||
struct netns_ipvs *ipvs = ct->ipvs;
|
||||
@@ -772,7 +772,8 @@ int ip_vs_check_template(struct ip_vs_conn *ct)
|
||||
*/
|
||||
if ((dest == NULL) ||
|
||||
!(dest->flags & IP_VS_DEST_F_AVAILABLE) ||
|
||||
expire_quiescent_template(ipvs, dest)) {
|
||||
expire_quiescent_template(ipvs, dest) ||
|
||||
(cdest && (dest != cdest))) {
|
||||
IP_VS_DBG_BUF(9, "check_template: dest not available for "
|
||||
"protocol %s s:%s:%d v:%s:%d "
|
||||
"-> d:%s:%d\n",
|
||||
|
||||
@@ -321,7 +321,7 @@ ip_vs_sched_persist(struct ip_vs_service *svc,
|
||||
|
||||
/* Check if a template already exists */
|
||||
ct = ip_vs_ct_in_get(¶m);
|
||||
if (!ct || !ip_vs_check_template(ct)) {
|
||||
if (!ct || !ip_vs_check_template(ct, NULL)) {
|
||||
struct ip_vs_scheduler *sched;
|
||||
|
||||
/*
|
||||
@@ -1154,7 +1154,8 @@ struct ip_vs_conn *ip_vs_new_conn_out(struct ip_vs_service *svc,
|
||||
vport, ¶m) < 0)
|
||||
return NULL;
|
||||
ct = ip_vs_ct_in_get(¶m);
|
||||
if (!ct) {
|
||||
/* check if template exists and points to the same dest */
|
||||
if (!ct || !ip_vs_check_template(ct, dest)) {
|
||||
ct = ip_vs_conn_new(¶m, dest->af, daddr, dport,
|
||||
IP_VS_CONN_F_TEMPLATE, dest, 0);
|
||||
if (!ct) {
|
||||
|
||||
@@ -632,6 +632,7 @@ static int __init nf_conntrack_ftp_init(void)
|
||||
if (ret) {
|
||||
pr_err("failed to register helper for pf: %d port: %d\n",
|
||||
ftp[i][j].tuple.src.l3num, ports[i]);
|
||||
ports_c = i;
|
||||
nf_conntrack_ftp_fini();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -361,9 +361,10 @@ EXPORT_SYMBOL_GPL(nf_ct_helper_log);
|
||||
|
||||
int nf_conntrack_helper_register(struct nf_conntrack_helper *me)
|
||||
{
|
||||
int ret = 0;
|
||||
struct nf_conntrack_helper *cur;
|
||||
struct nf_conntrack_tuple_mask mask = { .src.u.all = htons(0xFFFF) };
|
||||
unsigned int h = helper_hash(&me->tuple);
|
||||
struct nf_conntrack_helper *cur;
|
||||
int ret = 0;
|
||||
|
||||
BUG_ON(me->expect_policy == NULL);
|
||||
BUG_ON(me->expect_class_max >= NF_CT_MAX_EXPECT_CLASSES);
|
||||
@@ -371,9 +372,7 @@ int nf_conntrack_helper_register(struct nf_conntrack_helper *me)
|
||||
|
||||
mutex_lock(&nf_ct_helper_mutex);
|
||||
hlist_for_each_entry(cur, &nf_ct_helper_hash[h], hnode) {
|
||||
if (strncmp(cur->name, me->name, NF_CT_HELPER_NAME_LEN) == 0 &&
|
||||
cur->tuple.src.l3num == me->tuple.src.l3num &&
|
||||
cur->tuple.dst.protonum == me->tuple.dst.protonum) {
|
||||
if (nf_ct_tuple_src_mask_cmp(&cur->tuple, &me->tuple, &mask)) {
|
||||
ret = -EEXIST;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -271,6 +271,7 @@ static int __init nf_conntrack_irc_init(void)
|
||||
if (ret) {
|
||||
pr_err("failed to register helper for pf: %u port: %u\n",
|
||||
irc[i].tuple.src.l3num, ports[i]);
|
||||
ports_c = i;
|
||||
nf_conntrack_irc_fini();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -223,6 +223,7 @@ static int __init nf_conntrack_sane_init(void)
|
||||
if (ret) {
|
||||
pr_err("failed to register helper for pf: %d port: %d\n",
|
||||
sane[i][j].tuple.src.l3num, ports[i]);
|
||||
ports_c = i;
|
||||
nf_conntrack_sane_fini();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1669,6 +1669,7 @@ static int __init nf_conntrack_sip_init(void)
|
||||
if (ret) {
|
||||
pr_err("failed to register helper for pf: %u port: %u\n",
|
||||
sip[i][j].tuple.src.l3num, ports[i]);
|
||||
ports_c = i;
|
||||
nf_conntrack_sip_fini();
|
||||
return ret;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user