|
@@ -1955,3 +1955,55 @@ int tipc_nl_node_set_monitor(struct sk_buff *skb, struct genl_info *info)
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+static int __tipc_nl_add_monitor_prop(struct net *net, struct tipc_nl_msg *msg)
|
|
|
+{
|
|
|
+ struct nlattr *attrs;
|
|
|
+ void *hdr;
|
|
|
+ u32 val;
|
|
|
+
|
|
|
+ hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family,
|
|
|
+ 0, TIPC_NL_MON_GET);
|
|
|
+ if (!hdr)
|
|
|
+ return -EMSGSIZE;
|
|
|
+
|
|
|
+ attrs = nla_nest_start(msg->skb, TIPC_NLA_MON);
|
|
|
+ if (!attrs)
|
|
|
+ goto msg_full;
|
|
|
+
|
|
|
+ val = tipc_nl_monitor_get_threshold(net);
|
|
|
+
|
|
|
+ if (nla_put_u32(msg->skb, TIPC_NLA_MON_ACTIVATION_THRESHOLD, val))
|
|
|
+ goto attr_msg_full;
|
|
|
+
|
|
|
+ nla_nest_end(msg->skb, attrs);
|
|
|
+ genlmsg_end(msg->skb, hdr);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
+attr_msg_full:
|
|
|
+ nla_nest_cancel(msg->skb, attrs);
|
|
|
+msg_full:
|
|
|
+ genlmsg_cancel(msg->skb, hdr);
|
|
|
+
|
|
|
+ return -EMSGSIZE;
|
|
|
+}
|
|
|
+
|
|
|
+int tipc_nl_node_get_monitor(struct sk_buff *skb, struct genl_info *info)
|
|
|
+{
|
|
|
+ struct net *net = sock_net(skb->sk);
|
|
|
+ struct tipc_nl_msg msg;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ msg.skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
|
|
|
+ msg.portid = info->snd_portid;
|
|
|
+ msg.seq = info->snd_seq;
|
|
|
+
|
|
|
+ err = __tipc_nl_add_monitor_prop(net, &msg);
|
|
|
+ if (err) {
|
|
|
+ nlmsg_free(msg.skb);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ return genlmsg_reply(msg.skb, info);
|
|
|
+}
|