1 /* 2 * net/tipc/node.c: TIPC node management routines 3 * 4 * Copyright (c) 2000-2006, 2012-2016, 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 #include "monitor.h" 44 #include "discover.h" 45 #include "netlink.h" 46 #include "trace.h" 47 48 #define INVALID_NODE_SIG 0x10000 49 #define NODE_CLEANUP_AFTER 300000 50 51 /* Flags used to take different actions according to flag type 52 * TIPC_NOTIFY_NODE_DOWN: notify node is down 53 * TIPC_NOTIFY_NODE_UP: notify node is up 54 * TIPC_DISTRIBUTE_NAME: publish or withdraw link state name type 55 */ 56 enum { 57 TIPC_NOTIFY_NODE_DOWN = (1 << 3), 58 TIPC_NOTIFY_NODE_UP = (1 << 4), 59 TIPC_NOTIFY_LINK_UP = (1 << 6), 60 TIPC_NOTIFY_LINK_DOWN = (1 << 7) 61 }; 62 63 struct tipc_link_entry { 64 struct tipc_link *link; 65 spinlock_t lock; /* per link */ 66 u32 mtu; 67 struct sk_buff_head inputq; 68 struct tipc_media_addr maddr; 69 }; 70 71 struct tipc_bclink_entry { 72 struct tipc_link *link; 73 struct sk_buff_head inputq1; 74 struct sk_buff_head arrvq; 75 struct sk_buff_head inputq2; 76 struct sk_buff_head namedq; 77 }; 78 79 /** 80 * struct tipc_node - TIPC node structure 81 * @addr: network address of node 82 * @ref: reference counter to node object 83 * @lock: rwlock governing access to structure 84 * @net: the applicable net namespace 85 * @hash: links to adjacent nodes in unsorted hash chain 86 * @inputq: pointer to input queue containing messages for msg event 87 * @namedq: pointer to name table input queue with name table messages 88 * @active_links: bearer ids of active links, used as index into links[] array 89 * @links: array containing references to all links to node 90 * @action_flags: bit mask of different types of node actions 91 * @state: connectivity state vs peer node 92 * @sync_point: sequence number where synch/failover is finished 93 * @list: links to adjacent nodes in sorted list of cluster's nodes 94 * @working_links: number of working links to node (both active and standby) 95 * @link_cnt: number of links to node 96 * @capabilities: bitmap, indicating peer node's functional capabilities 97 * @signature: node instance identifier 98 * @link_id: local and remote bearer ids of changing link, if any 99 * @publ_list: list of publications 100 * @rcu: rcu struct for tipc_node 101 * @delete_at: indicates the time for deleting a down node 102 */ 103 struct tipc_node { 104 u32 addr; 105 struct kref kref; 106 rwlock_t lock; 107 struct net *net; 108 struct hlist_node hash; 109 int active_links[2]; 110 struct tipc_link_entry links[MAX_BEARERS]; 111 struct tipc_bclink_entry bc_entry; 112 int action_flags; 113 struct list_head list; 114 int state; 115 bool failover_sent; 116 u16 sync_point; 117 int link_cnt; 118 u16 working_links; 119 u16 capabilities; 120 u32 signature; 121 u32 link_id; 122 u8 peer_id[16]; 123 struct list_head publ_list; 124 struct list_head conn_sks; 125 unsigned long keepalive_intv; 126 struct timer_list timer; 127 struct rcu_head rcu; 128 unsigned long delete_at; 129 }; 130 131 /* Node FSM states and events: 132 */ 133 enum { 134 SELF_DOWN_PEER_DOWN = 0xdd, 135 SELF_UP_PEER_UP = 0xaa, 136 SELF_DOWN_PEER_LEAVING = 0xd1, 137 SELF_UP_PEER_COMING = 0xac, 138 SELF_COMING_PEER_UP = 0xca, 139 SELF_LEAVING_PEER_DOWN = 0x1d, 140 NODE_FAILINGOVER = 0xf0, 141 NODE_SYNCHING = 0xcc 142 }; 143 144 enum { 145 SELF_ESTABL_CONTACT_EVT = 0xece, 146 SELF_LOST_CONTACT_EVT = 0x1ce, 147 PEER_ESTABL_CONTACT_EVT = 0x9ece, 148 PEER_LOST_CONTACT_EVT = 0x91ce, 149 NODE_FAILOVER_BEGIN_EVT = 0xfbe, 150 NODE_FAILOVER_END_EVT = 0xfee, 151 NODE_SYNCH_BEGIN_EVT = 0xcbe, 152 NODE_SYNCH_END_EVT = 0xcee 153 }; 154 155 static void __tipc_node_link_down(struct tipc_node *n, int *bearer_id, 156 struct sk_buff_head *xmitq, 157 struct tipc_media_addr **maddr); 158 static void tipc_node_link_down(struct tipc_node *n, int bearer_id, 159 bool delete); 160 static void node_lost_contact(struct tipc_node *n, struct sk_buff_head *inputq); 161 static void tipc_node_delete(struct tipc_node *node); 162 static void tipc_node_timeout(struct timer_list *t); 163 static void tipc_node_fsm_evt(struct tipc_node *n, int evt); 164 static struct tipc_node *tipc_node_find(struct net *net, u32 addr); 165 static struct tipc_node *tipc_node_find_by_id(struct net *net, u8 *id); 166 static void tipc_node_put(struct tipc_node *node); 167 static bool node_is_up(struct tipc_node *n); 168 static void tipc_node_delete_from_list(struct tipc_node *node); 169 170 struct tipc_sock_conn { 171 u32 port; 172 u32 peer_port; 173 u32 peer_node; 174 struct list_head list; 175 }; 176 177 static struct tipc_link *node_active_link(struct tipc_node *n, int sel) 178 { 179 int bearer_id = n->active_links[sel & 1]; 180 181 if (unlikely(bearer_id == INVALID_BEARER_ID)) 182 return NULL; 183 184 return n->links[bearer_id].link; 185 } 186 187 int tipc_node_get_mtu(struct net *net, u32 addr, u32 sel) 188 { 189 struct tipc_node *n; 190 int bearer_id; 191 unsigned int mtu = MAX_MSG_SIZE; 192 193 n = tipc_node_find(net, addr); 194 if (unlikely(!n)) 195 return mtu; 196 197 bearer_id = n->active_links[sel & 1]; 198 if (likely(bearer_id != INVALID_BEARER_ID)) 199 mtu = n->links[bearer_id].mtu; 200 tipc_node_put(n); 201 return mtu; 202 } 203 204 bool tipc_node_get_id(struct net *net, u32 addr, u8 *id) 205 { 206 u8 *own_id = tipc_own_id(net); 207 struct tipc_node *n; 208 209 if (!own_id) 210 return true; 211 212 if (addr == tipc_own_addr(net)) { 213 memcpy(id, own_id, TIPC_NODEID_LEN); 214 return true; 215 } 216 n = tipc_node_find(net, addr); 217 if (!n) 218 return false; 219 220 memcpy(id, &n->peer_id, TIPC_NODEID_LEN); 221 tipc_node_put(n); 222 return true; 223 } 224 225 u16 tipc_node_get_capabilities(struct net *net, u32 addr) 226 { 227 struct tipc_node *n; 228 u16 caps; 229 230 n = tipc_node_find(net, addr); 231 if (unlikely(!n)) 232 return TIPC_NODE_CAPABILITIES; 233 caps = n->capabilities; 234 tipc_node_put(n); 235 return caps; 236 } 237 238 static void tipc_node_kref_release(struct kref *kref) 239 { 240 struct tipc_node *n = container_of(kref, struct tipc_node, kref); 241 242 kfree(n->bc_entry.link); 243 kfree_rcu(n, rcu); 244 } 245 246 static void tipc_node_put(struct tipc_node *node) 247 { 248 kref_put(&node->kref, tipc_node_kref_release); 249 } 250 251 static void tipc_node_get(struct tipc_node *node) 252 { 253 kref_get(&node->kref); 254 } 255 256 /* 257 * tipc_node_find - locate specified node object, if it exists 258 */ 259 static struct tipc_node *tipc_node_find(struct net *net, u32 addr) 260 { 261 struct tipc_net *tn = tipc_net(net); 262 struct tipc_node *node; 263 unsigned int thash = tipc_hashfn(addr); 264 265 rcu_read_lock(); 266 hlist_for_each_entry_rcu(node, &tn->node_htable[thash], hash) { 267 if (node->addr != addr) 268 continue; 269 if (!kref_get_unless_zero(&node->kref)) 270 node = NULL; 271 break; 272 } 273 rcu_read_unlock(); 274 return node; 275 } 276 277 /* tipc_node_find_by_id - locate specified node object by its 128-bit id 278 * Note: this function is called only when a discovery request failed 279 * to find the node by its 32-bit id, and is not time critical 280 */ 281 static struct tipc_node *tipc_node_find_by_id(struct net *net, u8 *id) 282 { 283 struct tipc_net *tn = tipc_net(net); 284 struct tipc_node *n; 285 bool found = false; 286 287 rcu_read_lock(); 288 list_for_each_entry_rcu(n, &tn->node_list, list) { 289 read_lock_bh(&n->lock); 290 if (!memcmp(id, n->peer_id, 16) && 291 kref_get_unless_zero(&n->kref)) 292 found = true; 293 read_unlock_bh(&n->lock); 294 if (found) 295 break; 296 } 297 rcu_read_unlock(); 298 return found ? n : NULL; 299 } 300 301 static void tipc_node_read_lock(struct tipc_node *n) 302 { 303 read_lock_bh(&n->lock); 304 } 305 306 static void tipc_node_read_unlock(struct tipc_node *n) 307 { 308 read_unlock_bh(&n->lock); 309 } 310 311 static void tipc_node_write_lock(struct tipc_node *n) 312 { 313 write_lock_bh(&n->lock); 314 } 315 316 static void tipc_node_write_unlock_fast(struct tipc_node *n) 317 { 318 write_unlock_bh(&n->lock); 319 } 320 321 static void tipc_node_write_unlock(struct tipc_node *n) 322 { 323 struct net *net = n->net; 324 u32 addr = 0; 325 u32 flags = n->action_flags; 326 u32 link_id = 0; 327 u32 bearer_id; 328 struct list_head *publ_list; 329 330 if (likely(!flags)) { 331 write_unlock_bh(&n->lock); 332 return; 333 } 334 335 addr = n->addr; 336 link_id = n->link_id; 337 bearer_id = link_id & 0xffff; 338 publ_list = &n->publ_list; 339 340 n->action_flags &= ~(TIPC_NOTIFY_NODE_DOWN | TIPC_NOTIFY_NODE_UP | 341 TIPC_NOTIFY_LINK_DOWN | TIPC_NOTIFY_LINK_UP); 342 343 write_unlock_bh(&n->lock); 344 345 if (flags & TIPC_NOTIFY_NODE_DOWN) 346 tipc_publ_notify(net, publ_list, addr); 347 348 if (flags & TIPC_NOTIFY_NODE_UP) 349 tipc_named_node_up(net, addr); 350 351 if (flags & TIPC_NOTIFY_LINK_UP) { 352 tipc_mon_peer_up(net, addr, bearer_id); 353 tipc_nametbl_publish(net, TIPC_LINK_STATE, addr, addr, 354 TIPC_NODE_SCOPE, link_id, link_id); 355 } 356 if (flags & TIPC_NOTIFY_LINK_DOWN) { 357 tipc_mon_peer_down(net, addr, bearer_id); 358 tipc_nametbl_withdraw(net, TIPC_LINK_STATE, addr, 359 addr, link_id); 360 } 361 } 362 363 static struct tipc_node *tipc_node_create(struct net *net, u32 addr, 364 u8 *peer_id, u16 capabilities) 365 { 366 struct tipc_net *tn = net_generic(net, tipc_net_id); 367 struct tipc_node *n, *temp_node; 368 struct tipc_link *l; 369 int bearer_id; 370 int i; 371 372 spin_lock_bh(&tn->node_list_lock); 373 n = tipc_node_find(net, addr); 374 if (n) { 375 if (n->capabilities == capabilities) 376 goto exit; 377 /* Same node may come back with new capabilities */ 378 tipc_node_write_lock(n); 379 n->capabilities = capabilities; 380 for (bearer_id = 0; bearer_id < MAX_BEARERS; bearer_id++) { 381 l = n->links[bearer_id].link; 382 if (l) 383 tipc_link_update_caps(l, capabilities); 384 } 385 tipc_node_write_unlock_fast(n); 386 387 /* Calculate cluster capabilities */ 388 tn->capabilities = TIPC_NODE_CAPABILITIES; 389 list_for_each_entry_rcu(temp_node, &tn->node_list, list) { 390 tn->capabilities &= temp_node->capabilities; 391 } 392 goto exit; 393 } 394 n = kzalloc(sizeof(*n), GFP_ATOMIC); 395 if (!n) { 396 pr_warn("Node creation failed, no memory\n"); 397 goto exit; 398 } 399 n->addr = addr; 400 memcpy(&n->peer_id, peer_id, 16); 401 n->net = net; 402 n->capabilities = capabilities; 403 kref_init(&n->kref); 404 rwlock_init(&n->lock); 405 INIT_HLIST_NODE(&n->hash); 406 INIT_LIST_HEAD(&n->list); 407 INIT_LIST_HEAD(&n->publ_list); 408 INIT_LIST_HEAD(&n->conn_sks); 409 skb_queue_head_init(&n->bc_entry.namedq); 410 skb_queue_head_init(&n->bc_entry.inputq1); 411 __skb_queue_head_init(&n->bc_entry.arrvq); 412 skb_queue_head_init(&n->bc_entry.inputq2); 413 for (i = 0; i < MAX_BEARERS; i++) 414 spin_lock_init(&n->links[i].lock); 415 n->state = SELF_DOWN_PEER_LEAVING; 416 n->delete_at = jiffies + msecs_to_jiffies(NODE_CLEANUP_AFTER); 417 n->signature = INVALID_NODE_SIG; 418 n->active_links[0] = INVALID_BEARER_ID; 419 n->active_links[1] = INVALID_BEARER_ID; 420 if (!tipc_link_bc_create(net, tipc_own_addr(net), 421 addr, U16_MAX, 422 tipc_link_window(tipc_bc_sndlink(net)), 423 n->capabilities, 424 &n->bc_entry.inputq1, 425 &n->bc_entry.namedq, 426 tipc_bc_sndlink(net), 427 &n->bc_entry.link)) { 428 pr_warn("Broadcast rcv link creation failed, no memory\n"); 429 kfree(n); 430 n = NULL; 431 goto exit; 432 } 433 tipc_node_get(n); 434 timer_setup(&n->timer, tipc_node_timeout, 0); 435 n->keepalive_intv = U32_MAX; 436 hlist_add_head_rcu(&n->hash, &tn->node_htable[tipc_hashfn(addr)]); 437 list_for_each_entry_rcu(temp_node, &tn->node_list, list) { 438 if (n->addr < temp_node->addr) 439 break; 440 } 441 list_add_tail_rcu(&n->list, &temp_node->list); 442 /* Calculate cluster capabilities */ 443 tn->capabilities = TIPC_NODE_CAPABILITIES; 444 list_for_each_entry_rcu(temp_node, &tn->node_list, list) { 445 tn->capabilities &= temp_node->capabilities; 446 } 447 trace_tipc_node_create(n, true, " "); 448 exit: 449 spin_unlock_bh(&tn->node_list_lock); 450 return n; 451 } 452 453 static void tipc_node_calculate_timer(struct tipc_node *n, struct tipc_link *l) 454 { 455 unsigned long tol = tipc_link_tolerance(l); 456 unsigned long intv = ((tol / 4) > 500) ? 500 : tol / 4; 457 458 /* Link with lowest tolerance determines timer interval */ 459 if (intv < n->keepalive_intv) 460 n->keepalive_intv = intv; 461 462 /* Ensure link's abort limit corresponds to current tolerance */ 463 tipc_link_set_abort_limit(l, tol / n->keepalive_intv); 464 } 465 466 static void tipc_node_delete_from_list(struct tipc_node *node) 467 { 468 list_del_rcu(&node->list); 469 hlist_del_rcu(&node->hash); 470 tipc_node_put(node); 471 } 472 473 static void tipc_node_delete(struct tipc_node *node) 474 { 475 trace_tipc_node_delete(node, true, " "); 476 tipc_node_delete_from_list(node); 477 478 del_timer_sync(&node->timer); 479 tipc_node_put(node); 480 } 481 482 void tipc_node_stop(struct net *net) 483 { 484 struct tipc_net *tn = tipc_net(net); 485 struct tipc_node *node, *t_node; 486 487 spin_lock_bh(&tn->node_list_lock); 488 list_for_each_entry_safe(node, t_node, &tn->node_list, list) 489 tipc_node_delete(node); 490 spin_unlock_bh(&tn->node_list_lock); 491 } 492 493 void tipc_node_subscribe(struct net *net, struct list_head *subscr, u32 addr) 494 { 495 struct tipc_node *n; 496 497 if (in_own_node(net, addr)) 498 return; 499 500 n = tipc_node_find(net, addr); 501 if (!n) { 502 pr_warn("Node subscribe rejected, unknown node 0x%x\n", addr); 503 return; 504 } 505 tipc_node_write_lock(n); 506 list_add_tail(subscr, &n->publ_list); 507 tipc_node_write_unlock_fast(n); 508 tipc_node_put(n); 509 } 510 511 void tipc_node_unsubscribe(struct net *net, struct list_head *subscr, u32 addr) 512 { 513 struct tipc_node *n; 514 515 if (in_own_node(net, addr)) 516 return; 517 518 n = tipc_node_find(net, addr); 519 if (!n) { 520 pr_warn("Node unsubscribe rejected, unknown node 0x%x\n", addr); 521 return; 522 } 523 tipc_node_write_lock(n); 524 list_del_init(subscr); 525 tipc_node_write_unlock_fast(n); 526 tipc_node_put(n); 527 } 528 529 int tipc_node_add_conn(struct net *net, u32 dnode, u32 port, u32 peer_port) 530 { 531 struct tipc_node *node; 532 struct tipc_sock_conn *conn; 533 int err = 0; 534 535 if (in_own_node(net, dnode)) 536 return 0; 537 538 node = tipc_node_find(net, dnode); 539 if (!node) { 540 pr_warn("Connecting sock to node 0x%x failed\n", dnode); 541 return -EHOSTUNREACH; 542 } 543 conn = kmalloc(sizeof(*conn), GFP_ATOMIC); 544 if (!conn) { 545 err = -EHOSTUNREACH; 546 goto exit; 547 } 548 conn->peer_node = dnode; 549 conn->port = port; 550 conn->peer_port = peer_port; 551 552 tipc_node_write_lock(node); 553 list_add_tail(&conn->list, &node->conn_sks); 554 tipc_node_write_unlock(node); 555 exit: 556 tipc_node_put(node); 557 return err; 558 } 559 560 void tipc_node_remove_conn(struct net *net, u32 dnode, u32 port) 561 { 562 struct tipc_node *node; 563 struct tipc_sock_conn *conn, *safe; 564 565 if (in_own_node(net, dnode)) 566 return; 567 568 node = tipc_node_find(net, dnode); 569 if (!node) 570 return; 571 572 tipc_node_write_lock(node); 573 list_for_each_entry_safe(conn, safe, &node->conn_sks, list) { 574 if (port != conn->port) 575 continue; 576 list_del(&conn->list); 577 kfree(conn); 578 } 579 tipc_node_write_unlock(node); 580 tipc_node_put(node); 581 } 582 583 static void tipc_node_clear_links(struct tipc_node *node) 584 { 585 int i; 586 587 for (i = 0; i < MAX_BEARERS; i++) { 588 struct tipc_link_entry *le = &node->links[i]; 589 590 if (le->link) { 591 kfree(le->link); 592 le->link = NULL; 593 node->link_cnt--; 594 } 595 } 596 } 597 598 /* tipc_node_cleanup - delete nodes that does not 599 * have active links for NODE_CLEANUP_AFTER time 600 */ 601 static bool tipc_node_cleanup(struct tipc_node *peer) 602 { 603 struct tipc_node *temp_node; 604 struct tipc_net *tn = tipc_net(peer->net); 605 bool deleted = false; 606 607 /* If lock held by tipc_node_stop() the node will be deleted anyway */ 608 if (!spin_trylock_bh(&tn->node_list_lock)) 609 return false; 610 611 tipc_node_write_lock(peer); 612 613 if (!node_is_up(peer) && time_after(jiffies, peer->delete_at)) { 614 tipc_node_clear_links(peer); 615 tipc_node_delete_from_list(peer); 616 deleted = true; 617 } 618 tipc_node_write_unlock(peer); 619 620 /* Calculate cluster capabilities */ 621 tn->capabilities = TIPC_NODE_CAPABILITIES; 622 list_for_each_entry_rcu(temp_node, &tn->node_list, list) { 623 tn->capabilities &= temp_node->capabilities; 624 } 625 626 spin_unlock_bh(&tn->node_list_lock); 627 return deleted; 628 } 629 630 /* tipc_node_timeout - handle expiration of node timer 631 */ 632 static void tipc_node_timeout(struct timer_list *t) 633 { 634 struct tipc_node *n = from_timer(n, t, timer); 635 struct tipc_link_entry *le; 636 struct sk_buff_head xmitq; 637 int remains = n->link_cnt; 638 int bearer_id; 639 int rc = 0; 640 641 trace_tipc_node_timeout(n, false, " "); 642 if (!node_is_up(n) && tipc_node_cleanup(n)) { 643 /*Removing the reference of Timer*/ 644 tipc_node_put(n); 645 return; 646 } 647 648 __skb_queue_head_init(&xmitq); 649 650 /* Initial node interval to value larger (10 seconds), then it will be 651 * recalculated with link lowest tolerance 652 */ 653 tipc_node_read_lock(n); 654 n->keepalive_intv = 10000; 655 tipc_node_read_unlock(n); 656 for (bearer_id = 0; remains && (bearer_id < MAX_BEARERS); bearer_id++) { 657 tipc_node_read_lock(n); 658 le = &n->links[bearer_id]; 659 if (le->link) { 660 spin_lock_bh(&le->lock); 661 /* Link tolerance may change asynchronously: */ 662 tipc_node_calculate_timer(n, le->link); 663 rc = tipc_link_timeout(le->link, &xmitq); 664 spin_unlock_bh(&le->lock); 665 remains--; 666 } 667 tipc_node_read_unlock(n); 668 tipc_bearer_xmit(n->net, bearer_id, &xmitq, &le->maddr); 669 if (rc & TIPC_LINK_DOWN_EVT) 670 tipc_node_link_down(n, bearer_id, false); 671 } 672 mod_timer(&n->timer, jiffies + msecs_to_jiffies(n->keepalive_intv)); 673 } 674 675 /** 676 * __tipc_node_link_up - handle addition of link 677 * Node lock must be held by caller 678 * Link becomes active (alone or shared) or standby, depending on its priority. 679 */ 680 static void __tipc_node_link_up(struct tipc_node *n, int bearer_id, 681 struct sk_buff_head *xmitq) 682 { 683 int *slot0 = &n->active_links[0]; 684 int *slot1 = &n->active_links[1]; 685 struct tipc_link *ol = node_active_link(n, 0); 686 struct tipc_link *nl = n->links[bearer_id].link; 687 688 if (!nl || tipc_link_is_up(nl)) 689 return; 690 691 tipc_link_fsm_evt(nl, LINK_ESTABLISH_EVT); 692 if (!tipc_link_is_up(nl)) 693 return; 694 695 n->working_links++; 696 n->action_flags |= TIPC_NOTIFY_LINK_UP; 697 n->link_id = tipc_link_id(nl); 698 699 /* Leave room for tunnel header when returning 'mtu' to users: */ 700 n->links[bearer_id].mtu = tipc_link_mtu(nl) - INT_H_SIZE; 701 702 tipc_bearer_add_dest(n->net, bearer_id, n->addr); 703 tipc_bcast_inc_bearer_dst_cnt(n->net, bearer_id); 704 705 pr_debug("Established link <%s> on network plane %c\n", 706 tipc_link_name(nl), tipc_link_plane(nl)); 707 trace_tipc_node_link_up(n, true, " "); 708 709 /* Ensure that a STATE message goes first */ 710 tipc_link_build_state_msg(nl, xmitq); 711 712 /* First link? => give it both slots */ 713 if (!ol) { 714 *slot0 = bearer_id; 715 *slot1 = bearer_id; 716 tipc_node_fsm_evt(n, SELF_ESTABL_CONTACT_EVT); 717 n->action_flags |= TIPC_NOTIFY_NODE_UP; 718 tipc_link_set_active(nl, true); 719 tipc_bcast_add_peer(n->net, nl, xmitq); 720 return; 721 } 722 723 /* Second link => redistribute slots */ 724 if (tipc_link_prio(nl) > tipc_link_prio(ol)) { 725 pr_debug("Old link <%s> becomes standby\n", tipc_link_name(ol)); 726 *slot0 = bearer_id; 727 *slot1 = bearer_id; 728 tipc_link_set_active(nl, true); 729 tipc_link_set_active(ol, false); 730 } else if (tipc_link_prio(nl) == tipc_link_prio(ol)) { 731 tipc_link_set_active(nl, true); 732 *slot1 = bearer_id; 733 } else { 734 pr_debug("New link <%s> is standby\n", tipc_link_name(nl)); 735 } 736 737 /* Prepare synchronization with first link */ 738 tipc_link_tnl_prepare(ol, nl, SYNCH_MSG, xmitq); 739 } 740 741 /** 742 * tipc_node_link_up - handle addition of link 743 * 744 * Link becomes active (alone or shared) or standby, depending on its priority. 745 */ 746 static void tipc_node_link_up(struct tipc_node *n, int bearer_id, 747 struct sk_buff_head *xmitq) 748 { 749 struct tipc_media_addr *maddr; 750 751 tipc_node_write_lock(n); 752 __tipc_node_link_up(n, bearer_id, xmitq); 753 maddr = &n->links[bearer_id].maddr; 754 tipc_bearer_xmit(n->net, bearer_id, xmitq, maddr); 755 tipc_node_write_unlock(n); 756 } 757 758 /** 759 * tipc_node_link_failover() - start failover in case "half-failover" 760 * 761 * This function is only called in a very special situation where link 762 * failover can be already started on peer node but not on this node. 763 * This can happen when e.g. 764 * 1. Both links <1A-2A>, <1B-2B> down 765 * 2. Link endpoint 2A up, but 1A still down (e.g. due to network 766 * disturbance, wrong session, etc.) 767 * 3. Link <1B-2B> up 768 * 4. Link endpoint 2A down (e.g. due to link tolerance timeout) 769 * 5. Node B starts failover onto link <1B-2B> 770 * 771 * ==> Node A does never start link/node failover! 772 * 773 * @n: tipc node structure 774 * @l: link peer endpoint failingover (- can be NULL) 775 * @tnl: tunnel link 776 * @xmitq: queue for messages to be xmited on tnl link later 777 */ 778 static void tipc_node_link_failover(struct tipc_node *n, struct tipc_link *l, 779 struct tipc_link *tnl, 780 struct sk_buff_head *xmitq) 781 { 782 /* Avoid to be "self-failover" that can never end */ 783 if (!tipc_link_is_up(tnl)) 784 return; 785 786 tipc_link_fsm_evt(tnl, LINK_SYNCH_END_EVT); 787 tipc_node_fsm_evt(n, NODE_SYNCH_END_EVT); 788 789 n->sync_point = tipc_link_rcv_nxt(tnl) + (U16_MAX / 2 - 1); 790 tipc_link_failover_prepare(l, tnl, xmitq); 791 792 if (l) 793 tipc_link_fsm_evt(l, LINK_FAILOVER_BEGIN_EVT); 794 tipc_node_fsm_evt(n, NODE_FAILOVER_BEGIN_EVT); 795 } 796 797 /** 798 * __tipc_node_link_down - handle loss of link 799 */ 800 static void __tipc_node_link_down(struct tipc_node *n, int *bearer_id, 801 struct sk_buff_head *xmitq, 802 struct tipc_media_addr **maddr) 803 { 804 struct tipc_link_entry *le = &n->links[*bearer_id]; 805 int *slot0 = &n->active_links[0]; 806 int *slot1 = &n->active_links[1]; 807 int i, highest = 0, prio; 808 struct tipc_link *l, *_l, *tnl; 809 810 l = n->links[*bearer_id].link; 811 if (!l || tipc_link_is_reset(l)) 812 return; 813 814 n->working_links--; 815 n->action_flags |= TIPC_NOTIFY_LINK_DOWN; 816 n->link_id = tipc_link_id(l); 817 818 tipc_bearer_remove_dest(n->net, *bearer_id, n->addr); 819 820 pr_debug("Lost link <%s> on network plane %c\n", 821 tipc_link_name(l), tipc_link_plane(l)); 822 823 /* Select new active link if any available */ 824 *slot0 = INVALID_BEARER_ID; 825 *slot1 = INVALID_BEARER_ID; 826 for (i = 0; i < MAX_BEARERS; i++) { 827 _l = n->links[i].link; 828 if (!_l || !tipc_link_is_up(_l)) 829 continue; 830 if (_l == l) 831 continue; 832 prio = tipc_link_prio(_l); 833 if (prio < highest) 834 continue; 835 if (prio > highest) { 836 highest = prio; 837 *slot0 = i; 838 *slot1 = i; 839 continue; 840 } 841 *slot1 = i; 842 } 843 844 if (!node_is_up(n)) { 845 if (tipc_link_peer_is_down(l)) 846 tipc_node_fsm_evt(n, PEER_LOST_CONTACT_EVT); 847 tipc_node_fsm_evt(n, SELF_LOST_CONTACT_EVT); 848 trace_tipc_link_reset(l, TIPC_DUMP_ALL, "link down!"); 849 tipc_link_fsm_evt(l, LINK_RESET_EVT); 850 tipc_link_reset(l); 851 tipc_link_build_reset_msg(l, xmitq); 852 *maddr = &n->links[*bearer_id].maddr; 853 node_lost_contact(n, &le->inputq); 854 tipc_bcast_dec_bearer_dst_cnt(n->net, *bearer_id); 855 return; 856 } 857 tipc_bcast_dec_bearer_dst_cnt(n->net, *bearer_id); 858 859 /* There is still a working link => initiate failover */ 860 *bearer_id = n->active_links[0]; 861 tnl = n->links[*bearer_id].link; 862 tipc_link_fsm_evt(tnl, LINK_SYNCH_END_EVT); 863 tipc_node_fsm_evt(n, NODE_SYNCH_END_EVT); 864 n->sync_point = tipc_link_rcv_nxt(tnl) + (U16_MAX / 2 - 1); 865 tipc_link_tnl_prepare(l, tnl, FAILOVER_MSG, xmitq); 866 trace_tipc_link_reset(l, TIPC_DUMP_ALL, "link down -> failover!"); 867 tipc_link_reset(l); 868 tipc_link_fsm_evt(l, LINK_RESET_EVT); 869 tipc_link_fsm_evt(l, LINK_FAILOVER_BEGIN_EVT); 870 tipc_node_fsm_evt(n, NODE_FAILOVER_BEGIN_EVT); 871 *maddr = &n->links[*bearer_id].maddr; 872 } 873 874 static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete) 875 { 876 struct tipc_link_entry *le = &n->links[bearer_id]; 877 struct tipc_media_addr *maddr = NULL; 878 struct tipc_link *l = le->link; 879 int old_bearer_id = bearer_id; 880 struct sk_buff_head xmitq; 881 882 if (!l) 883 return; 884 885 __skb_queue_head_init(&xmitq); 886 887 tipc_node_write_lock(n); 888 if (!tipc_link_is_establishing(l)) { 889 __tipc_node_link_down(n, &bearer_id, &xmitq, &maddr); 890 } else { 891 /* Defuse pending tipc_node_link_up() */ 892 tipc_link_reset(l); 893 tipc_link_fsm_evt(l, LINK_RESET_EVT); 894 } 895 if (delete) { 896 kfree(l); 897 le->link = NULL; 898 n->link_cnt--; 899 } 900 trace_tipc_node_link_down(n, true, "node link down or deleted!"); 901 tipc_node_write_unlock(n); 902 if (delete) 903 tipc_mon_remove_peer(n->net, n->addr, old_bearer_id); 904 if (!skb_queue_empty(&xmitq)) 905 tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr); 906 tipc_sk_rcv(n->net, &le->inputq); 907 } 908 909 static bool node_is_up(struct tipc_node *n) 910 { 911 return n->active_links[0] != INVALID_BEARER_ID; 912 } 913 914 bool tipc_node_is_up(struct net *net, u32 addr) 915 { 916 struct tipc_node *n; 917 bool retval = false; 918 919 if (in_own_node(net, addr)) 920 return true; 921 922 n = tipc_node_find(net, addr); 923 if (!n) 924 return false; 925 retval = node_is_up(n); 926 tipc_node_put(n); 927 return retval; 928 } 929 930 static u32 tipc_node_suggest_addr(struct net *net, u32 addr) 931 { 932 struct tipc_node *n; 933 934 addr ^= tipc_net(net)->random; 935 while ((n = tipc_node_find(net, addr))) { 936 tipc_node_put(n); 937 addr++; 938 } 939 return addr; 940 } 941 942 /* tipc_node_try_addr(): Check if addr can be used by peer, suggest other if not 943 * Returns suggested address if any, otherwise 0 944 */ 945 u32 tipc_node_try_addr(struct net *net, u8 *id, u32 addr) 946 { 947 struct tipc_net *tn = tipc_net(net); 948 struct tipc_node *n; 949 950 /* Suggest new address if some other peer is using this one */ 951 n = tipc_node_find(net, addr); 952 if (n) { 953 if (!memcmp(n->peer_id, id, NODE_ID_LEN)) 954 addr = 0; 955 tipc_node_put(n); 956 if (!addr) 957 return 0; 958 return tipc_node_suggest_addr(net, addr); 959 } 960 961 /* Suggest previously used address if peer is known */ 962 n = tipc_node_find_by_id(net, id); 963 if (n) { 964 addr = n->addr; 965 tipc_node_put(n); 966 return addr; 967 } 968 969 /* Even this node may be in conflict */ 970 if (tn->trial_addr == addr) 971 return tipc_node_suggest_addr(net, addr); 972 973 return 0; 974 } 975 976 void tipc_node_check_dest(struct net *net, u32 addr, 977 u8 *peer_id, struct tipc_bearer *b, 978 u16 capabilities, u32 signature, 979 struct tipc_media_addr *maddr, 980 bool *respond, bool *dupl_addr) 981 { 982 struct tipc_node *n; 983 struct tipc_link *l; 984 struct tipc_link_entry *le; 985 bool addr_match = false; 986 bool sign_match = false; 987 bool link_up = false; 988 bool accept_addr = false; 989 bool reset = true; 990 char *if_name; 991 unsigned long intv; 992 u16 session; 993 994 *dupl_addr = false; 995 *respond = false; 996 997 n = tipc_node_create(net, addr, peer_id, capabilities); 998 if (!n) 999 return; 1000 1001 tipc_node_write_lock(n); 1002 1003 le = &n->links[b->identity]; 1004 1005 /* Prepare to validate requesting node's signature and media address */ 1006 l = le->link; 1007 link_up = l && tipc_link_is_up(l); 1008 addr_match = l && !memcmp(&le->maddr, maddr, sizeof(*maddr)); 1009 sign_match = (signature == n->signature); 1010 1011 /* These three flags give us eight permutations: */ 1012 1013 if (sign_match && addr_match && link_up) { 1014 /* All is fine. Do nothing. */ 1015 reset = false; 1016 } else if (sign_match && addr_match && !link_up) { 1017 /* Respond. The link will come up in due time */ 1018 *respond = true; 1019 } else if (sign_match && !addr_match && link_up) { 1020 /* Peer has changed i/f address without rebooting. 1021 * If so, the link will reset soon, and the next 1022 * discovery will be accepted. So we can ignore it. 1023 * It may also be an cloned or malicious peer having 1024 * chosen the same node address and signature as an 1025 * existing one. 1026 * Ignore requests until the link goes down, if ever. 1027 */ 1028 *dupl_addr = true; 1029 } else if (sign_match && !addr_match && !link_up) { 1030 /* Peer link has changed i/f address without rebooting. 1031 * It may also be a cloned or malicious peer; we can't 1032 * distinguish between the two. 1033 * The signature is correct, so we must accept. 1034 */ 1035 accept_addr = true; 1036 *respond = true; 1037 } else if (!sign_match && addr_match && link_up) { 1038 /* Peer node rebooted. Two possibilities: 1039 * - Delayed re-discovery; this link endpoint has already 1040 * reset and re-established contact with the peer, before 1041 * receiving a discovery message from that node. 1042 * (The peer happened to receive one from this node first). 1043 * - The peer came back so fast that our side has not 1044 * discovered it yet. Probing from this side will soon 1045 * reset the link, since there can be no working link 1046 * endpoint at the peer end, and the link will re-establish. 1047 * Accept the signature, since it comes from a known peer. 1048 */ 1049 n->signature = signature; 1050 } else if (!sign_match && addr_match && !link_up) { 1051 /* The peer node has rebooted. 1052 * Accept signature, since it is a known peer. 1053 */ 1054 n->signature = signature; 1055 *respond = true; 1056 } else if (!sign_match && !addr_match && link_up) { 1057 /* Peer rebooted with new address, or a new/duplicate peer. 1058 * Ignore until the link goes down, if ever. 1059 */ 1060 *dupl_addr = true; 1061 } else if (!sign_match && !addr_match && !link_up) { 1062 /* Peer rebooted with new address, or it is a new peer. 1063 * Accept signature and address. 1064 */ 1065 n->signature = signature; 1066 accept_addr = true; 1067 *respond = true; 1068 } 1069 1070 if (!accept_addr) 1071 goto exit; 1072 1073 /* Now create new link if not already existing */ 1074 if (!l) { 1075 if (n->link_cnt == 2) 1076 goto exit; 1077 1078 if_name = strchr(b->name, ':') + 1; 1079 get_random_bytes(&session, sizeof(u16)); 1080 if (!tipc_link_create(net, if_name, b->identity, b->tolerance, 1081 b->net_plane, b->mtu, b->priority, 1082 b->window, session, 1083 tipc_own_addr(net), addr, peer_id, 1084 n->capabilities, 1085 tipc_bc_sndlink(n->net), n->bc_entry.link, 1086 &le->inputq, 1087 &n->bc_entry.namedq, &l)) { 1088 *respond = false; 1089 goto exit; 1090 } 1091 trace_tipc_link_reset(l, TIPC_DUMP_ALL, "link created!"); 1092 tipc_link_reset(l); 1093 tipc_link_fsm_evt(l, LINK_RESET_EVT); 1094 if (n->state == NODE_FAILINGOVER) 1095 tipc_link_fsm_evt(l, LINK_FAILOVER_BEGIN_EVT); 1096 le->link = l; 1097 n->link_cnt++; 1098 tipc_node_calculate_timer(n, l); 1099 if (n->link_cnt == 1) { 1100 intv = jiffies + msecs_to_jiffies(n->keepalive_intv); 1101 if (!mod_timer(&n->timer, intv)) 1102 tipc_node_get(n); 1103 } 1104 } 1105 memcpy(&le->maddr, maddr, sizeof(*maddr)); 1106 exit: 1107 tipc_node_write_unlock(n); 1108 if (reset && l && !tipc_link_is_reset(l)) 1109 tipc_node_link_down(n, b->identity, false); 1110 tipc_node_put(n); 1111 } 1112 1113 void tipc_node_delete_links(struct net *net, int bearer_id) 1114 { 1115 struct tipc_net *tn = net_generic(net, tipc_net_id); 1116 struct tipc_node *n; 1117 1118 rcu_read_lock(); 1119 list_for_each_entry_rcu(n, &tn->node_list, list) { 1120 tipc_node_link_down(n, bearer_id, true); 1121 } 1122 rcu_read_unlock(); 1123 } 1124 1125 static void tipc_node_reset_links(struct tipc_node *n) 1126 { 1127 int i; 1128 1129 pr_warn("Resetting all links to %x\n", n->addr); 1130 1131 trace_tipc_node_reset_links(n, true, " "); 1132 for (i = 0; i < MAX_BEARERS; i++) { 1133 tipc_node_link_down(n, i, false); 1134 } 1135 } 1136 1137 /* tipc_node_fsm_evt - node finite state machine 1138 * Determines when contact is allowed with peer node 1139 */ 1140 static void tipc_node_fsm_evt(struct tipc_node *n, int evt) 1141 { 1142 int state = n->state; 1143 1144 switch (state) { 1145 case SELF_DOWN_PEER_DOWN: 1146 switch (evt) { 1147 case SELF_ESTABL_CONTACT_EVT: 1148 state = SELF_UP_PEER_COMING; 1149 break; 1150 case PEER_ESTABL_CONTACT_EVT: 1151 state = SELF_COMING_PEER_UP; 1152 break; 1153 case SELF_LOST_CONTACT_EVT: 1154 case PEER_LOST_CONTACT_EVT: 1155 break; 1156 case NODE_SYNCH_END_EVT: 1157 case NODE_SYNCH_BEGIN_EVT: 1158 case NODE_FAILOVER_BEGIN_EVT: 1159 case NODE_FAILOVER_END_EVT: 1160 default: 1161 goto illegal_evt; 1162 } 1163 break; 1164 case SELF_UP_PEER_UP: 1165 switch (evt) { 1166 case SELF_LOST_CONTACT_EVT: 1167 state = SELF_DOWN_PEER_LEAVING; 1168 break; 1169 case PEER_LOST_CONTACT_EVT: 1170 state = SELF_LEAVING_PEER_DOWN; 1171 break; 1172 case NODE_SYNCH_BEGIN_EVT: 1173 state = NODE_SYNCHING; 1174 break; 1175 case NODE_FAILOVER_BEGIN_EVT: 1176 state = NODE_FAILINGOVER; 1177 break; 1178 case SELF_ESTABL_CONTACT_EVT: 1179 case PEER_ESTABL_CONTACT_EVT: 1180 case NODE_SYNCH_END_EVT: 1181 case NODE_FAILOVER_END_EVT: 1182 break; 1183 default: 1184 goto illegal_evt; 1185 } 1186 break; 1187 case SELF_DOWN_PEER_LEAVING: 1188 switch (evt) { 1189 case PEER_LOST_CONTACT_EVT: 1190 state = SELF_DOWN_PEER_DOWN; 1191 break; 1192 case SELF_ESTABL_CONTACT_EVT: 1193 case PEER_ESTABL_CONTACT_EVT: 1194 case SELF_LOST_CONTACT_EVT: 1195 break; 1196 case NODE_SYNCH_END_EVT: 1197 case NODE_SYNCH_BEGIN_EVT: 1198 case NODE_FAILOVER_BEGIN_EVT: 1199 case NODE_FAILOVER_END_EVT: 1200 default: 1201 goto illegal_evt; 1202 } 1203 break; 1204 case SELF_UP_PEER_COMING: 1205 switch (evt) { 1206 case PEER_ESTABL_CONTACT_EVT: 1207 state = SELF_UP_PEER_UP; 1208 break; 1209 case SELF_LOST_CONTACT_EVT: 1210 state = SELF_DOWN_PEER_DOWN; 1211 break; 1212 case SELF_ESTABL_CONTACT_EVT: 1213 case PEER_LOST_CONTACT_EVT: 1214 case NODE_SYNCH_END_EVT: 1215 case NODE_FAILOVER_BEGIN_EVT: 1216 break; 1217 case NODE_SYNCH_BEGIN_EVT: 1218 case NODE_FAILOVER_END_EVT: 1219 default: 1220 goto illegal_evt; 1221 } 1222 break; 1223 case SELF_COMING_PEER_UP: 1224 switch (evt) { 1225 case SELF_ESTABL_CONTACT_EVT: 1226 state = SELF_UP_PEER_UP; 1227 break; 1228 case PEER_LOST_CONTACT_EVT: 1229 state = SELF_DOWN_PEER_DOWN; 1230 break; 1231 case SELF_LOST_CONTACT_EVT: 1232 case PEER_ESTABL_CONTACT_EVT: 1233 break; 1234 case NODE_SYNCH_END_EVT: 1235 case NODE_SYNCH_BEGIN_EVT: 1236 case NODE_FAILOVER_BEGIN_EVT: 1237 case NODE_FAILOVER_END_EVT: 1238 default: 1239 goto illegal_evt; 1240 } 1241 break; 1242 case SELF_LEAVING_PEER_DOWN: 1243 switch (evt) { 1244 case SELF_LOST_CONTACT_EVT: 1245 state = SELF_DOWN_PEER_DOWN; 1246 break; 1247 case SELF_ESTABL_CONTACT_EVT: 1248 case PEER_ESTABL_CONTACT_EVT: 1249 case PEER_LOST_CONTACT_EVT: 1250 break; 1251 case NODE_SYNCH_END_EVT: 1252 case NODE_SYNCH_BEGIN_EVT: 1253 case NODE_FAILOVER_BEGIN_EVT: 1254 case NODE_FAILOVER_END_EVT: 1255 default: 1256 goto illegal_evt; 1257 } 1258 break; 1259 case NODE_FAILINGOVER: 1260 switch (evt) { 1261 case SELF_LOST_CONTACT_EVT: 1262 state = SELF_DOWN_PEER_LEAVING; 1263 break; 1264 case PEER_LOST_CONTACT_EVT: 1265 state = SELF_LEAVING_PEER_DOWN; 1266 break; 1267 case NODE_FAILOVER_END_EVT: 1268 state = SELF_UP_PEER_UP; 1269 break; 1270 case NODE_FAILOVER_BEGIN_EVT: 1271 case SELF_ESTABL_CONTACT_EVT: 1272 case PEER_ESTABL_CONTACT_EVT: 1273 break; 1274 case NODE_SYNCH_BEGIN_EVT: 1275 case NODE_SYNCH_END_EVT: 1276 default: 1277 goto illegal_evt; 1278 } 1279 break; 1280 case NODE_SYNCHING: 1281 switch (evt) { 1282 case SELF_LOST_CONTACT_EVT: 1283 state = SELF_DOWN_PEER_LEAVING; 1284 break; 1285 case PEER_LOST_CONTACT_EVT: 1286 state = SELF_LEAVING_PEER_DOWN; 1287 break; 1288 case NODE_SYNCH_END_EVT: 1289 state = SELF_UP_PEER_UP; 1290 break; 1291 case NODE_FAILOVER_BEGIN_EVT: 1292 state = NODE_FAILINGOVER; 1293 break; 1294 case NODE_SYNCH_BEGIN_EVT: 1295 case SELF_ESTABL_CONTACT_EVT: 1296 case PEER_ESTABL_CONTACT_EVT: 1297 break; 1298 case NODE_FAILOVER_END_EVT: 1299 default: 1300 goto illegal_evt; 1301 } 1302 break; 1303 default: 1304 pr_err("Unknown node fsm state %x\n", state); 1305 break; 1306 } 1307 trace_tipc_node_fsm(n->peer_id, n->state, state, evt); 1308 n->state = state; 1309 return; 1310 1311 illegal_evt: 1312 pr_err("Illegal node fsm evt %x in state %x\n", evt, state); 1313 trace_tipc_node_fsm(n->peer_id, n->state, state, evt); 1314 } 1315 1316 static void node_lost_contact(struct tipc_node *n, 1317 struct sk_buff_head *inputq) 1318 { 1319 struct tipc_sock_conn *conn, *safe; 1320 struct tipc_link *l; 1321 struct list_head *conns = &n->conn_sks; 1322 struct sk_buff *skb; 1323 uint i; 1324 1325 pr_debug("Lost contact with %x\n", n->addr); 1326 n->delete_at = jiffies + msecs_to_jiffies(NODE_CLEANUP_AFTER); 1327 trace_tipc_node_lost_contact(n, true, " "); 1328 1329 /* Clean up broadcast state */ 1330 tipc_bcast_remove_peer(n->net, n->bc_entry.link); 1331 1332 /* Abort any ongoing link failover */ 1333 for (i = 0; i < MAX_BEARERS; i++) { 1334 l = n->links[i].link; 1335 if (l) 1336 tipc_link_fsm_evt(l, LINK_FAILOVER_END_EVT); 1337 } 1338 1339 /* Notify publications from this node */ 1340 n->action_flags |= TIPC_NOTIFY_NODE_DOWN; 1341 1342 /* Notify sockets connected to node */ 1343 list_for_each_entry_safe(conn, safe, conns, list) { 1344 skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE, TIPC_CONN_MSG, 1345 SHORT_H_SIZE, 0, tipc_own_addr(n->net), 1346 conn->peer_node, conn->port, 1347 conn->peer_port, TIPC_ERR_NO_NODE); 1348 if (likely(skb)) 1349 skb_queue_tail(inputq, skb); 1350 list_del(&conn->list); 1351 kfree(conn); 1352 } 1353 } 1354 1355 /** 1356 * tipc_node_get_linkname - get the name of a link 1357 * 1358 * @bearer_id: id of the bearer 1359 * @node: peer node address 1360 * @linkname: link name output buffer 1361 * 1362 * Returns 0 on success 1363 */ 1364 int tipc_node_get_linkname(struct net *net, u32 bearer_id, u32 addr, 1365 char *linkname, size_t len) 1366 { 1367 struct tipc_link *link; 1368 int err = -EINVAL; 1369 struct tipc_node *node = tipc_node_find(net, addr); 1370 1371 if (!node) 1372 return err; 1373 1374 if (bearer_id >= MAX_BEARERS) 1375 goto exit; 1376 1377 tipc_node_read_lock(node); 1378 link = node->links[bearer_id].link; 1379 if (link) { 1380 strncpy(linkname, tipc_link_name(link), len); 1381 err = 0; 1382 } 1383 tipc_node_read_unlock(node); 1384 exit: 1385 tipc_node_put(node); 1386 return err; 1387 } 1388 1389 /* Caller should hold node lock for the passed node */ 1390 static int __tipc_nl_add_node(struct tipc_nl_msg *msg, struct tipc_node *node) 1391 { 1392 void *hdr; 1393 struct nlattr *attrs; 1394 1395 hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family, 1396 NLM_F_MULTI, TIPC_NL_NODE_GET); 1397 if (!hdr) 1398 return -EMSGSIZE; 1399 1400 attrs = nla_nest_start_noflag(msg->skb, TIPC_NLA_NODE); 1401 if (!attrs) 1402 goto msg_full; 1403 1404 if (nla_put_u32(msg->skb, TIPC_NLA_NODE_ADDR, node->addr)) 1405 goto attr_msg_full; 1406 if (node_is_up(node)) 1407 if (nla_put_flag(msg->skb, TIPC_NLA_NODE_UP)) 1408 goto attr_msg_full; 1409 1410 nla_nest_end(msg->skb, attrs); 1411 genlmsg_end(msg->skb, hdr); 1412 1413 return 0; 1414 1415 attr_msg_full: 1416 nla_nest_cancel(msg->skb, attrs); 1417 msg_full: 1418 genlmsg_cancel(msg->skb, hdr); 1419 1420 return -EMSGSIZE; 1421 } 1422 1423 /** 1424 * tipc_node_xmit() is the general link level function for message sending 1425 * @net: the applicable net namespace 1426 * @list: chain of buffers containing message 1427 * @dnode: address of destination node 1428 * @selector: a number used for deterministic link selection 1429 * Consumes the buffer chain. 1430 * Returns 0 if success, otherwise: -ELINKCONG,-EHOSTUNREACH,-EMSGSIZE,-ENOBUF 1431 */ 1432 int tipc_node_xmit(struct net *net, struct sk_buff_head *list, 1433 u32 dnode, int selector) 1434 { 1435 struct tipc_link_entry *le = NULL; 1436 struct tipc_node *n; 1437 struct sk_buff_head xmitq; 1438 int bearer_id; 1439 int rc; 1440 1441 if (in_own_node(net, dnode)) { 1442 tipc_sk_rcv(net, list); 1443 return 0; 1444 } 1445 1446 n = tipc_node_find(net, dnode); 1447 if (unlikely(!n)) { 1448 skb_queue_purge(list); 1449 return -EHOSTUNREACH; 1450 } 1451 1452 tipc_node_read_lock(n); 1453 bearer_id = n->active_links[selector & 1]; 1454 if (unlikely(bearer_id == INVALID_BEARER_ID)) { 1455 tipc_node_read_unlock(n); 1456 tipc_node_put(n); 1457 skb_queue_purge(list); 1458 return -EHOSTUNREACH; 1459 } 1460 1461 __skb_queue_head_init(&xmitq); 1462 le = &n->links[bearer_id]; 1463 spin_lock_bh(&le->lock); 1464 rc = tipc_link_xmit(le->link, list, &xmitq); 1465 spin_unlock_bh(&le->lock); 1466 tipc_node_read_unlock(n); 1467 1468 if (unlikely(rc == -ENOBUFS)) 1469 tipc_node_link_down(n, bearer_id, false); 1470 else 1471 tipc_bearer_xmit(net, bearer_id, &xmitq, &le->maddr); 1472 1473 tipc_node_put(n); 1474 1475 return rc; 1476 } 1477 1478 /* tipc_node_xmit_skb(): send single buffer to destination 1479 * Buffers sent via this functon are generally TIPC_SYSTEM_IMPORTANCE 1480 * messages, which will not be rejected 1481 * The only exception is datagram messages rerouted after secondary 1482 * lookup, which are rare and safe to dispose of anyway. 1483 */ 1484 int tipc_node_xmit_skb(struct net *net, struct sk_buff *skb, u32 dnode, 1485 u32 selector) 1486 { 1487 struct sk_buff_head head; 1488 1489 skb_queue_head_init(&head); 1490 __skb_queue_tail(&head, skb); 1491 tipc_node_xmit(net, &head, dnode, selector); 1492 return 0; 1493 } 1494 1495 /* tipc_node_distr_xmit(): send single buffer msgs to individual destinations 1496 * Note: this is only for SYSTEM_IMPORTANCE messages, which cannot be rejected 1497 */ 1498 int tipc_node_distr_xmit(struct net *net, struct sk_buff_head *xmitq) 1499 { 1500 struct sk_buff *skb; 1501 u32 selector, dnode; 1502 1503 while ((skb = __skb_dequeue(xmitq))) { 1504 selector = msg_origport(buf_msg(skb)); 1505 dnode = msg_destnode(buf_msg(skb)); 1506 tipc_node_xmit_skb(net, skb, dnode, selector); 1507 } 1508 return 0; 1509 } 1510 1511 void tipc_node_broadcast(struct net *net, struct sk_buff *skb) 1512 { 1513 struct sk_buff *txskb; 1514 struct tipc_node *n; 1515 u32 dst; 1516 1517 rcu_read_lock(); 1518 list_for_each_entry_rcu(n, tipc_nodes(net), list) { 1519 dst = n->addr; 1520 if (in_own_node(net, dst)) 1521 continue; 1522 if (!node_is_up(n)) 1523 continue; 1524 txskb = pskb_copy(skb, GFP_ATOMIC); 1525 if (!txskb) 1526 break; 1527 msg_set_destnode(buf_msg(txskb), dst); 1528 tipc_node_xmit_skb(net, txskb, dst, 0); 1529 } 1530 rcu_read_unlock(); 1531 1532 kfree_skb(skb); 1533 } 1534 1535 static void tipc_node_mcast_rcv(struct tipc_node *n) 1536 { 1537 struct tipc_bclink_entry *be = &n->bc_entry; 1538 1539 /* 'arrvq' is under inputq2's lock protection */ 1540 spin_lock_bh(&be->inputq2.lock); 1541 spin_lock_bh(&be->inputq1.lock); 1542 skb_queue_splice_tail_init(&be->inputq1, &be->arrvq); 1543 spin_unlock_bh(&be->inputq1.lock); 1544 spin_unlock_bh(&be->inputq2.lock); 1545 tipc_sk_mcast_rcv(n->net, &be->arrvq, &be->inputq2); 1546 } 1547 1548 static void tipc_node_bc_sync_rcv(struct tipc_node *n, struct tipc_msg *hdr, 1549 int bearer_id, struct sk_buff_head *xmitq) 1550 { 1551 struct tipc_link *ucl; 1552 int rc; 1553 1554 rc = tipc_bcast_sync_rcv(n->net, n->bc_entry.link, hdr); 1555 1556 if (rc & TIPC_LINK_DOWN_EVT) { 1557 tipc_node_reset_links(n); 1558 return; 1559 } 1560 1561 if (!(rc & TIPC_LINK_SND_STATE)) 1562 return; 1563 1564 /* If probe message, a STATE response will be sent anyway */ 1565 if (msg_probe(hdr)) 1566 return; 1567 1568 /* Produce a STATE message carrying broadcast NACK */ 1569 tipc_node_read_lock(n); 1570 ucl = n->links[bearer_id].link; 1571 if (ucl) 1572 tipc_link_build_state_msg(ucl, xmitq); 1573 tipc_node_read_unlock(n); 1574 } 1575 1576 /** 1577 * tipc_node_bc_rcv - process TIPC broadcast packet arriving from off-node 1578 * @net: the applicable net namespace 1579 * @skb: TIPC packet 1580 * @bearer_id: id of bearer message arrived on 1581 * 1582 * Invoked with no locks held. 1583 */ 1584 static void tipc_node_bc_rcv(struct net *net, struct sk_buff *skb, int bearer_id) 1585 { 1586 int rc; 1587 struct sk_buff_head xmitq; 1588 struct tipc_bclink_entry *be; 1589 struct tipc_link_entry *le; 1590 struct tipc_msg *hdr = buf_msg(skb); 1591 int usr = msg_user(hdr); 1592 u32 dnode = msg_destnode(hdr); 1593 struct tipc_node *n; 1594 1595 __skb_queue_head_init(&xmitq); 1596 1597 /* If NACK for other node, let rcv link for that node peek into it */ 1598 if ((usr == BCAST_PROTOCOL) && (dnode != tipc_own_addr(net))) 1599 n = tipc_node_find(net, dnode); 1600 else 1601 n = tipc_node_find(net, msg_prevnode(hdr)); 1602 if (!n) { 1603 kfree_skb(skb); 1604 return; 1605 } 1606 be = &n->bc_entry; 1607 le = &n->links[bearer_id]; 1608 1609 rc = tipc_bcast_rcv(net, be->link, skb); 1610 1611 /* Broadcast ACKs are sent on a unicast link */ 1612 if (rc & TIPC_LINK_SND_STATE) { 1613 tipc_node_read_lock(n); 1614 tipc_link_build_state_msg(le->link, &xmitq); 1615 tipc_node_read_unlock(n); 1616 } 1617 1618 if (!skb_queue_empty(&xmitq)) 1619 tipc_bearer_xmit(net, bearer_id, &xmitq, &le->maddr); 1620 1621 if (!skb_queue_empty(&be->inputq1)) 1622 tipc_node_mcast_rcv(n); 1623 1624 /* Handle NAME_DISTRIBUTOR messages sent from 1.7 nodes */ 1625 if (!skb_queue_empty(&n->bc_entry.namedq)) 1626 tipc_named_rcv(net, &n->bc_entry.namedq); 1627 1628 /* If reassembly or retransmission failure => reset all links to peer */ 1629 if (rc & TIPC_LINK_DOWN_EVT) 1630 tipc_node_reset_links(n); 1631 1632 tipc_node_put(n); 1633 } 1634 1635 /** 1636 * tipc_node_check_state - check and if necessary update node state 1637 * @skb: TIPC packet 1638 * @bearer_id: identity of bearer delivering the packet 1639 * Returns true if state and msg are ok, otherwise false 1640 */ 1641 static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb, 1642 int bearer_id, struct sk_buff_head *xmitq) 1643 { 1644 struct tipc_msg *hdr = buf_msg(skb); 1645 int usr = msg_user(hdr); 1646 int mtyp = msg_type(hdr); 1647 u16 oseqno = msg_seqno(hdr); 1648 u16 iseqno = msg_seqno(msg_get_wrapped(hdr)); 1649 u16 exp_pkts = msg_msgcnt(hdr); 1650 u16 rcv_nxt, syncpt, dlv_nxt, inputq_len; 1651 int state = n->state; 1652 struct tipc_link *l, *tnl, *pl = NULL; 1653 struct tipc_media_addr *maddr; 1654 int pb_id; 1655 1656 if (trace_tipc_node_check_state_enabled()) { 1657 trace_tipc_skb_dump(skb, false, "skb for node state check"); 1658 trace_tipc_node_check_state(n, true, " "); 1659 } 1660 l = n->links[bearer_id].link; 1661 if (!l) 1662 return false; 1663 rcv_nxt = tipc_link_rcv_nxt(l); 1664 1665 1666 if (likely((state == SELF_UP_PEER_UP) && (usr != TUNNEL_PROTOCOL))) 1667 return true; 1668 1669 /* Find parallel link, if any */ 1670 for (pb_id = 0; pb_id < MAX_BEARERS; pb_id++) { 1671 if ((pb_id != bearer_id) && n->links[pb_id].link) { 1672 pl = n->links[pb_id].link; 1673 break; 1674 } 1675 } 1676 1677 if (!tipc_link_validate_msg(l, hdr)) { 1678 trace_tipc_skb_dump(skb, false, "PROTO invalid (2)!"); 1679 trace_tipc_link_dump(l, TIPC_DUMP_NONE, "PROTO invalid (2)!"); 1680 return false; 1681 } 1682 1683 /* Check and update node accesibility if applicable */ 1684 if (state == SELF_UP_PEER_COMING) { 1685 if (!tipc_link_is_up(l)) 1686 return true; 1687 if (!msg_peer_link_is_up(hdr)) 1688 return true; 1689 tipc_node_fsm_evt(n, PEER_ESTABL_CONTACT_EVT); 1690 } 1691 1692 if (state == SELF_DOWN_PEER_LEAVING) { 1693 if (msg_peer_node_is_up(hdr)) 1694 return false; 1695 tipc_node_fsm_evt(n, PEER_LOST_CONTACT_EVT); 1696 return true; 1697 } 1698 1699 if (state == SELF_LEAVING_PEER_DOWN) 1700 return false; 1701 1702 /* Ignore duplicate packets */ 1703 if ((usr != LINK_PROTOCOL) && less(oseqno, rcv_nxt)) 1704 return true; 1705 1706 /* Initiate or update failover mode if applicable */ 1707 if ((usr == TUNNEL_PROTOCOL) && (mtyp == FAILOVER_MSG)) { 1708 syncpt = oseqno + exp_pkts - 1; 1709 if (pl && tipc_link_is_up(pl)) { 1710 __tipc_node_link_down(n, &pb_id, xmitq, &maddr); 1711 trace_tipc_node_link_down(n, true, 1712 "node link down <- failover!"); 1713 tipc_skb_queue_splice_tail_init(tipc_link_inputq(pl), 1714 tipc_link_inputq(l)); 1715 } 1716 1717 /* If parallel link was already down, and this happened before 1718 * the tunnel link came up, node failover was never started. 1719 * Ensure that a FAILOVER_MSG is sent to get peer out of 1720 * NODE_FAILINGOVER state, also this node must accept 1721 * TUNNEL_MSGs from peer. 1722 */ 1723 if (n->state != NODE_FAILINGOVER) 1724 tipc_node_link_failover(n, pl, l, xmitq); 1725 1726 /* If pkts arrive out of order, use lowest calculated syncpt */ 1727 if (less(syncpt, n->sync_point)) 1728 n->sync_point = syncpt; 1729 } 1730 1731 /* Open parallel link when tunnel link reaches synch point */ 1732 if ((n->state == NODE_FAILINGOVER) && tipc_link_is_up(l)) { 1733 if (!more(rcv_nxt, n->sync_point)) 1734 return true; 1735 tipc_node_fsm_evt(n, NODE_FAILOVER_END_EVT); 1736 if (pl) 1737 tipc_link_fsm_evt(pl, LINK_FAILOVER_END_EVT); 1738 return true; 1739 } 1740 1741 /* No synching needed if only one link */ 1742 if (!pl || !tipc_link_is_up(pl)) 1743 return true; 1744 1745 /* Initiate synch mode if applicable */ 1746 if ((usr == TUNNEL_PROTOCOL) && (mtyp == SYNCH_MSG) && (oseqno == 1)) { 1747 syncpt = iseqno + exp_pkts - 1; 1748 if (!tipc_link_is_up(l)) 1749 __tipc_node_link_up(n, bearer_id, xmitq); 1750 if (n->state == SELF_UP_PEER_UP) { 1751 n->sync_point = syncpt; 1752 tipc_link_fsm_evt(l, LINK_SYNCH_BEGIN_EVT); 1753 tipc_node_fsm_evt(n, NODE_SYNCH_BEGIN_EVT); 1754 } 1755 } 1756 1757 /* Open tunnel link when parallel link reaches synch point */ 1758 if (n->state == NODE_SYNCHING) { 1759 if (tipc_link_is_synching(l)) { 1760 tnl = l; 1761 } else { 1762 tnl = pl; 1763 pl = l; 1764 } 1765 inputq_len = skb_queue_len(tipc_link_inputq(pl)); 1766 dlv_nxt = tipc_link_rcv_nxt(pl) - inputq_len; 1767 if (more(dlv_nxt, n->sync_point)) { 1768 tipc_link_fsm_evt(tnl, LINK_SYNCH_END_EVT); 1769 tipc_node_fsm_evt(n, NODE_SYNCH_END_EVT); 1770 return true; 1771 } 1772 if (l == pl) 1773 return true; 1774 if ((usr == TUNNEL_PROTOCOL) && (mtyp == SYNCH_MSG)) 1775 return true; 1776 if (usr == LINK_PROTOCOL) 1777 return true; 1778 return false; 1779 } 1780 return true; 1781 } 1782 1783 /** 1784 * tipc_rcv - process TIPC packets/messages arriving from off-node 1785 * @net: the applicable net namespace 1786 * @skb: TIPC packet 1787 * @bearer: pointer to bearer message arrived on 1788 * 1789 * Invoked with no locks held. Bearer pointer must point to a valid bearer 1790 * structure (i.e. cannot be NULL), but bearer can be inactive. 1791 */ 1792 void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b) 1793 { 1794 struct sk_buff_head xmitq; 1795 struct tipc_node *n; 1796 struct tipc_msg *hdr; 1797 int bearer_id = b->identity; 1798 struct tipc_link_entry *le; 1799 u32 self = tipc_own_addr(net); 1800 int usr, rc = 0; 1801 u16 bc_ack; 1802 1803 __skb_queue_head_init(&xmitq); 1804 1805 /* Ensure message is well-formed before touching the header */ 1806 if (unlikely(!tipc_msg_validate(&skb))) 1807 goto discard; 1808 hdr = buf_msg(skb); 1809 usr = msg_user(hdr); 1810 bc_ack = msg_bcast_ack(hdr); 1811 1812 /* Handle arrival of discovery or broadcast packet */ 1813 if (unlikely(msg_non_seq(hdr))) { 1814 if (unlikely(usr == LINK_CONFIG)) 1815 return tipc_disc_rcv(net, skb, b); 1816 else 1817 return tipc_node_bc_rcv(net, skb, bearer_id); 1818 } 1819 1820 /* Discard unicast link messages destined for another node */ 1821 if (unlikely(!msg_short(hdr) && (msg_destnode(hdr) != self))) 1822 goto discard; 1823 1824 /* Locate neighboring node that sent packet */ 1825 n = tipc_node_find(net, msg_prevnode(hdr)); 1826 if (unlikely(!n)) 1827 goto discard; 1828 le = &n->links[bearer_id]; 1829 1830 /* Ensure broadcast reception is in synch with peer's send state */ 1831 if (unlikely(usr == LINK_PROTOCOL)) 1832 tipc_node_bc_sync_rcv(n, hdr, bearer_id, &xmitq); 1833 else if (unlikely(tipc_link_acked(n->bc_entry.link) != bc_ack)) 1834 tipc_bcast_ack_rcv(net, n->bc_entry.link, hdr); 1835 1836 /* Receive packet directly if conditions permit */ 1837 tipc_node_read_lock(n); 1838 if (likely((n->state == SELF_UP_PEER_UP) && (usr != TUNNEL_PROTOCOL))) { 1839 spin_lock_bh(&le->lock); 1840 if (le->link) { 1841 rc = tipc_link_rcv(le->link, skb, &xmitq); 1842 skb = NULL; 1843 } 1844 spin_unlock_bh(&le->lock); 1845 } 1846 tipc_node_read_unlock(n); 1847 1848 /* Check/update node state before receiving */ 1849 if (unlikely(skb)) { 1850 if (unlikely(skb_linearize(skb))) 1851 goto discard; 1852 tipc_node_write_lock(n); 1853 if (tipc_node_check_state(n, skb, bearer_id, &xmitq)) { 1854 if (le->link) { 1855 rc = tipc_link_rcv(le->link, skb, &xmitq); 1856 skb = NULL; 1857 } 1858 } 1859 tipc_node_write_unlock(n); 1860 } 1861 1862 if (unlikely(rc & TIPC_LINK_UP_EVT)) 1863 tipc_node_link_up(n, bearer_id, &xmitq); 1864 1865 if (unlikely(rc & TIPC_LINK_DOWN_EVT)) 1866 tipc_node_link_down(n, bearer_id, false); 1867 1868 if (unlikely(!skb_queue_empty(&n->bc_entry.namedq))) 1869 tipc_named_rcv(net, &n->bc_entry.namedq); 1870 1871 if (unlikely(!skb_queue_empty(&n->bc_entry.inputq1))) 1872 tipc_node_mcast_rcv(n); 1873 1874 if (!skb_queue_empty(&le->inputq)) 1875 tipc_sk_rcv(net, &le->inputq); 1876 1877 if (!skb_queue_empty(&xmitq)) 1878 tipc_bearer_xmit(net, bearer_id, &xmitq, &le->maddr); 1879 1880 tipc_node_put(n); 1881 discard: 1882 kfree_skb(skb); 1883 } 1884 1885 void tipc_node_apply_property(struct net *net, struct tipc_bearer *b, 1886 int prop) 1887 { 1888 struct tipc_net *tn = tipc_net(net); 1889 int bearer_id = b->identity; 1890 struct sk_buff_head xmitq; 1891 struct tipc_link_entry *e; 1892 struct tipc_node *n; 1893 1894 __skb_queue_head_init(&xmitq); 1895 1896 rcu_read_lock(); 1897 1898 list_for_each_entry_rcu(n, &tn->node_list, list) { 1899 tipc_node_write_lock(n); 1900 e = &n->links[bearer_id]; 1901 if (e->link) { 1902 if (prop == TIPC_NLA_PROP_TOL) 1903 tipc_link_set_tolerance(e->link, b->tolerance, 1904 &xmitq); 1905 else if (prop == TIPC_NLA_PROP_MTU) 1906 tipc_link_set_mtu(e->link, b->mtu); 1907 } 1908 tipc_node_write_unlock(n); 1909 tipc_bearer_xmit(net, bearer_id, &xmitq, &e->maddr); 1910 } 1911 1912 rcu_read_unlock(); 1913 } 1914 1915 int tipc_nl_peer_rm(struct sk_buff *skb, struct genl_info *info) 1916 { 1917 struct net *net = sock_net(skb->sk); 1918 struct tipc_net *tn = net_generic(net, tipc_net_id); 1919 struct nlattr *attrs[TIPC_NLA_NET_MAX + 1]; 1920 struct tipc_node *peer; 1921 u32 addr; 1922 int err; 1923 1924 /* We identify the peer by its net */ 1925 if (!info->attrs[TIPC_NLA_NET]) 1926 return -EINVAL; 1927 1928 err = nla_parse_nested_deprecated(attrs, TIPC_NLA_NET_MAX, 1929 info->attrs[TIPC_NLA_NET], 1930 tipc_nl_net_policy, info->extack); 1931 if (err) 1932 return err; 1933 1934 if (!attrs[TIPC_NLA_NET_ADDR]) 1935 return -EINVAL; 1936 1937 addr = nla_get_u32(attrs[TIPC_NLA_NET_ADDR]); 1938 1939 if (in_own_node(net, addr)) 1940 return -ENOTSUPP; 1941 1942 spin_lock_bh(&tn->node_list_lock); 1943 peer = tipc_node_find(net, addr); 1944 if (!peer) { 1945 spin_unlock_bh(&tn->node_list_lock); 1946 return -ENXIO; 1947 } 1948 1949 tipc_node_write_lock(peer); 1950 if (peer->state != SELF_DOWN_PEER_DOWN && 1951 peer->state != SELF_DOWN_PEER_LEAVING) { 1952 tipc_node_write_unlock(peer); 1953 err = -EBUSY; 1954 goto err_out; 1955 } 1956 1957 tipc_node_clear_links(peer); 1958 tipc_node_write_unlock(peer); 1959 tipc_node_delete(peer); 1960 1961 err = 0; 1962 err_out: 1963 tipc_node_put(peer); 1964 spin_unlock_bh(&tn->node_list_lock); 1965 1966 return err; 1967 } 1968 1969 int tipc_nl_node_dump(struct sk_buff *skb, struct netlink_callback *cb) 1970 { 1971 int err; 1972 struct net *net = sock_net(skb->sk); 1973 struct tipc_net *tn = net_generic(net, tipc_net_id); 1974 int done = cb->args[0]; 1975 int last_addr = cb->args[1]; 1976 struct tipc_node *node; 1977 struct tipc_nl_msg msg; 1978 1979 if (done) 1980 return 0; 1981 1982 msg.skb = skb; 1983 msg.portid = NETLINK_CB(cb->skb).portid; 1984 msg.seq = cb->nlh->nlmsg_seq; 1985 1986 rcu_read_lock(); 1987 if (last_addr) { 1988 node = tipc_node_find(net, last_addr); 1989 if (!node) { 1990 rcu_read_unlock(); 1991 /* We never set seq or call nl_dump_check_consistent() 1992 * this means that setting prev_seq here will cause the 1993 * consistence check to fail in the netlink callback 1994 * handler. Resulting in the NLMSG_DONE message having 1995 * the NLM_F_DUMP_INTR flag set if the node state 1996 * changed while we released the lock. 1997 */ 1998 cb->prev_seq = 1; 1999 return -EPIPE; 2000 } 2001 tipc_node_put(node); 2002 } 2003 2004 list_for_each_entry_rcu(node, &tn->node_list, list) { 2005 if (last_addr) { 2006 if (node->addr == last_addr) 2007 last_addr = 0; 2008 else 2009 continue; 2010 } 2011 2012 tipc_node_read_lock(node); 2013 err = __tipc_nl_add_node(&msg, node); 2014 if (err) { 2015 last_addr = node->addr; 2016 tipc_node_read_unlock(node); 2017 goto out; 2018 } 2019 2020 tipc_node_read_unlock(node); 2021 } 2022 done = 1; 2023 out: 2024 cb->args[0] = done; 2025 cb->args[1] = last_addr; 2026 rcu_read_unlock(); 2027 2028 return skb->len; 2029 } 2030 2031 /* tipc_node_find_by_name - locate owner node of link by link's name 2032 * @net: the applicable net namespace 2033 * @name: pointer to link name string 2034 * @bearer_id: pointer to index in 'node->links' array where the link was found. 2035 * 2036 * Returns pointer to node owning the link, or 0 if no matching link is found. 2037 */ 2038 static struct tipc_node *tipc_node_find_by_name(struct net *net, 2039 const char *link_name, 2040 unsigned int *bearer_id) 2041 { 2042 struct tipc_net *tn = net_generic(net, tipc_net_id); 2043 struct tipc_link *l; 2044 struct tipc_node *n; 2045 struct tipc_node *found_node = NULL; 2046 int i; 2047 2048 *bearer_id = 0; 2049 rcu_read_lock(); 2050 list_for_each_entry_rcu(n, &tn->node_list, list) { 2051 tipc_node_read_lock(n); 2052 for (i = 0; i < MAX_BEARERS; i++) { 2053 l = n->links[i].link; 2054 if (l && !strcmp(tipc_link_name(l), link_name)) { 2055 *bearer_id = i; 2056 found_node = n; 2057 break; 2058 } 2059 } 2060 tipc_node_read_unlock(n); 2061 if (found_node) 2062 break; 2063 } 2064 rcu_read_unlock(); 2065 2066 return found_node; 2067 } 2068 2069 int tipc_nl_node_set_link(struct sk_buff *skb, struct genl_info *info) 2070 { 2071 int err; 2072 int res = 0; 2073 int bearer_id; 2074 char *name; 2075 struct tipc_link *link; 2076 struct tipc_node *node; 2077 struct sk_buff_head xmitq; 2078 struct nlattr *attrs[TIPC_NLA_LINK_MAX + 1]; 2079 struct net *net = sock_net(skb->sk); 2080 2081 __skb_queue_head_init(&xmitq); 2082 2083 if (!info->attrs[TIPC_NLA_LINK]) 2084 return -EINVAL; 2085 2086 err = nla_parse_nested_deprecated(attrs, TIPC_NLA_LINK_MAX, 2087 info->attrs[TIPC_NLA_LINK], 2088 tipc_nl_link_policy, info->extack); 2089 if (err) 2090 return err; 2091 2092 if (!attrs[TIPC_NLA_LINK_NAME]) 2093 return -EINVAL; 2094 2095 name = nla_data(attrs[TIPC_NLA_LINK_NAME]); 2096 2097 if (strcmp(name, tipc_bclink_name) == 0) 2098 return tipc_nl_bc_link_set(net, attrs); 2099 2100 node = tipc_node_find_by_name(net, name, &bearer_id); 2101 if (!node) 2102 return -EINVAL; 2103 2104 tipc_node_read_lock(node); 2105 2106 link = node->links[bearer_id].link; 2107 if (!link) { 2108 res = -EINVAL; 2109 goto out; 2110 } 2111 2112 if (attrs[TIPC_NLA_LINK_PROP]) { 2113 struct nlattr *props[TIPC_NLA_PROP_MAX + 1]; 2114 2115 err = tipc_nl_parse_link_prop(attrs[TIPC_NLA_LINK_PROP], 2116 props); 2117 if (err) { 2118 res = err; 2119 goto out; 2120 } 2121 2122 if (props[TIPC_NLA_PROP_TOL]) { 2123 u32 tol; 2124 2125 tol = nla_get_u32(props[TIPC_NLA_PROP_TOL]); 2126 tipc_link_set_tolerance(link, tol, &xmitq); 2127 } 2128 if (props[TIPC_NLA_PROP_PRIO]) { 2129 u32 prio; 2130 2131 prio = nla_get_u32(props[TIPC_NLA_PROP_PRIO]); 2132 tipc_link_set_prio(link, prio, &xmitq); 2133 } 2134 if (props[TIPC_NLA_PROP_WIN]) { 2135 u32 win; 2136 2137 win = nla_get_u32(props[TIPC_NLA_PROP_WIN]); 2138 tipc_link_set_queue_limits(link, win); 2139 } 2140 } 2141 2142 out: 2143 tipc_node_read_unlock(node); 2144 tipc_bearer_xmit(net, bearer_id, &xmitq, &node->links[bearer_id].maddr); 2145 return res; 2146 } 2147 2148 int tipc_nl_node_get_link(struct sk_buff *skb, struct genl_info *info) 2149 { 2150 struct net *net = genl_info_net(info); 2151 struct nlattr *attrs[TIPC_NLA_LINK_MAX + 1]; 2152 struct tipc_nl_msg msg; 2153 char *name; 2154 int err; 2155 2156 msg.portid = info->snd_portid; 2157 msg.seq = info->snd_seq; 2158 2159 if (!info->attrs[TIPC_NLA_LINK]) 2160 return -EINVAL; 2161 2162 err = nla_parse_nested_deprecated(attrs, TIPC_NLA_LINK_MAX, 2163 info->attrs[TIPC_NLA_LINK], 2164 tipc_nl_link_policy, info->extack); 2165 if (err) 2166 return err; 2167 2168 if (!attrs[TIPC_NLA_LINK_NAME]) 2169 return -EINVAL; 2170 2171 name = nla_data(attrs[TIPC_NLA_LINK_NAME]); 2172 2173 msg.skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); 2174 if (!msg.skb) 2175 return -ENOMEM; 2176 2177 if (strcmp(name, tipc_bclink_name) == 0) { 2178 err = tipc_nl_add_bc_link(net, &msg); 2179 if (err) 2180 goto err_free; 2181 } else { 2182 int bearer_id; 2183 struct tipc_node *node; 2184 struct tipc_link *link; 2185 2186 node = tipc_node_find_by_name(net, name, &bearer_id); 2187 if (!node) { 2188 err = -EINVAL; 2189 goto err_free; 2190 } 2191 2192 tipc_node_read_lock(node); 2193 link = node->links[bearer_id].link; 2194 if (!link) { 2195 tipc_node_read_unlock(node); 2196 err = -EINVAL; 2197 goto err_free; 2198 } 2199 2200 err = __tipc_nl_add_link(net, &msg, link, 0); 2201 tipc_node_read_unlock(node); 2202 if (err) 2203 goto err_free; 2204 } 2205 2206 return genlmsg_reply(msg.skb, info); 2207 2208 err_free: 2209 nlmsg_free(msg.skb); 2210 return err; 2211 } 2212 2213 int tipc_nl_node_reset_link_stats(struct sk_buff *skb, struct genl_info *info) 2214 { 2215 int err; 2216 char *link_name; 2217 unsigned int bearer_id; 2218 struct tipc_link *link; 2219 struct tipc_node *node; 2220 struct nlattr *attrs[TIPC_NLA_LINK_MAX + 1]; 2221 struct net *net = sock_net(skb->sk); 2222 struct tipc_link_entry *le; 2223 2224 if (!info->attrs[TIPC_NLA_LINK]) 2225 return -EINVAL; 2226 2227 err = nla_parse_nested_deprecated(attrs, TIPC_NLA_LINK_MAX, 2228 info->attrs[TIPC_NLA_LINK], 2229 tipc_nl_link_policy, info->extack); 2230 if (err) 2231 return err; 2232 2233 if (!attrs[TIPC_NLA_LINK_NAME]) 2234 return -EINVAL; 2235 2236 link_name = nla_data(attrs[TIPC_NLA_LINK_NAME]); 2237 2238 if (strcmp(link_name, tipc_bclink_name) == 0) { 2239 err = tipc_bclink_reset_stats(net); 2240 if (err) 2241 return err; 2242 return 0; 2243 } 2244 2245 node = tipc_node_find_by_name(net, link_name, &bearer_id); 2246 if (!node) 2247 return -EINVAL; 2248 2249 le = &node->links[bearer_id]; 2250 tipc_node_read_lock(node); 2251 spin_lock_bh(&le->lock); 2252 link = node->links[bearer_id].link; 2253 if (!link) { 2254 spin_unlock_bh(&le->lock); 2255 tipc_node_read_unlock(node); 2256 return -EINVAL; 2257 } 2258 tipc_link_reset_stats(link); 2259 spin_unlock_bh(&le->lock); 2260 tipc_node_read_unlock(node); 2261 return 0; 2262 } 2263 2264 /* Caller should hold node lock */ 2265 static int __tipc_nl_add_node_links(struct net *net, struct tipc_nl_msg *msg, 2266 struct tipc_node *node, u32 *prev_link) 2267 { 2268 u32 i; 2269 int err; 2270 2271 for (i = *prev_link; i < MAX_BEARERS; i++) { 2272 *prev_link = i; 2273 2274 if (!node->links[i].link) 2275 continue; 2276 2277 err = __tipc_nl_add_link(net, msg, 2278 node->links[i].link, NLM_F_MULTI); 2279 if (err) 2280 return err; 2281 } 2282 *prev_link = 0; 2283 2284 return 0; 2285 } 2286 2287 int tipc_nl_node_dump_link(struct sk_buff *skb, struct netlink_callback *cb) 2288 { 2289 struct net *net = sock_net(skb->sk); 2290 struct tipc_net *tn = net_generic(net, tipc_net_id); 2291 struct tipc_node *node; 2292 struct tipc_nl_msg msg; 2293 u32 prev_node = cb->args[0]; 2294 u32 prev_link = cb->args[1]; 2295 int done = cb->args[2]; 2296 int err; 2297 2298 if (done) 2299 return 0; 2300 2301 msg.skb = skb; 2302 msg.portid = NETLINK_CB(cb->skb).portid; 2303 msg.seq = cb->nlh->nlmsg_seq; 2304 2305 rcu_read_lock(); 2306 if (prev_node) { 2307 node = tipc_node_find(net, prev_node); 2308 if (!node) { 2309 /* We never set seq or call nl_dump_check_consistent() 2310 * this means that setting prev_seq here will cause the 2311 * consistence check to fail in the netlink callback 2312 * handler. Resulting in the last NLMSG_DONE message 2313 * having the NLM_F_DUMP_INTR flag set. 2314 */ 2315 cb->prev_seq = 1; 2316 goto out; 2317 } 2318 tipc_node_put(node); 2319 2320 list_for_each_entry_continue_rcu(node, &tn->node_list, 2321 list) { 2322 tipc_node_read_lock(node); 2323 err = __tipc_nl_add_node_links(net, &msg, node, 2324 &prev_link); 2325 tipc_node_read_unlock(node); 2326 if (err) 2327 goto out; 2328 2329 prev_node = node->addr; 2330 } 2331 } else { 2332 err = tipc_nl_add_bc_link(net, &msg); 2333 if (err) 2334 goto out; 2335 2336 list_for_each_entry_rcu(node, &tn->node_list, list) { 2337 tipc_node_read_lock(node); 2338 err = __tipc_nl_add_node_links(net, &msg, node, 2339 &prev_link); 2340 tipc_node_read_unlock(node); 2341 if (err) 2342 goto out; 2343 2344 prev_node = node->addr; 2345 } 2346 } 2347 done = 1; 2348 out: 2349 rcu_read_unlock(); 2350 2351 cb->args[0] = prev_node; 2352 cb->args[1] = prev_link; 2353 cb->args[2] = done; 2354 2355 return skb->len; 2356 } 2357 2358 int tipc_nl_node_set_monitor(struct sk_buff *skb, struct genl_info *info) 2359 { 2360 struct nlattr *attrs[TIPC_NLA_MON_MAX + 1]; 2361 struct net *net = sock_net(skb->sk); 2362 int err; 2363 2364 if (!info->attrs[TIPC_NLA_MON]) 2365 return -EINVAL; 2366 2367 err = nla_parse_nested_deprecated(attrs, TIPC_NLA_MON_MAX, 2368 info->attrs[TIPC_NLA_MON], 2369 tipc_nl_monitor_policy, 2370 info->extack); 2371 if (err) 2372 return err; 2373 2374 if (attrs[TIPC_NLA_MON_ACTIVATION_THRESHOLD]) { 2375 u32 val; 2376 2377 val = nla_get_u32(attrs[TIPC_NLA_MON_ACTIVATION_THRESHOLD]); 2378 err = tipc_nl_monitor_set_threshold(net, val); 2379 if (err) 2380 return err; 2381 } 2382 2383 return 0; 2384 } 2385 2386 static int __tipc_nl_add_monitor_prop(struct net *net, struct tipc_nl_msg *msg) 2387 { 2388 struct nlattr *attrs; 2389 void *hdr; 2390 u32 val; 2391 2392 hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family, 2393 0, TIPC_NL_MON_GET); 2394 if (!hdr) 2395 return -EMSGSIZE; 2396 2397 attrs = nla_nest_start_noflag(msg->skb, TIPC_NLA_MON); 2398 if (!attrs) 2399 goto msg_full; 2400 2401 val = tipc_nl_monitor_get_threshold(net); 2402 2403 if (nla_put_u32(msg->skb, TIPC_NLA_MON_ACTIVATION_THRESHOLD, val)) 2404 goto attr_msg_full; 2405 2406 nla_nest_end(msg->skb, attrs); 2407 genlmsg_end(msg->skb, hdr); 2408 2409 return 0; 2410 2411 attr_msg_full: 2412 nla_nest_cancel(msg->skb, attrs); 2413 msg_full: 2414 genlmsg_cancel(msg->skb, hdr); 2415 2416 return -EMSGSIZE; 2417 } 2418 2419 int tipc_nl_node_get_monitor(struct sk_buff *skb, struct genl_info *info) 2420 { 2421 struct net *net = sock_net(skb->sk); 2422 struct tipc_nl_msg msg; 2423 int err; 2424 2425 msg.skb = nlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL); 2426 if (!msg.skb) 2427 return -ENOMEM; 2428 msg.portid = info->snd_portid; 2429 msg.seq = info->snd_seq; 2430 2431 err = __tipc_nl_add_monitor_prop(net, &msg); 2432 if (err) { 2433 nlmsg_free(msg.skb); 2434 return err; 2435 } 2436 2437 return genlmsg_reply(msg.skb, info); 2438 } 2439 2440 int tipc_nl_node_dump_monitor(struct sk_buff *skb, struct netlink_callback *cb) 2441 { 2442 struct net *net = sock_net(skb->sk); 2443 u32 prev_bearer = cb->args[0]; 2444 struct tipc_nl_msg msg; 2445 int bearer_id; 2446 int err; 2447 2448 if (prev_bearer == MAX_BEARERS) 2449 return 0; 2450 2451 msg.skb = skb; 2452 msg.portid = NETLINK_CB(cb->skb).portid; 2453 msg.seq = cb->nlh->nlmsg_seq; 2454 2455 rtnl_lock(); 2456 for (bearer_id = prev_bearer; bearer_id < MAX_BEARERS; bearer_id++) { 2457 err = __tipc_nl_add_monitor(net, &msg, bearer_id); 2458 if (err) 2459 break; 2460 } 2461 rtnl_unlock(); 2462 cb->args[0] = bearer_id; 2463 2464 return skb->len; 2465 } 2466 2467 int tipc_nl_node_dump_monitor_peer(struct sk_buff *skb, 2468 struct netlink_callback *cb) 2469 { 2470 struct net *net = sock_net(skb->sk); 2471 u32 prev_node = cb->args[1]; 2472 u32 bearer_id = cb->args[2]; 2473 int done = cb->args[0]; 2474 struct tipc_nl_msg msg; 2475 int err; 2476 2477 if (!prev_node) { 2478 struct nlattr **attrs; 2479 struct nlattr *mon[TIPC_NLA_MON_MAX + 1]; 2480 2481 err = tipc_nlmsg_parse(cb->nlh, &attrs); 2482 if (err) 2483 return err; 2484 2485 if (!attrs[TIPC_NLA_MON]) 2486 return -EINVAL; 2487 2488 err = nla_parse_nested_deprecated(mon, TIPC_NLA_MON_MAX, 2489 attrs[TIPC_NLA_MON], 2490 tipc_nl_monitor_policy, 2491 NULL); 2492 if (err) 2493 return err; 2494 2495 if (!mon[TIPC_NLA_MON_REF]) 2496 return -EINVAL; 2497 2498 bearer_id = nla_get_u32(mon[TIPC_NLA_MON_REF]); 2499 2500 if (bearer_id >= MAX_BEARERS) 2501 return -EINVAL; 2502 } 2503 2504 if (done) 2505 return 0; 2506 2507 msg.skb = skb; 2508 msg.portid = NETLINK_CB(cb->skb).portid; 2509 msg.seq = cb->nlh->nlmsg_seq; 2510 2511 rtnl_lock(); 2512 err = tipc_nl_add_monitor_peer(net, &msg, bearer_id, &prev_node); 2513 if (!err) 2514 done = 1; 2515 2516 rtnl_unlock(); 2517 cb->args[0] = done; 2518 cb->args[1] = prev_node; 2519 cb->args[2] = bearer_id; 2520 2521 return skb->len; 2522 } 2523 2524 u32 tipc_node_get_addr(struct tipc_node *node) 2525 { 2526 return (node) ? node->addr : 0; 2527 } 2528 2529 /** 2530 * tipc_node_dump - dump TIPC node data 2531 * @n: tipc node to be dumped 2532 * @more: dump more? 2533 * - false: dump only tipc node data 2534 * - true: dump node link data as well 2535 * @buf: returned buffer of dump data in format 2536 */ 2537 int tipc_node_dump(struct tipc_node *n, bool more, char *buf) 2538 { 2539 int i = 0; 2540 size_t sz = (more) ? NODE_LMAX : NODE_LMIN; 2541 2542 if (!n) { 2543 i += scnprintf(buf, sz, "node data: (null)\n"); 2544 return i; 2545 } 2546 2547 i += scnprintf(buf, sz, "node data: %x", n->addr); 2548 i += scnprintf(buf + i, sz - i, " %x", n->state); 2549 i += scnprintf(buf + i, sz - i, " %d", n->active_links[0]); 2550 i += scnprintf(buf + i, sz - i, " %d", n->active_links[1]); 2551 i += scnprintf(buf + i, sz - i, " %x", n->action_flags); 2552 i += scnprintf(buf + i, sz - i, " %u", n->failover_sent); 2553 i += scnprintf(buf + i, sz - i, " %u", n->sync_point); 2554 i += scnprintf(buf + i, sz - i, " %d", n->link_cnt); 2555 i += scnprintf(buf + i, sz - i, " %u", n->working_links); 2556 i += scnprintf(buf + i, sz - i, " %x", n->capabilities); 2557 i += scnprintf(buf + i, sz - i, " %lu\n", n->keepalive_intv); 2558 2559 if (!more) 2560 return i; 2561 2562 i += scnprintf(buf + i, sz - i, "link_entry[0]:\n"); 2563 i += scnprintf(buf + i, sz - i, " mtu: %u\n", n->links[0].mtu); 2564 i += scnprintf(buf + i, sz - i, " media: "); 2565 i += tipc_media_addr_printf(buf + i, sz - i, &n->links[0].maddr); 2566 i += scnprintf(buf + i, sz - i, "\n"); 2567 i += tipc_link_dump(n->links[0].link, TIPC_DUMP_NONE, buf + i); 2568 i += scnprintf(buf + i, sz - i, " inputq: "); 2569 i += tipc_list_dump(&n->links[0].inputq, false, buf + i); 2570 2571 i += scnprintf(buf + i, sz - i, "link_entry[1]:\n"); 2572 i += scnprintf(buf + i, sz - i, " mtu: %u\n", n->links[1].mtu); 2573 i += scnprintf(buf + i, sz - i, " media: "); 2574 i += tipc_media_addr_printf(buf + i, sz - i, &n->links[1].maddr); 2575 i += scnprintf(buf + i, sz - i, "\n"); 2576 i += tipc_link_dump(n->links[1].link, TIPC_DUMP_NONE, buf + i); 2577 i += scnprintf(buf + i, sz - i, " inputq: "); 2578 i += tipc_list_dump(&n->links[1].inputq, false, buf + i); 2579 2580 i += scnprintf(buf + i, sz - i, "bclink:\n "); 2581 i += tipc_link_dump(n->bc_entry.link, TIPC_DUMP_NONE, buf + i); 2582 2583 return i; 2584 } 2585