aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/uapi/linux/tipc_netlink.h25
-rw-r--r--net/tipc/monitor.c133
-rw-r--r--net/tipc/monitor.h6
-rw-r--r--net/tipc/netlink.c7
-rw-r--r--net/tipc/node.c86
-rw-r--r--net/tipc/node.h3
6 files changed, 260 insertions, 0 deletions
diff --git a/include/uapi/linux/tipc_netlink.h b/include/uapi/linux/tipc_netlink.h
index d07c6ec76062..5f3f6d09fb79 100644
--- a/include/uapi/linux/tipc_netlink.h
+++ b/include/uapi/linux/tipc_netlink.h
@@ -58,6 +58,7 @@ enum {
58 TIPC_NL_NAME_TABLE_GET, 58 TIPC_NL_NAME_TABLE_GET,
59 TIPC_NL_MON_SET, 59 TIPC_NL_MON_SET,
60 TIPC_NL_MON_GET, 60 TIPC_NL_MON_GET,
61 TIPC_NL_MON_PEER_GET,
61 62
62 __TIPC_NL_CMD_MAX, 63 __TIPC_NL_CMD_MAX,
63 TIPC_NL_CMD_MAX = __TIPC_NL_CMD_MAX - 1 64 TIPC_NL_CMD_MAX = __TIPC_NL_CMD_MAX - 1
@@ -75,6 +76,7 @@ enum {
75 TIPC_NLA_NET, /* nest */ 76 TIPC_NLA_NET, /* nest */
76 TIPC_NLA_NAME_TABLE, /* nest */ 77 TIPC_NLA_NAME_TABLE, /* nest */
77 TIPC_NLA_MON, /* nest */ 78 TIPC_NLA_MON, /* nest */
79 TIPC_NLA_MON_PEER, /* nest */
78 80
79 __TIPC_NLA_MAX, 81 __TIPC_NLA_MAX,
80 TIPC_NLA_MAX = __TIPC_NLA_MAX - 1 82 TIPC_NLA_MAX = __TIPC_NLA_MAX - 1
@@ -173,6 +175,11 @@ enum {
173enum { 175enum {
174 TIPC_NLA_MON_UNSPEC, 176 TIPC_NLA_MON_UNSPEC,
175 TIPC_NLA_MON_ACTIVATION_THRESHOLD, /* u32 */ 177 TIPC_NLA_MON_ACTIVATION_THRESHOLD, /* u32 */
178 TIPC_NLA_MON_REF, /* u32 */
179 TIPC_NLA_MON_ACTIVE, /* flag */
180 TIPC_NLA_MON_BEARER_NAME, /* string */
181 TIPC_NLA_MON_PEERCNT, /* u32 */
182 TIPC_NLA_MON_LISTGEN, /* u32 */
176 183
177 __TIPC_NLA_MON_MAX, 184 __TIPC_NLA_MON_MAX,
178 TIPC_NLA_MON_MAX = __TIPC_NLA_MON_MAX - 1 185 TIPC_NLA_MON_MAX = __TIPC_NLA_MON_MAX - 1
@@ -194,6 +201,24 @@ enum {
194 TIPC_NLA_PUBL_MAX = __TIPC_NLA_PUBL_MAX - 1 201 TIPC_NLA_PUBL_MAX = __TIPC_NLA_PUBL_MAX - 1
195}; 202};
196 203
204/* Monitor peer info */
205enum {
206 TIPC_NLA_MON_PEER_UNSPEC,
207
208 TIPC_NLA_MON_PEER_ADDR, /* u32 */
209 TIPC_NLA_MON_PEER_DOMGEN, /* u32 */
210 TIPC_NLA_MON_PEER_APPLIED, /* u32 */
211 TIPC_NLA_MON_PEER_UPMAP, /* u64 */
212 TIPC_NLA_MON_PEER_MEMBERS, /* tlv */
213 TIPC_NLA_MON_PEER_UP, /* flag */
214 TIPC_NLA_MON_PEER_HEAD, /* flag */
215 TIPC_NLA_MON_PEER_LOCAL, /* flag */
216 TIPC_NLA_MON_PEER_PAD, /* flag */
217
218 __TIPC_NLA_MON_PEER_MAX,
219 TIPC_NLA_MON_PEER_MAX = __TIPC_NLA_MON_PEER_MAX - 1
220};
221
197/* Nest, connection info */ 222/* Nest, connection info */
198enum { 223enum {
199 TIPC_NLA_CON_UNSPEC, 224 TIPC_NLA_CON_UNSPEC,
diff --git a/net/tipc/monitor.c b/net/tipc/monitor.c
index 3579126e2ac8..be70a57c1ff9 100644
--- a/net/tipc/monitor.c
+++ b/net/tipc/monitor.c
@@ -33,9 +33,11 @@
33 * POSSIBILITY OF SUCH DAMAGE. 33 * POSSIBILITY OF SUCH DAMAGE.
34 */ 34 */
35 35
36#include <net/genetlink.h>
36#include "core.h" 37#include "core.h"
37#include "addr.h" 38#include "addr.h"
38#include "monitor.h" 39#include "monitor.h"
40#include "bearer.h"
39 41
40#define MAX_MON_DOMAIN 64 42#define MAX_MON_DOMAIN 64
41#define MON_TIMEOUT 120000 43#define MON_TIMEOUT 120000
@@ -668,3 +670,134 @@ int tipc_nl_monitor_get_threshold(struct net *net)
668 670
669 return tn->mon_threshold; 671 return tn->mon_threshold;
670} 672}
673
674int __tipc_nl_add_monitor_peer(struct tipc_peer *peer, struct tipc_nl_msg *msg)
675{
676 struct tipc_mon_domain *dom = peer->domain;
677 struct nlattr *attrs;
678 void *hdr;
679
680 hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family,
681 NLM_F_MULTI, TIPC_NL_MON_PEER_GET);
682 if (!hdr)
683 return -EMSGSIZE;
684
685 attrs = nla_nest_start(msg->skb, TIPC_NLA_MON_PEER);
686 if (!attrs)
687 goto msg_full;
688
689 if (nla_put_u32(msg->skb, TIPC_NLA_MON_PEER_ADDR, peer->addr))
690 goto attr_msg_full;
691 if (nla_put_u32(msg->skb, TIPC_NLA_MON_PEER_APPLIED, peer->applied))
692 goto attr_msg_full;
693
694 if (peer->is_up)
695 if (nla_put_flag(msg->skb, TIPC_NLA_MON_PEER_UP))
696 goto attr_msg_full;
697 if (peer->is_local)
698 if (nla_put_flag(msg->skb, TIPC_NLA_MON_PEER_LOCAL))
699 goto attr_msg_full;
700 if (peer->is_head)
701 if (nla_put_flag(msg->skb, TIPC_NLA_MON_PEER_HEAD))
702 goto attr_msg_full;
703
704 if (dom) {
705 if (nla_put_u32(msg->skb, TIPC_NLA_MON_PEER_DOMGEN, dom->gen))
706 goto attr_msg_full;
707 if (nla_put_u64_64bit(msg->skb, TIPC_NLA_MON_PEER_UPMAP,
708 dom->up_map, TIPC_NLA_MON_PEER_PAD))
709 goto attr_msg_full;
710 if (nla_put(msg->skb, TIPC_NLA_MON_PEER_MEMBERS,
711 dom->member_cnt * sizeof(u32), &dom->members))
712 goto attr_msg_full;
713 }
714
715 nla_nest_end(msg->skb, attrs);
716 genlmsg_end(msg->skb, hdr);
717 return 0;
718
719attr_msg_full:
720 nla_nest_cancel(msg->skb, attrs);
721msg_full:
722 genlmsg_cancel(msg->skb, hdr);
723
724 return -EMSGSIZE;
725}
726
727int tipc_nl_add_monitor_peer(struct net *net, struct tipc_nl_msg *msg,
728 u32 bearer_id, u32 *prev_node)
729{
730 struct tipc_monitor *mon = tipc_monitor(net, bearer_id);
731 struct tipc_peer *peer = mon->self;
732
733 if (!mon)
734 return -EINVAL;
735
736 read_lock_bh(&mon->lock);
737 do {
738 if (*prev_node) {
739 if (peer->addr == *prev_node)
740 *prev_node = 0;
741 else
742 continue;
743 }
744 if (__tipc_nl_add_monitor_peer(peer, msg)) {
745 *prev_node = peer->addr;
746 read_unlock_bh(&mon->lock);
747 return -EMSGSIZE;
748 }
749 } while ((peer = peer_nxt(peer)) != mon->self);
750 read_unlock_bh(&mon->lock);
751
752 return 0;
753}
754
755int __tipc_nl_add_monitor(struct net *net, struct tipc_nl_msg *msg,
756 u32 bearer_id)
757{
758 struct tipc_monitor *mon = tipc_monitor(net, bearer_id);
759 char bearer_name[TIPC_MAX_BEARER_NAME];
760 struct nlattr *attrs;
761 void *hdr;
762 int ret;
763
764 ret = tipc_bearer_get_name(net, bearer_name, bearer_id);
765 if (ret || !mon)
766 return -EINVAL;
767
768 hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family,
769 NLM_F_MULTI, TIPC_NL_MON_GET);
770 if (!hdr)
771 return -EMSGSIZE;
772
773 attrs = nla_nest_start(msg->skb, TIPC_NLA_MON);
774 if (!attrs)
775 goto msg_full;
776
777 read_lock_bh(&mon->lock);
778 if (nla_put_u32(msg->skb, TIPC_NLA_MON_REF, bearer_id))
779 goto attr_msg_full;
780 if (tipc_mon_is_active(net, mon))
781 if (nla_put_flag(msg->skb, TIPC_NLA_MON_ACTIVE))
782 goto attr_msg_full;
783 if (nla_put_string(msg->skb, TIPC_NLA_MON_BEARER_NAME, bearer_name))
784 goto attr_msg_full;
785 if (nla_put_u32(msg->skb, TIPC_NLA_MON_PEERCNT, mon->peer_cnt))
786 goto attr_msg_full;
787 if (nla_put_u32(msg->skb, TIPC_NLA_MON_LISTGEN, mon->list_gen))
788 goto attr_msg_full;
789
790 read_unlock_bh(&mon->lock);
791 nla_nest_end(msg->skb, attrs);
792 genlmsg_end(msg->skb, hdr);
793
794 return 0;
795
796attr_msg_full:
797 nla_nest_cancel(msg->skb, attrs);