{
        struct smc_sock *smc = smc_sk(sk);
 
-       r->diag_family = sk->sk_family;
        if (!smc->clcsock)
                return;
        r->id.idiag_sport = htons(smc->clcsock->sk->sk_num);
        r->id.idiag_dport = smc->clcsock->sk->sk_dport;
        r->id.idiag_if = smc->clcsock->sk->sk_bound_dev_if;
        sock_diag_save_cookie(sk, r->id.idiag_cookie);
-       memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src));
-       memset(&r->id.idiag_dst, 0, sizeof(r->id.idiag_dst));
-       r->id.idiag_src[0] = smc->clcsock->sk->sk_rcv_saddr;
-       r->id.idiag_dst[0] = smc->clcsock->sk->sk_daddr;
+       if (sk->sk_protocol == SMCPROTO_SMC) {
+               r->diag_family = PF_INET;
+               memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src));
+               memset(&r->id.idiag_dst, 0, sizeof(r->id.idiag_dst));
+               r->id.idiag_src[0] = smc->clcsock->sk->sk_rcv_saddr;
+               r->id.idiag_dst[0] = smc->clcsock->sk->sk_daddr;
+#if IS_ENABLED(CONFIG_IPV6)
+       } else if (sk->sk_protocol == SMCPROTO_SMC6) {
+               r->diag_family = PF_INET6;
+               memcpy(&r->id.idiag_src, &smc->clcsock->sk->sk_v6_rcv_saddr,
+                      sizeof(smc->clcsock->sk->sk_v6_rcv_saddr));
+               memcpy(&r->id.idiag_dst, &smc->clcsock->sk->sk_v6_daddr,
+                      sizeof(smc->clcsock->sk->sk_v6_daddr));
+#endif
+       }
 }
 
 static int smc_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb,
        return -EMSGSIZE;
 }
 
-static int smc_diag_dump(struct sk_buff *skb, struct netlink_callback *cb)
+static int smc_diag_dump_proto(struct proto *prot, struct sk_buff *skb,
+                              struct netlink_callback *cb)
 {
        struct net *net = sock_net(skb->sk);
        struct nlattr *bc = NULL;
        struct sock *sk;
        int rc = 0;
 
-       read_lock(&smc_proto.h.smc_hash->lock);
-       head = &smc_proto.h.smc_hash->ht;
+       read_lock(&prot->h.smc_hash->lock);
+       head = &prot->h.smc_hash->ht;
        if (hlist_empty(head))
                goto out;
 
        }
 
 out:
-       read_unlock(&smc_proto.h.smc_hash->lock);
+       read_unlock(&prot->h.smc_hash->lock);
+       return rc;
+}
+
+static int smc_diag_dump(struct sk_buff *skb, struct netlink_callback *cb)
+{
+       int rc = 0;
+
+       rc = smc_diag_dump_proto(&smc_proto, skb, cb);
+       if (!rc)
+               rc = smc_diag_dump_proto(&smc_proto6, skb, cb);
        return rc;
 }