1 /* 2 * net/tipc/node.c: TIPC node management routines 3 * 4 * Copyright (c) 2000-2006, 2012-2015, Ericsson AB 5 * Copyright (c) 2005-2006, 2010-2014, Wind River Systems 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. Neither the names of the copyright holders nor the names of its 17 * contributors may be used to endorse or promote products derived from 18 * this software without specific prior written permission. 19 * 20 * Alternatively, this software may be distributed under the terms of the 21 * GNU General Public License ("GPL") version 2 as published by the Free 22 * Software Foundation. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 34 * POSSIBILITY OF SUCH DAMAGE. 35 */ 36 37 #include "core.h" 38 #include "link.h" 39 #include "node.h" 40 #include "name_distr.h" 41 #include "socket.h" 42 #include "bcast.h" 43 44 static void node_lost_contact(struct tipc_node *n_ptr); 45 static void node_established_contact(struct tipc_node *n_ptr); 46 static void tipc_node_delete(struct tipc_node *node); 47 48 struct tipc_sock_conn { 49 u32 port; 50 u32 peer_port; 51 u32 peer_node; 52 struct list_head list; 53 }; 54 55 static const struct nla_policy tipc_nl_node_policy[TIPC_NLA_NODE_MAX + 1] = { 56 [TIPC_NLA_NODE_UNSPEC] = { .type = NLA_UNSPEC }, 57 [TIPC_NLA_NODE_ADDR] = { .type = NLA_U32 }, 58 [TIPC_NLA_NODE_UP] = { .type = NLA_FLAG } 59 }; 60 61 /* 62 * A trivial power-of-two bitmask technique is used for speed, since this 63 * operation is done for every incoming TIPC packet. The number of hash table 64 * entries has been chosen so that no hash chain exceeds 8 nodes and will 65 * usually be much smaller (typically only a single node). 66 */ 67 static unsigned int tipc_hashfn(u32 addr) 68 { 69 return addr & (NODE_HTABLE_SIZE - 1); 70 } 71 72 static void tipc_node_kref_release(struct kref *kref) 73 { 74 struct tipc_node *node = container_of(kref, struct tipc_node, kref); 75 76 tipc_node_delete(node); 77 } 78 79 void tipc_node_put(struct tipc_node *node) 80 { 81 kref_put(&node->kref, tipc_node_kref_release); 82 } 83 84 static void tipc_node_get(struct tipc_node *node) 85 { 86 kref_get(&node->kref); 87 } 88 89 /* 90 * tipc_node_find - locate specified node object, if it exists 91 */ 92 struct tipc_node *tipc_node_find(struct net *net, u32 addr) 93 { 94 struct tipc_net *tn = net_generic(net, tipc_net_id); 95 struct tipc_node *node; 96 97 if (unlikely(!in_own_cluster_exact(net, addr))) 98 return NULL; 99 100 rcu_read_lock(); 101 hlist_for_each_entry_rcu(node, &tn->node_htable[tipc_hashfn(addr)], 102 hash) { 103 if (node->addr == addr) { 104 tipc_node_get(node); 105 rcu_read_unlock(); 106 return node; 107 } 108 } 109 rcu_read_unlock(); 110 return NULL; 111 } 112 113 struct tipc_node *tipc_node_create(struct net *net, u32 addr) 114 { 115 struct tipc_net *tn = net_generic(net, tipc_net_id); 116 struct tipc_node *n_ptr, *temp_node; 117 118 spin_lock_bh(&tn->node_list_lock); 119 n_ptr = tipc_node_find(net, addr); 120 if (n_ptr) 121 goto exit; 122 n_ptr = kzalloc(sizeof(*n_ptr), GFP_ATOMIC); 123 if (!n_ptr) { 124 pr_warn("Node creation failed, no memory\n"); 125 goto exit; 126 } 127 n_ptr->addr = addr; 128 n_ptr->net = net; 129 kref_init(&n_ptr->kref); 130 spin_lock_init(&n_ptr->lock); 131 INIT_HLIST_NODE(&n_ptr->hash); 132 INIT_LIST_HEAD(&n_ptr->list); 133 INIT_LIST_HEAD(&n_ptr->publ_list); 134 INIT_LIST_HEAD(&n_ptr->conn_sks); 135 __skb_queue_head_init(&n_ptr->bclink.deferdq); 136 hlist_add_head_rcu(&n_ptr->hash, &tn->node_htable[tipc_hashfn(addr)]); 137 list_for_each_entry_rcu(temp_node, &tn->node_list, list) { 138 if (n_ptr->addr < temp_node->addr) 139 break; 140 } 141 list_add_tail_rcu(&n_ptr->list, &temp_node->list); 142 n_ptr->action_flags = TIPC_WAIT_PEER_LINKS_DOWN; 143 n_ptr->signature = INVALID_NODE_SIG; 144 tipc_node_get(n_ptr); 145 exit: 146 spin_unlock_bh(&tn->node_list_lock); 147 return n_ptr; 148 } 149 150 static void tipc_node_delete(struct tipc_node *node) 151 { 152 list_del_rcu(&node->list); 153 hlist_del_rcu(&node->hash); 154 kfree_rcu(node, rcu); 155 } 156 157 void tipc_node_stop(struct net *net) 158 { 159 struct tipc_net *tn = net_generic(net, tipc_net_id); 160 struct tipc_node *node, *t_node; 161 162 spin_lock_bh(&tn->node_list_lock); 163 list_for_each_entry_safe(node, t_node, &tn->node_list, list) 164 tipc_node_put(node); 165 spin_unlock_bh(&tn->node_list_lock); 166 } 167 168 int tipc_node_add_conn(struct net *net, u32 dnode, u32 port, u32 peer_port) 169 { 170 struct tipc_node *node; 171 struct tipc_sock_conn *conn; 172 int err = 0; 173 174 if (in_own_node(net, dnode)) 175 return 0; 176 177 node = tipc_node_find(net, dnode); 178 if (!node) { 179 pr_warn("Connecting sock to node 0x%x failed\n", dnode); 180 return -EHOSTUNREACH; 181 } 182 conn = kmalloc(sizeof(*conn), GFP_ATOMIC); 183 if (!conn) { 184 err = -EHOSTUNREACH; 185 goto exit; 186 } 187 conn->peer_node = dnode; 188 conn->port = port; 189 conn->peer_port = peer_port; 190 191 tipc_node_lock(node); 192 list_add_tail(&conn->list, &node->conn_sks); 193 tipc_node_unlock(node); 194 exit: 195 tipc_node_put(node); 196 return err; 197 } 198 199 void tipc_node_remove_conn(struct net *net, u32 dnode, u32 port) 200 { 201 struct tipc_node *node; 202 struct tipc_sock_conn *conn, *safe; 203 204 if (in_own_node(net, dnode)) 205 return; 206 207 node = tipc_node_find(net, dnode); 208 if (!node) 209 return; 210 211 tipc_node_lock(node); 212 list_for_each_entry_safe(conn, safe, &node->conn_sks, list) { 213 if (port != conn->port) 214 continue; 215 list_del(&conn->list); 216 kfree(conn); 217 } 218 tipc_node_unlock(node); 219 tipc_node_put(node); 220 } 221 222 /** 223 * tipc_node_link_up - handle addition of link 224 * 225 * Link becomes active (alone or shared) or standby, depending on its priority. 226 */ 227 void tipc_node_link_up(struct tipc_node *n_ptr, struct tipc_link *l_ptr) 228 { 229 struct tipc_link **active = &n_ptr->active_links[0]; 230 231 n_ptr->working_links++; 232 n_ptr->action_flags |= TIPC_NOTIFY_LINK_UP; 233 n_ptr->link_id = l_ptr->peer_bearer_id << 16 | l_ptr->bearer_id; 234 235 pr_debug("Established link <%s> on network plane %c\n", 236 l_ptr->name, l_ptr->net_plane); 237 238 if (!active[0]) { 239 active[0] = active[1] = l_ptr; 240 node_established_contact(n_ptr); 241 goto exit; 242 } 243 if (l_ptr->priority < active[0]->priority) { 244 pr_debug("New link <%s> becomes standby\n", l_ptr->name); 245 goto exit; 246 } 247 tipc_link_dup_queue_xmit(active[0], l_ptr); 248 if (l_ptr->priority == active[0]->priority) { 249 active[0] = l_ptr; 250 goto exit; 251 } 252 pr_debug("Old link <%s> becomes standby\n", active[0]->name); 253 if (active[1] != active[0]) 254 pr_debug("Old link <%s> becomes standby\n", active[1]->name); 255 active[0] = active[1] = l_ptr; 256 exit: 257 /* Leave room for changeover header when returning 'mtu' to users: */ 258 n_ptr->act_mtus[0] = active[0]->mtu - INT_H_SIZE; 259 n_ptr->act_mtus[1] = active[1]->mtu - INT_H_SIZE; 260 } 261 262 /** 263 * node_select_active_links - select active link 264 */ 265 static void node_select_active_links(struct tipc_node *n_ptr) 266 { 267 struct tipc_link **active = &n_ptr->active_links[0]; 268 u32 i; 269 u32 highest_prio = 0; 270 271 active[0] = active[1] = NULL; 272 273 for (i = 0; i < MAX_BEARERS; i++) { 274 struct tipc_link *l_ptr = n_ptr->links[i]; 275 276 if (!l_ptr || !tipc_link_is_up(l_ptr) || 277 (l_ptr->priority < highest_prio)) 278 continue; 279 280 if (l_ptr->priority > highest_prio) { 281 highest_prio = l_ptr->priority; 282 active[0] = active[1] = l_ptr; 283 } else { 284 active[1] = l_ptr; 285 } 286 } 287 } 288 289 /** 290 * tipc_node_link_down - handle loss of link 291 */ 292 void tipc_node_link_down(struct tipc_node *n_ptr, struct tipc_link *l_ptr) 293 { 294 struct tipc_net *tn = net_generic(n_ptr->net, tipc_net_id); 295 struct tipc_link **active; 296 297 n_ptr->working_links--; 298 n_ptr->action_flags |= TIPC_NOTIFY_LINK_DOWN; 299 n_ptr->link_id = l_ptr->peer_bearer_id << 16 | l_ptr->bearer_id; 300 301 if (!tipc_link_is_active(l_ptr)) { 302 pr_debug("Lost standby link <%s> on network plane %c\n", 303 l_ptr->name, l_ptr->net_plane); 304 return; 305 } 306 pr_debug("Lost link <%s> on network plane %c\n", 307 l_ptr->name, l_ptr->net_plane); 308 309 active = &n_ptr->active_links[0]; 310 if (active[0] == l_ptr) 311 active[0] = active[1]; 312 if (active[1] == l_ptr) 313 active[1] = active[0]; 314 if (active[0] == l_ptr) 315 node_select_active_links(n_ptr); 316 if (tipc_node_is_up(n_ptr)) 317 tipc_link_failover_send_queue(l_ptr); 318 else 319 node_lost_contact(n_ptr); 320 321 /* Leave room for changeover header when returning 'mtu' to users: */ 322 if (active[0]) { 323 n_ptr->act_mtus[0] = active[0]->mtu - INT_H_SIZE; 324 n_ptr->act_mtus[1] = active[1]->mtu - INT_H_SIZE; 325 return; 326 } 327 /* Loopback link went down? No fragmentation needed from now on. */ 328 if (n_ptr->addr == tn->own_addr) { 329 n_ptr->act_mtus[0] = MAX_MSG_SIZE; 330 n_ptr->act_mtus[1] = MAX_MSG_SIZE; 331 } 332 } 333 334 int tipc_node_active_links(struct tipc_node *n_ptr) 335 { 336 return n_ptr->active_links[0] != NULL; 337 } 338 339 int tipc_node_is_up(struct tipc_node *n_ptr) 340 { 341 return tipc_node_active_links(n_ptr); 342 } 343 344 void tipc_node_attach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr) 345 { 346 n_ptr->links[l_ptr->bearer_id] = l_ptr; 347 n_ptr->link_cnt++; 348 } 349 350 void tipc_node_detach_link(struct tipc_node *n_ptr, struct tipc_link *l_ptr) 351 { 352 int i; 353 354 for (i = 0; i < MAX_BEARERS; i++) { 355 if (l_ptr != n_ptr->links[i]) 356 continue; 357 n_ptr->links[i] = NULL; 358 n_ptr->link_cnt--; 359 } 360 } 361 362 static void node_established_contact(struct tipc_node *n_ptr) 363 { 364 n_ptr->action_flags |= TIPC_NOTIFY_NODE_UP; 365 n_ptr->bclink.oos_state = 0; 366 n_ptr->bclink.acked = tipc_bclink_get_last_sent(n_ptr->net); 367 tipc_bclink_add_node(n_ptr->net, n_ptr->addr); 368 } 369 370 static void node_lost_contact(struct tipc_node *n_ptr) 371 { 372 char addr_string[16]; 373 struct tipc_sock_conn *conn, *safe; 374 struct list_head *conns = &n_ptr->conn_sks; 375 struct sk_buff *skb; 376 struct tipc_net *tn = net_generic(n_ptr->net, tipc_net_id); 377 uint i; 378 379 pr_debug("Lost contact with %s\n", 380 tipc_addr_string_fill(addr_string, n_ptr->addr)); 381 382 /* Flush broadcast link info associated with lost node */ 383 if (n_ptr->bclink.recv_permitted) { 384 __skb_queue_purge(&n_ptr->bclink.deferdq); 385 386 if (n_ptr->bclink.reasm_buf) { 387 kfree_skb(n_ptr->bclink.reasm_buf); 388 n_ptr->bclink.reasm_buf = NULL; 389 } 390 391 tipc_bclink_remove_node(n_ptr->net, n_ptr->addr); 392 tipc_bclink_acknowledge(n_ptr, INVALID_LINK_SEQ); 393 394 n_ptr->bclink.recv_permitted = false; 395 } 396 397 /* Abort any ongoing link failover */ 398 for (i = 0; i < MAX_BEARERS; i++) { 399 struct tipc_link *l_ptr = n_ptr->links[i]; 400 if (!l_ptr) 401 continue; 402 l_ptr->flags &= ~LINK_FAILINGOVER; 403 l_ptr->failover_checkpt = 0; 404 l_ptr->failover_pkts = 0; 405 kfree_skb(l_ptr->failover_skb); 406 l_ptr->failover_skb = NULL; 407 tipc_link_reset_fragments(l_ptr); 408 } 409 410 n_ptr->action_flags &= ~TIPC_WAIT_OWN_LINKS_DOWN; 411 412 /* Prevent re-contact with node until cleanup is done */ 413 n_ptr->action_flags |= TIPC_WAIT_PEER_LINKS_DOWN; 414 415 /* Notify publications from this node */ 416 n_ptr->action_flags |= TIPC_NOTIFY_NODE_DOWN; 417 418 /* Notify sockets connected to node */ 419 list_for_each_entry_safe(conn, safe, conns, list) { 420 skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE, TIPC_CONN_MSG, 421 SHORT_H_SIZE, 0, tn->own_addr, 422 conn->peer_node, conn->port, 423 conn->peer_port, TIPC_ERR_NO_NODE); 424 if (likely(skb)) { 425 skb_queue_tail(n_ptr->inputq, skb); 426 n_ptr->action_flags |= TIPC_MSG_EVT; 427 } 428 list_del(&conn->list); 429 kfree(conn); 430 } 431 } 432 433 /** 434 * tipc_node_get_linkname - get the name of a link 435 * 436 * @bearer_id: id of the bearer 437 * @node: peer node address 438 * @linkname: link name output buffer 439 * 440 * Returns 0 on success 441 */ 442 int tipc_node_get_linkname(struct net *net, u32 bearer_id, u32 addr, 443 char *linkname, size_t len) 444 { 445 struct tipc_link *link; 446 int err = -EINVAL; 447 struct tipc_node *node = tipc_node_find(net, addr); 448 449 if (!node) 450 return err; 451 452 if (bearer_id >= MAX_BEARERS) 453 goto exit; 454 455 tipc_node_lock(node); 456 link = node->links[bearer_id]; 457 if (link) { 458 strncpy(linkname, link->name, len); 459 err = 0; 460 } 461 exit: 462 tipc_node_unlock(node); 463 tipc_node_put(node); 464 return err; 465 } 466 467 void tipc_node_unlock(struct tipc_node *node) 468 { 469 struct net *net = node->net; 470 u32 addr = 0; 471 u32 flags = node->action_flags; 472 u32 link_id = 0; 473 struct list_head *publ_list; 474 struct sk_buff_head *inputq = node->inputq; 475 struct sk_buff_head *namedq; 476 477 if (likely(!flags || (flags == TIPC_MSG_EVT))) { 478 node->action_flags = 0; 479 spin_unlock_bh(&node->lock); 480 if (flags == TIPC_MSG_EVT) 481 tipc_sk_rcv(net, inputq); 482 return; 483 } 484 485 addr = node->addr; 486 link_id = node->link_id; 487 namedq = node->namedq; 488 publ_list = &node->publ_list; 489 490 node->action_flags &= ~(TIPC_MSG_EVT | 491 TIPC_NOTIFY_NODE_DOWN | TIPC_NOTIFY_NODE_UP | 492 TIPC_NOTIFY_LINK_DOWN | TIPC_NOTIFY_LINK_UP | 493 TIPC_WAKEUP_BCAST_USERS | TIPC_BCAST_MSG_EVT | 494 TIPC_NAMED_MSG_EVT | TIPC_BCAST_RESET); 495 496 spin_unlock_bh(&node->lock); 497 498 if (flags & TIPC_NOTIFY_NODE_DOWN) 499 tipc_publ_notify(net, publ_list, addr); 500 501 if (flags & TIPC_WAKEUP_BCAST_USERS) 502 tipc_bclink_wakeup_users(net); 503 504 if (flags & TIPC_NOTIFY_NODE_UP) 505 tipc_named_node_up(net, addr); 506 507 if (flags & TIPC_NOTIFY_LINK_UP) 508 tipc_nametbl_publish(net, TIPC_LINK_STATE, addr, addr, 509 TIPC_NODE_SCOPE, link_id, addr); 510 511 if (flags & TIPC_NOTIFY_LINK_DOWN) 512 tipc_nametbl_withdraw(net, TIPC_LINK_STATE, addr, 513 link_id, addr); 514 515 if (flags & TIPC_MSG_EVT) 516 tipc_sk_rcv(net, inputq); 517 518 if (flags & TIPC_NAMED_MSG_EVT) 519 tipc_named_rcv(net, namedq); 520 521 if (flags & TIPC_BCAST_MSG_EVT) 522 tipc_bclink_input(net); 523 524 if (flags & TIPC_BCAST_RESET) 525 tipc_link_reset_all(node); 526 } 527 528 /* Caller should hold node lock for the passed node */ 529 static int __tipc_nl_add_node(struct tipc_nl_msg *msg, struct tipc_node *node) 530 { 531 void *hdr; 532 struct nlattr *attrs; 533 534 hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family, 535 NLM_F_MULTI, TIPC_NL_NODE_GET); 536 if (!hdr) 537 return -EMSGSIZE; 538 539 attrs = nla_nest_start(msg->skb, TIPC_NLA_NODE); 540 if (!attrs) 541 goto msg_full; 542 543 if (nla_put_u32(msg->skb, TIPC_NLA_NODE_ADDR, node->addr)) 544 goto attr_msg_full; 545 if (tipc_node_is_up(node)) 546 if (nla_put_flag(msg->skb, TIPC_NLA_NODE_UP)) 547 goto attr_msg_full; 548 549 nla_nest_end(msg->skb, attrs); 550 genlmsg_end(msg->skb, hdr); 551 552 return 0; 553 554 attr_msg_full: 555 nla_nest_cancel(msg->skb, attrs); 556 msg_full: 557 genlmsg_cancel(msg->skb, hdr); 558 559 return -EMSGSIZE; 560 } 561 562 int tipc_nl_node_dump(struct sk_buff *skb, struct netlink_callback *cb) 563 { 564 int err; 565 struct net *net = sock_net(skb->sk); 566 struct tipc_net *tn = net_generic(net, tipc_net_id); 567 int done = cb->args[0]; 568 int last_addr = cb->args[1]; 569 struct tipc_node *node; 570 struct tipc_nl_msg msg; 571 572 if (done) 573 return 0; 574 575 msg.skb = skb; 576 msg.portid = NETLINK_CB(cb->skb).portid; 577 msg.seq = cb->nlh->nlmsg_seq; 578 579 rcu_read_lock(); 580 if (last_addr) { 581 node = tipc_node_find(net, last_addr); 582 if (!node) { 583 rcu_read_unlock(); 584 /* We never set seq or call nl_dump_check_consistent() 585 * this means that setting prev_seq here will cause the 586 * consistence check to fail in the netlink callback 587 * handler. Resulting in the NLMSG_DONE message having 588 * the NLM_F_DUMP_INTR flag set if the node state 589 * changed while we released the lock. 590 */ 591 cb->prev_seq = 1; 592 return -EPIPE; 593 } 594 tipc_node_put(node); 595 } 596 597 list_for_each_entry_rcu(node, &tn->node_list, list) { 598 if (last_addr) { 599 if (node->addr == last_addr) 600 last_addr = 0; 601 else 602 continue; 603 } 604 605 tipc_node_lock(node); 606 err = __tipc_nl_add_node(&msg, node); 607 if (err) { 608 last_addr = node->addr; 609 tipc_node_unlock(node); 610 goto out; 611 } 612 613 tipc_node_unlock(node); 614 } 615 done = 1; 616 out: 617 cb->args[0] = done; 618 cb->args[1] = last_addr; 619 rcu_read_unlock(); 620 621 return skb->len; 622 } 623