Skip to content

Commit 51b35d4

Browse files
committed
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Merge in late fixes to prepare for the 6.11 net-next PR. Conflicts: 93c3a96 ("net: pse-pd: Do not return EOPNOSUPP if config is null") 4cddb0f ("net: ethtool: pse-pd: Fix possible null-deref") 30d7b67 ("net: ethtool: Add new power limit get and set features") https://lore.kernel.org/[email protected]/ Signed-off-by: Jakub Kicinski <[email protected]>
2 parents af58de3 + 0a1868b commit 51b35d4

File tree

22 files changed

+310
-67
lines changed

22 files changed

+310
-67
lines changed

drivers/net/netconsole.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -973,14 +973,14 @@ static int netconsole_netdev_event(struct notifier_block *this,
973973
/* rtnl_lock already held
974974
* we might sleep in __netpoll_cleanup()
975975
*/
976+
nt->enabled = false;
976977
spin_unlock_irqrestore(&target_list_lock, flags);
977978

978979
__netpoll_cleanup(&nt->np);
979980

980981
spin_lock_irqsave(&target_list_lock, flags);
981982
netdev_put(nt->np.dev, &nt->np.dev_tracker);
982983
nt->np.dev = NULL;
983-
nt->enabled = false;
984984
stopped = true;
985985
netconsole_target_put(nt);
986986
goto restart;

drivers/net/pse-pd/pse_core.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -832,13 +832,13 @@ int pse_ethtool_set_config(struct pse_control *psec,
832832
{
833833
int err = 0;
834834

835-
if (pse_has_c33(psec)) {
835+
if (pse_has_c33(psec) && config->c33_admin_control) {
836836
err = pse_ethtool_c33_set_config(psec, config);
837837
if (err)
838838
return err;
839839
}
840840

841-
if (pse_has_podl(psec))
841+
if (pse_has_podl(psec) && config->podl_admin_control)
842842
err = pse_ethtool_podl_set_config(psec, config);
843843

844844
return err;

include/net/ip6_route.h

+14-6
Original file line numberDiff line numberDiff line change
@@ -127,18 +127,26 @@ void rt6_age_exceptions(struct fib6_info *f6i, struct fib6_gc_args *gc_args,
127127

128128
static inline int ip6_route_get_saddr(struct net *net, struct fib6_info *f6i,
129129
const struct in6_addr *daddr,
130-
unsigned int prefs,
130+
unsigned int prefs, int l3mdev_index,
131131
struct in6_addr *saddr)
132132
{
133+
struct net_device *l3mdev;
134+
struct net_device *dev;
135+
bool same_vrf;
133136
int err = 0;
134137

135-
if (f6i && f6i->fib6_prefsrc.plen) {
138+
rcu_read_lock();
139+
140+
l3mdev = dev_get_by_index_rcu(net, l3mdev_index);
141+
if (!f6i || !f6i->fib6_prefsrc.plen || l3mdev)
142+
dev = f6i ? fib6_info_nh_dev(f6i) : NULL;
143+
same_vrf = !l3mdev || l3mdev_master_dev_rcu(dev) == l3mdev;
144+
if (f6i && f6i->fib6_prefsrc.plen && same_vrf)
136145
*saddr = f6i->fib6_prefsrc.addr;
137-
} else {
138-
struct net_device *dev = f6i ? fib6_info_nh_dev(f6i) : NULL;
146+
else
147+
err = ipv6_dev_get_saddr(net, same_vrf ? dev : l3mdev, daddr, prefs, saddr);
139148

140-
err = ipv6_dev_get_saddr(net, dev, daddr, prefs, saddr);
141-
}
149+
rcu_read_unlock();
142150

143151
return err;
144152
}

include/net/xfrm.h

+10-26
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,10 @@ struct xfrm_state {
178178
struct hlist_node gclist;
179179
struct hlist_node bydst;
180180
};
181-
struct hlist_node bysrc;
181+
union {
182+
struct hlist_node dev_gclist;
183+
struct hlist_node bysrc;
184+
};
182185
struct hlist_node byspi;
183186
struct hlist_node byseq;
184187

@@ -1592,7 +1595,7 @@ void xfrm_state_update_stats(struct net *net);
15921595
static inline void xfrm_dev_state_update_stats(struct xfrm_state *x)
15931596
{
15941597
struct xfrm_dev_offload *xdo = &x->xso;
1595-
struct net_device *dev = xdo->dev;
1598+
struct net_device *dev = READ_ONCE(xdo->dev);
15961599

15971600
if (dev && dev->xfrmdev_ops &&
15981601
dev->xfrmdev_ops->xdo_dev_state_update_stats)
@@ -1950,13 +1953,16 @@ int xfrm_dev_policy_add(struct net *net, struct xfrm_policy *xp,
19501953
struct xfrm_user_offload *xuo, u8 dir,
19511954
struct netlink_ext_ack *extack);
19521955
bool xfrm_dev_offload_ok(struct sk_buff *skb, struct xfrm_state *x);
1956+
void xfrm_dev_state_delete(struct xfrm_state *x);
1957+
void xfrm_dev_state_free(struct xfrm_state *x);
19531958

19541959
static inline void xfrm_dev_state_advance_esn(struct xfrm_state *x)
19551960
{
19561961
struct xfrm_dev_offload *xso = &x->xso;
1962+
struct net_device *dev = READ_ONCE(xso->dev);
19571963

1958-
if (xso->dev && xso->dev->xfrmdev_ops->xdo_dev_state_advance_esn)
1959-
xso->dev->xfrmdev_ops->xdo_dev_state_advance_esn(x);
1964+
if (dev && dev->xfrmdev_ops->xdo_dev_state_advance_esn)
1965+
dev->xfrmdev_ops->xdo_dev_state_advance_esn(x);
19601966
}
19611967

19621968
static inline bool xfrm_dst_offload_ok(struct dst_entry *dst)
@@ -1977,28 +1983,6 @@ static inline bool xfrm_dst_offload_ok(struct dst_entry *dst)
19771983
return false;
19781984
}
19791985

1980-
static inline void xfrm_dev_state_delete(struct xfrm_state *x)
1981-
{
1982-
struct xfrm_dev_offload *xso = &x->xso;
1983-
1984-
if (xso->dev)
1985-
xso->dev->xfrmdev_ops->xdo_dev_state_delete(x);
1986-
}
1987-
1988-
static inline void xfrm_dev_state_free(struct xfrm_state *x)
1989-
{
1990-
struct xfrm_dev_offload *xso = &x->xso;
1991-
struct net_device *dev = xso->dev;
1992-
1993-
if (dev && dev->xfrmdev_ops) {
1994-
if (dev->xfrmdev_ops->xdo_dev_state_free)
1995-
dev->xfrmdev_ops->xdo_dev_state_free(x);
1996-
xso->dev = NULL;
1997-
xso->type = XFRM_DEV_OFFLOAD_UNSPECIFIED;
1998-
netdev_put(dev, &xso->dev_tracker);
1999-
}
2000-
}
2001-
20021986
static inline void xfrm_dev_policy_delete(struct xfrm_policy *x)
20031987
{
20041988
struct xfrm_dev_offload *xdo = &x->xdo;

net/bridge/br_forward.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ static inline int should_deliver(const struct net_bridge_port *p,
2525

2626
vg = nbp_vlan_group_rcu(p);
2727
return ((p->flags & BR_HAIRPIN_MODE) || skb->dev != p->dev) &&
28-
p->state == BR_STATE_FORWARDING && br_allowed_egress(vg, skb) &&
29-
nbp_switchdev_allowed_egress(p, skb) &&
28+
(br_mst_is_enabled(p->br) || p->state == BR_STATE_FORWARDING) &&
29+
br_allowed_egress(vg, skb) && nbp_switchdev_allowed_egress(p, skb) &&
3030
!br_skb_isolated(p, skb);
3131
}
3232

net/core/xdp.c

+1-3
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,8 @@ void xdp_unreg_mem_model(struct xdp_mem_info *mem)
127127
return;
128128

129129
if (type == MEM_TYPE_PAGE_POOL) {
130-
rcu_read_lock();
131-
xa = rhashtable_lookup(mem_id_ht, &id, mem_id_rht_params);
130+
xa = rhashtable_lookup_fast(mem_id_ht, &id, mem_id_rht_params);
132131
page_pool_destroy(xa->page_pool);
133-
rcu_read_unlock();
134132
}
135133
}
136134
EXPORT_SYMBOL_GPL(xdp_unreg_mem_model);

net/ethtool/pse-pd.c

+6-2
Original file line numberDiff line numberDiff line change
@@ -277,17 +277,21 @@ ethnl_set_pse(struct ethnl_req_info *req_info, struct genl_info *info)
277277
tb[ETHTOOL_A_C33_PSE_ADMIN_CONTROL]) {
278278
struct pse_control_config config = {};
279279

280-
if (pse_has_podl(phydev->psec))
280+
if (tb[ETHTOOL_A_PODL_PSE_ADMIN_CONTROL])
281281
config.podl_admin_control = nla_get_u32(tb[ETHTOOL_A_PODL_PSE_ADMIN_CONTROL]);
282-
if (pse_has_c33(phydev->psec))
282+
if (tb[ETHTOOL_A_C33_PSE_ADMIN_CONTROL])
283283
config.c33_admin_control = nla_get_u32(tb[ETHTOOL_A_C33_PSE_ADMIN_CONTROL]);
284284

285+
/* pse_ethtool_set_config() will do nothing if the config
286+
* is zero
287+
*/
285288
ret = pse_ethtool_set_config(phydev->psec, info->extack,
286289
&config);
287290
if (ret)
288291
return ret;
289292
}
290293

294+
/* Return errno or zero - PSE has no notification */
291295
return ret;
292296
}
293297

net/ipv4/esp4.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,7 @@ static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb)
239239
#else
240240
static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb)
241241
{
242-
kfree_skb(skb);
243-
242+
WARN_ON(1);
244243
return -EOPNOTSUPP;
245244
}
246245
#endif

net/ipv4/esp4_offload.c

+7
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ static struct sk_buff *esp4_gro_receive(struct list_head *head,
5656
x = xfrm_state_lookup(dev_net(skb->dev), skb->mark,
5757
(xfrm_address_t *)&ip_hdr(skb)->daddr,
5858
spi, IPPROTO_ESP, AF_INET);
59+
60+
if (unlikely(x && x->dir && x->dir != XFRM_SA_DIR_IN)) {
61+
/* non-offload path will record the error and audit log */
62+
xfrm_state_put(x);
63+
x = NULL;
64+
}
65+
5966
if (!x)
6067
goto out_reset;
6168

net/ipv4/fib_semantics.c

+11-2
Original file line numberDiff line numberDiff line change
@@ -2269,6 +2269,15 @@ void fib_select_path(struct net *net, struct fib_result *res,
22692269
fib_select_default(fl4, res);
22702270

22712271
check_saddr:
2272-
if (!fl4->saddr)
2273-
fl4->saddr = fib_result_prefsrc(net, res);
2272+
if (!fl4->saddr) {
2273+
struct net_device *l3mdev;
2274+
2275+
l3mdev = dev_get_by_index_rcu(net, fl4->flowi4_l3mdev);
2276+
2277+
if (!l3mdev ||
2278+
l3mdev_master_dev_rcu(FIB_RES_DEV(*res)) == l3mdev)
2279+
fl4->saddr = fib_result_prefsrc(net, res);
2280+
else
2281+
fl4->saddr = inet_select_addr(l3mdev, 0, RT_SCOPE_LINK);
2282+
}
22742283
}

net/ipv6/addrconf.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -1873,7 +1873,8 @@ int ipv6_dev_get_saddr(struct net *net, const struct net_device *dst_dev,
18731873
master, &dst,
18741874
scores, hiscore_idx);
18751875

1876-
if (scores[hiscore_idx].ifa)
1876+
if (scores[hiscore_idx].ifa &&
1877+
scores[hiscore_idx].scopedist >= 0)
18771878
goto out;
18781879
}
18791880

net/ipv6/esp6.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,7 @@ static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb)
256256
#else
257257
static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb)
258258
{
259-
kfree_skb(skb);
260-
259+
WARN_ON(1);
261260
return -EOPNOTSUPP;
262261
}
263262
#endif

