aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/socket.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-02-09 16:20:53 -0500
committerDavid S. Miller <davem@davemloft.net>2015-02-09 16:20:53 -0500
commit9dce285b70c157754d753203112cfef22770b1f9 (patch)
tree4859799a8311ecd637e2a582600af1057a78e08b /net/tipc/socket.c
parentc8ac18f2006b2926ce375c01646b2f487d1c33b2 (diff)
parent941787b82982b3f33ac398c8c00035ddd0f8c514 (diff)
Merge branch 'tipc-next'
Richard Alpe says: ==================== tipc: new compat layer for the legacy NL API This is a compatibility / transcoding layer for the old netlink API. It relies on the new netlink API to collect data or perform actions (dumpit / doit). The main benefit of this compat layer is that it removes a lot of complex code from the tipc core as only the new API needs to be able harness data or perform actions. I.e. the compat layer isn't concerned with locking or how the internal data-structures look. As long as the new API stays relatively intact the compat layer should be fine. The main challenge in this compat layer is the randomness of the legacy API. Some commands send binary data and some send ASCII data, some are very picky in optimizing there buffer sizes and some just don't care. Most legacy commands put there data in a single TLV (data container) but some segment the data into multiple TLV's. This list of randomness goes on and on.. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r--net/tipc/socket.c90
1 files changed, 2 insertions, 88 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 4a98d15a1323..f73e975af80b 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -40,7 +40,6 @@
40#include "name_table.h" 40#include "name_table.h"
41#include "node.h" 41#include "node.h"
42#include "link.h" 42#include "link.h"
43#include "config.h"
44#include "name_distr.h" 43#include "name_distr.h"
45#include "socket.h" 44#include "socket.h"
46 45
@@ -2281,91 +2280,6 @@ static int tipc_sk_withdraw(struct tipc_sock *tsk, uint scope,
2281 return rc; 2280 return rc;
2282} 2281}
2283 2282
2284static int tipc_sk_show(struct tipc_sock *tsk, char *buf,
2285 int len, int full_id)
2286{
2287 struct net *net = sock_net(&tsk->sk);
2288 struct tipc_net *tn = net_generic(net, tipc_net_id);
2289 struct publication *publ;
2290 int ret;
2291
2292 if (full_id)
2293 ret = tipc_snprintf(buf, len, "<%u.%u.%u:%u>:",
2294 tipc_zone(tn->own_addr),
2295 tipc_cluster(tn->own_addr),
2296 tipc_node(tn->own_addr), tsk->portid);
2297 else
2298 ret = tipc_snprintf(buf, len, "%-10u:", tsk->portid);
2299
2300 if (tsk->connected) {
2301 u32 dport = tsk_peer_port(tsk);
2302 u32 destnode = tsk_peer_node(tsk);
2303
2304 ret += tipc_snprintf(buf + ret, len - ret,
2305 " connected to <%u.%u.%u:%u>",
2306 tipc_zone(destnode),
2307 tipc_cluster(destnode),
2308 tipc_node(destnode), dport);
2309 if (tsk->conn_type != 0)
2310 ret += tipc_snprintf(buf + ret, len - ret,
2311 " via {%u,%u}", tsk->conn_type,
2312 tsk->conn_instance);
2313 } else if (tsk->published) {
2314 ret += tipc_snprintf(buf + ret, len - ret, " bound to");
2315 list_for_each_entry(publ, &tsk->publications, pport_list) {
2316 if (publ->lower == publ->upper)
2317 ret += tipc_snprintf(buf + ret, len - ret,
2318 " {%u,%u}", publ->type,
2319 publ->lower);
2320 else
2321 ret += tipc_snprintf(buf + ret, len - ret,
2322 " {%u,%u,%u}", publ->type,
2323 publ->lower, publ->upper);
2324 }
2325 }
2326 ret += tipc_snprintf(buf + ret, len - ret, "\n");
2327 return ret;
2328}
2329
2330struct sk_buff *tipc_sk_socks_show(struct net *net)
2331{
2332 struct tipc_net *tn = net_generic(net, tipc_net_id);
2333 const struct bucket_table *tbl;
2334 struct rhash_head *pos;
2335 struct sk_buff *buf;
2336 struct tlv_desc *rep_tlv;
2337 char *pb;
2338 int pb_len;
2339 struct tipc_sock *tsk;
2340 int str_len = 0;
2341 int i;
2342
2343 buf = tipc_cfg_reply_alloc(TLV_SPACE(ULTRA_STRING_MAX_LEN));
2344 if (!buf)
2345 return NULL;
2346 rep_tlv = (struct tlv_desc *)buf->data;
2347 pb = TLV_DATA(rep_tlv);
2348 pb_len = ULTRA_STRING_MAX_LEN;
2349
2350 rcu_read_lock();
2351 tbl = rht_dereference_rcu((&tn->sk_rht)->tbl, &tn->sk_rht);
2352 for (i = 0; i < tbl->size; i++) {
2353 rht_for_each_entry_rcu(tsk, pos, tbl, i, node) {
2354 spin_lock_bh(&tsk->sk.sk_lock.slock);
2355 str_len += tipc_sk_show(tsk, pb + str_len,
2356 pb_len - str_len, 0);
2357 spin_unlock_bh(&tsk->sk.sk_lock.slock);
2358 }
2359 }
2360 rcu_read_unlock();
2361
2362 str_len += 1; /* for "\0" */
2363 skb_put(buf, TLV_SPACE(str_len));
2364 TLV_SET(rep_tlv, TIPC_TLV_ULTRA_STRING, NULL, str_len);
2365
2366 return buf;
2367}
2368
2369/* tipc_sk_reinit: set non-zero address in all existing sockets 2283/* tipc_sk_reinit: set non-zero address in all existing sockets
2370 * when we go from standalone to network mode. 2284 * when we go from standalone to network mode.
2371 */ 2285 */
@@ -2783,7 +2697,7 @@ static int __tipc_nl_add_sk(struct sk_buff *skb, struct netlink_callback *cb,
2783 struct tipc_net *tn = net_generic(net, tipc_net_id); 2697 struct tipc_net *tn = net_generic(net, tipc_net_id);
2784 2698
2785 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, 2699 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
2786 &tipc_genl_v2_family, NLM_F_MULTI, TIPC_NL_SOCK_GET); 2700 &tipc_genl_family, NLM_F_MULTI, TIPC_NL_SOCK_GET);
2787 if (!hdr) 2701 if (!hdr)
2788 goto msg_cancel; 2702 goto msg_cancel;
2789 2703
@@ -2864,7 +2778,7 @@ static int __tipc_nl_add_sk_publ(struct sk_buff *skb,
2864 struct nlattr *attrs; 2778 struct nlattr *attrs;
2865 2779
2866 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, 2780 hdr = genlmsg_put(skb, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
2867 &tipc_genl_v2_family, NLM_F_MULTI, TIPC_NL_PUBL_GET); 2781 &tipc_genl_family, NLM_F_MULTI, TIPC_NL_PUBL_GET);
2868 if (!hdr) 2782 if (!hdr)
2869 goto msg_cancel; 2783 goto msg_cancel;
2870 2784