tipc: extend sock diag for group communication
authorGhantaKrishnamurthy MohanKrishna <mohan.krishna.ghanta.krishnamurthy@ericsson.com>
Fri, 29 Jun 2018 11:26:18 +0000 (13:26 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 30 Jun 2018 12:05:42 +0000 (21:05 +0900)
This commit extends the existing TIPC socket diagnostics framework
for information related to TIPC group communication.

Acked-by: Ying Xue <ying.xue@windriver.com>
Acked-by: Jon Maloy <jon.maloy@ericsson.com>
Signed-off-by: GhantaKrishnamurthy MohanKrishna <mohan.krishna.ghanta.krishnamurthy@ericsson.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/tipc_netlink.h
net/tipc/group.c
net/tipc/group.h
net/tipc/socket.c

index 85c11982c89b38a3995db683d08b7f89ac2e3889..0ebe02ef1a86b1eeceeac99c8354bd38516a26e2 100644 (file)
@@ -121,6 +121,7 @@ enum {
        TIPC_NLA_SOCK_TIPC_STATE,       /* u32 */
        TIPC_NLA_SOCK_COOKIE,           /* u64 */
        TIPC_NLA_SOCK_PAD,              /* flag */
+       TIPC_NLA_SOCK_GROUP,            /* nest */
 
        __TIPC_NLA_SOCK_MAX,
        TIPC_NLA_SOCK_MAX = __TIPC_NLA_SOCK_MAX - 1
@@ -233,6 +234,19 @@ enum {
        TIPC_NLA_MON_PEER_MAX = __TIPC_NLA_MON_PEER_MAX - 1
 };
 
+/* Nest, socket group info */
+enum {
+       TIPC_NLA_SOCK_GROUP_ID,                 /* u32 */
+       TIPC_NLA_SOCK_GROUP_OPEN,               /* flag */
+       TIPC_NLA_SOCK_GROUP_NODE_SCOPE,         /* flag */
+       TIPC_NLA_SOCK_GROUP_CLUSTER_SCOPE,      /* flag */
+       TIPC_NLA_SOCK_GROUP_INSTANCE,           /* u32 */
+       TIPC_NLA_SOCK_GROUP_BC_SEND_NEXT,       /* u32 */
+
+       __TIPC_NLA_SOCK_GROUP_MAX,
+       TIPC_NLA_SOCK_GROUP_MAX = __TIPC_NLA_SOCK_GROUP_MAX - 1
+};
+
 /* Nest, connection info */
 enum {
        TIPC_NLA_CON_UNSPEC,
index d7a7befeddd42c907bdf88a37e0b77515b3e8705..cbe39e8db39c49180dcbcbf689f5d2e29b03e406 100644 (file)
@@ -918,3 +918,35 @@ void tipc_group_member_evt(struct tipc_group *grp,
        }
        *sk_rcvbuf = tipc_group_rcvbuf_limit(grp);
 }
+
+int tipc_group_fill_sock_diag(struct tipc_group *grp, struct sk_buff *skb)
+{
+       struct nlattr *group = nla_nest_start(skb, TIPC_NLA_SOCK_GROUP);
+
+       if (nla_put_u32(skb, TIPC_NLA_SOCK_GROUP_ID,
+                       grp->type) ||
+           nla_put_u32(skb, TIPC_NLA_SOCK_GROUP_INSTANCE,
+                       grp->instance) ||
+           nla_put_u32(skb, TIPC_NLA_SOCK_GROUP_BC_SEND_NEXT,
+                       grp->bc_snd_nxt))
+               goto group_msg_cancel;
+
+       if (grp->scope == TIPC_NODE_SCOPE)
+               if (nla_put_flag(skb, TIPC_NLA_SOCK_GROUP_NODE_SCOPE))
+                       goto group_msg_cancel;
+
+       if (grp->scope == TIPC_CLUSTER_SCOPE)
+               if (nla_put_flag(skb, TIPC_NLA_SOCK_GROUP_CLUSTER_SCOPE))
+                       goto group_msg_cancel;
+
+       if (*grp->open)
+               if (nla_put_flag(skb, TIPC_NLA_SOCK_GROUP_OPEN))
+                       goto group_msg_cancel;
+
+       nla_nest_end(skb, group);
+       return 0;
+
+group_msg_cancel:
+       nla_nest_cancel(skb, group);
+       return -1;
+}
index 5996af6e9f1ddb72b565ae9288e685c83d6a1c0d..76b4e5a7b39deb83520932a7af678e7b25558be4 100644 (file)
@@ -72,4 +72,5 @@ void tipc_group_update_rcv_win(struct tipc_group *grp, int blks, u32 node,
                               u32 port, struct sk_buff_head *xmitq);
 u16 tipc_group_bc_snd_nxt(struct tipc_group *grp);
 void tipc_group_update_member(struct tipc_member *m, int len);
+int tipc_group_fill_sock_diag(struct tipc_group *grp, struct sk_buff *skb);
 #endif
index 14a5d055717d2a7b95ea353b15f53dfb81a39515..840dd995f63197d87142f0d17a2d30e41f89160d 100644 (file)
@@ -3316,6 +3316,11 @@ int tipc_sk_fill_sock_diag(struct sk_buff *skb, struct netlink_callback *cb,
                goto stat_msg_cancel;
 
        nla_nest_end(skb, stat);
+
+       if (tsk->group)
+               if (tipc_group_fill_sock_diag(tsk->group, skb))
+                       goto stat_msg_cancel;
+
        nla_nest_end(skb, attrs);
 
        return 0;