net/ipv6/esp6_offload.c

+7
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,13 @@ static struct sk_buff *esp6_gro_receive(struct list_head *head,
8383
x = xfrm_state_lookup(dev_net(skb->dev), skb->mark,
8484
(xfrm_address_t *)&ipv6_hdr(skb)->daddr,
8585
spi, IPPROTO_ESP, AF_INET6);
86+
87+
if (unlikely(x && x->dir && x->dir != XFRM_SA_DIR_IN)) {
88+
/* non-offload path will record the error and audit log */
89+
xfrm_state_put(x);
90+
x = NULL;
91+
}
92+
8693
if (!x)
8794
goto out_reset;
8895

net/ipv6/ip6_output.c

+1
Original file line numberDiff line numberDiff line change
@@ -1124,6 +1124,7 @@ static int ip6_dst_lookup_tail(struct net *net, const struct sock *sk,
11241124
from = rt ? rcu_dereference(rt->from) : NULL;
11251125
err = ip6_route_get_saddr(net, from, &fl6->daddr,
11261126
sk ? READ_ONCE(inet6_sk(sk)->srcprefs) : 0,
1127+
fl6->flowi6_l3mdev,
11271128
&fl6->saddr);
11281129
rcu_read_unlock();
11291130

net/ipv6/route.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -5687,7 +5687,7 @@ static int rt6_fill_node(struct net *net, struct sk_buff *skb,
56875687
goto nla_put_failure;
56885688
} else if (dest) {
56895689
struct in6_addr saddr_buf;
5690-
if (ip6_route_get_saddr(net, rt, dest, 0, &saddr_buf) == 0 &&
5690+
if (ip6_route_get_saddr(net, rt, dest, 0, 0, &saddr_buf) == 0 &&
56915691
nla_put_in6_addr(skb, RTA_PREFSRC, &saddr_buf))
56925692
goto nla_put_failure;
56935693
}

0 commit comments

Comments
 (0)