diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/tipc/config.c | 4 | ||||
| -rw-r--r-- | net/tipc/netlink_compat.c | 22 | ||||
| -rw-r--r-- | net/tipc/node.c | 54 | ||||
| -rw-r--r-- | net/tipc/node.h | 2 |
4 files changed, 22 insertions, 60 deletions
diff --git a/net/tipc/config.c b/net/tipc/config.c index df410823e889..74babd75c07d 100644 --- a/net/tipc/config.c +++ b/net/tipc/config.c | |||
| @@ -205,10 +205,6 @@ struct sk_buff *tipc_cfg_do_cmd(struct net *net, u32 orig_node, u16 cmd, | |||
| 205 | case TIPC_CMD_NOOP: | 205 | case TIPC_CMD_NOOP: |
| 206 | rep_tlv_buf = tipc_cfg_reply_none(); | 206 | rep_tlv_buf = tipc_cfg_reply_none(); |
| 207 | break; | 207 | break; |
| 208 | case TIPC_CMD_GET_NODES: | ||
| 209 | rep_tlv_buf = tipc_node_get_nodes(net, req_tlv_area, | ||
| 210 | req_tlv_space); | ||
| 211 | break; | ||
| 212 | case TIPC_CMD_SHOW_STATS: | 208 | case TIPC_CMD_SHOW_STATS: |
| 213 | rep_tlv_buf = tipc_show_stats(); | 209 | rep_tlv_buf = tipc_show_stats(); |
| 214 | break; | 210 | break; |
diff --git a/net/tipc/netlink_compat.c b/net/tipc/netlink_compat.c index d23075efaa76..0dc448e77e13 100644 --- a/net/tipc/netlink_compat.c +++ b/net/tipc/netlink_compat.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include "link.h" | 37 | #include "link.h" |
| 38 | #include "name_table.h" | 38 | #include "name_table.h" |
| 39 | #include "socket.h" | 39 | #include "socket.h" |
| 40 | #include "node.h" | ||
| 40 | #include <net/genetlink.h> | 41 | #include <net/genetlink.h> |
| 41 | #include <linux/tipc_config.h> | 42 | #include <linux/tipc_config.h> |
| 42 | 43 | ||
| @@ -835,6 +836,21 @@ static int tipc_nl_compat_media_dump(struct tipc_nl_compat_msg *msg, | |||
| 835 | nla_len(media[TIPC_NLA_MEDIA_NAME])); | 836 | nla_len(media[TIPC_NLA_MEDIA_NAME])); |
| 836 | } | 837 | } |
| 837 | 838 | ||
| 839 | static int tipc_nl_compat_node_dump(struct tipc_nl_compat_msg *msg, | ||
| 840 | struct nlattr **attrs) | ||
| 841 | { | ||
| 842 | struct tipc_node_info node_info; | ||
| 843 | struct nlattr *node[TIPC_NLA_NODE_MAX + 1]; | ||
| 844 | |||
| 845 | nla_parse_nested(node, TIPC_NLA_NODE_MAX, attrs[TIPC_NLA_NODE], NULL); | ||
| 846 | |||
| 847 | node_info.addr = htonl(nla_get_u32(node[TIPC_NLA_NODE_ADDR])); | ||
| 848 | node_info.up = htonl(nla_get_flag(node[TIPC_NLA_NODE_UP])); | ||
| 849 | |||
| 850 | return tipc_add_tlv(msg->rep, TIPC_TLV_NODE_INFO, &node_info, | ||
| 851 | sizeof(node_info)); | ||
| 852 | } | ||
| 853 | |||
| 838 | static int tipc_nl_compat_handle(struct tipc_nl_compat_msg *msg) | 854 | static int tipc_nl_compat_handle(struct tipc_nl_compat_msg *msg) |
| 839 | { | 855 | { |
| 840 | struct tipc_nl_compat_cmd_dump dump; | 856 | struct tipc_nl_compat_cmd_dump dump; |
| @@ -903,6 +919,11 @@ static int tipc_nl_compat_handle(struct tipc_nl_compat_msg *msg) | |||
| 903 | dump.dumpit = tipc_nl_media_dump; | 919 | dump.dumpit = tipc_nl_media_dump; |
| 904 | dump.format = tipc_nl_compat_media_dump; | 920 | dump.format = tipc_nl_compat_media_dump; |
| 905 | return tipc_nl_compat_dumpit(&dump, msg); | 921 | return tipc_nl_compat_dumpit(&dump, msg); |
| 922 | case TIPC_CMD_GET_NODES: | ||
| 923 | msg->rep_size = ULTRA_STRING_MAX_LEN; | ||
| 924 | dump.dumpit = tipc_nl_node_dump; | ||
| 925 | dump.format = tipc_nl_compat_node_dump; | ||
| 926 | return tipc_nl_compat_dumpit(&dump, msg); | ||
| 906 | } | 927 | } |
| 907 | 928 | ||
| 908 | return -EOPNOTSUPP; | 929 | return -EOPNOTSUPP; |
| @@ -1011,6 +1032,7 @@ static int tipc_nl_compat_tmp_wrap(struct sk_buff *skb, struct genl_info *info) | |||
| 1011 | case TIPC_CMD_SHOW_NAME_TABLE: | 1032 | case TIPC_CMD_SHOW_NAME_TABLE: |
| 1012 | case TIPC_CMD_SHOW_PORTS: | 1033 | case TIPC_CMD_SHOW_PORTS: |
| 1013 | case TIPC_CMD_GET_MEDIA_NAMES: | 1034 | case TIPC_CMD_GET_MEDIA_NAMES: |
| 1035 | case TIPC_CMD_GET_NODES: | ||
| 1014 | return tipc_nl_compat_recv(skb, info); | 1036 | return tipc_nl_compat_recv(skb, info); |
| 1015 | } | 1037 | } |
| 1016 | 1038 | ||
diff --git a/net/tipc/node.c b/net/tipc/node.c index 46b87f77d342..ddaa2bbaa35d 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
| @@ -120,7 +120,6 @@ struct tipc_node *tipc_node_create(struct net *net, u32 addr) | |||
| 120 | list_add_tail_rcu(&n_ptr->list, &temp_node->list); | 120 | list_add_tail_rcu(&n_ptr->list, &temp_node->list); |
| 121 | n_ptr->action_flags = TIPC_WAIT_PEER_LINKS_DOWN; | 121 | n_ptr->action_flags = TIPC_WAIT_PEER_LINKS_DOWN; |
| 122 | n_ptr->signature = INVALID_NODE_SIG; | 122 | n_ptr->signature = INVALID_NODE_SIG; |
| 123 | tn->num_nodes++; | ||
| 124 | exit: | 123 | exit: |
| 125 | spin_unlock_bh(&tn->node_list_lock); | 124 | spin_unlock_bh(&tn->node_list_lock); |
| 126 | return n_ptr; | 125 | return n_ptr; |
| @@ -131,8 +130,6 @@ static void tipc_node_delete(struct tipc_net *tn, struct tipc_node *n_ptr) | |||
| 131 | list_del_rcu(&n_ptr->list); | 130 | list_del_rcu(&n_ptr->list); |
| 132 | hlist_del_rcu(&n_ptr->hash); | 131 | hlist_del_rcu(&n_ptr->hash); |
| 133 | kfree_rcu(n_ptr, rcu); | 132 | kfree_rcu(n_ptr, rcu); |
| 134 | |||
| 135 | tn->num_nodes--; | ||
| 136 | } | 133 | } |
| 137 | 134 | ||
| 138 | void tipc_node_stop(struct net *net) | 135 | void tipc_node_stop(struct net *net) |
| @@ -407,57 +404,6 @@ static void node_lost_contact(struct tipc_node *n_ptr) | |||
| 407 | } | 404 | } |
| 408 | } | 405 | } |
| 409 | 406 | ||
| 410 | struct sk_buff *tipc_node_get_nodes(struct net *net, const void *req_tlv_area, | ||
| 411 | int req_tlv_space) | ||
| 412 | { | ||
| 413 | struct tipc_net *tn = net_generic(net, tipc_net_id); | ||
| 414 | u32 domain; | ||
| 415 | struct sk_buff *buf; | ||
| 416 | struct tipc_node *n_ptr; | ||
| 417 | struct tipc_node_info node_info; | ||
| 418 | u32 payload_size; | ||
| 419 | |||
| 420 | if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_NET_ADDR)) | ||
| 421 | return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); | ||
| 422 | |||
| 423 | domain = ntohl(*(__be32 *)TLV_DATA(req_tlv_area)); | ||
| 424 | if (!tipc_addr_domain_valid(domain)) | ||
| 425 | return tipc_cfg_reply_error_string(TIPC_CFG_INVALID_VALUE | ||
| 426 | " (network address)"); | ||
| 427 | |||
| 428 | spin_lock_bh(&tn->node_list_lock); | ||
| 429 | if (!tn->num_nodes) { | ||
| 430 | spin_unlock_bh(&tn->node_list_lock); | ||
| 431 | return tipc_cfg_reply_none(); | ||
| 432 | } | ||
| 433 | |||
| 434 | /* For now, get space for all other nodes */ | ||
| 435 | payload_size = TLV_SPACE(sizeof(node_info)) * tn->num_nodes; | ||
| 436 | if (payload_size > 32768u) { | ||
| 437 | spin_unlock_bh(&tn->node_list_lock); | ||
| 438 | return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED | ||
| 439 | " (too many nodes)"); | ||
| 440 | } | ||
| 441 | spin_unlock_bh(&tn->node_list_lock); | ||
| 442 | |||
| 443 | buf = tipc_cfg_reply_alloc(payload_size); | ||
| 444 | if (!buf) | ||
| 445 | return NULL; | ||
| 446 | |||
| 447 | /* Add TLVs for all nodes in scope */ | ||
| 448 | rcu_read_lock(); | ||
| 449 | list_for_each_entry_rcu(n_ptr, &tn->node_list, list) { | ||
| 450 | if (!tipc_in_scope(domain, n_ptr->addr)) | ||
| 451 | continue; | ||
| 452 | node_info.addr = htonl(n_ptr->addr); | ||
| 453 | node_info.up = htonl(tipc_node_is_up(n_ptr)); | ||
| 454 | tipc_cfg_append_tlv(buf, TIPC_TLV_NODE_INFO, | ||
| 455 | &node_info, sizeof(node_info)); | ||
| 456 | } | ||
| 457 | rcu_read_unlock(); | ||
| 458 | return buf; | ||
| 459 | } | ||
| 460 | |||
| 461 | /** | 407 | /** |
| 462 | * tipc_node_get_linkname - get the name of a link | 408 | * tipc_node_get_linkname - get the name of a link |
| 463 | * | 409 | * |
diff --git a/net/tipc/node.h b/net/tipc/node.h index 59dafee61aa0..3d18c66b7f78 100644 --- a/net/tipc/node.h +++ b/net/tipc/node.h | |||
| @@ -142,8 +142,6 @@ void tipc_node_link_down(struct tipc_node *n_ptr, struct tipc_link *l_ptr); | |||
| 142 | void tipc_node_link_up(struct tipc_node *n_ptr, struct tipc_link *l_ptr); | 142 | void tipc_node_link_up(struct tipc_node *n_ptr, struct tipc_link *l_ptr); |
| 143 | int tipc_node_active_links(struct tipc_node *n_ptr); | 143 | int tipc_node_active_links(struct tipc_node *n_ptr); |
| 144 | int tipc_node_is_up(struct tipc_node *n_ptr); | 144 | int tipc_node_is_up(struct tipc_node *n_ptr); |
| 145 | struct sk_buff *tipc_node_get_nodes(struct net *net, const void *req_tlv_area, | ||
| 146 | int req_tlv_space); | ||
| 147 | int tipc_node_get_linkname(struct net *net, u32 bearer_id, u32 node, | 145 | int tipc_node_get_linkname(struct net *net, u32 bearer_id, u32 node, |
| 148 | char *linkname, size_t len); | 146 | char *linkname, size_t len); |
| 149 | void tipc_node_unlock(struct tipc_node *node); | 147 | void tipc_node_unlock(struct tipc_node *node); |
