@@ -246,6 +246,8 @@ int smc_nl_get_sys_info(struct sk_buff *skb, struct netlink_callback *cb)
246
246
goto errattr ;
247
247
if (nla_put_u8 (skb , SMC_NLA_SYS_IS_ISM_V2 , smc_ism_is_v2_capable ()))
248
248
goto errattr ;
249
+ if (nla_put_u8 (skb , SMC_NLA_SYS_IS_SMCR_V2 , true))
250
+ goto errattr ;
249
251
smc_clc_get_hostname (& host );
250
252
if (host ) {
251
253
memcpy (hostname , host , SMC_MAX_HOSTNAME_LEN );
@@ -273,12 +275,65 @@ int smc_nl_get_sys_info(struct sk_buff *skb, struct netlink_callback *cb)
273
275
return skb -> len ;
274
276
}
275
277
278
+ /* Fill SMC_NLA_LGR_D_V2_COMMON/SMC_NLA_LGR_R_V2_COMMON nested attributes */
279
+ static int smc_nl_fill_lgr_v2_common (struct smc_link_group * lgr ,
280
+ struct sk_buff * skb ,
281
+ struct netlink_callback * cb ,
282
+ struct nlattr * v2_attrs )
283
+ {
284
+ char smc_host [SMC_MAX_HOSTNAME_LEN + 1 ];
285
+ char smc_eid [SMC_MAX_EID_LEN + 1 ];
286
+
287
+ if (nla_put_u8 (skb , SMC_NLA_LGR_V2_VER , lgr -> smc_version ))
288
+ goto errv2attr ;
289
+ if (nla_put_u8 (skb , SMC_NLA_LGR_V2_REL , lgr -> peer_smc_release ))
290
+ goto errv2attr ;
291
+ if (nla_put_u8 (skb , SMC_NLA_LGR_V2_OS , lgr -> peer_os ))
292
+ goto errv2attr ;
293
+ memcpy (smc_host , lgr -> peer_hostname , SMC_MAX_HOSTNAME_LEN );
294
+ smc_host [SMC_MAX_HOSTNAME_LEN ] = 0 ;
295
+ if (nla_put_string (skb , SMC_NLA_LGR_V2_PEER_HOST , smc_host ))
296
+ goto errv2attr ;
297
+ memcpy (smc_eid , lgr -> negotiated_eid , SMC_MAX_EID_LEN );
298
+ smc_eid [SMC_MAX_EID_LEN ] = 0 ;
299
+ if (nla_put_string (skb , SMC_NLA_LGR_V2_NEG_EID , smc_eid ))
300
+ goto errv2attr ;
301
+
302
+ nla_nest_end (skb , v2_attrs );
303
+ return 0 ;
304
+
305
+ errv2attr :
306
+ nla_nest_cancel (skb , v2_attrs );
307
+ return - EMSGSIZE ;
308
+ }
309
+
310
+ static int smc_nl_fill_smcr_lgr_v2 (struct smc_link_group * lgr ,
311
+ struct sk_buff * skb ,
312
+ struct netlink_callback * cb )
313
+ {
314
+ struct nlattr * v2_attrs ;
315
+
316
+ v2_attrs = nla_nest_start (skb , SMC_NLA_LGR_R_V2 );
317
+ if (!v2_attrs )
318
+ goto errattr ;
319
+ if (nla_put_u8 (skb , SMC_NLA_LGR_R_V2_DIRECT , !lgr -> uses_gateway ))
320
+ goto errv2attr ;
321
+
322
+ nla_nest_end (skb , v2_attrs );
323
+ return 0 ;
324
+
325
+ errv2attr :
326
+ nla_nest_cancel (skb , v2_attrs );
327
+ errattr :
328
+ return - EMSGSIZE ;
329
+ }
330
+
276
331
static int smc_nl_fill_lgr (struct smc_link_group * lgr ,
277
332
struct sk_buff * skb ,
278
333
struct netlink_callback * cb )
279
334
{
280
335
char smc_target [SMC_MAX_PNETID_LEN + 1 ];
281
- struct nlattr * attrs ;
336
+ struct nlattr * attrs , * v2_attrs ;
282
337
283
338
attrs = nla_nest_start (skb , SMC_GEN_LGR_SMCR );
284
339
if (!attrs )
@@ -298,6 +353,15 @@ static int smc_nl_fill_lgr(struct smc_link_group *lgr,
298
353
smc_target [SMC_MAX_PNETID_LEN ] = 0 ;
299
354
if (nla_put_string (skb , SMC_NLA_LGR_R_PNETID , smc_target ))
300
355
goto errattr ;
356
+ if (lgr -> smc_version > SMC_V1 ) {
357
+ v2_attrs = nla_nest_start (skb , SMC_NLA_LGR_R_V2_COMMON );
358
+ if (!v2_attrs )
359
+ goto errattr ;
360
+ if (smc_nl_fill_lgr_v2_common (lgr , skb , cb , v2_attrs ))
361
+ goto errattr ;
362
+ if (smc_nl_fill_smcr_lgr_v2 (lgr , skb , cb ))
363
+ goto errattr ;
364
+ }
301
365
302
366
nla_nest_end (skb , attrs );
303
367
return 0 ;
@@ -430,10 +494,7 @@ static int smc_nl_fill_smcd_lgr(struct smc_link_group *lgr,
430
494
struct sk_buff * skb ,
431
495
struct netlink_callback * cb )
432
496
{
433
- char smc_host [SMC_MAX_HOSTNAME_LEN + 1 ];
434
497
char smc_pnet [SMC_MAX_PNETID_LEN + 1 ];
435
- char smc_eid [SMC_MAX_EID_LEN + 1 ];
436
- struct nlattr * v2_attrs ;
437
498
struct nlattr * attrs ;
438
499
void * nlh ;
439
500
@@ -465,32 +526,19 @@ static int smc_nl_fill_smcd_lgr(struct smc_link_group *lgr,
465
526
smc_pnet [SMC_MAX_PNETID_LEN ] = 0 ;
466
527
if (nla_put_string (skb , SMC_NLA_LGR_D_PNETID , smc_pnet ))
467
528
goto errattr ;
529
+ if (lgr -> smc_version > SMC_V1 ) {
530
+ struct nlattr * v2_attrs ;
468
531
469
- v2_attrs = nla_nest_start (skb , SMC_NLA_LGR_V2 );
470
- if (!v2_attrs )
471
- goto errattr ;
472
- if (nla_put_u8 (skb , SMC_NLA_LGR_V2_VER , lgr -> smc_version ))
473
- goto errv2attr ;
474
- if (nla_put_u8 (skb , SMC_NLA_LGR_V2_REL , lgr -> peer_smc_release ))
475
- goto errv2attr ;
476
- if (nla_put_u8 (skb , SMC_NLA_LGR_V2_OS , lgr -> peer_os ))
477
- goto errv2attr ;
478
- memcpy (smc_host , lgr -> peer_hostname , SMC_MAX_HOSTNAME_LEN );
479
- smc_host [SMC_MAX_HOSTNAME_LEN ] = 0 ;
480
- if (nla_put_string (skb , SMC_NLA_LGR_V2_PEER_HOST , smc_host ))
481
- goto errv2attr ;
482
- memcpy (smc_eid , lgr -> negotiated_eid , SMC_MAX_EID_LEN );
483
- smc_eid [SMC_MAX_EID_LEN ] = 0 ;
484
- if (nla_put_string (skb , SMC_NLA_LGR_V2_NEG_EID , smc_eid ))
485
- goto errv2attr ;
486
-
487
- nla_nest_end (skb , v2_attrs );
532
+ v2_attrs = nla_nest_start (skb , SMC_NLA_LGR_D_V2_COMMON );
533
+ if (!v2_attrs )
534
+ goto errattr ;
535
+ if (smc_nl_fill_lgr_v2_common (lgr , skb , cb , v2_attrs ))
536
+ goto errattr ;
537
+ }
488
538
nla_nest_end (skb , attrs );
489
539
genlmsg_end (skb , nlh );
490
540
return 0 ;
491
541
492
- errv2attr :
493
- nla_nest_cancel (skb , v2_attrs );
494
542
errattr :
495
543
nla_nest_cancel (skb , attrs );
496
544
errout :
0 commit comments