mirror of
https://github.com/torvalds/linux.git
synced 2025-11-30 23:16:01 +07:00
Merge branch 'hsr-send-correct-hsrv0-supervision-frames'
Felix Maurer says: ==================== hsr: Send correct HSRv0 supervision frames Hangbin recently reported that the hsr selftests were failing and noted that the entries in the node table were not merged, i.e., had 00:00:00:00:00:00 as MacAddressB forever [1]. This failure only occured with HSRv0 because it was not sending supervision frames anymore. While debugging this I found that we were not really following the HSRv0 standard for the supervision frames we sent, so I additionally made a few changes to get closer to the standard and restore a more correct behavior we had a while ago. The selftests can still fail because they take a while and run into the timeout. I did not include a change of the timeout because I have more improvements to the selftests mostly ready that change the test duration but are net-next material. [1]: https://lore.kernel.org/netdev/aMONxDXkzBZZRfE5@fedora/ ==================== Link: https://patch.msgid.link/cover.1762876095.git.fmaurer@redhat.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
@@ -320,6 +320,9 @@ static void send_hsr_supervision_frame(struct hsr_port *port,
|
||||
}
|
||||
|
||||
hsr_stag = skb_put(skb, sizeof(struct hsr_sup_tag));
|
||||
skb_set_network_header(skb, ETH_HLEN + HSR_HLEN);
|
||||
skb_reset_mac_len(skb);
|
||||
|
||||
set_hsr_stag_path(hsr_stag, (hsr->prot_version ? 0x0 : 0xf));
|
||||
set_hsr_stag_HSR_ver(hsr_stag, hsr->prot_version);
|
||||
|
||||
@@ -334,7 +337,7 @@ static void send_hsr_supervision_frame(struct hsr_port *port,
|
||||
}
|
||||
|
||||
hsr_stag->tlv.HSR_TLV_type = type;
|
||||
/* TODO: Why 12 in HSRv0? */
|
||||
/* HSRv0 has 6 unused bytes after the MAC */
|
||||
hsr_stag->tlv.HSR_TLV_length = hsr->prot_version ?
|
||||
sizeof(struct hsr_sup_payload) : 12;
|
||||
|
||||
|
||||
@@ -262,15 +262,23 @@ static struct sk_buff *prp_fill_rct(struct sk_buff *skb,
|
||||
return skb;
|
||||
}
|
||||
|
||||
static void hsr_set_path_id(struct hsr_ethhdr *hsr_ethhdr,
|
||||
static void hsr_set_path_id(struct hsr_frame_info *frame,
|
||||
struct hsr_ethhdr *hsr_ethhdr,
|
||||
struct hsr_port *port)
|
||||
{
|
||||
int path_id;
|
||||
|
||||
if (port->type == HSR_PT_SLAVE_A)
|
||||
path_id = 0;
|
||||
else
|
||||
path_id = 1;
|
||||
if (port->hsr->prot_version) {
|
||||
if (port->type == HSR_PT_SLAVE_A)
|
||||
path_id = 0;
|
||||
else
|
||||
path_id = 1;
|
||||
} else {
|
||||
if (frame->is_supervision)
|
||||
path_id = 0xf;
|
||||
else
|
||||
path_id = 1;
|
||||
}
|
||||
|
||||
set_hsr_tag_path(&hsr_ethhdr->hsr_tag, path_id);
|
||||
}
|
||||
@@ -304,7 +312,7 @@ static struct sk_buff *hsr_fill_tag(struct sk_buff *skb,
|
||||
else
|
||||
hsr_ethhdr = (struct hsr_ethhdr *)pc;
|
||||
|
||||
hsr_set_path_id(hsr_ethhdr, port);
|
||||
hsr_set_path_id(frame, hsr_ethhdr, port);
|
||||
set_hsr_tag_LSDU_size(&hsr_ethhdr->hsr_tag, lsdu_size);
|
||||
hsr_ethhdr->hsr_tag.sequence_nr = htons(frame->sequence_nr);
|
||||
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,
|
||||
(struct hsr_ethhdr *)skb_mac_header(frame->skb_hsr);
|
||||
|
||||
/* set the lane id properly */
|
||||
hsr_set_path_id(hsr_ethhdr, port);
|
||||
hsr_set_path_id(frame, hsr_ethhdr, port);
|
||||
return skb_clone(frame->skb_hsr, GFP_ATOMIC);
|
||||
} else if (port->dev->features & NETIF_F_HW_HSR_TAG_INS) {
|
||||
return skb_clone(frame->skb_std, GFP_ATOMIC);
|
||||
|
||||
Reference in New Issue
Block a user