net/smc: add SMC-D diag support
authorHans Wippel <hwippel@linux.ibm.com>
Thu, 28 Jun 2018 17:05:12 +0000 (19:05 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 30 Jun 2018 11:42:26 +0000 (20:42 +0900)
This patch adds diag support for SMC-D.

Signed-off-by: Hans Wippel <hwippel@linux.ibm.com>
Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
Suggested-by: Thomas Richter <tmricht@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/smc_diag.h
net/smc/smc_diag.c

index 0ae5d46..92be255 100644 (file)
@@ -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_ */
index 64ce107..6d83eef 100644 (file)
@@ -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;