Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net/smc: add netlink support for SMC-Rv2

Implement the netlink support for SMC-Rv2 related attributes that are
provided to user space.

Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Karsten Graul and committed by
David S. Miller
b0539f5e b4ba4652

+88 -27
+15 -2
include/uapi/linux/smc.h
··· 84 84 SMC_NLA_SYS_IS_ISM_V2, /* u8 */ 85 85 SMC_NLA_SYS_LOCAL_HOST, /* string */ 86 86 SMC_NLA_SYS_SEID, /* string */ 87 + SMC_NLA_SYS_IS_SMCR_V2, /* u8 */ 87 88 __SMC_NLA_SYS_MAX, 88 89 SMC_NLA_SYS_MAX = __SMC_NLA_SYS_MAX - 1 89 90 }; 90 91 91 - /* SMC_NLA_LGR_V2 nested attributes */ 92 + /* SMC_NLA_LGR_D_V2_COMMON and SMC_NLA_LGR_R_V2_COMMON nested attributes */ 92 93 enum { 93 94 SMC_NLA_LGR_V2_VER, /* u8 */ 94 95 SMC_NLA_LGR_V2_REL, /* u8 */ 95 96 SMC_NLA_LGR_V2_OS, /* u8 */ 96 97 SMC_NLA_LGR_V2_NEG_EID, /* string */ 97 98 SMC_NLA_LGR_V2_PEER_HOST, /* string */ 99 + __SMC_NLA_LGR_V2_MAX, 100 + SMC_NLA_LGR_V2_MAX = __SMC_NLA_LGR_V2_MAX - 1 101 + }; 102 + 103 + /* SMC_NLA_LGR_R_V2 nested attributes */ 104 + enum { 105 + SMC_NLA_LGR_R_V2_UNSPEC, 106 + SMC_NLA_LGR_R_V2_DIRECT, /* u8 */ 107 + __SMC_NLA_LGR_R_V2_MAX, 108 + SMC_NLA_LGR_R_V2_MAX = __SMC_NLA_LGR_R_V2_MAX - 1 98 109 }; 99 110 100 111 /* SMC_GEN_LGR_SMCR attributes */ ··· 117 106 SMC_NLA_LGR_R_PNETID, /* string */ 118 107 SMC_NLA_LGR_R_VLAN_ID, /* u8 */ 119 108 SMC_NLA_LGR_R_CONNS_NUM, /* u32 */ 109 + SMC_NLA_LGR_R_V2_COMMON, /* nest */ 110 + SMC_NLA_LGR_R_V2, /* nest */ 120 111 __SMC_NLA_LGR_R_MAX, 121 112 SMC_NLA_LGR_R_MAX = __SMC_NLA_LGR_R_MAX - 1 122 113 }; ··· 151 138 SMC_NLA_LGR_D_PNETID, /* string */ 152 139 SMC_NLA_LGR_D_CHID, /* u16 */ 153 140 SMC_NLA_LGR_D_PAD, /* flag */ 154 - SMC_NLA_LGR_V2, /* nest */ 141 + SMC_NLA_LGR_D_V2_COMMON, /* nest */ 155 142 __SMC_NLA_LGR_D_MAX, 156 143 SMC_NLA_LGR_D_MAX = __SMC_NLA_LGR_D_MAX - 1 157 144 };
+73 -25
net/smc/smc_core.c
··· 244 244 goto errattr; 245 245 if (nla_put_u8(skb, SMC_NLA_SYS_IS_ISM_V2, smc_ism_is_v2_capable())) 246 246 goto errattr; 247 + if (nla_put_u8(skb, SMC_NLA_SYS_IS_SMCR_V2, true)) 248 + goto errattr; 247 249 smc_clc_get_hostname(&host); 248 250 if (host) { 249 251 memcpy(hostname, host, SMC_MAX_HOSTNAME_LEN); ··· 273 271 return skb->len; 274 272 } 275 273 274 + /* Fill SMC_NLA_LGR_D_V2_COMMON/SMC_NLA_LGR_R_V2_COMMON nested attributes */ 275 + static int smc_nl_fill_lgr_v2_common(struct smc_link_group *lgr, 276 + struct sk_buff *skb, 277 + struct netlink_callback *cb, 278 + struct nlattr *v2_attrs) 279 + { 280 + char smc_host[SMC_MAX_HOSTNAME_LEN + 1]; 281 + char smc_eid[SMC_MAX_EID_LEN + 1]; 282 + 283 + if (nla_put_u8(skb, SMC_NLA_LGR_V2_VER, lgr->smc_version)) 284 + goto errv2attr; 285 + if (nla_put_u8(skb, SMC_NLA_LGR_V2_REL, lgr->peer_smc_release)) 286 + goto errv2attr; 287 + if (nla_put_u8(skb, SMC_NLA_LGR_V2_OS, lgr->peer_os)) 288 + goto errv2attr; 289 + memcpy(smc_host, lgr->peer_hostname, SMC_MAX_HOSTNAME_LEN); 290 + smc_host[SMC_MAX_HOSTNAME_LEN] = 0; 291 + if (nla_put_string(skb, SMC_NLA_LGR_V2_PEER_HOST, smc_host)) 292 + goto errv2attr; 293 + memcpy(smc_eid, lgr->negotiated_eid, SMC_MAX_EID_LEN); 294 + smc_eid[SMC_MAX_EID_LEN] = 0; 295 + if (nla_put_string(skb, SMC_NLA_LGR_V2_NEG_EID, smc_eid)) 296 + goto errv2attr; 297 + 298 + nla_nest_end(skb, v2_attrs); 299 + return 0; 300 + 301 + errv2attr: 302 + nla_nest_cancel(skb, v2_attrs); 303 + return -EMSGSIZE; 304 + } 305 + 306 + static int smc_nl_fill_smcr_lgr_v2(struct smc_link_group *lgr, 307 + struct sk_buff *skb, 308 + struct netlink_callback *cb) 309 + { 310 + struct nlattr *v2_attrs; 311 + 312 + v2_attrs = nla_nest_start(skb, SMC_NLA_LGR_R_V2); 313 + if (!v2_attrs) 314 + goto errattr; 315 + if (nla_put_u8(skb, SMC_NLA_LGR_R_V2_DIRECT, !lgr->uses_gateway)) 316 + goto errv2attr; 317 + 318 + nla_nest_end(skb, v2_attrs); 319 + return 0; 320 + 321 + errv2attr: 322 + nla_nest_cancel(skb, v2_attrs); 323 + errattr: 324 + return -EMSGSIZE; 325 + } 326 + 276 327 static int smc_nl_fill_lgr(struct smc_link_group *lgr, 277 328 struct sk_buff *skb, 278 329 struct netlink_callback *cb) 279 330 { 280 331 char smc_target[SMC_MAX_PNETID_LEN + 1]; 281 - struct nlattr *attrs; 332 + struct nlattr *attrs, *v2_attrs; 282 333 283 334 attrs = nla_nest_start(skb, SMC_GEN_LGR_SMCR); 284 335 if (!attrs) ··· 351 296 smc_target[SMC_MAX_PNETID_LEN] = 0; 352 297 if (nla_put_string(skb, SMC_NLA_LGR_R_PNETID, smc_target)) 353 298 goto errattr; 299 + if (lgr->smc_version > SMC_V1) { 300 + v2_attrs = nla_nest_start(skb, SMC_NLA_LGR_R_V2_COMMON); 301 + if (!v2_attrs) 302 + goto errattr; 303 + if (smc_nl_fill_lgr_v2_common(lgr, skb, cb, v2_attrs)) 304 + goto errattr; 305 + if (smc_nl_fill_smcr_lgr_v2(lgr, skb, cb)) 306 + goto errattr; 307 + } 354 308 355 309 nla_nest_end(skb, attrs); 356 310 return 0; ··· 492 428 struct sk_buff *skb, 493 429 struct netlink_callback *cb) 494 430 { 495 - char smc_host[SMC_MAX_HOSTNAME_LEN + 1]; 496 431 char smc_pnet[SMC_MAX_PNETID_LEN + 1]; 497 - char smc_eid[SMC_MAX_EID_LEN + 1]; 498 - struct nlattr *v2_attrs; 499 432 struct nlattr *attrs; 500 433 void *nlh; 501 434 ··· 524 463 smc_pnet[SMC_MAX_PNETID_LEN] = 0; 525 464 if (nla_put_string(skb, SMC_NLA_LGR_D_PNETID, smc_pnet)) 526 465 goto errattr; 466 + if (lgr->smc_version > SMC_V1) { 467 + struct nlattr *v2_attrs; 527 468 528 - v2_attrs = nla_nest_start(skb, SMC_NLA_LGR_V2); 529 - if (!v2_attrs) 530 - goto errattr; 531 - if (nla_put_u8(skb, SMC_NLA_LGR_V2_VER, lgr->smc_version)) 532 - goto errv2attr; 533 - if (nla_put_u8(skb, SMC_NLA_LGR_V2_REL, lgr->peer_smc_release)) 534 - goto errv2attr; 535 - if (nla_put_u8(skb, SMC_NLA_LGR_V2_OS, lgr->peer_os)) 536 - goto errv2attr; 537 - memcpy(smc_host, lgr->peer_hostname, SMC_MAX_HOSTNAME_LEN); 538 - smc_host[SMC_MAX_HOSTNAME_LEN] = 0; 539 - if (nla_put_string(skb, SMC_NLA_LGR_V2_PEER_HOST, smc_host)) 540 - goto errv2attr; 541 - memcpy(smc_eid, lgr->negotiated_eid, SMC_MAX_EID_LEN); 542 - smc_eid[SMC_MAX_EID_LEN] = 0; 543 - if (nla_put_string(skb, SMC_NLA_LGR_V2_NEG_EID, smc_eid)) 544 - goto errv2attr; 545 - 546 - nla_nest_end(skb, v2_attrs); 469 + v2_attrs = nla_nest_start(skb, SMC_NLA_LGR_D_V2_COMMON); 470 + if (!v2_attrs) 471 + goto errattr; 472 + if (smc_nl_fill_lgr_v2_common(lgr, skb, cb, v2_attrs)) 473 + goto errattr; 474 + } 547 475 nla_nest_end(skb, attrs); 548 476 genlmsg_end(skb, nlh); 549 477 return 0; 550 478 551 - errv2attr: 552 - nla_nest_cancel(skb, v2_attrs); 553 479 errattr: 554 480 nla_nest_cancel(skb, attrs); 555 481 errout: