Skip to content

Commit b2c26c8

Browse files
fmaurer-rhPaolo Abeni
authored andcommitted
hsr: Follow standard for HSRv0 supervision frames
For HSRv0, the path_id has the following meaning: - 0000: PRP supervision frame - 0001-1001: HSR ring identifier - 1010-1011: Frames from PRP network (A/B, with RedBoxes) - 1111: HSR supervision frame Follow the IEC 62439-3:2010 standard more closely by setting the right path_id for HSRv0 supervision frames (actually, it is correctly set when the frame is constructed, but hsr_set_path_id() overwrites it) and set a fixed HSR ring identifier of 1. The ring identifier seems to be generally unused and we ignore it anyways on reception, but some fixed identifier is definitely better than using one identifier in one direction and a wrong identifier in the other. This was also the behavior before commit f266a68 ("net/hsr: Better frame dispatch") which introduced the alternating path_id. This was later moved to hsr_set_path_id() in commit 451d812 ("net: prp: add packet handling support"). The IEC 62439-3:2010 also contains 6 unused bytes after the MacAddressA in the HSRv0 supervision frames. Adjust a TODO comment accordingly. Fixes: f266a68 ("net/hsr: Better frame dispatch") Fixes: 451d812 ("net: prp: add packet handling support") Signed-off-by: Felix Maurer <fmaurer@redhat.com> Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Link: https://patch.msgid.link/ea0d5133cd593856b2fa673d6e2067bf1d4d1794.1762876095.git.fmaurer@redhat.com Tested-by: Hangbin Liu <liuhangbin@gmail.com> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 96a3a03 commit b2c26c8

2 files changed

Lines changed: 16 additions & 8 deletions

File tree

net/hsr/hsr_device.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ static void send_hsr_supervision_frame(struct hsr_port *port,
337337
}
338338

339339
hsr_stag->tlv.HSR_TLV_type = type;
340-
/* TODO: Why 12 in HSRv0? */
340+
/* HSRv0 has 6 unused bytes after the MAC */
341341
hsr_stag->tlv.HSR_TLV_length = hsr->prot_version ?
342342
sizeof(struct hsr_sup_payload) : 12;
343343

net/hsr/hsr_forward.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -262,15 +262,23 @@ static struct sk_buff *prp_fill_rct(struct sk_buff *skb,
262262
return skb;
263263
}
264264

265-
static void hsr_set_path_id(struct hsr_ethhdr *hsr_ethhdr,
265+
static void hsr_set_path_id(struct hsr_frame_info *frame,
266+
struct hsr_ethhdr *hsr_ethhdr,
266267
struct hsr_port *port)
267268
{
268269
int path_id;
269270

270-
if (port->type == HSR_PT_SLAVE_A)
271-
path_id = 0;
272-
else
273-
path_id = 1;
271+
if (port->hsr->prot_version) {
272+
if (port->type == HSR_PT_SLAVE_A)
273+
path_id = 0;
274+
else
275+
path_id = 1;
276+
} else {
277+
if (frame->is_supervision)
278+
path_id = 0xf;
279+
else
280+
path_id = 1;
281+
}
274282

275283
set_hsr_tag_path(&hsr_ethhdr->hsr_tag, path_id);
276284
}
@@ -304,7 +312,7 @@ static struct sk_buff *hsr_fill_tag(struct sk_buff *skb,
304312
else
305313
hsr_ethhdr = (struct hsr_ethhdr *)pc;
306314

307-
hsr_set_path_id(hsr_ethhdr, port);
315+
hsr_set_path_id(frame, hsr_ethhdr, port);
308316
set_hsr_tag_LSDU_size(&hsr_ethhdr->hsr_tag, lsdu_size);
309317
hsr_ethhdr->hsr_tag.sequence_nr = htons(frame->sequence_nr);
310318
hsr_ethhdr->hsr_tag.encap_proto = hsr_ethhdr->ethhdr.h_proto;
@@ -330,7 +338,7 @@ struct sk_buff *hsr_create_tagged_frame(struct hsr_frame_info *frame,
330338
(struct hsr_ethhdr *)skb_mac_header(frame->skb_hsr);
331339

332340
/* set the lane id properly */
333-
hsr_set_path_id(hsr_ethhdr, port);
341+
hsr_set_path_id(frame, hsr_ethhdr, port);
334342
return skb_clone(frame->skb_hsr, GFP_ATOMIC);
335343
} else if (port->dev->features & NETIF_F_HW_HSR_TAG_INS) {
336344
return skb_clone(frame->skb_std, GFP_ATOMIC);

0 commit comments

Comments
 (0)