From: Hans Wippel <hwip...@linux.ibm.com>

This patch adds diag support for SMC-D.

Signed-off-by: Hans Wippel <hwip...@linux.ibm.com>
Signed-off-by: Ursula Braun <ubr...@linux.ibm.com>
Suggested-by: Thomas Richter <tmri...@linux.ibm.com>
---
 include/uapi/linux/smc_diag.h | 10 ++++++++++
 net/smc/smc_diag.c            | 15 +++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/include/uapi/linux/smc_diag.h b/include/uapi/linux/smc_diag.h
index 0ae5d4685ba3..92be255e534c 100644
--- a/include/uapi/linux/smc_diag.h
+++ b/include/uapi/linux/smc_diag.h
@@ -35,6 +35,7 @@ enum {
        SMC_DIAG_CONNINFO,
        SMC_DIAG_LGRINFO,
        SMC_DIAG_SHUTDOWN,
+       SMC_DIAG_DMBINFO,
        __SMC_DIAG_MAX,
 };
 
@@ -83,4 +84,13 @@ struct smc_diag_lgrinfo {
        struct smc_diag_linkinfo        lnk[1];
        __u8                            role;
 };
+
+struct smcd_diag_dmbinfo {             /* SMC-D Socket internals */
+       __u32 linkid;                   /* Link identifier */
+       __u64 peer_gid;                 /* Peer GID */
+       __u64 my_gid;                   /* My GID */
+       __u64 token;                    /* Token of DMB */
+       __u64 peer_token;               /* Token of remote DMBE */
+};
+
 #endif /* _UAPI_SMC_DIAG_H_ */
diff --git a/net/smc/smc_diag.c b/net/smc/smc_diag.c
index 64ce107c24d9..6d83eef1b743 100644
--- a/net/smc/smc_diag.c
+++ b/net/smc/smc_diag.c
@@ -156,6 +156,21 @@ static int __smc_diag_dump(struct sock *sk, struct sk_buff 
*skb,
                if (nla_put(skb, SMC_DIAG_LGRINFO, sizeof(linfo), &linfo) < 0)
                        goto errout;
        }
+       if (smc->conn.lgr && smc->conn.lgr->is_smcd &&
+           (req->diag_ext & (1 << (SMC_DIAG_DMBINFO - 1))) &&
+           !list_empty(&smc->conn.lgr->list)) {
+               struct smc_connection *conn = &smc->conn;
+               struct smcd_diag_dmbinfo dinfo = {
+                       .linkid = *((u32 *)conn->lgr->id),
+                       .peer_gid = conn->lgr->peer_gid,
+                       .my_gid = conn->lgr->smcd->local_gid,
+                       .token = conn->rmb_desc->token,
+                       .peer_token = conn->peer_token
+               };
+
+               if (nla_put(skb, SMC_DIAG_DMBINFO, sizeof(dinfo), &dinfo) < 0)
+                       goto errout;
+       }
 
        nlmsg_end(skb, nlh);
        return 0;
-- 
2.16.4

Reply via email to