hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/net/hsr/hsr_device.c
....@@ -219,7 +219,9 @@
219219 skb->dev = master->dev;
220220 skb_reset_mac_header(skb);
221221 skb_reset_mac_len(skb);
222
+ spin_lock_bh(&hsr->seqnr_lock);
222223 hsr_forward_skb(skb, master);
224
+ spin_unlock_bh(&hsr->seqnr_lock);
223225 } else {
224226 atomic_long_inc(&dev->tx_dropped);
225227 dev_kfree_skb_any(skb);
....@@ -232,7 +234,7 @@
232234 .parse = eth_header_parse,
233235 };
234236
235
-static struct sk_buff *hsr_init_skb(struct hsr_port *master, u16 proto)
237
+static struct sk_buff *hsr_init_skb(struct hsr_port *master)
236238 {
237239 struct hsr_priv *hsr = master->hsr;
238240 struct sk_buff *skb;
....@@ -244,8 +246,7 @@
244246 * being, for PRP it is a trailer and for HSR it is a
245247 * header
246248 */
247
- skb = dev_alloc_skb(sizeof(struct hsr_tag) +
248
- sizeof(struct hsr_sup_tag) +
249
+ skb = dev_alloc_skb(sizeof(struct hsr_sup_tag) +
249250 sizeof(struct hsr_sup_payload) + hlen + tlen);
250251
251252 if (!skb)
....@@ -253,10 +254,9 @@
253254
254255 skb_reserve(skb, hlen);
255256 skb->dev = master->dev;
256
- skb->protocol = htons(proto);
257257 skb->priority = TC_PRIO_CONTROL;
258258
259
- if (dev_hard_header(skb, skb->dev, proto,
259
+ if (dev_hard_header(skb, skb->dev, ETH_P_PRP,
260260 hsr->sup_multicast_addr,
261261 skb->dev->dev_addr, skb->len) <= 0)
262262 goto out;
....@@ -278,12 +278,9 @@
278278 {
279279 struct hsr_priv *hsr = master->hsr;
280280 __u8 type = HSR_TLV_LIFE_CHECK;
281
- struct hsr_tag *hsr_tag = NULL;
282281 struct hsr_sup_payload *hsr_sp;
283282 struct hsr_sup_tag *hsr_stag;
284
- unsigned long irqflags;
285283 struct sk_buff *skb;
286
- u16 proto;
287284
288285 *interval = msecs_to_jiffies(HSR_LIFE_CHECK_INTERVAL);
289286 if (hsr->announce_count < 3 && hsr->prot_version == 0) {
....@@ -292,21 +289,10 @@
292289 hsr->announce_count++;
293290 }
294291
295
- if (!hsr->prot_version)
296
- proto = ETH_P_PRP;
297
- else
298
- proto = ETH_P_HSR;
299
-
300
- skb = hsr_init_skb(master, proto);
292
+ skb = hsr_init_skb(master);
301293 if (!skb) {
302294 WARN_ONCE(1, "HSR: Could not send supervision frame\n");
303295 return;
304
- }
305
-
306
- if (hsr->prot_version > 0) {
307
- hsr_tag = skb_put(skb, sizeof(struct hsr_tag));
308
- hsr_tag->encap_proto = htons(ETH_P_PRP);
309
- set_hsr_tag_LSDU_size(hsr_tag, HSR_V1_SUP_LSDUSIZE);
310296 }
311297
312298 hsr_stag = skb_put(skb, sizeof(struct hsr_sup_tag));
....@@ -314,17 +300,14 @@
314300 set_hsr_stag_HSR_ver(hsr_stag, hsr->prot_version);
315301
316302 /* From HSRv1 on we have separate supervision sequence numbers. */
317
- spin_lock_irqsave(&master->hsr->seqnr_lock, irqflags);
303
+ spin_lock_bh(&hsr->seqnr_lock);
318304 if (hsr->prot_version > 0) {
319305 hsr_stag->sequence_nr = htons(hsr->sup_sequence_nr);
320306 hsr->sup_sequence_nr++;
321
- hsr_tag->sequence_nr = htons(hsr->sequence_nr);
322
- hsr->sequence_nr++;
323307 } else {
324308 hsr_stag->sequence_nr = htons(hsr->sequence_nr);
325309 hsr->sequence_nr++;
326310 }
327
- spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags);
328311
329312 hsr_stag->HSR_TLV_type = type;
330313 /* TODO: Why 12 in HSRv0? */
....@@ -335,11 +318,13 @@
335318 hsr_sp = skb_put(skb, sizeof(struct hsr_sup_payload));
336319 ether_addr_copy(hsr_sp->macaddress_A, master->dev->dev_addr);
337320
338
- if (skb_put_padto(skb, ETH_ZLEN + HSR_HLEN))
321
+ if (skb_put_padto(skb, ETH_ZLEN)) {
322
+ spin_unlock_bh(&hsr->seqnr_lock);
339323 return;
324
+ }
340325
341326 hsr_forward_skb(skb, master);
342
-
327
+ spin_unlock_bh(&hsr->seqnr_lock);
343328 return;
344329 }
345330
....@@ -349,12 +334,9 @@
349334 struct hsr_priv *hsr = master->hsr;
350335 struct hsr_sup_payload *hsr_sp;
351336 struct hsr_sup_tag *hsr_stag;
352
- unsigned long irqflags;
353337 struct sk_buff *skb;
354
- struct prp_rct *rct;
355
- u8 *tail;
356338
357
- skb = hsr_init_skb(master, ETH_P_PRP);
339
+ skb = hsr_init_skb(master);
358340 if (!skb) {
359341 WARN_ONCE(1, "PRP: Could not send supervision frame\n");
360342 return;
....@@ -366,7 +348,7 @@
366348 set_hsr_stag_HSR_ver(hsr_stag, (hsr->prot_version ? 1 : 0));
367349
368350 /* From HSRv1 on we have separate supervision sequence numbers. */
369
- spin_lock_irqsave(&master->hsr->seqnr_lock, irqflags);
351
+ spin_lock_bh(&hsr->seqnr_lock);
370352 hsr_stag->sequence_nr = htons(hsr->sup_sequence_nr);
371353 hsr->sup_sequence_nr++;
372354 hsr_stag->HSR_TLV_type = PRP_TLV_LIFE_CHECK_DD;
....@@ -376,20 +358,13 @@
376358 hsr_sp = skb_put(skb, sizeof(struct hsr_sup_payload));
377359 ether_addr_copy(hsr_sp->macaddress_A, master->dev->dev_addr);
378360
379
- if (skb_put_padto(skb, ETH_ZLEN + HSR_HLEN)) {
380
- spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags);
361
+ if (skb_put_padto(skb, ETH_ZLEN)) {
362
+ spin_unlock_bh(&hsr->seqnr_lock);
381363 return;
382364 }
383365
384
- tail = skb_tail_pointer(skb) - HSR_HLEN;
385
- rct = (struct prp_rct *)tail;
386
- rct->PRP_suffix = htons(ETH_P_PRP);
387
- set_prp_LSDU_size(rct, HSR_V1_SUP_LSDUSIZE);
388
- rct->sequence_nr = htons(hsr->sequence_nr);
389
- hsr->sequence_nr++;
390
- spin_unlock_irqrestore(&master->hsr->seqnr_lock, irqflags);
391
-
392366 hsr_forward_skb(skb, master);
367
+ spin_unlock_bh(&hsr->seqnr_lock);
393368 }
394369
395370 /* Announce (supervision frame) timer function
....@@ -468,7 +443,7 @@
468443 dev->header_ops = &hsr_header_ops;
469444 dev->netdev_ops = &hsr_device_ops;
470445 SET_NETDEV_DEVTYPE(dev, &hsr_type);
471
- dev->priv_flags |= IFF_NO_QUEUE;
446
+ dev->priv_flags |= IFF_NO_QUEUE | IFF_DISABLE_NETPOLL;
472447
473448 dev->needs_free_netdev = true;
474449