hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/net/hsr/hsr_framereg.c
....@@ -159,6 +159,7 @@
159159 return NULL;
160160
161161 ether_addr_copy(new_node->macaddress_A, addr);
162
+ spin_lock_init(&new_node->seq_out_lock);
162163
163164 /* We are only interested in time diffs here, so use current jiffies
164165 * as initialization. (0 could trigger an spurious ring error warning).
....@@ -311,6 +312,7 @@
311312 goto done;
312313
313314 ether_addr_copy(node_real->macaddress_B, ethhdr->h_source);
315
+ spin_lock_bh(&node_real->seq_out_lock);
314316 for (i = 0; i < HSR_PT_PORTS; i++) {
315317 if (!node_curr->time_in_stale[i] &&
316318 time_after(node_curr->time_in[i], node_real->time_in[i])) {
....@@ -321,6 +323,7 @@
321323 if (seq_nr_after(node_curr->seq_out[i], node_real->seq_out[i]))
322324 node_real->seq_out[i] = node_curr->seq_out[i];
323325 }
326
+ spin_unlock_bh(&node_real->seq_out_lock);
324327 node_real->addr_B_port = port_rcv->type;
325328
326329 spin_lock_bh(&hsr->list_lock);
....@@ -377,7 +380,7 @@
377380 node_dst = find_node_by_addr_A(&port->hsr->node_db,
378381 eth_hdr(skb)->h_dest);
379382 if (!node_dst) {
380
- if (net_ratelimit())
383
+ if (port->hsr->prot_version != PRP_V1 && net_ratelimit())
381384 netdev_err(skb->dev, "%s: Unknown node\n", __func__);
382385 return;
383386 }
....@@ -413,13 +416,17 @@
413416 int hsr_register_frame_out(struct hsr_port *port, struct hsr_node *node,
414417 u16 sequence_nr)
415418 {
419
+ spin_lock_bh(&node->seq_out_lock);
416420 if (seq_nr_before_or_eq(sequence_nr, node->seq_out[port->type]) &&
417421 time_is_after_jiffies(node->time_out[port->type] +
418
- msecs_to_jiffies(HSR_ENTRY_FORGET_TIME)))
422
+ msecs_to_jiffies(HSR_ENTRY_FORGET_TIME))) {
423
+ spin_unlock_bh(&node->seq_out_lock);
419424 return 1;
425
+ }
420426
421427 node->time_out[port->type] = jiffies;
422428 node->seq_out[port->type] = sequence_nr;
429
+ spin_unlock_bh(&node->seq_out_lock);
423430 return 0;
424431 }
425432