tipc: add link stat reset to new netlink api
authorRichard Alpe <richard.alpe@ericsson.com>
Thu, 20 Nov 2014 09:29:14 +0000 (10:29 +0100)
committerDavid S. Miller <davem@davemloft.net>
Fri, 21 Nov 2014 20:01:31 +0000 (15:01 -0500)
Add TIPC_NL_LINK_RESET_STATS command to the new netlink API.

This command resets the link statistics for a particular link.

Netlink logical layout of link reset message:
-> link
    -> name

Signed-off-by: Richard Alpe <richard.alpe@ericsson.com>
Reviewed-by: Erik Hugne <erik.hugne@ericsson.com>
Reviewed-by: Jon Maloy <jon.maloy@ericsson.com>
Acked-by: Ying Xue <ying.xue@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/uapi/linux/tipc_netlink.h
net/tipc/link.c
net/tipc/link.h
net/tipc/netlink.c

index 2deb7fd..574882a 100644 (file)
@@ -49,6 +49,7 @@ enum {
        TIPC_NL_PUBL_GET,
        TIPC_NL_LINK_GET,
        TIPC_NL_LINK_SET,
+       TIPC_NL_LINK_RESET_STATS,
 
        __TIPC_NL_CMD_MAX,
        TIPC_NL_CMD_MAX = __TIPC_NL_CMD_MAX - 1
index 6785dcf..629e8cf 100644 (file)
@@ -2783,3 +2783,52 @@ err_out:
 
        return err;
 }
+
+int tipc_nl_link_reset_stats(struct sk_buff *skb, struct genl_info *info)
+{
+       int err;
+       char *link_name;
+       unsigned int bearer_id;
+       struct tipc_link *link;
+       struct tipc_node *node;
+       struct nlattr *attrs[TIPC_NLA_LINK_MAX + 1];
+
+       if (!info->attrs[TIPC_NLA_LINK])
+               return -EINVAL;
+
+       err = nla_parse_nested(attrs, TIPC_NLA_LINK_MAX,
+                              info->attrs[TIPC_NLA_LINK],
+                              tipc_nl_link_policy);
+       if (err)
+               return err;
+
+       if (!attrs[TIPC_NLA_LINK_NAME])
+               return -EINVAL;
+
+       link_name = nla_data(attrs[TIPC_NLA_LINK_NAME]);
+
+       if (strcmp(link_name, tipc_bclink_name) == 0) {
+               err = tipc_bclink_reset_stats();
+               if (err)
+                       return err;
+               return 0;
+       }
+
+       node = tipc_link_find_owner(link_name, &bearer_id);
+       if (!node)
+               return -EINVAL;
+
+       tipc_node_lock(node);
+
+       link = node->links[bearer_id];
+       if (!link) {
+               tipc_node_unlock(node);
+               return -EINVAL;
+       }
+
+       link_reset_statistics(link);
+
+       tipc_node_unlock(node);
+
+       return 0;
+}
index 3738ba1..f463e7b 100644 (file)
@@ -243,6 +243,7 @@ void tipc_link_retransmit(struct tipc_link *l_ptr,
 int tipc_nl_link_dump(struct sk_buff *skb, struct netlink_callback *cb);
 int tipc_nl_link_get(struct sk_buff *skb, struct genl_info *info);
 int tipc_nl_link_set(struct sk_buff *skb, struct genl_info *info);
+int tipc_nl_link_reset_stats(struct sk_buff *skb, struct genl_info *info);
 int tipc_nl_parse_link_prop(struct nlattr *prop, struct nlattr *props[]);
 
 /*
index d4444e5..68bfd11 100644 (file)
@@ -149,6 +149,11 @@ static const struct genl_ops tipc_genl_v2_ops[] = {
                .cmd    = TIPC_NL_LINK_SET,
                .doit   = tipc_nl_link_set,
                .policy = tipc_nl_policy,
+       },
+       {
+               .cmd    = TIPC_NL_LINK_RESET_STATS,
+               .doit   = tipc_nl_link_reset_stats,
+               .policy = tipc_nl_policy,
        }
 };