@@ -246,20 +246,22 @@ static const struct header_ops hsr_header_ops = {
246
246
.parse = eth_header_parse ,
247
247
};
248
248
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 )
250
250
{
251
251
struct hsr_priv * hsr = master -> hsr ;
252
252
struct sk_buff * skb ;
253
253
int hlen , tlen ;
254
+ int len ;
254
255
255
256
hlen = LL_RESERVED_SPACE (master -> dev );
256
257
tlen = master -> dev -> needed_tailroom ;
258
+ len = sizeof (struct hsr_sup_tag ) + sizeof (struct hsr_sup_payload );
257
259
/* skb size is same for PRP/HSR frames, only difference
258
260
* being, for PRP it is a trailer and for HSR it is a
259
- * header
261
+ * header.
262
+ * RedBox might use @extra more bytes.
260
263
*/
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 );
263
265
264
266
if (!skb )
265
267
return skb ;
@@ -295,6 +297,7 @@ static void send_hsr_supervision_frame(struct hsr_port *port,
295
297
struct hsr_sup_tlv * hsr_stlv ;
296
298
struct hsr_sup_tag * hsr_stag ;
297
299
struct sk_buff * skb ;
300
+ int extra = 0 ;
298
301
299
302
* interval = msecs_to_jiffies (HSR_LIFE_CHECK_INTERVAL );
300
303
if (hsr -> announce_count < 3 && hsr -> prot_version == 0 ) {
@@ -303,7 +306,11 @@ static void send_hsr_supervision_frame(struct hsr_port *port,
303
306
hsr -> announce_count ++ ;
304
307
}
305
308
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 );
307
314
if (!skb ) {
308
315
netdev_warn_once (port -> dev , "HSR: Could not send supervision frame\n" );
309
316
return ;
@@ -362,7 +369,7 @@ static void send_prp_supervision_frame(struct hsr_port *master,
362
369
struct hsr_sup_tag * hsr_stag ;
363
370
struct sk_buff * skb ;
364
371
365
- skb = hsr_init_skb (master );
372
+ skb = hsr_init_skb (master , 0 );
366
373
if (!skb ) {
367
374
netdev_warn_once (master -> dev , "PRP: Could not send supervision frame\n" );
368
375
return ;
0 commit comments