Skip to content

Commit 67096a1

Browse files
author
CKI KWF Bot
committed
Merge: hsr: stable backports from upstream (phase 1)
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/967 JIRA: https://issues.redhat.com/browse/RHEL-84547 Backporting missing fixes from upstream. Signed-off-by: Felix Maurer <fmaurer@redhat.com> Approved-by: Hangbin Liu <haliu@redhat.com> Approved-by: Guillaume Nault <gnault@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
2 parents 575d800 + deb5a25 commit 67096a1

File tree

3 files changed

+21
-10
lines changed

3 files changed

+21
-10
lines changed

net/hsr/hsr_device.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -246,20 +246,22 @@ static const struct header_ops hsr_header_ops = {
246246
.parse = eth_header_parse,
247247
};
248248

249-
static struct sk_buff *hsr_init_skb(struct hsr_port *master)
249+
static struct sk_buff *hsr_init_skb(struct hsr_port *master, int extra)
250250
{
251251
struct hsr_priv *hsr = master->hsr;
252252
struct sk_buff *skb;
253253
int hlen, tlen;
254+
int len;
254255

255256
hlen = LL_RESERVED_SPACE(master->dev);
256257
tlen = master->dev->needed_tailroom;
258+
len = sizeof(struct hsr_sup_tag) + sizeof(struct hsr_sup_payload);
257259
/* skb size is same for PRP/HSR frames, only difference
258260
* being, for PRP it is a trailer and for HSR it is a
259-
* header
261+
* header.
262+
* RedBox might use @extra more bytes.
260263
*/
261-
skb = dev_alloc_skb(sizeof(struct hsr_sup_tag) +
262-
sizeof(struct hsr_sup_payload) + hlen + tlen);
264+
skb = dev_alloc_skb(len + extra + hlen + tlen);
263265

264266
if (!skb)
265267
return skb;
@@ -268,15 +270,15 @@ static struct sk_buff *hsr_init_skb(struct hsr_port *master)
268270
skb->dev = master->dev;
269271
skb->priority = TC_PRIO_CONTROL;
270272

273+
skb_reset_network_header(skb);
274+
skb_reset_transport_header(skb);
271275
if (dev_hard_header(skb, skb->dev, ETH_P_PRP,
272276
hsr->sup_multicast_addr,
273277
skb->dev->dev_addr, skb->len) <= 0)
274278
goto out;
275279

276280
skb_reset_mac_header(skb);
277281
skb_reset_mac_len(skb);
278-
skb_reset_network_header(skb);
279-
skb_reset_transport_header(skb);
280282

281283
return skb;
282284
out:
@@ -295,6 +297,7 @@ static void send_hsr_supervision_frame(struct hsr_port *port,
295297
struct hsr_sup_tlv *hsr_stlv;
296298
struct hsr_sup_tag *hsr_stag;
297299
struct sk_buff *skb;
300+
int extra = 0;
298301

299302
*interval = msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL);
300303
if (hsr->announce_count < 3 && hsr->prot_version == 0) {
@@ -303,7 +306,11 @@ static void send_hsr_supervision_frame(struct hsr_port *port,
303306
hsr->announce_count++;
304307
}
305308

306-
skb = hsr_init_skb(port);
309+
if (hsr->redbox)
310+
extra = sizeof(struct hsr_sup_tlv) +
311+
sizeof(struct hsr_sup_payload);
312+
313+
skb = hsr_init_skb(port, extra);
307314
if (!skb) {
308315
netdev_warn_once(port->dev, "HSR: Could not send supervision frame\n");
309316
return;
@@ -362,7 +369,7 @@ static void send_prp_supervision_frame(struct hsr_port *master,
362369
struct hsr_sup_tag *hsr_stag;
363370
struct sk_buff *skb;
364371

365-
skb = hsr_init_skb(master);
372+
skb = hsr_init_skb(master, 0);
366373
if (!skb) {
367374
netdev_warn_once(master->dev, "PRP: Could not send supervision frame\n");
368375
return;

net/hsr/hsr_forward.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -688,7 +688,12 @@ static int fill_frame_info(struct hsr_frame_info *frame,
688688
frame->is_vlan = true;
689689

690690
if (frame->is_vlan) {
691-
vlan_hdr = (struct hsr_vlan_ethhdr *)ethhdr;
691+
/* Note: skb->mac_len might be wrong here. */
692+
if (!pskb_may_pull(skb,
693+
skb_mac_offset(skb) +
694+
offsetofend(struct hsr_vlan_ethhdr, vlanhdr)))
695+
return -EINVAL;
696+
vlan_hdr = (struct hsr_vlan_ethhdr *)skb_mac_header(skb);
692697
proto = vlan_hdr->vlanhdr.h_vlan_encapsulated_proto;
693698
/* FIXME: */
694699
netdev_warn_once(skb->dev, "VLAN not yet supported");

net/hsr/hsr_slave.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,6 @@ int hsr_add_port(struct hsr_priv *hsr, struct net_device *dev,
204204
}
205205

206206
list_add_tail_rcu(&port->port_list, &hsr->ports);
207-
synchronize_rcu();
208207

209208
master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
210209
netdev_update_features(master->dev);

0 commit comments

Comments
 (0)