1 /* 2 * net/tipc/link.c: TIPC link code 3 * 4 * Copyright (c) 1996-2007, Ericsson AB 5 * Copyright (c) 2004-2007, 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 "dbg.h" 39 #include "link.h" 40 #include "net.h" 41 #include "node.h" 42 #include "port.h" 43 #include "addr.h" 44 #include "node_subscr.h" 45 #include "name_distr.h" 46 #include "bearer.h" 47 #include "name_table.h" 48 #include "discover.h" 49 #include "config.h" 50 #include "bcast.h" 51 52 53 /* 54 * Out-of-range value for link session numbers 55 */ 56 57 #define INVALID_SESSION 0x10000 58 59 /* 60 * Limit for deferred reception queue: 61 */ 62 63 #define DEF_QUEUE_LIMIT 256u 64 65 /* 66 * Link state events: 67 */ 68 69 #define STARTING_EVT 856384768 /* link processing trigger */ 70 #define TRAFFIC_MSG_EVT 560815u /* rx'd ??? */ 71 #define TIMEOUT_EVT 560817u /* link timer expired */ 72 73 /* 74 * The following two 'message types' is really just implementation 75 * data conveniently stored in the message header. 76 * They must not be considered part of the protocol 77 */ 78 #define OPEN_MSG 0 79 #define CLOSED_MSG 1 80 81 /* 82 * State value stored in 'exp_msg_count' 83 */ 84 85 #define START_CHANGEOVER 100000u 86 87 /** 88 * struct link_name - deconstructed link name 89 * @addr_local: network address of node at this end 90 * @if_local: name of interface at this end 91 * @addr_peer: network address of node at far end 92 * @if_peer: name of interface at far end 93 */ 94 95 struct link_name { 96 u32 addr_local; 97 char if_local[TIPC_MAX_IF_NAME]; 98 u32 addr_peer; 99 char if_peer[TIPC_MAX_IF_NAME]; 100 }; 101 102 #if 0 103 104 /* LINK EVENT CODE IS NOT SUPPORTED AT PRESENT */ 105 106 /** 107 * struct link_event - link up/down event notification 108 */ 109 110 struct link_event { 111 u32 addr; 112 int up; 113 void (*fcn)(u32, char *, int); 114 char name[TIPC_MAX_LINK_NAME]; 115 }; 116 117 #endif 118 119 static void link_handle_out_of_seq_msg(struct link *l_ptr, 120 struct sk_buff *buf); 121 static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf); 122 static int link_recv_changeover_msg(struct link **l_ptr, struct sk_buff **buf); 123 static void link_set_supervision_props(struct link *l_ptr, u32 tolerance); 124 static int link_send_sections_long(struct port *sender, 125 struct iovec const *msg_sect, 126 u32 num_sect, u32 destnode); 127 static void link_check_defragm_bufs(struct link *l_ptr); 128 static void link_state_event(struct link *l_ptr, u32 event); 129 static void link_reset_statistics(struct link *l_ptr); 130 static void link_print(struct link *l_ptr, struct print_buf *buf, 131 const char *str); 132 133 /* 134 * Debugging code used by link routines only 135 * 136 * When debugging link problems on a system that has multiple links, 137 * the standard TIPC debugging routines may not be useful since they 138 * allow the output from multiple links to be intermixed. For this reason 139 * routines of the form "dbg_link_XXX()" have been created that will capture 140 * debug info into a link's personal print buffer, which can then be dumped 141 * into the TIPC system log (TIPC_LOG) upon request. 142 * 143 * To enable per-link debugging, use LINK_LOG_BUF_SIZE to specify the size 144 * of the print buffer used by each link. If LINK_LOG_BUF_SIZE is set to 0, 145 * the dbg_link_XXX() routines simply send their output to the standard 146 * debug print buffer (DBG_OUTPUT), if it has been defined; this can be useful 147 * when there is only a single link in the system being debugged. 148 * 149 * Notes: 150 * - When enabled, LINK_LOG_BUF_SIZE should be set to at least TIPC_PB_MIN_SIZE 151 * - "l_ptr" must be valid when using dbg_link_XXX() macros 152 */ 153 154 #define LINK_LOG_BUF_SIZE 0 155 156 #define dbg_link(fmt, arg...) \ 157 do { \ 158 if (LINK_LOG_BUF_SIZE) \ 159 tipc_printf(&l_ptr->print_buf, fmt, ## arg); \ 160 } while (0) 161 #define dbg_link_msg(msg, txt) \ 162 do { \ 163 if (LINK_LOG_BUF_SIZE) \ 164 tipc_msg_dbg(&l_ptr->print_buf, msg, txt); \ 165 } while (0) 166 #define dbg_link_state(txt) \ 167 do { \ 168 if (LINK_LOG_BUF_SIZE) \ 169 link_print(l_ptr, &l_ptr->print_buf, txt); \ 170 } while (0) 171 #define dbg_link_dump() do { \ 172 if (LINK_LOG_BUF_SIZE) { \ 173 tipc_printf(LOG, "\n\nDumping link <%s>:\n", l_ptr->name); \ 174 tipc_printbuf_move(LOG, &l_ptr->print_buf); \ 175 } \ 176 } while (0) 177 178 static void dbg_print_link(struct link *l_ptr, const char *str) 179 { 180 if (DBG_OUTPUT != TIPC_NULL) 181 link_print(l_ptr, DBG_OUTPUT, str); 182 } 183 184 static void dbg_print_buf_chain(struct sk_buff *root_buf) 185 { 186 if (DBG_OUTPUT != TIPC_NULL) { 187 struct sk_buff *buf = root_buf; 188 189 while (buf) { 190 msg_dbg(buf_msg(buf), "In chain: "); 191 buf = buf->next; 192 } 193 } 194 } 195 196 /* 197 * Simple link routines 198 */ 199 200 static unsigned int align(unsigned int i) 201 { 202 return (i + 3) & ~3u; 203 } 204 205 static int link_working_working(struct link *l_ptr) 206 { 207 return (l_ptr->state == WORKING_WORKING); 208 } 209 210 static int link_working_unknown(struct link *l_ptr) 211 { 212 return (l_ptr->state == WORKING_UNKNOWN); 213 } 214 215 static int link_reset_unknown(struct link *l_ptr) 216 { 217 return (l_ptr->state == RESET_UNKNOWN); 218 } 219 220 static int link_reset_reset(struct link *l_ptr) 221 { 222 return (l_ptr->state == RESET_RESET); 223 } 224 225 static int link_blocked(struct link *l_ptr) 226 { 227 return (l_ptr->exp_msg_count || l_ptr->blocked); 228 } 229 230 static int link_congested(struct link *l_ptr) 231 { 232 return (l_ptr->out_queue_size >= l_ptr->queue_limit[0]); 233 } 234 235 static u32 link_max_pkt(struct link *l_ptr) 236 { 237 return l_ptr->max_pkt; 238 } 239 240 static void link_init_max_pkt(struct link *l_ptr) 241 { 242 u32 max_pkt; 243 244 max_pkt = (l_ptr->b_ptr->publ.mtu & ~3); 245 if (max_pkt > MAX_MSG_SIZE) 246 max_pkt = MAX_MSG_SIZE; 247 248 l_ptr->max_pkt_target = max_pkt; 249 if (l_ptr->max_pkt_target < MAX_PKT_DEFAULT) 250 l_ptr->max_pkt = l_ptr->max_pkt_target; 251 else 252 l_ptr->max_pkt = MAX_PKT_DEFAULT; 253 254 l_ptr->max_pkt_probes = 0; 255 } 256 257 static u32 link_next_sent(struct link *l_ptr) 258 { 259 if (l_ptr->next_out) 260 return msg_seqno(buf_msg(l_ptr->next_out)); 261 return mod(l_ptr->next_out_no); 262 } 263 264 static u32 link_last_sent(struct link *l_ptr) 265 { 266 return mod(link_next_sent(l_ptr) - 1); 267 } 268 269 /* 270 * Simple non-static link routines (i.e. referenced outside this file) 271 */ 272 273 int tipc_link_is_up(struct link *l_ptr) 274 { 275 if (!l_ptr) 276 return 0; 277 return (link_working_working(l_ptr) || link_working_unknown(l_ptr)); 278 } 279 280 int tipc_link_is_active(struct link *l_ptr) 281 { 282 return ((l_ptr->owner->active_links[0] == l_ptr) || 283 (l_ptr->owner->active_links[1] == l_ptr)); 284 } 285 286 /** 287 * link_name_validate - validate & (optionally) deconstruct link name 288 * @name - ptr to link name string 289 * @name_parts - ptr to area for link name components (or NULL if not needed) 290 * 291 * Returns 1 if link name is valid, otherwise 0. 292 */ 293 294 static int link_name_validate(const char *name, struct link_name *name_parts) 295 { 296 char name_copy[TIPC_MAX_LINK_NAME]; 297 char *addr_local; 298 char *if_local; 299 char *addr_peer; 300 char *if_peer; 301 char dummy; 302 u32 z_local, c_local, n_local; 303 u32 z_peer, c_peer, n_peer; 304 u32 if_local_len; 305 u32 if_peer_len; 306 307 /* copy link name & ensure length is OK */ 308 309 name_copy[TIPC_MAX_LINK_NAME - 1] = 0; 310 /* need above in case non-Posix strncpy() doesn't pad with nulls */ 311 strncpy(name_copy, name, TIPC_MAX_LINK_NAME); 312 if (name_copy[TIPC_MAX_LINK_NAME - 1] != 0) 313 return 0; 314 315 /* ensure all component parts of link name are present */ 316 317 addr_local = name_copy; 318 if ((if_local = strchr(addr_local, ':')) == NULL) 319 return 0; 320 *(if_local++) = 0; 321 if ((addr_peer = strchr(if_local, '-')) == NULL) 322 return 0; 323 *(addr_peer++) = 0; 324 if_local_len = addr_peer - if_local; 325 if ((if_peer = strchr(addr_peer, ':')) == NULL) 326 return 0; 327 *(if_peer++) = 0; 328 if_peer_len = strlen(if_peer) + 1; 329 330 /* validate component parts of link name */ 331 332 if ((sscanf(addr_local, "%u.%u.%u%c", 333 &z_local, &c_local, &n_local, &dummy) != 3) || 334 (sscanf(addr_peer, "%u.%u.%u%c", 335 &z_peer, &c_peer, &n_peer, &dummy) != 3) || 336 (z_local > 255) || (c_local > 4095) || (n_local > 4095) || 337 (z_peer > 255) || (c_peer > 4095) || (n_peer > 4095) || 338 (if_local_len <= 1) || (if_local_len > TIPC_MAX_IF_NAME) || 339 (if_peer_len <= 1) || (if_peer_len > TIPC_MAX_IF_NAME) || 340 (strspn(if_local, tipc_alphabet) != (if_local_len - 1)) || 341 (strspn(if_peer, tipc_alphabet) != (if_peer_len - 1))) 342 return 0; 343 344 /* return link name components, if necessary */ 345 346 if (name_parts) { 347 name_parts->addr_local = tipc_addr(z_local, c_local, n_local); 348 strcpy(name_parts->if_local, if_local); 349 name_parts->addr_peer = tipc_addr(z_peer, c_peer, n_peer); 350 strcpy(name_parts->if_peer, if_peer); 351 } 352 return 1; 353 } 354 355 /** 356 * link_timeout - handle expiration of link timer 357 * @l_ptr: pointer to link 358 * 359 * This routine must not grab "tipc_net_lock" to avoid a potential deadlock conflict 360 * with tipc_link_delete(). (There is no risk that the node will be deleted by 361 * another thread because tipc_link_delete() always cancels the link timer before 362 * tipc_node_delete() is called.) 363 */ 364 365 static void link_timeout(struct link *l_ptr) 366 { 367 tipc_node_lock(l_ptr->owner); 368 369 /* update counters used in statistical profiling of send traffic */ 370 371 l_ptr->stats.accu_queue_sz += l_ptr->out_queue_size; 372 l_ptr->stats.queue_sz_counts++; 373 374 if (l_ptr->out_queue_size > l_ptr->stats.max_queue_sz) 375 l_ptr->stats.max_queue_sz = l_ptr->out_queue_size; 376 377 if (l_ptr->first_out) { 378 struct tipc_msg *msg = buf_msg(l_ptr->first_out); 379 u32 length = msg_size(msg); 380 381 if ((msg_user(msg) == MSG_FRAGMENTER) && 382 (msg_type(msg) == FIRST_FRAGMENT)) { 383 length = msg_size(msg_get_wrapped(msg)); 384 } 385 if (length) { 386 l_ptr->stats.msg_lengths_total += length; 387 l_ptr->stats.msg_length_counts++; 388 if (length <= 64) 389 l_ptr->stats.msg_length_profile[0]++; 390 else if (length <= 256) 391 l_ptr->stats.msg_length_profile[1]++; 392 else if (length <= 1024) 393 l_ptr->stats.msg_length_profile[2]++; 394 else if (length <= 4096) 395 l_ptr->stats.msg_length_profile[3]++; 396 else if (length <= 16384) 397 l_ptr->stats.msg_length_profile[4]++; 398 else if (length <= 32768) 399 l_ptr->stats.msg_length_profile[5]++; 400 else 401 l_ptr->stats.msg_length_profile[6]++; 402 } 403 } 404 405 /* do all other link processing performed on a periodic basis */ 406 407 link_check_defragm_bufs(l_ptr); 408 409 link_state_event(l_ptr, TIMEOUT_EVT); 410 411 if (l_ptr->next_out) 412 tipc_link_push_queue(l_ptr); 413 414 tipc_node_unlock(l_ptr->owner); 415 } 416 417 static void link_set_timer(struct link *l_ptr, u32 time) 418 { 419 k_start_timer(&l_ptr->timer, time); 420 } 421 422 /** 423 * tipc_link_create - create a new link 424 * @b_ptr: pointer to associated bearer 425 * @peer: network address of node at other end of link 426 * @media_addr: media address to use when sending messages over link 427 * 428 * Returns pointer to link. 429 */ 430 431 struct link *tipc_link_create(struct bearer *b_ptr, const u32 peer, 432 const struct tipc_media_addr *media_addr) 433 { 434 struct link *l_ptr; 435 struct tipc_msg *msg; 436 char *if_name; 437 438 l_ptr = kzalloc(sizeof(*l_ptr), GFP_ATOMIC); 439 if (!l_ptr) { 440 warn("Link creation failed, no memory\n"); 441 return NULL; 442 } 443 444 if (LINK_LOG_BUF_SIZE) { 445 char *pb = kmalloc(LINK_LOG_BUF_SIZE, GFP_ATOMIC); 446 447 if (!pb) { 448 kfree(l_ptr); 449 warn("Link creation failed, no memory for print buffer\n"); 450 return NULL; 451 } 452 tipc_printbuf_init(&l_ptr->print_buf, pb, LINK_LOG_BUF_SIZE); 453 } 454 455 l_ptr->addr = peer; 456 if_name = strchr(b_ptr->publ.name, ':') + 1; 457 sprintf(l_ptr->name, "%u.%u.%u:%s-%u.%u.%u:", 458 tipc_zone(tipc_own_addr), tipc_cluster(tipc_own_addr), 459 tipc_node(tipc_own_addr), 460 if_name, 461 tipc_zone(peer), tipc_cluster(peer), tipc_node(peer)); 462 /* note: peer i/f is appended to link name by reset/activate */ 463 memcpy(&l_ptr->media_addr, media_addr, sizeof(*media_addr)); 464 l_ptr->checkpoint = 1; 465 l_ptr->b_ptr = b_ptr; 466 link_set_supervision_props(l_ptr, b_ptr->media->tolerance); 467 l_ptr->state = RESET_UNKNOWN; 468 469 l_ptr->pmsg = (struct tipc_msg *)&l_ptr->proto_msg; 470 msg = l_ptr->pmsg; 471 msg_init(msg, LINK_PROTOCOL, RESET_MSG, INT_H_SIZE, l_ptr->addr); 472 msg_set_size(msg, sizeof(l_ptr->proto_msg)); 473 msg_set_session(msg, (tipc_random & 0xffff)); 474 msg_set_bearer_id(msg, b_ptr->identity); 475 strcpy((char *)msg_data(msg), if_name); 476 477 l_ptr->priority = b_ptr->priority; 478 tipc_link_set_queue_limits(l_ptr, b_ptr->media->window); 479 480 link_init_max_pkt(l_ptr); 481 482 l_ptr->next_out_no = 1; 483 INIT_LIST_HEAD(&l_ptr->waiting_ports); 484 485 link_reset_statistics(l_ptr); 486 487 l_ptr->owner = tipc_node_attach_link(l_ptr); 488 if (!l_ptr->owner) { 489 if (LINK_LOG_BUF_SIZE) 490 kfree(l_ptr->print_buf.buf); 491 kfree(l_ptr); 492 return NULL; 493 } 494 495 k_init_timer(&l_ptr->timer, (Handler)link_timeout, (unsigned long)l_ptr); 496 list_add_tail(&l_ptr->link_list, &b_ptr->links); 497 tipc_k_signal((Handler)tipc_link_start, (unsigned long)l_ptr); 498 499 dbg("tipc_link_create(): tolerance = %u,cont intv = %u, abort_limit = %u\n", 500 l_ptr->tolerance, l_ptr->continuity_interval, l_ptr->abort_limit); 501 502 return l_ptr; 503 } 504 505 /** 506 * tipc_link_delete - delete a link 507 * @l_ptr: pointer to link 508 * 509 * Note: 'tipc_net_lock' is write_locked, bearer is locked. 510 * This routine must not grab the node lock until after link timer cancellation 511 * to avoid a potential deadlock situation. 512 */ 513 514 void tipc_link_delete(struct link *l_ptr) 515 { 516 if (!l_ptr) { 517 err("Attempt to delete non-existent link\n"); 518 return; 519 } 520 521 dbg("tipc_link_delete()\n"); 522 523 k_cancel_timer(&l_ptr->timer); 524 525 tipc_node_lock(l_ptr->owner); 526 tipc_link_reset(l_ptr); 527 tipc_node_detach_link(l_ptr->owner, l_ptr); 528 tipc_link_stop(l_ptr); 529 list_del_init(&l_ptr->link_list); 530 if (LINK_LOG_BUF_SIZE) 531 kfree(l_ptr->print_buf.buf); 532 tipc_node_unlock(l_ptr->owner); 533 k_term_timer(&l_ptr->timer); 534 kfree(l_ptr); 535 } 536 537 void tipc_link_start(struct link *l_ptr) 538 { 539 dbg("tipc_link_start %x\n", l_ptr); 540 link_state_event(l_ptr, STARTING_EVT); 541 } 542 543 /** 544 * link_schedule_port - schedule port for deferred sending 545 * @l_ptr: pointer to link 546 * @origport: reference to sending port 547 * @sz: amount of data to be sent 548 * 549 * Schedules port for renewed sending of messages after link congestion 550 * has abated. 551 */ 552 553 static int link_schedule_port(struct link *l_ptr, u32 origport, u32 sz) 554 { 555 struct port *p_ptr; 556 557 spin_lock_bh(&tipc_port_list_lock); 558 p_ptr = tipc_port_lock(origport); 559 if (p_ptr) { 560 if (!p_ptr->wakeup) 561 goto exit; 562 if (!list_empty(&p_ptr->wait_list)) 563 goto exit; 564 p_ptr->congested_link = l_ptr; 565 p_ptr->publ.congested = 1; 566 p_ptr->waiting_pkts = 1 + ((sz - 1) / link_max_pkt(l_ptr)); 567 list_add_tail(&p_ptr->wait_list, &l_ptr->waiting_ports); 568 l_ptr->stats.link_congs++; 569 exit: 570 tipc_port_unlock(p_ptr); 571 } 572 spin_unlock_bh(&tipc_port_list_lock); 573 return -ELINKCONG; 574 } 575 576 void tipc_link_wakeup_ports(struct link *l_ptr, int all) 577 { 578 struct port *p_ptr; 579 struct port *temp_p_ptr; 580 int win = l_ptr->queue_limit[0] - l_ptr->out_queue_size; 581 582 if (all) 583 win = 100000; 584 if (win <= 0) 585 return; 586 if (!spin_trylock_bh(&tipc_port_list_lock)) 587 return; 588 if (link_congested(l_ptr)) 589 goto exit; 590 list_for_each_entry_safe(p_ptr, temp_p_ptr, &l_ptr->waiting_ports, 591 wait_list) { 592 if (win <= 0) 593 break; 594 list_del_init(&p_ptr->wait_list); 595 p_ptr->congested_link = NULL; 596 spin_lock_bh(p_ptr->publ.lock); 597 p_ptr->publ.congested = 0; 598 p_ptr->wakeup(&p_ptr->publ); 599 win -= p_ptr->waiting_pkts; 600 spin_unlock_bh(p_ptr->publ.lock); 601 } 602 603 exit: 604 spin_unlock_bh(&tipc_port_list_lock); 605 } 606 607 /** 608 * link_release_outqueue - purge link's outbound message queue 609 * @l_ptr: pointer to link 610 */ 611 612 static void link_release_outqueue(struct link *l_ptr) 613 { 614 struct sk_buff *buf = l_ptr->first_out; 615 struct sk_buff *next; 616 617 while (buf) { 618 next = buf->next; 619 buf_discard(buf); 620 buf = next; 621 } 622 l_ptr->first_out = NULL; 623 l_ptr->out_queue_size = 0; 624 } 625 626 /** 627 * tipc_link_reset_fragments - purge link's inbound message fragments queue 628 * @l_ptr: pointer to link 629 */ 630 631 void tipc_link_reset_fragments(struct link *l_ptr) 632 { 633 struct sk_buff *buf = l_ptr->defragm_buf; 634 struct sk_buff *next; 635 636 while (buf) { 637 next = buf->next; 638 buf_discard(buf); 639 buf = next; 640 } 641 l_ptr->defragm_buf = NULL; 642 } 643 644 /** 645 * tipc_link_stop - purge all inbound and outbound messages associated with link 646 * @l_ptr: pointer to link 647 */ 648 649 void tipc_link_stop(struct link *l_ptr) 650 { 651 struct sk_buff *buf; 652 struct sk_buff *next; 653 654 buf = l_ptr->oldest_deferred_in; 655 while (buf) { 656 next = buf->next; 657 buf_discard(buf); 658 buf = next; 659 } 660 661 buf = l_ptr->first_out; 662 while (buf) { 663 next = buf->next; 664 buf_discard(buf); 665 buf = next; 666 } 667 668 tipc_link_reset_fragments(l_ptr); 669 670 buf_discard(l_ptr->proto_msg_queue); 671 l_ptr->proto_msg_queue = NULL; 672 } 673 674 #if 0 675 676 /* LINK EVENT CODE IS NOT SUPPORTED AT PRESENT */ 677 678 static void link_recv_event(struct link_event *ev) 679 { 680 ev->fcn(ev->addr, ev->name, ev->up); 681 kfree(ev); 682 } 683 684 static void link_send_event(void (*fcn)(u32 a, char *n, int up), 685 struct link *l_ptr, int up) 686 { 687 struct link_event *ev; 688 689 ev = kmalloc(sizeof(*ev), GFP_ATOMIC); 690 if (!ev) { 691 warn("Link event allocation failure\n"); 692 return; 693 } 694 ev->addr = l_ptr->addr; 695 ev->up = up; 696 ev->fcn = fcn; 697 memcpy(ev->name, l_ptr->name, TIPC_MAX_LINK_NAME); 698 tipc_k_signal((Handler)link_recv_event, (unsigned long)ev); 699 } 700 701 #else 702 703 #define link_send_event(fcn, l_ptr, up) do { } while (0) 704 705 #endif 706 707 void tipc_link_reset(struct link *l_ptr) 708 { 709 struct sk_buff *buf; 710 u32 prev_state = l_ptr->state; 711 u32 checkpoint = l_ptr->next_in_no; 712 int was_active_link = tipc_link_is_active(l_ptr); 713 714 msg_set_session(l_ptr->pmsg, ((msg_session(l_ptr->pmsg) + 1) & 0xffff)); 715 716 /* Link is down, accept any session */ 717 l_ptr->peer_session = INVALID_SESSION; 718 719 /* Prepare for max packet size negotiation */ 720 link_init_max_pkt(l_ptr); 721 722 l_ptr->state = RESET_UNKNOWN; 723 dbg_link_state("Resetting Link\n"); 724 725 if ((prev_state == RESET_UNKNOWN) || (prev_state == RESET_RESET)) 726 return; 727 728 tipc_node_link_down(l_ptr->owner, l_ptr); 729 tipc_bearer_remove_dest(l_ptr->b_ptr, l_ptr->addr); 730 #if 0 731 tipc_printf(TIPC_CONS, "\nReset link <%s>\n", l_ptr->name); 732 dbg_link_dump(); 733 #endif 734 if (was_active_link && tipc_node_has_active_links(l_ptr->owner) && 735 l_ptr->owner->permit_changeover) { 736 l_ptr->reset_checkpoint = checkpoint; 737 l_ptr->exp_msg_count = START_CHANGEOVER; 738 } 739 740 /* Clean up all queues: */ 741 742 link_release_outqueue(l_ptr); 743 buf_discard(l_ptr->proto_msg_queue); 744 l_ptr->proto_msg_queue = NULL; 745 buf = l_ptr->oldest_deferred_in; 746 while (buf) { 747 struct sk_buff *next = buf->next; 748 buf_discard(buf); 749 buf = next; 750 } 751 if (!list_empty(&l_ptr->waiting_ports)) 752 tipc_link_wakeup_ports(l_ptr, 1); 753 754 l_ptr->retransm_queue_head = 0; 755 l_ptr->retransm_queue_size = 0; 756 l_ptr->last_out = NULL; 757 l_ptr->first_out = NULL; 758 l_ptr->next_out = NULL; 759 l_ptr->unacked_window = 0; 760 l_ptr->checkpoint = 1; 761 l_ptr->next_out_no = 1; 762 l_ptr->deferred_inqueue_sz = 0; 763 l_ptr->oldest_deferred_in = NULL; 764 l_ptr->newest_deferred_in = NULL; 765 l_ptr->fsm_msg_cnt = 0; 766 l_ptr->stale_count = 0; 767 link_reset_statistics(l_ptr); 768 769 link_send_event(tipc_cfg_link_event, l_ptr, 0); 770 if (!in_own_cluster(l_ptr->addr)) 771 link_send_event(tipc_disc_link_event, l_ptr, 0); 772 } 773 774 775 static void link_activate(struct link *l_ptr) 776 { 777 l_ptr->next_in_no = l_ptr->stats.recv_info = 1; 778 tipc_node_link_up(l_ptr->owner, l_ptr); 779 tipc_bearer_add_dest(l_ptr->b_ptr, l_ptr->addr); 780 link_send_event(tipc_cfg_link_event, l_ptr, 1); 781 if (!in_own_cluster(l_ptr->addr)) 782 link_send_event(tipc_disc_link_event, l_ptr, 1); 783 } 784 785 /** 786 * link_state_event - link finite state machine 787 * @l_ptr: pointer to link 788 * @event: state machine event to process 789 */ 790 791 static void link_state_event(struct link *l_ptr, unsigned event) 792 { 793 struct link *other; 794 u32 cont_intv = l_ptr->continuity_interval; 795 796 if (!l_ptr->started && (event != STARTING_EVT)) 797 return; /* Not yet. */ 798 799 if (link_blocked(l_ptr)) { 800 if (event == TIMEOUT_EVT) { 801 link_set_timer(l_ptr, cont_intv); 802 } 803 return; /* Changeover going on */ 804 } 805 dbg_link("STATE_EV: <%s> ", l_ptr->name); 806 807 switch (l_ptr->state) { 808 case WORKING_WORKING: 809 dbg_link("WW/"); 810 switch (event) { 811 case TRAFFIC_MSG_EVT: 812 dbg_link("TRF-"); 813 /* fall through */ 814 case ACTIVATE_MSG: 815 dbg_link("ACT\n"); 816 break; 817 case TIMEOUT_EVT: 818 dbg_link("TIM "); 819 if (l_ptr->next_in_no != l_ptr->checkpoint) { 820 l_ptr->checkpoint = l_ptr->next_in_no; 821 if (tipc_bclink_acks_missing(l_ptr->owner)) { 822 tipc_link_send_proto_msg(l_ptr, STATE_MSG, 823 0, 0, 0, 0, 0); 824 l_ptr->fsm_msg_cnt++; 825 } else if (l_ptr->max_pkt < l_ptr->max_pkt_target) { 826 tipc_link_send_proto_msg(l_ptr, STATE_MSG, 827 1, 0, 0, 0, 0); 828 l_ptr->fsm_msg_cnt++; 829 } 830 link_set_timer(l_ptr, cont_intv); 831 break; 832 } 833 dbg_link(" -> WU\n"); 834 l_ptr->state = WORKING_UNKNOWN; 835 l_ptr->fsm_msg_cnt = 0; 836 tipc_link_send_proto_msg(l_ptr, STATE_MSG, 1, 0, 0, 0, 0); 837 l_ptr->fsm_msg_cnt++; 838 link_set_timer(l_ptr, cont_intv / 4); 839 break; 840 case RESET_MSG: 841 dbg_link("RES -> RR\n"); 842 info("Resetting link <%s>, requested by peer\n", 843 l_ptr->name); 844 tipc_link_reset(l_ptr); 845 l_ptr->state = RESET_RESET; 846 l_ptr->fsm_msg_cnt = 0; 847 tipc_link_send_proto_msg(l_ptr, ACTIVATE_MSG, 0, 0, 0, 0, 0); 848 l_ptr->fsm_msg_cnt++; 849 link_set_timer(l_ptr, cont_intv); 850 break; 851 default: 852 err("Unknown link event %u in WW state\n", event); 853 } 854 break; 855 case WORKING_UNKNOWN: 856 dbg_link("WU/"); 857 switch (event) { 858 case TRAFFIC_MSG_EVT: 859 dbg_link("TRF-"); 860 case ACTIVATE_MSG: 861 dbg_link("ACT -> WW\n"); 862 l_ptr->state = WORKING_WORKING; 863 l_ptr->fsm_msg_cnt = 0; 864 link_set_timer(l_ptr, cont_intv); 865 break; 866 case RESET_MSG: 867 dbg_link("RES -> RR\n"); 868 info("Resetting link <%s>, requested by peer " 869 "while probing\n", l_ptr->name); 870 tipc_link_reset(l_ptr); 871 l_ptr->state = RESET_RESET; 872 l_ptr->fsm_msg_cnt = 0; 873 tipc_link_send_proto_msg(l_ptr, ACTIVATE_MSG, 0, 0, 0, 0, 0); 874 l_ptr->fsm_msg_cnt++; 875 link_set_timer(l_ptr, cont_intv); 876 break; 877 case TIMEOUT_EVT: 878 dbg_link("TIM "); 879 if (l_ptr->next_in_no != l_ptr->checkpoint) { 880 dbg_link("-> WW \n"); 881 l_ptr->state = WORKING_WORKING; 882 l_ptr->fsm_msg_cnt = 0; 883 l_ptr->checkpoint = l_ptr->next_in_no; 884 if (tipc_bclink_acks_missing(l_ptr->owner)) { 885 tipc_link_send_proto_msg(l_ptr, STATE_MSG, 886 0, 0, 0, 0, 0); 887 l_ptr->fsm_msg_cnt++; 888 } 889 link_set_timer(l_ptr, cont_intv); 890 } else if (l_ptr->fsm_msg_cnt < l_ptr->abort_limit) { 891 dbg_link("Probing %u/%u,timer = %u ms)\n", 892 l_ptr->fsm_msg_cnt, l_ptr->abort_limit, 893 cont_intv / 4); 894 tipc_link_send_proto_msg(l_ptr, STATE_MSG, 895 1, 0, 0, 0, 0); 896 l_ptr->fsm_msg_cnt++; 897 link_set_timer(l_ptr, cont_intv / 4); 898 } else { /* Link has failed */ 899 dbg_link("-> RU (%u probes unanswered)\n", 900 l_ptr->fsm_msg_cnt); 901 warn("Resetting link <%s>, peer not responding\n", 902 l_ptr->name); 903 tipc_link_reset(l_ptr); 904 l_ptr->state = RESET_UNKNOWN; 905 l_ptr->fsm_msg_cnt = 0; 906 tipc_link_send_proto_msg(l_ptr, RESET_MSG, 907 0, 0, 0, 0, 0); 908 l_ptr->fsm_msg_cnt++; 909 link_set_timer(l_ptr, cont_intv); 910 } 911 break; 912 default: 913 err("Unknown link event %u in WU state\n", event); 914 } 915 break; 916 case RESET_UNKNOWN: 917 dbg_link("RU/"); 918 switch (event) { 919 case TRAFFIC_MSG_EVT: 920 dbg_link("TRF-\n"); 921 break; 922 case ACTIVATE_MSG: 923 other = l_ptr->owner->active_links[0]; 924 if (other && link_working_unknown(other)) { 925 dbg_link("ACT\n"); 926 break; 927 } 928 dbg_link("ACT -> WW\n"); 929 l_ptr->state = WORKING_WORKING; 930 l_ptr->fsm_msg_cnt = 0; 931 link_activate(l_ptr); 932 tipc_link_send_proto_msg(l_ptr, STATE_MSG, 1, 0, 0, 0, 0); 933 l_ptr->fsm_msg_cnt++; 934 link_set_timer(l_ptr, cont_intv); 935 break; 936 case RESET_MSG: 937 dbg_link("RES \n"); 938 dbg_link(" -> RR\n"); 939 l_ptr->state = RESET_RESET; 940 l_ptr->fsm_msg_cnt = 0; 941 tipc_link_send_proto_msg(l_ptr, ACTIVATE_MSG, 1, 0, 0, 0, 0); 942 l_ptr->fsm_msg_cnt++; 943 link_set_timer(l_ptr, cont_intv); 944 break; 945 case STARTING_EVT: 946 dbg_link("START-"); 947 l_ptr->started = 1; 948 /* fall through */ 949 case TIMEOUT_EVT: 950 dbg_link("TIM \n"); 951 tipc_link_send_proto_msg(l_ptr, RESET_MSG, 0, 0, 0, 0, 0); 952 l_ptr->fsm_msg_cnt++; 953 link_set_timer(l_ptr, cont_intv); 954 break; 955 default: 956 err("Unknown link event %u in RU state\n", event); 957 } 958 break; 959 case RESET_RESET: 960 dbg_link("RR/ "); 961 switch (event) { 962 case TRAFFIC_MSG_EVT: 963 dbg_link("TRF-"); 964 /* fall through */ 965 case ACTIVATE_MSG: 966 other = l_ptr->owner->active_links[0]; 967 if (other && link_working_unknown(other)) { 968 dbg_link("ACT\n"); 969 break; 970 } 971 dbg_link("ACT -> WW\n"); 972 l_ptr->state = WORKING_WORKING; 973 l_ptr->fsm_msg_cnt = 0; 974 link_activate(l_ptr); 975 tipc_link_send_proto_msg(l_ptr, STATE_MSG, 1, 0, 0, 0, 0); 976 l_ptr->fsm_msg_cnt++; 977 link_set_timer(l_ptr, cont_intv); 978 break; 979 case RESET_MSG: 980 dbg_link("RES\n"); 981 break; 982 case TIMEOUT_EVT: 983 dbg_link("TIM\n"); 984 tipc_link_send_proto_msg(l_ptr, ACTIVATE_MSG, 0, 0, 0, 0, 0); 985 l_ptr->fsm_msg_cnt++; 986 link_set_timer(l_ptr, cont_intv); 987 dbg_link("fsm_msg_cnt %u\n", l_ptr->fsm_msg_cnt); 988 break; 989 default: 990 err("Unknown link event %u in RR state\n", event); 991 } 992 break; 993 default: 994 err("Unknown link state %u/%u\n", l_ptr->state, event); 995 } 996 } 997 998 /* 999 * link_bundle_buf(): Append contents of a buffer to 1000 * the tail of an existing one. 1001 */ 1002 1003 static int link_bundle_buf(struct link *l_ptr, 1004 struct sk_buff *bundler, 1005 struct sk_buff *buf) 1006 { 1007 struct tipc_msg *bundler_msg = buf_msg(bundler); 1008 struct tipc_msg *msg = buf_msg(buf); 1009 u32 size = msg_size(msg); 1010 u32 bundle_size = msg_size(bundler_msg); 1011 u32 to_pos = align(bundle_size); 1012 u32 pad = to_pos - bundle_size; 1013 1014 if (msg_user(bundler_msg) != MSG_BUNDLER) 1015 return 0; 1016 if (msg_type(bundler_msg) != OPEN_MSG) 1017 return 0; 1018 if (skb_tailroom(bundler) < (pad + size)) 1019 return 0; 1020 if (link_max_pkt(l_ptr) < (to_pos + size)) 1021 return 0; 1022 1023 skb_put(bundler, pad + size); 1024 skb_copy_to_linear_data_offset(bundler, to_pos, buf->data, size); 1025 msg_set_size(bundler_msg, to_pos + size); 1026 msg_set_msgcnt(bundler_msg, msg_msgcnt(bundler_msg) + 1); 1027 dbg("Packed msg # %u(%u octets) into pos %u in buf(#%u)\n", 1028 msg_msgcnt(bundler_msg), size, to_pos, msg_seqno(bundler_msg)); 1029 msg_dbg(msg, "PACKD:"); 1030 buf_discard(buf); 1031 l_ptr->stats.sent_bundled++; 1032 return 1; 1033 } 1034 1035 static void link_add_to_outqueue(struct link *l_ptr, 1036 struct sk_buff *buf, 1037 struct tipc_msg *msg) 1038 { 1039 u32 ack = mod(l_ptr->next_in_no - 1); 1040 u32 seqno = mod(l_ptr->next_out_no++); 1041 1042 msg_set_word(msg, 2, ((ack << 16) | seqno)); 1043 msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); 1044 buf->next = NULL; 1045 if (l_ptr->first_out) { 1046 l_ptr->last_out->next = buf; 1047 l_ptr->last_out = buf; 1048 } else 1049 l_ptr->first_out = l_ptr->last_out = buf; 1050 l_ptr->out_queue_size++; 1051 } 1052 1053 /* 1054 * tipc_link_send_buf() is the 'full path' for messages, called from 1055 * inside TIPC when the 'fast path' in tipc_send_buf 1056 * has failed, and from link_send() 1057 */ 1058 1059 int tipc_link_send_buf(struct link *l_ptr, struct sk_buff *buf) 1060 { 1061 struct tipc_msg *msg = buf_msg(buf); 1062 u32 size = msg_size(msg); 1063 u32 dsz = msg_data_sz(msg); 1064 u32 queue_size = l_ptr->out_queue_size; 1065 u32 imp = msg_tot_importance(msg); 1066 u32 queue_limit = l_ptr->queue_limit[imp]; 1067 u32 max_packet = link_max_pkt(l_ptr); 1068 1069 msg_set_prevnode(msg, tipc_own_addr); /* If routed message */ 1070 1071 /* Match msg importance against queue limits: */ 1072 1073 if (unlikely(queue_size >= queue_limit)) { 1074 if (imp <= TIPC_CRITICAL_IMPORTANCE) { 1075 return link_schedule_port(l_ptr, msg_origport(msg), 1076 size); 1077 } 1078 msg_dbg(msg, "TIPC: Congestion, throwing away\n"); 1079 buf_discard(buf); 1080 if (imp > CONN_MANAGER) { 1081 warn("Resetting link <%s>, send queue full", l_ptr->name); 1082 tipc_link_reset(l_ptr); 1083 } 1084 return dsz; 1085 } 1086 1087 /* Fragmentation needed ? */ 1088 1089 if (size > max_packet) 1090 return tipc_link_send_long_buf(l_ptr, buf); 1091 1092 /* Packet can be queued or sent: */ 1093 1094 if (queue_size > l_ptr->stats.max_queue_sz) 1095 l_ptr->stats.max_queue_sz = queue_size; 1096 1097 if (likely(!tipc_bearer_congested(l_ptr->b_ptr, l_ptr) && 1098 !link_congested(l_ptr))) { 1099 link_add_to_outqueue(l_ptr, buf, msg); 1100 1101 if (likely(tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr))) { 1102 l_ptr->unacked_window = 0; 1103 } else { 1104 tipc_bearer_schedule(l_ptr->b_ptr, l_ptr); 1105 l_ptr->stats.bearer_congs++; 1106 l_ptr->next_out = buf; 1107 } 1108 return dsz; 1109 } 1110 /* Congestion: can message be bundled ?: */ 1111 1112 if ((msg_user(msg) != CHANGEOVER_PROTOCOL) && 1113 (msg_user(msg) != MSG_FRAGMENTER)) { 1114 1115 /* Try adding message to an existing bundle */ 1116 1117 if (l_ptr->next_out && 1118 link_bundle_buf(l_ptr, l_ptr->last_out, buf)) { 1119 tipc_bearer_resolve_congestion(l_ptr->b_ptr, l_ptr); 1120 return dsz; 1121 } 1122 1123 /* Try creating a new bundle */ 1124 1125 if (size <= max_packet * 2 / 3) { 1126 struct sk_buff *bundler = buf_acquire(max_packet); 1127 struct tipc_msg bundler_hdr; 1128 1129 if (bundler) { 1130 msg_init(&bundler_hdr, MSG_BUNDLER, OPEN_MSG, 1131 INT_H_SIZE, l_ptr->addr); 1132 skb_copy_to_linear_data(bundler, &bundler_hdr, 1133 INT_H_SIZE); 1134 skb_trim(bundler, INT_H_SIZE); 1135 link_bundle_buf(l_ptr, bundler, buf); 1136 buf = bundler; 1137 msg = buf_msg(buf); 1138 l_ptr->stats.sent_bundles++; 1139 } 1140 } 1141 } 1142 if (!l_ptr->next_out) 1143 l_ptr->next_out = buf; 1144 link_add_to_outqueue(l_ptr, buf, msg); 1145 tipc_bearer_resolve_congestion(l_ptr->b_ptr, l_ptr); 1146 return dsz; 1147 } 1148 1149 /* 1150 * tipc_link_send(): same as tipc_link_send_buf(), but the link to use has 1151 * not been selected yet, and the the owner node is not locked 1152 * Called by TIPC internal users, e.g. the name distributor 1153 */ 1154 1155 int tipc_link_send(struct sk_buff *buf, u32 dest, u32 selector) 1156 { 1157 struct link *l_ptr; 1158 struct tipc_node *n_ptr; 1159 int res = -ELINKCONG; 1160 1161 read_lock_bh(&tipc_net_lock); 1162 n_ptr = tipc_node_select(dest, selector); 1163 if (n_ptr) { 1164 tipc_node_lock(n_ptr); 1165 l_ptr = n_ptr->active_links[selector & 1]; 1166 if (l_ptr) { 1167 dbg("tipc_link_send: found link %x for dest %x\n", l_ptr, dest); 1168 res = tipc_link_send_buf(l_ptr, buf); 1169 } else { 1170 dbg("Attempt to send msg to unreachable node:\n"); 1171 msg_dbg(buf_msg(buf),">>>"); 1172 buf_discard(buf); 1173 } 1174 tipc_node_unlock(n_ptr); 1175 } else { 1176 dbg("Attempt to send msg to unknown node:\n"); 1177 msg_dbg(buf_msg(buf),">>>"); 1178 buf_discard(buf); 1179 } 1180 read_unlock_bh(&tipc_net_lock); 1181 return res; 1182 } 1183 1184 /* 1185 * link_send_buf_fast: Entry for data messages where the 1186 * destination link is known and the header is complete, 1187 * inclusive total message length. Very time critical. 1188 * Link is locked. Returns user data length. 1189 */ 1190 1191 static int link_send_buf_fast(struct link *l_ptr, struct sk_buff *buf, 1192 u32 *used_max_pkt) 1193 { 1194 struct tipc_msg *msg = buf_msg(buf); 1195 int res = msg_data_sz(msg); 1196 1197 if (likely(!link_congested(l_ptr))) { 1198 if (likely(msg_size(msg) <= link_max_pkt(l_ptr))) { 1199 if (likely(list_empty(&l_ptr->b_ptr->cong_links))) { 1200 link_add_to_outqueue(l_ptr, buf, msg); 1201 if (likely(tipc_bearer_send(l_ptr->b_ptr, buf, 1202 &l_ptr->media_addr))) { 1203 l_ptr->unacked_window = 0; 1204 msg_dbg(msg,"SENT_FAST:"); 1205 return res; 1206 } 1207 dbg("failed sent fast...\n"); 1208 tipc_bearer_schedule(l_ptr->b_ptr, l_ptr); 1209 l_ptr->stats.bearer_congs++; 1210 l_ptr->next_out = buf; 1211 return res; 1212 } 1213 } 1214 else 1215 *used_max_pkt = link_max_pkt(l_ptr); 1216 } 1217 return tipc_link_send_buf(l_ptr, buf); /* All other cases */ 1218 } 1219 1220 /* 1221 * tipc_send_buf_fast: Entry for data messages where the 1222 * destination node is known and the header is complete, 1223 * inclusive total message length. 1224 * Returns user data length. 1225 */ 1226 int tipc_send_buf_fast(struct sk_buff *buf, u32 destnode) 1227 { 1228 struct link *l_ptr; 1229 struct tipc_node *n_ptr; 1230 int res; 1231 u32 selector = msg_origport(buf_msg(buf)) & 1; 1232 u32 dummy; 1233 1234 if (destnode == tipc_own_addr) 1235 return tipc_port_recv_msg(buf); 1236 1237 read_lock_bh(&tipc_net_lock); 1238 n_ptr = tipc_node_select(destnode, selector); 1239 if (likely(n_ptr)) { 1240 tipc_node_lock(n_ptr); 1241 l_ptr = n_ptr->active_links[selector]; 1242 dbg("send_fast: buf %x selected %x, destnode = %x\n", 1243 buf, l_ptr, destnode); 1244 if (likely(l_ptr)) { 1245 res = link_send_buf_fast(l_ptr, buf, &dummy); 1246 tipc_node_unlock(n_ptr); 1247 read_unlock_bh(&tipc_net_lock); 1248 return res; 1249 } 1250 tipc_node_unlock(n_ptr); 1251 } 1252 read_unlock_bh(&tipc_net_lock); 1253 res = msg_data_sz(buf_msg(buf)); 1254 tipc_reject_msg(buf, TIPC_ERR_NO_NODE); 1255 return res; 1256 } 1257 1258 1259 /* 1260 * tipc_link_send_sections_fast: Entry for messages where the 1261 * destination processor is known and the header is complete, 1262 * except for total message length. 1263 * Returns user data length or errno. 1264 */ 1265 int tipc_link_send_sections_fast(struct port *sender, 1266 struct iovec const *msg_sect, 1267 const u32 num_sect, 1268 u32 destaddr) 1269 { 1270 struct tipc_msg *hdr = &sender->publ.phdr; 1271 struct link *l_ptr; 1272 struct sk_buff *buf; 1273 struct tipc_node *node; 1274 int res; 1275 u32 selector = msg_origport(hdr) & 1; 1276 1277 again: 1278 /* 1279 * Try building message using port's max_pkt hint. 1280 * (Must not hold any locks while building message.) 1281 */ 1282 1283 res = msg_build(hdr, msg_sect, num_sect, sender->publ.max_pkt, 1284 !sender->user_port, &buf); 1285 1286 read_lock_bh(&tipc_net_lock); 1287 node = tipc_node_select(destaddr, selector); 1288 if (likely(node)) { 1289 tipc_node_lock(node); 1290 l_ptr = node->active_links[selector]; 1291 if (likely(l_ptr)) { 1292 if (likely(buf)) { 1293 res = link_send_buf_fast(l_ptr, buf, 1294 &sender->publ.max_pkt); 1295 if (unlikely(res < 0)) 1296 buf_discard(buf); 1297 exit: 1298 tipc_node_unlock(node); 1299 read_unlock_bh(&tipc_net_lock); 1300 return res; 1301 } 1302 1303 /* Exit if build request was invalid */ 1304 1305 if (unlikely(res < 0)) 1306 goto exit; 1307 1308 /* Exit if link (or bearer) is congested */ 1309 1310 if (link_congested(l_ptr) || 1311 !list_empty(&l_ptr->b_ptr->cong_links)) { 1312 res = link_schedule_port(l_ptr, 1313 sender->publ.ref, res); 1314 goto exit; 1315 } 1316 1317 /* 1318 * Message size exceeds max_pkt hint; update hint, 1319 * then re-try fast path or fragment the message 1320 */ 1321 1322 sender->publ.max_pkt = link_max_pkt(l_ptr); 1323 tipc_node_unlock(node); 1324 read_unlock_bh(&tipc_net_lock); 1325 1326 1327 if ((msg_hdr_sz(hdr) + res) <= sender->publ.max_pkt) 1328 goto again; 1329 1330 return link_send_sections_long(sender, msg_sect, 1331 num_sect, destaddr); 1332 } 1333 tipc_node_unlock(node); 1334 } 1335 read_unlock_bh(&tipc_net_lock); 1336 1337 /* Couldn't find a link to the destination node */ 1338 1339 if (buf) 1340 return tipc_reject_msg(buf, TIPC_ERR_NO_NODE); 1341 if (res >= 0) 1342 return tipc_port_reject_sections(sender, hdr, msg_sect, num_sect, 1343 TIPC_ERR_NO_NODE); 1344 return res; 1345 } 1346 1347 /* 1348 * link_send_sections_long(): Entry for long messages where the 1349 * destination node is known and the header is complete, 1350 * inclusive total message length. 1351 * Link and bearer congestion status have been checked to be ok, 1352 * and are ignored if they change. 1353 * 1354 * Note that fragments do not use the full link MTU so that they won't have 1355 * to undergo refragmentation if link changeover causes them to be sent 1356 * over another link with an additional tunnel header added as prefix. 1357 * (Refragmentation will still occur if the other link has a smaller MTU.) 1358 * 1359 * Returns user data length or errno. 1360 */ 1361 static int link_send_sections_long(struct port *sender, 1362 struct iovec const *msg_sect, 1363 u32 num_sect, 1364 u32 destaddr) 1365 { 1366 struct link *l_ptr; 1367 struct tipc_node *node; 1368 struct tipc_msg *hdr = &sender->publ.phdr; 1369 u32 dsz = msg_data_sz(hdr); 1370 u32 max_pkt,fragm_sz,rest; 1371 struct tipc_msg fragm_hdr; 1372 struct sk_buff *buf,*buf_chain,*prev; 1373 u32 fragm_crs,fragm_rest,hsz,sect_rest; 1374 const unchar *sect_crs; 1375 int curr_sect; 1376 u32 fragm_no; 1377 1378 again: 1379 fragm_no = 1; 1380 max_pkt = sender->publ.max_pkt - INT_H_SIZE; 1381 /* leave room for tunnel header in case of link changeover */ 1382 fragm_sz = max_pkt - INT_H_SIZE; 1383 /* leave room for fragmentation header in each fragment */ 1384 rest = dsz; 1385 fragm_crs = 0; 1386 fragm_rest = 0; 1387 sect_rest = 0; 1388 sect_crs = NULL; 1389 curr_sect = -1; 1390 1391 /* Prepare reusable fragment header: */ 1392 1393 msg_dbg(hdr, ">FRAGMENTING>"); 1394 msg_init(&fragm_hdr, MSG_FRAGMENTER, FIRST_FRAGMENT, 1395 INT_H_SIZE, msg_destnode(hdr)); 1396 msg_set_link_selector(&fragm_hdr, sender->publ.ref); 1397 msg_set_size(&fragm_hdr, max_pkt); 1398 msg_set_fragm_no(&fragm_hdr, 1); 1399 1400 /* Prepare header of first fragment: */ 1401 1402 buf_chain = buf = buf_acquire(max_pkt); 1403 if (!buf) 1404 return -ENOMEM; 1405 buf->next = NULL; 1406 skb_copy_to_linear_data(buf, &fragm_hdr, INT_H_SIZE); 1407 hsz = msg_hdr_sz(hdr); 1408 skb_copy_to_linear_data_offset(buf, INT_H_SIZE, hdr, hsz); 1409 msg_dbg(buf_msg(buf), ">BUILD>"); 1410 1411 /* Chop up message: */ 1412 1413 fragm_crs = INT_H_SIZE + hsz; 1414 fragm_rest = fragm_sz - hsz; 1415 1416 do { /* For all sections */ 1417 u32 sz; 1418 1419 if (!sect_rest) { 1420 sect_rest = msg_sect[++curr_sect].iov_len; 1421 sect_crs = (const unchar *)msg_sect[curr_sect].iov_base; 1422 } 1423 1424 if (sect_rest < fragm_rest) 1425 sz = sect_rest; 1426 else 1427 sz = fragm_rest; 1428 1429 if (likely(!sender->user_port)) { 1430 if (copy_from_user(buf->data + fragm_crs, sect_crs, sz)) { 1431 error: 1432 for (; buf_chain; buf_chain = buf) { 1433 buf = buf_chain->next; 1434 buf_discard(buf_chain); 1435 } 1436 return -EFAULT; 1437 } 1438 } else 1439 skb_copy_to_linear_data_offset(buf, fragm_crs, 1440 sect_crs, sz); 1441 sect_crs += sz; 1442 sect_rest -= sz; 1443 fragm_crs += sz; 1444 fragm_rest -= sz; 1445 rest -= sz; 1446 1447 if (!fragm_rest && rest) { 1448 1449 /* Initiate new fragment: */ 1450 if (rest <= fragm_sz) { 1451 fragm_sz = rest; 1452 msg_set_type(&fragm_hdr,LAST_FRAGMENT); 1453 } else { 1454 msg_set_type(&fragm_hdr, FRAGMENT); 1455 } 1456 msg_set_size(&fragm_hdr, fragm_sz + INT_H_SIZE); 1457 msg_set_fragm_no(&fragm_hdr, ++fragm_no); 1458 prev = buf; 1459 buf = buf_acquire(fragm_sz + INT_H_SIZE); 1460 if (!buf) 1461 goto error; 1462 1463 buf->next = NULL; 1464 prev->next = buf; 1465 skb_copy_to_linear_data(buf, &fragm_hdr, INT_H_SIZE); 1466 fragm_crs = INT_H_SIZE; 1467 fragm_rest = fragm_sz; 1468 msg_dbg(buf_msg(buf)," >BUILD>"); 1469 } 1470 } 1471 while (rest > 0); 1472 1473 /* 1474 * Now we have a buffer chain. Select a link and check 1475 * that packet size is still OK 1476 */ 1477 node = tipc_node_select(destaddr, sender->publ.ref & 1); 1478 if (likely(node)) { 1479 tipc_node_lock(node); 1480 l_ptr = node->active_links[sender->publ.ref & 1]; 1481 if (!l_ptr) { 1482 tipc_node_unlock(node); 1483 goto reject; 1484 } 1485 if (link_max_pkt(l_ptr) < max_pkt) { 1486 sender->publ.max_pkt = link_max_pkt(l_ptr); 1487 tipc_node_unlock(node); 1488 for (; buf_chain; buf_chain = buf) { 1489 buf = buf_chain->next; 1490 buf_discard(buf_chain); 1491 } 1492 goto again; 1493 } 1494 } else { 1495 reject: 1496 for (; buf_chain; buf_chain = buf) { 1497 buf = buf_chain->next; 1498 buf_discard(buf_chain); 1499 } 1500 return tipc_port_reject_sections(sender, hdr, msg_sect, num_sect, 1501 TIPC_ERR_NO_NODE); 1502 } 1503 1504 /* Append whole chain to send queue: */ 1505 1506 buf = buf_chain; 1507 l_ptr->long_msg_seq_no = mod(l_ptr->long_msg_seq_no + 1); 1508 if (!l_ptr->next_out) 1509 l_ptr->next_out = buf_chain; 1510 l_ptr->stats.sent_fragmented++; 1511 while (buf) { 1512 struct sk_buff *next = buf->next; 1513 struct tipc_msg *msg = buf_msg(buf); 1514 1515 l_ptr->stats.sent_fragments++; 1516 msg_set_long_msgno(msg, l_ptr->long_msg_seq_no); 1517 link_add_to_outqueue(l_ptr, buf, msg); 1518 msg_dbg(msg, ">ADD>"); 1519 buf = next; 1520 } 1521 1522 /* Send it, if possible: */ 1523 1524 tipc_link_push_queue(l_ptr); 1525 tipc_node_unlock(node); 1526 return dsz; 1527 } 1528 1529 /* 1530 * tipc_link_push_packet: Push one unsent packet to the media 1531 */ 1532 u32 tipc_link_push_packet(struct link *l_ptr) 1533 { 1534 struct sk_buff *buf = l_ptr->first_out; 1535 u32 r_q_size = l_ptr->retransm_queue_size; 1536 u32 r_q_head = l_ptr->retransm_queue_head; 1537 1538 /* Step to position where retransmission failed, if any, */ 1539 /* consider that buffers may have been released in meantime */ 1540 1541 if (r_q_size && buf) { 1542 u32 last = lesser(mod(r_q_head + r_q_size), 1543 link_last_sent(l_ptr)); 1544 u32 first = msg_seqno(buf_msg(buf)); 1545 1546 while (buf && less(first, r_q_head)) { 1547 first = mod(first + 1); 1548 buf = buf->next; 1549 } 1550 l_ptr->retransm_queue_head = r_q_head = first; 1551 l_ptr->retransm_queue_size = r_q_size = mod(last - first); 1552 } 1553 1554 /* Continue retransmission now, if there is anything: */ 1555 1556 if (r_q_size && buf && !skb_cloned(buf)) { 1557 msg_set_ack(buf_msg(buf), mod(l_ptr->next_in_no - 1)); 1558 msg_set_bcast_ack(buf_msg(buf), l_ptr->owner->bclink.last_in); 1559 if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) { 1560 msg_dbg(buf_msg(buf), ">DEF-RETR>"); 1561 l_ptr->retransm_queue_head = mod(++r_q_head); 1562 l_ptr->retransm_queue_size = --r_q_size; 1563 l_ptr->stats.retransmitted++; 1564 return 0; 1565 } else { 1566 l_ptr->stats.bearer_congs++; 1567 msg_dbg(buf_msg(buf), "|>DEF-RETR>"); 1568 return PUSH_FAILED; 1569 } 1570 } 1571 1572 /* Send deferred protocol message, if any: */ 1573 1574 buf = l_ptr->proto_msg_queue; 1575 if (buf) { 1576 msg_set_ack(buf_msg(buf), mod(l_ptr->next_in_no - 1)); 1577 msg_set_bcast_ack(buf_msg(buf),l_ptr->owner->bclink.last_in); 1578 if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) { 1579 msg_dbg(buf_msg(buf), ">DEF-PROT>"); 1580 l_ptr->unacked_window = 0; 1581 buf_discard(buf); 1582 l_ptr->proto_msg_queue = NULL; 1583 return 0; 1584 } else { 1585 msg_dbg(buf_msg(buf), "|>DEF-PROT>"); 1586 l_ptr->stats.bearer_congs++; 1587 return PUSH_FAILED; 1588 } 1589 } 1590 1591 /* Send one deferred data message, if send window not full: */ 1592 1593 buf = l_ptr->next_out; 1594 if (buf) { 1595 struct tipc_msg *msg = buf_msg(buf); 1596 u32 next = msg_seqno(msg); 1597 u32 first = msg_seqno(buf_msg(l_ptr->first_out)); 1598 1599 if (mod(next - first) < l_ptr->queue_limit[0]) { 1600 msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); 1601 msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); 1602 if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) { 1603 if (msg_user(msg) == MSG_BUNDLER) 1604 msg_set_type(msg, CLOSED_MSG); 1605 msg_dbg(msg, ">PUSH-DATA>"); 1606 l_ptr->next_out = buf->next; 1607 return 0; 1608 } else { 1609 msg_dbg(msg, "|PUSH-DATA|"); 1610 l_ptr->stats.bearer_congs++; 1611 return PUSH_FAILED; 1612 } 1613 } 1614 } 1615 return PUSH_FINISHED; 1616 } 1617 1618 /* 1619 * push_queue(): push out the unsent messages of a link where 1620 * congestion has abated. Node is locked 1621 */ 1622 void tipc_link_push_queue(struct link *l_ptr) 1623 { 1624 u32 res; 1625 1626 if (tipc_bearer_congested(l_ptr->b_ptr, l_ptr)) 1627 return; 1628 1629 do { 1630 res = tipc_link_push_packet(l_ptr); 1631 } while (!res); 1632 1633 if (res == PUSH_FAILED) 1634 tipc_bearer_schedule(l_ptr->b_ptr, l_ptr); 1635 } 1636 1637 static void link_reset_all(unsigned long addr) 1638 { 1639 struct tipc_node *n_ptr; 1640 char addr_string[16]; 1641 u32 i; 1642 1643 read_lock_bh(&tipc_net_lock); 1644 n_ptr = tipc_node_find((u32)addr); 1645 if (!n_ptr) { 1646 read_unlock_bh(&tipc_net_lock); 1647 return; /* node no longer exists */ 1648 } 1649 1650 tipc_node_lock(n_ptr); 1651 1652 warn("Resetting all links to %s\n", 1653 addr_string_fill(addr_string, n_ptr->addr)); 1654 1655 for (i = 0; i < MAX_BEARERS; i++) { 1656 if (n_ptr->links[i]) { 1657 link_print(n_ptr->links[i], TIPC_OUTPUT, 1658 "Resetting link\n"); 1659 tipc_link_reset(n_ptr->links[i]); 1660 } 1661 } 1662 1663 tipc_node_unlock(n_ptr); 1664 read_unlock_bh(&tipc_net_lock); 1665 } 1666 1667 static void link_retransmit_failure(struct link *l_ptr, struct sk_buff *buf) 1668 { 1669 struct tipc_msg *msg = buf_msg(buf); 1670 1671 warn("Retransmission failure on link <%s>\n", l_ptr->name); 1672 tipc_msg_dbg(TIPC_OUTPUT, msg, ">RETR-FAIL>"); 1673 1674 if (l_ptr->addr) { 1675 1676 /* Handle failure on standard link */ 1677 1678 link_print(l_ptr, TIPC_OUTPUT, "Resetting link\n"); 1679 tipc_link_reset(l_ptr); 1680 1681 } else { 1682 1683 /* Handle failure on broadcast link */ 1684 1685 struct tipc_node *n_ptr; 1686 char addr_string[16]; 1687 1688 tipc_printf(TIPC_OUTPUT, "Msg seq number: %u, ", msg_seqno(msg)); 1689 tipc_printf(TIPC_OUTPUT, "Outstanding acks: %lu\n", 1690 (unsigned long) TIPC_SKB_CB(buf)->handle); 1691 1692 n_ptr = l_ptr->owner->next; 1693 tipc_node_lock(n_ptr); 1694 1695 addr_string_fill(addr_string, n_ptr->addr); 1696 tipc_printf(TIPC_OUTPUT, "Multicast link info for %s\n", addr_string); 1697 tipc_printf(TIPC_OUTPUT, "Supported: %d, ", n_ptr->bclink.supported); 1698 tipc_printf(TIPC_OUTPUT, "Acked: %u\n", n_ptr->bclink.acked); 1699 tipc_printf(TIPC_OUTPUT, "Last in: %u, ", n_ptr->bclink.last_in); 1700 tipc_printf(TIPC_OUTPUT, "Gap after: %u, ", n_ptr->bclink.gap_after); 1701 tipc_printf(TIPC_OUTPUT, "Gap to: %u\n", n_ptr->bclink.gap_to); 1702 tipc_printf(TIPC_OUTPUT, "Nack sync: %u\n\n", n_ptr->bclink.nack_sync); 1703 1704 tipc_k_signal((Handler)link_reset_all, (unsigned long)n_ptr->addr); 1705 1706 tipc_node_unlock(n_ptr); 1707 1708 l_ptr->stale_count = 0; 1709 } 1710 } 1711 1712 void tipc_link_retransmit(struct link *l_ptr, struct sk_buff *buf, 1713 u32 retransmits) 1714 { 1715 struct tipc_msg *msg; 1716 1717 if (!buf) 1718 return; 1719 1720 msg = buf_msg(buf); 1721 1722 dbg("Retransmitting %u in link %x\n", retransmits, l_ptr); 1723 1724 if (tipc_bearer_congested(l_ptr->b_ptr, l_ptr)) { 1725 if (!skb_cloned(buf)) { 1726 msg_dbg(msg, ">NO_RETR->BCONG>"); 1727 dbg_print_link(l_ptr, " "); 1728 l_ptr->retransm_queue_head = msg_seqno(msg); 1729 l_ptr->retransm_queue_size = retransmits; 1730 return; 1731 } else { 1732 /* Don't retransmit if driver already has the buffer */ 1733 } 1734 } else { 1735 /* Detect repeated retransmit failures on uncongested bearer */ 1736 1737 if (l_ptr->last_retransmitted == msg_seqno(msg)) { 1738 if (++l_ptr->stale_count > 100) { 1739 link_retransmit_failure(l_ptr, buf); 1740 return; 1741 } 1742 } else { 1743 l_ptr->last_retransmitted = msg_seqno(msg); 1744 l_ptr->stale_count = 1; 1745 } 1746 } 1747 1748 while (retransmits && (buf != l_ptr->next_out) && buf && !skb_cloned(buf)) { 1749 msg = buf_msg(buf); 1750 msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); 1751 msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); 1752 if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) { 1753 msg_dbg(buf_msg(buf), ">RETR>"); 1754 buf = buf->next; 1755 retransmits--; 1756 l_ptr->stats.retransmitted++; 1757 } else { 1758 tipc_bearer_schedule(l_ptr->b_ptr, l_ptr); 1759 l_ptr->stats.bearer_congs++; 1760 l_ptr->retransm_queue_head = msg_seqno(buf_msg(buf)); 1761 l_ptr->retransm_queue_size = retransmits; 1762 return; 1763 } 1764 } 1765 1766 l_ptr->retransm_queue_head = l_ptr->retransm_queue_size = 0; 1767 } 1768 1769 /** 1770 * link_insert_deferred_queue - insert deferred messages back into receive chain 1771 */ 1772 1773 static struct sk_buff *link_insert_deferred_queue(struct link *l_ptr, 1774 struct sk_buff *buf) 1775 { 1776 u32 seq_no; 1777 1778 if (l_ptr->oldest_deferred_in == NULL) 1779 return buf; 1780 1781 seq_no = msg_seqno(buf_msg(l_ptr->oldest_deferred_in)); 1782 if (seq_no == mod(l_ptr->next_in_no)) { 1783 l_ptr->newest_deferred_in->next = buf; 1784 buf = l_ptr->oldest_deferred_in; 1785 l_ptr->oldest_deferred_in = NULL; 1786 l_ptr->deferred_inqueue_sz = 0; 1787 } 1788 return buf; 1789 } 1790 1791 /** 1792 * link_recv_buf_validate - validate basic format of received message 1793 * 1794 * This routine ensures a TIPC message has an acceptable header, and at least 1795 * as much data as the header indicates it should. The routine also ensures 1796 * that the entire message header is stored in the main fragment of the message 1797 * buffer, to simplify future access to message header fields. 1798 * 1799 * Note: Having extra info present in the message header or data areas is OK. 1800 * TIPC will ignore the excess, under the assumption that it is optional info 1801 * introduced by a later release of the protocol. 1802 */ 1803 1804 static int link_recv_buf_validate(struct sk_buff *buf) 1805 { 1806 static u32 min_data_hdr_size[8] = { 1807 SHORT_H_SIZE, MCAST_H_SIZE, LONG_H_SIZE, DIR_MSG_H_SIZE, 1808 MAX_H_SIZE, MAX_H_SIZE, MAX_H_SIZE, MAX_H_SIZE 1809 }; 1810 1811 struct tipc_msg *msg; 1812 u32 tipc_hdr[2]; 1813 u32 size; 1814 u32 hdr_size; 1815 u32 min_hdr_size; 1816 1817 if (unlikely(buf->len < MIN_H_SIZE)) 1818 return 0; 1819 1820 msg = skb_header_pointer(buf, 0, sizeof(tipc_hdr), tipc_hdr); 1821 if (msg == NULL) 1822 return 0; 1823 1824 if (unlikely(msg_version(msg) != TIPC_VERSION)) 1825 return 0; 1826 1827 size = msg_size(msg); 1828 hdr_size = msg_hdr_sz(msg); 1829 min_hdr_size = msg_isdata(msg) ? 1830 min_data_hdr_size[msg_type(msg)] : INT_H_SIZE; 1831 1832 if (unlikely((hdr_size < min_hdr_size) || 1833 (size < hdr_size) || 1834 (buf->len < size) || 1835 (size - hdr_size > TIPC_MAX_USER_MSG_SIZE))) 1836 return 0; 1837 1838 return pskb_may_pull(buf, hdr_size); 1839 } 1840 1841 void tipc_recv_msg(struct sk_buff *head, struct tipc_bearer *tb_ptr) 1842 { 1843 read_lock_bh(&tipc_net_lock); 1844 while (head) { 1845 struct bearer *b_ptr = (struct bearer *)tb_ptr; 1846 struct tipc_node *n_ptr; 1847 struct link *l_ptr; 1848 struct sk_buff *crs; 1849 struct sk_buff *buf = head; 1850 struct tipc_msg *msg; 1851 u32 seq_no; 1852 u32 ackd; 1853 u32 released = 0; 1854 int type; 1855 1856 head = head->next; 1857 1858 /* Ensure message is well-formed */ 1859 1860 if (unlikely(!link_recv_buf_validate(buf))) 1861 goto cont; 1862 1863 /* Ensure message data is a single contiguous unit */ 1864 1865 if (unlikely(buf_linearize(buf))) { 1866 goto cont; 1867 } 1868 1869 /* Handle arrival of a non-unicast link message */ 1870 1871 msg = buf_msg(buf); 1872 1873 if (unlikely(msg_non_seq(msg))) { 1874 if (msg_user(msg) == LINK_CONFIG) 1875 tipc_disc_recv_msg(buf, b_ptr); 1876 else 1877 tipc_bclink_recv_pkt(buf); 1878 continue; 1879 } 1880 1881 if (unlikely(!msg_short(msg) && 1882 (msg_destnode(msg) != tipc_own_addr))) 1883 goto cont; 1884 1885 /* Discard non-routeable messages destined for another node */ 1886 1887 if (unlikely(!msg_isdata(msg) && 1888 (msg_destnode(msg) != tipc_own_addr))) { 1889 if ((msg_user(msg) != CONN_MANAGER) && 1890 (msg_user(msg) != MSG_FRAGMENTER)) 1891 goto cont; 1892 } 1893 1894 /* Locate unicast link endpoint that should handle message */ 1895 1896 n_ptr = tipc_node_find(msg_prevnode(msg)); 1897 if (unlikely(!n_ptr)) 1898 goto cont; 1899 tipc_node_lock(n_ptr); 1900 1901 l_ptr = n_ptr->links[b_ptr->identity]; 1902 if (unlikely(!l_ptr)) { 1903 tipc_node_unlock(n_ptr); 1904 goto cont; 1905 } 1906 1907 /* Validate message sequence number info */ 1908 1909 seq_no = msg_seqno(msg); 1910 ackd = msg_ack(msg); 1911 1912 /* Release acked messages */ 1913 1914 if (less(n_ptr->bclink.acked, msg_bcast_ack(msg))) { 1915 if (tipc_node_is_up(n_ptr) && n_ptr->bclink.supported) 1916 tipc_bclink_acknowledge(n_ptr, msg_bcast_ack(msg)); 1917 } 1918 1919 crs = l_ptr->first_out; 1920 while ((crs != l_ptr->next_out) && 1921 less_eq(msg_seqno(buf_msg(crs)), ackd)) { 1922 struct sk_buff *next = crs->next; 1923 1924 buf_discard(crs); 1925 crs = next; 1926 released++; 1927 } 1928 if (released) { 1929 l_ptr->first_out = crs; 1930 l_ptr->out_queue_size -= released; 1931 } 1932 1933 /* Try sending any messages link endpoint has pending */ 1934 1935 if (unlikely(l_ptr->next_out)) 1936 tipc_link_push_queue(l_ptr); 1937 if (unlikely(!list_empty(&l_ptr->waiting_ports))) 1938 tipc_link_wakeup_ports(l_ptr, 0); 1939 if (unlikely(++l_ptr->unacked_window >= TIPC_MIN_LINK_WIN)) { 1940 l_ptr->stats.sent_acks++; 1941 tipc_link_send_proto_msg(l_ptr, STATE_MSG, 0, 0, 0, 0, 0); 1942 } 1943 1944 /* Now (finally!) process the incoming message */ 1945 1946 protocol_check: 1947 if (likely(link_working_working(l_ptr))) { 1948 if (likely(seq_no == mod(l_ptr->next_in_no))) { 1949 l_ptr->next_in_no++; 1950 if (unlikely(l_ptr->oldest_deferred_in)) 1951 head = link_insert_deferred_queue(l_ptr, 1952 head); 1953 if (likely(msg_is_dest(msg, tipc_own_addr))) { 1954 deliver: 1955 if (likely(msg_isdata(msg))) { 1956 tipc_node_unlock(n_ptr); 1957 tipc_port_recv_msg(buf); 1958 continue; 1959 } 1960 switch (msg_user(msg)) { 1961 case MSG_BUNDLER: 1962 l_ptr->stats.recv_bundles++; 1963 l_ptr->stats.recv_bundled += 1964 msg_msgcnt(msg); 1965 tipc_node_unlock(n_ptr); 1966 tipc_link_recv_bundle(buf); 1967 continue; 1968 case ROUTE_DISTRIBUTOR: 1969 tipc_node_unlock(n_ptr); 1970 tipc_cltr_recv_routing_table(buf); 1971 continue; 1972 case NAME_DISTRIBUTOR: 1973 tipc_node_unlock(n_ptr); 1974 tipc_named_recv(buf); 1975 continue; 1976 case CONN_MANAGER: 1977 tipc_node_unlock(n_ptr); 1978 tipc_port_recv_proto_msg(buf); 1979 continue; 1980 case MSG_FRAGMENTER: 1981 l_ptr->stats.recv_fragments++; 1982 if (tipc_link_recv_fragment(&l_ptr->defragm_buf, 1983 &buf, &msg)) { 1984 l_ptr->stats.recv_fragmented++; 1985 goto deliver; 1986 } 1987 break; 1988 case CHANGEOVER_PROTOCOL: 1989 type = msg_type(msg); 1990 if (link_recv_changeover_msg(&l_ptr, &buf)) { 1991 msg = buf_msg(buf); 1992 seq_no = msg_seqno(msg); 1993 if (type == ORIGINAL_MSG) 1994 goto deliver; 1995 goto protocol_check; 1996 } 1997 break; 1998 } 1999 } 2000 tipc_node_unlock(n_ptr); 2001 tipc_net_route_msg(buf); 2002 continue; 2003 } 2004 link_handle_out_of_seq_msg(l_ptr, buf); 2005 head = link_insert_deferred_queue(l_ptr, head); 2006 tipc_node_unlock(n_ptr); 2007 continue; 2008 } 2009 2010 if (msg_user(msg) == LINK_PROTOCOL) { 2011 link_recv_proto_msg(l_ptr, buf); 2012 head = link_insert_deferred_queue(l_ptr, head); 2013 tipc_node_unlock(n_ptr); 2014 continue; 2015 } 2016 msg_dbg(msg,"NSEQ<REC<"); 2017 link_state_event(l_ptr, TRAFFIC_MSG_EVT); 2018 2019 if (link_working_working(l_ptr)) { 2020 /* Re-insert in front of queue */ 2021 msg_dbg(msg,"RECV-REINS:"); 2022 buf->next = head; 2023 head = buf; 2024 tipc_node_unlock(n_ptr); 2025 continue; 2026 } 2027 tipc_node_unlock(n_ptr); 2028 cont: 2029 buf_discard(buf); 2030 } 2031 read_unlock_bh(&tipc_net_lock); 2032 } 2033 2034 /* 2035 * link_defer_buf(): Sort a received out-of-sequence packet 2036 * into the deferred reception queue. 2037 * Returns the increase of the queue length,i.e. 0 or 1 2038 */ 2039 2040 u32 tipc_link_defer_pkt(struct sk_buff **head, 2041 struct sk_buff **tail, 2042 struct sk_buff *buf) 2043 { 2044 struct sk_buff *prev = NULL; 2045 struct sk_buff *crs = *head; 2046 u32 seq_no = msg_seqno(buf_msg(buf)); 2047 2048 buf->next = NULL; 2049 2050 /* Empty queue ? */ 2051 if (*head == NULL) { 2052 *head = *tail = buf; 2053 return 1; 2054 } 2055 2056 /* Last ? */ 2057 if (less(msg_seqno(buf_msg(*tail)), seq_no)) { 2058 (*tail)->next = buf; 2059 *tail = buf; 2060 return 1; 2061 } 2062 2063 /* Scan through queue and sort it in */ 2064 do { 2065 struct tipc_msg *msg = buf_msg(crs); 2066 2067 if (less(seq_no, msg_seqno(msg))) { 2068 buf->next = crs; 2069 if (prev) 2070 prev->next = buf; 2071 else 2072 *head = buf; 2073 return 1; 2074 } 2075 if (seq_no == msg_seqno(msg)) { 2076 break; 2077 } 2078 prev = crs; 2079 crs = crs->next; 2080 } 2081 while (crs); 2082 2083 /* Message is a duplicate of an existing message */ 2084 2085 buf_discard(buf); 2086 return 0; 2087 } 2088 2089 /** 2090 * link_handle_out_of_seq_msg - handle arrival of out-of-sequence packet 2091 */ 2092 2093 static void link_handle_out_of_seq_msg(struct link *l_ptr, 2094 struct sk_buff *buf) 2095 { 2096 u32 seq_no = msg_seqno(buf_msg(buf)); 2097 2098 if (likely(msg_user(buf_msg(buf)) == LINK_PROTOCOL)) { 2099 link_recv_proto_msg(l_ptr, buf); 2100 return; 2101 } 2102 2103 dbg("rx OOS msg: seq_no %u, expecting %u (%u)\n", 2104 seq_no, mod(l_ptr->next_in_no), l_ptr->next_in_no); 2105 2106 /* Record OOS packet arrival (force mismatch on next timeout) */ 2107 2108 l_ptr->checkpoint--; 2109 2110 /* 2111 * Discard packet if a duplicate; otherwise add it to deferred queue 2112 * and notify peer of gap as per protocol specification 2113 */ 2114 2115 if (less(seq_no, mod(l_ptr->next_in_no))) { 2116 l_ptr->stats.duplicates++; 2117 buf_discard(buf); 2118 return; 2119 } 2120 2121 if (tipc_link_defer_pkt(&l_ptr->oldest_deferred_in, 2122 &l_ptr->newest_deferred_in, buf)) { 2123 l_ptr->deferred_inqueue_sz++; 2124 l_ptr->stats.deferred_recv++; 2125 if ((l_ptr->deferred_inqueue_sz % 16) == 1) 2126 tipc_link_send_proto_msg(l_ptr, STATE_MSG, 0, 0, 0, 0, 0); 2127 } else 2128 l_ptr->stats.duplicates++; 2129 } 2130 2131 /* 2132 * Send protocol message to the other endpoint. 2133 */ 2134 void tipc_link_send_proto_msg(struct link *l_ptr, u32 msg_typ, int probe_msg, 2135 u32 gap, u32 tolerance, u32 priority, u32 ack_mtu) 2136 { 2137 struct sk_buff *buf = NULL; 2138 struct tipc_msg *msg = l_ptr->pmsg; 2139 u32 msg_size = sizeof(l_ptr->proto_msg); 2140 2141 if (link_blocked(l_ptr)) 2142 return; 2143 msg_set_type(msg, msg_typ); 2144 msg_set_net_plane(msg, l_ptr->b_ptr->net_plane); 2145 msg_set_bcast_ack(msg, mod(l_ptr->owner->bclink.last_in)); 2146 msg_set_last_bcast(msg, tipc_bclink_get_last_sent()); 2147 2148 if (msg_typ == STATE_MSG) { 2149 u32 next_sent = mod(l_ptr->next_out_no); 2150 2151 if (!tipc_link_is_up(l_ptr)) 2152 return; 2153 if (l_ptr->next_out) 2154 next_sent = msg_seqno(buf_msg(l_ptr->next_out)); 2155 msg_set_next_sent(msg, next_sent); 2156 if (l_ptr->oldest_deferred_in) { 2157 u32 rec = msg_seqno(buf_msg(l_ptr->oldest_deferred_in)); 2158 gap = mod(rec - mod(l_ptr->next_in_no)); 2159 } 2160 msg_set_seq_gap(msg, gap); 2161 if (gap) 2162 l_ptr->stats.sent_nacks++; 2163 msg_set_link_tolerance(msg, tolerance); 2164 msg_set_linkprio(msg, priority); 2165 msg_set_max_pkt(msg, ack_mtu); 2166 msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); 2167 msg_set_probe(msg, probe_msg != 0); 2168 if (probe_msg) { 2169 u32 mtu = l_ptr->max_pkt; 2170 2171 if ((mtu < l_ptr->max_pkt_target) && 2172 link_working_working(l_ptr) && 2173 l_ptr->fsm_msg_cnt) { 2174 msg_size = (mtu + (l_ptr->max_pkt_target - mtu)/2 + 2) & ~3; 2175 if (l_ptr->max_pkt_probes == 10) { 2176 l_ptr->max_pkt_target = (msg_size - 4); 2177 l_ptr->max_pkt_probes = 0; 2178 msg_size = (mtu + (l_ptr->max_pkt_target - mtu)/2 + 2) & ~3; 2179 } 2180 l_ptr->max_pkt_probes++; 2181 } 2182 2183 l_ptr->stats.sent_probes++; 2184 } 2185 l_ptr->stats.sent_states++; 2186 } else { /* RESET_MSG or ACTIVATE_MSG */ 2187 msg_set_ack(msg, mod(l_ptr->reset_checkpoint - 1)); 2188 msg_set_seq_gap(msg, 0); 2189 msg_set_next_sent(msg, 1); 2190 msg_set_link_tolerance(msg, l_ptr->tolerance); 2191 msg_set_linkprio(msg, l_ptr->priority); 2192 msg_set_max_pkt(msg, l_ptr->max_pkt_target); 2193 } 2194 2195 if (tipc_node_has_redundant_links(l_ptr->owner)) { 2196 msg_set_redundant_link(msg); 2197 } else { 2198 msg_clear_redundant_link(msg); 2199 } 2200 msg_set_linkprio(msg, l_ptr->priority); 2201 2202 /* Ensure sequence number will not fit : */ 2203 2204 msg_set_seqno(msg, mod(l_ptr->next_out_no + (0xffff/2))); 2205 2206 /* Congestion? */ 2207 2208 if (tipc_bearer_congested(l_ptr->b_ptr, l_ptr)) { 2209 if (!l_ptr->proto_msg_queue) { 2210 l_ptr->proto_msg_queue = 2211 buf_acquire(sizeof(l_ptr->proto_msg)); 2212 } 2213 buf = l_ptr->proto_msg_queue; 2214 if (!buf) 2215 return; 2216 skb_copy_to_linear_data(buf, msg, sizeof(l_ptr->proto_msg)); 2217 return; 2218 } 2219 msg_set_timestamp(msg, jiffies_to_msecs(jiffies)); 2220 2221 /* Message can be sent */ 2222 2223 msg_dbg(msg, ">>"); 2224 2225 buf = buf_acquire(msg_size); 2226 if (!buf) 2227 return; 2228 2229 skb_copy_to_linear_data(buf, msg, sizeof(l_ptr->proto_msg)); 2230 msg_set_size(buf_msg(buf), msg_size); 2231 2232 if (tipc_bearer_send(l_ptr->b_ptr, buf, &l_ptr->media_addr)) { 2233 l_ptr->unacked_window = 0; 2234 buf_discard(buf); 2235 return; 2236 } 2237 2238 /* New congestion */ 2239 tipc_bearer_schedule(l_ptr->b_ptr, l_ptr); 2240 l_ptr->proto_msg_queue = buf; 2241 l_ptr->stats.bearer_congs++; 2242 } 2243 2244 /* 2245 * Receive protocol message : 2246 * Note that network plane id propagates through the network, and may 2247 * change at any time. The node with lowest address rules 2248 */ 2249 2250 static void link_recv_proto_msg(struct link *l_ptr, struct sk_buff *buf) 2251 { 2252 u32 rec_gap = 0; 2253 u32 max_pkt_info; 2254 u32 max_pkt_ack; 2255 u32 msg_tol; 2256 struct tipc_msg *msg = buf_msg(buf); 2257 2258 dbg("AT(%u):", jiffies_to_msecs(jiffies)); 2259 msg_dbg(msg, "<<"); 2260 if (link_blocked(l_ptr)) 2261 goto exit; 2262 2263 /* record unnumbered packet arrival (force mismatch on next timeout) */ 2264 2265 l_ptr->checkpoint--; 2266 2267 if (l_ptr->b_ptr->net_plane != msg_net_plane(msg)) 2268 if (tipc_own_addr > msg_prevnode(msg)) 2269 l_ptr->b_ptr->net_plane = msg_net_plane(msg); 2270 2271 l_ptr->owner->permit_changeover = msg_redundant_link(msg); 2272 2273 switch (msg_type(msg)) { 2274 2275 case RESET_MSG: 2276 if (!link_working_unknown(l_ptr) && 2277 (l_ptr->peer_session != INVALID_SESSION)) { 2278 if (msg_session(msg) == l_ptr->peer_session) { 2279 dbg("Duplicate RESET: %u<->%u\n", 2280 msg_session(msg), l_ptr->peer_session); 2281 break; /* duplicate: ignore */ 2282 } 2283 } 2284 /* fall thru' */ 2285 case ACTIVATE_MSG: 2286 /* Update link settings according other endpoint's values */ 2287 2288 strcpy((strrchr(l_ptr->name, ':') + 1), (char *)msg_data(msg)); 2289 2290 if ((msg_tol = msg_link_tolerance(msg)) && 2291 (msg_tol > l_ptr->tolerance)) 2292 link_set_supervision_props(l_ptr, msg_tol); 2293 2294 if (msg_linkprio(msg) > l_ptr->priority) 2295 l_ptr->priority = msg_linkprio(msg); 2296 2297 max_pkt_info = msg_max_pkt(msg); 2298 if (max_pkt_info) { 2299 if (max_pkt_info < l_ptr->max_pkt_target) 2300 l_ptr->max_pkt_target = max_pkt_info; 2301 if (l_ptr->max_pkt > l_ptr->max_pkt_target) 2302 l_ptr->max_pkt = l_ptr->max_pkt_target; 2303 } else { 2304 l_ptr->max_pkt = l_ptr->max_pkt_target; 2305 } 2306 l_ptr->owner->bclink.supported = (max_pkt_info != 0); 2307 2308 link_state_event(l_ptr, msg_type(msg)); 2309 2310 l_ptr->peer_session = msg_session(msg); 2311 l_ptr->peer_bearer_id = msg_bearer_id(msg); 2312 2313 /* Synchronize broadcast sequence numbers */ 2314 if (!tipc_node_has_redundant_links(l_ptr->owner)) { 2315 l_ptr->owner->bclink.last_in = mod(msg_last_bcast(msg)); 2316 } 2317 break; 2318 case STATE_MSG: 2319 2320 if ((msg_tol = msg_link_tolerance(msg))) 2321 link_set_supervision_props(l_ptr, msg_tol); 2322 2323 if (msg_linkprio(msg) && 2324 (msg_linkprio(msg) != l_ptr->priority)) { 2325 warn("Resetting link <%s>, priority change %u->%u\n", 2326 l_ptr->name, l_ptr->priority, msg_linkprio(msg)); 2327 l_ptr->priority = msg_linkprio(msg); 2328 tipc_link_reset(l_ptr); /* Enforce change to take effect */ 2329 break; 2330 } 2331 link_state_event(l_ptr, TRAFFIC_MSG_EVT); 2332 l_ptr->stats.recv_states++; 2333 if (link_reset_unknown(l_ptr)) 2334 break; 2335 2336 if (less_eq(mod(l_ptr->next_in_no), msg_next_sent(msg))) { 2337 rec_gap = mod(msg_next_sent(msg) - 2338 mod(l_ptr->next_in_no)); 2339 } 2340 2341 max_pkt_ack = msg_max_pkt(msg); 2342 if (max_pkt_ack > l_ptr->max_pkt) { 2343 dbg("Link <%s> updated MTU %u -> %u\n", 2344 l_ptr->name, l_ptr->max_pkt, max_pkt_ack); 2345 l_ptr->max_pkt = max_pkt_ack; 2346 l_ptr->max_pkt_probes = 0; 2347 } 2348 2349 max_pkt_ack = 0; 2350 if (msg_probe(msg)) { 2351 l_ptr->stats.recv_probes++; 2352 if (msg_size(msg) > sizeof(l_ptr->proto_msg)) { 2353 max_pkt_ack = msg_size(msg); 2354 } 2355 } 2356 2357 /* Protocol message before retransmits, reduce loss risk */ 2358 2359 tipc_bclink_check_gap(l_ptr->owner, msg_last_bcast(msg)); 2360 2361 if (rec_gap || (msg_probe(msg))) { 2362 tipc_link_send_proto_msg(l_ptr, STATE_MSG, 2363 0, rec_gap, 0, 0, max_pkt_ack); 2364 } 2365 if (msg_seq_gap(msg)) { 2366 msg_dbg(msg, "With Gap:"); 2367 l_ptr->stats.recv_nacks++; 2368 tipc_link_retransmit(l_ptr, l_ptr->first_out, 2369 msg_seq_gap(msg)); 2370 } 2371 break; 2372 default: 2373 msg_dbg(buf_msg(buf), "<DISCARDING UNKNOWN<"); 2374 } 2375 exit: 2376 buf_discard(buf); 2377 } 2378 2379 2380 /* 2381 * tipc_link_tunnel(): Send one message via a link belonging to 2382 * another bearer. Owner node is locked. 2383 */ 2384 void tipc_link_tunnel(struct link *l_ptr, 2385 struct tipc_msg *tunnel_hdr, 2386 struct tipc_msg *msg, 2387 u32 selector) 2388 { 2389 struct link *tunnel; 2390 struct sk_buff *buf; 2391 u32 length = msg_size(msg); 2392 2393 tunnel = l_ptr->owner->active_links[selector & 1]; 2394 if (!tipc_link_is_up(tunnel)) { 2395 warn("Link changeover error, " 2396 "tunnel link no longer available\n"); 2397 return; 2398 } 2399 msg_set_size(tunnel_hdr, length + INT_H_SIZE); 2400 buf = buf_acquire(length + INT_H_SIZE); 2401 if (!buf) { 2402 warn("Link changeover error, " 2403 "unable to send tunnel msg\n"); 2404 return; 2405 } 2406 skb_copy_to_linear_data(buf, tunnel_hdr, INT_H_SIZE); 2407 skb_copy_to_linear_data_offset(buf, INT_H_SIZE, msg, length); 2408 dbg("%c->%c:", l_ptr->b_ptr->net_plane, tunnel->b_ptr->net_plane); 2409 msg_dbg(buf_msg(buf), ">SEND>"); 2410 tipc_link_send_buf(tunnel, buf); 2411 } 2412 2413 2414 2415 /* 2416 * changeover(): Send whole message queue via the remaining link 2417 * Owner node is locked. 2418 */ 2419 2420 void tipc_link_changeover(struct link *l_ptr) 2421 { 2422 u32 msgcount = l_ptr->out_queue_size; 2423 struct sk_buff *crs = l_ptr->first_out; 2424 struct link *tunnel = l_ptr->owner->active_links[0]; 2425 struct tipc_msg tunnel_hdr; 2426 int split_bundles; 2427 2428 if (!tunnel) 2429 return; 2430 2431 if (!l_ptr->owner->permit_changeover) { 2432 warn("Link changeover error, " 2433 "peer did not permit changeover\n"); 2434 return; 2435 } 2436 2437 msg_init(&tunnel_hdr, CHANGEOVER_PROTOCOL, 2438 ORIGINAL_MSG, INT_H_SIZE, l_ptr->addr); 2439 msg_set_bearer_id(&tunnel_hdr, l_ptr->peer_bearer_id); 2440 msg_set_msgcnt(&tunnel_hdr, msgcount); 2441 dbg("Link changeover requires %u tunnel messages\n", msgcount); 2442 2443 if (!l_ptr->first_out) { 2444 struct sk_buff *buf; 2445 2446 buf = buf_acquire(INT_H_SIZE); 2447 if (buf) { 2448 skb_copy_to_linear_data(buf, &tunnel_hdr, INT_H_SIZE); 2449 msg_set_size(&tunnel_hdr, INT_H_SIZE); 2450 dbg("%c->%c:", l_ptr->b_ptr->net_plane, 2451 tunnel->b_ptr->net_plane); 2452 msg_dbg(&tunnel_hdr, "EMPTY>SEND>"); 2453 tipc_link_send_buf(tunnel, buf); 2454 } else { 2455 warn("Link changeover error, " 2456 "unable to send changeover msg\n"); 2457 } 2458 return; 2459 } 2460 2461 split_bundles = (l_ptr->owner->active_links[0] != 2462 l_ptr->owner->active_links[1]); 2463 2464 while (crs) { 2465 struct tipc_msg *msg = buf_msg(crs); 2466 2467 if ((msg_user(msg) == MSG_BUNDLER) && split_bundles) { 2468 struct tipc_msg *m = msg_get_wrapped(msg); 2469 unchar* pos = (unchar*)m; 2470 2471 msgcount = msg_msgcnt(msg); 2472 while (msgcount--) { 2473 msg_set_seqno(m,msg_seqno(msg)); 2474 tipc_link_tunnel(l_ptr, &tunnel_hdr, m, 2475 msg_link_selector(m)); 2476 pos += align(msg_size(m)); 2477 m = (struct tipc_msg *)pos; 2478 } 2479 } else { 2480 tipc_link_tunnel(l_ptr, &tunnel_hdr, msg, 2481 msg_link_selector(msg)); 2482 } 2483 crs = crs->next; 2484 } 2485 } 2486 2487 void tipc_link_send_duplicate(struct link *l_ptr, struct link *tunnel) 2488 { 2489 struct sk_buff *iter; 2490 struct tipc_msg tunnel_hdr; 2491 2492 msg_init(&tunnel_hdr, CHANGEOVER_PROTOCOL, 2493 DUPLICATE_MSG, INT_H_SIZE, l_ptr->addr); 2494 msg_set_msgcnt(&tunnel_hdr, l_ptr->out_queue_size); 2495 msg_set_bearer_id(&tunnel_hdr, l_ptr->peer_bearer_id); 2496 iter = l_ptr->first_out; 2497 while (iter) { 2498 struct sk_buff *outbuf; 2499 struct tipc_msg *msg = buf_msg(iter); 2500 u32 length = msg_size(msg); 2501 2502 if (msg_user(msg) == MSG_BUNDLER) 2503 msg_set_type(msg, CLOSED_MSG); 2504 msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); /* Update */ 2505 msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); 2506 msg_set_size(&tunnel_hdr, length + INT_H_SIZE); 2507 outbuf = buf_acquire(length + INT_H_SIZE); 2508 if (outbuf == NULL) { 2509 warn("Link changeover error, " 2510 "unable to send duplicate msg\n"); 2511 return; 2512 } 2513 skb_copy_to_linear_data(outbuf, &tunnel_hdr, INT_H_SIZE); 2514 skb_copy_to_linear_data_offset(outbuf, INT_H_SIZE, iter->data, 2515 length); 2516 dbg("%c->%c:", l_ptr->b_ptr->net_plane, 2517 tunnel->b_ptr->net_plane); 2518 msg_dbg(buf_msg(outbuf), ">SEND>"); 2519 tipc_link_send_buf(tunnel, outbuf); 2520 if (!tipc_link_is_up(l_ptr)) 2521 return; 2522 iter = iter->next; 2523 } 2524 } 2525 2526 2527 2528 /** 2529 * buf_extract - extracts embedded TIPC message from another message 2530 * @skb: encapsulating message buffer 2531 * @from_pos: offset to extract from 2532 * 2533 * Returns a new message buffer containing an embedded message. The 2534 * encapsulating message itself is left unchanged. 2535 */ 2536 2537 static struct sk_buff *buf_extract(struct sk_buff *skb, u32 from_pos) 2538 { 2539 struct tipc_msg *msg = (struct tipc_msg *)(skb->data + from_pos); 2540 u32 size = msg_size(msg); 2541 struct sk_buff *eb; 2542 2543 eb = buf_acquire(size); 2544 if (eb) 2545 skb_copy_to_linear_data(eb, msg, size); 2546 return eb; 2547 } 2548 2549 /* 2550 * link_recv_changeover_msg(): Receive tunneled packet sent 2551 * via other link. Node is locked. Return extracted buffer. 2552 */ 2553 2554 static int link_recv_changeover_msg(struct link **l_ptr, 2555 struct sk_buff **buf) 2556 { 2557 struct sk_buff *tunnel_buf = *buf; 2558 struct link *dest_link; 2559 struct tipc_msg *msg; 2560 struct tipc_msg *tunnel_msg = buf_msg(tunnel_buf); 2561 u32 msg_typ = msg_type(tunnel_msg); 2562 u32 msg_count = msg_msgcnt(tunnel_msg); 2563 2564 dest_link = (*l_ptr)->owner->links[msg_bearer_id(tunnel_msg)]; 2565 if (!dest_link) { 2566 msg_dbg(tunnel_msg, "NOLINK/<REC<"); 2567 goto exit; 2568 } 2569 if (dest_link == *l_ptr) { 2570 err("Unexpected changeover message on link <%s>\n", 2571 (*l_ptr)->name); 2572 goto exit; 2573 } 2574 dbg("%c<-%c:", dest_link->b_ptr->net_plane, 2575 (*l_ptr)->b_ptr->net_plane); 2576 *l_ptr = dest_link; 2577 msg = msg_get_wrapped(tunnel_msg); 2578 2579 if (msg_typ == DUPLICATE_MSG) { 2580 if (less(msg_seqno(msg), mod(dest_link->next_in_no))) { 2581 msg_dbg(tunnel_msg, "DROP/<REC<"); 2582 goto exit; 2583 } 2584 *buf = buf_extract(tunnel_buf,INT_H_SIZE); 2585 if (*buf == NULL) { 2586 warn("Link changeover error, duplicate msg dropped\n"); 2587 goto exit; 2588 } 2589 msg_dbg(tunnel_msg, "TNL<REC<"); 2590 buf_discard(tunnel_buf); 2591 return 1; 2592 } 2593 2594 /* First original message ?: */ 2595 2596 if (tipc_link_is_up(dest_link)) { 2597 msg_dbg(tunnel_msg, "UP/FIRST/<REC<"); 2598 info("Resetting link <%s>, changeover initiated by peer\n", 2599 dest_link->name); 2600 tipc_link_reset(dest_link); 2601 dest_link->exp_msg_count = msg_count; 2602 dbg("Expecting %u tunnelled messages\n", msg_count); 2603 if (!msg_count) 2604 goto exit; 2605 } else if (dest_link->exp_msg_count == START_CHANGEOVER) { 2606 msg_dbg(tunnel_msg, "BLK/FIRST/<REC<"); 2607 dest_link->exp_msg_count = msg_count; 2608 dbg("Expecting %u tunnelled messages\n", msg_count); 2609 if (!msg_count) 2610 goto exit; 2611 } 2612 2613 /* Receive original message */ 2614 2615 if (dest_link->exp_msg_count == 0) { 2616 warn("Link switchover error, " 2617 "got too many tunnelled messages\n"); 2618 msg_dbg(tunnel_msg, "OVERDUE/DROP/<REC<"); 2619 dbg_print_link(dest_link, "LINK:"); 2620 goto exit; 2621 } 2622 dest_link->exp_msg_count--; 2623 if (less(msg_seqno(msg), dest_link->reset_checkpoint)) { 2624 msg_dbg(tunnel_msg, "DROP/DUPL/<REC<"); 2625 goto exit; 2626 } else { 2627 *buf = buf_extract(tunnel_buf, INT_H_SIZE); 2628 if (*buf != NULL) { 2629 msg_dbg(tunnel_msg, "TNL<REC<"); 2630 buf_discard(tunnel_buf); 2631 return 1; 2632 } else { 2633 warn("Link changeover error, original msg dropped\n"); 2634 } 2635 } 2636 exit: 2637 *buf = NULL; 2638 buf_discard(tunnel_buf); 2639 return 0; 2640 } 2641 2642 /* 2643 * Bundler functionality: 2644 */ 2645 void tipc_link_recv_bundle(struct sk_buff *buf) 2646 { 2647 u32 msgcount = msg_msgcnt(buf_msg(buf)); 2648 u32 pos = INT_H_SIZE; 2649 struct sk_buff *obuf; 2650 2651 msg_dbg(buf_msg(buf), "<BNDL<: "); 2652 while (msgcount--) { 2653 obuf = buf_extract(buf, pos); 2654 if (obuf == NULL) { 2655 warn("Link unable to unbundle message(s)\n"); 2656 break; 2657 } 2658 pos += align(msg_size(buf_msg(obuf))); 2659 msg_dbg(buf_msg(obuf), " /"); 2660 tipc_net_route_msg(obuf); 2661 } 2662 buf_discard(buf); 2663 } 2664 2665 /* 2666 * Fragmentation/defragmentation: 2667 */ 2668 2669 2670 /* 2671 * tipc_link_send_long_buf: Entry for buffers needing fragmentation. 2672 * The buffer is complete, inclusive total message length. 2673 * Returns user data length. 2674 */ 2675 int tipc_link_send_long_buf(struct link *l_ptr, struct sk_buff *buf) 2676 { 2677 struct tipc_msg *inmsg = buf_msg(buf); 2678 struct tipc_msg fragm_hdr; 2679 u32 insize = msg_size(inmsg); 2680 u32 dsz = msg_data_sz(inmsg); 2681 unchar *crs = buf->data; 2682 u32 rest = insize; 2683 u32 pack_sz = link_max_pkt(l_ptr); 2684 u32 fragm_sz = pack_sz - INT_H_SIZE; 2685 u32 fragm_no = 1; 2686 u32 destaddr; 2687 2688 if (msg_short(inmsg)) 2689 destaddr = l_ptr->addr; 2690 else 2691 destaddr = msg_destnode(inmsg); 2692 2693 if (msg_routed(inmsg)) 2694 msg_set_prevnode(inmsg, tipc_own_addr); 2695 2696 /* Prepare reusable fragment header: */ 2697 2698 msg_init(&fragm_hdr, MSG_FRAGMENTER, FIRST_FRAGMENT, 2699 INT_H_SIZE, destaddr); 2700 msg_set_link_selector(&fragm_hdr, msg_link_selector(inmsg)); 2701 msg_set_long_msgno(&fragm_hdr, mod(l_ptr->long_msg_seq_no++)); 2702 msg_set_fragm_no(&fragm_hdr, fragm_no); 2703 l_ptr->stats.sent_fragmented++; 2704 2705 /* Chop up message: */ 2706 2707 while (rest > 0) { 2708 struct sk_buff *fragm; 2709 2710 if (rest <= fragm_sz) { 2711 fragm_sz = rest; 2712 msg_set_type(&fragm_hdr, LAST_FRAGMENT); 2713 } 2714 fragm = buf_acquire(fragm_sz + INT_H_SIZE); 2715 if (fragm == NULL) { 2716 warn("Link unable to fragment message\n"); 2717 dsz = -ENOMEM; 2718 goto exit; 2719 } 2720 msg_set_size(&fragm_hdr, fragm_sz + INT_H_SIZE); 2721 skb_copy_to_linear_data(fragm, &fragm_hdr, INT_H_SIZE); 2722 skb_copy_to_linear_data_offset(fragm, INT_H_SIZE, crs, 2723 fragm_sz); 2724 /* Send queued messages first, if any: */ 2725 2726 l_ptr->stats.sent_fragments++; 2727 tipc_link_send_buf(l_ptr, fragm); 2728 if (!tipc_link_is_up(l_ptr)) 2729 return dsz; 2730 msg_set_fragm_no(&fragm_hdr, ++fragm_no); 2731 rest -= fragm_sz; 2732 crs += fragm_sz; 2733 msg_set_type(&fragm_hdr, FRAGMENT); 2734 } 2735 exit: 2736 buf_discard(buf); 2737 return dsz; 2738 } 2739 2740 /* 2741 * A pending message being re-assembled must store certain values 2742 * to handle subsequent fragments correctly. The following functions 2743 * help storing these values in unused, available fields in the 2744 * pending message. This makes dynamic memory allocation unecessary. 2745 */ 2746 2747 static void set_long_msg_seqno(struct sk_buff *buf, u32 seqno) 2748 { 2749 msg_set_seqno(buf_msg(buf), seqno); 2750 } 2751 2752 static u32 get_fragm_size(struct sk_buff *buf) 2753 { 2754 return msg_ack(buf_msg(buf)); 2755 } 2756 2757 static void set_fragm_size(struct sk_buff *buf, u32 sz) 2758 { 2759 msg_set_ack(buf_msg(buf), sz); 2760 } 2761 2762 static u32 get_expected_frags(struct sk_buff *buf) 2763 { 2764 return msg_bcast_ack(buf_msg(buf)); 2765 } 2766 2767 static void set_expected_frags(struct sk_buff *buf, u32 exp) 2768 { 2769 msg_set_bcast_ack(buf_msg(buf), exp); 2770 } 2771 2772 static u32 get_timer_cnt(struct sk_buff *buf) 2773 { 2774 return msg_reroute_cnt(buf_msg(buf)); 2775 } 2776 2777 static void incr_timer_cnt(struct sk_buff *buf) 2778 { 2779 msg_incr_reroute_cnt(buf_msg(buf)); 2780 } 2781 2782 /* 2783 * tipc_link_recv_fragment(): Called with node lock on. Returns 2784 * the reassembled buffer if message is complete. 2785 */ 2786 int tipc_link_recv_fragment(struct sk_buff **pending, struct sk_buff **fb, 2787 struct tipc_msg **m) 2788 { 2789 struct sk_buff *prev = NULL; 2790 struct sk_buff *fbuf = *fb; 2791 struct tipc_msg *fragm = buf_msg(fbuf); 2792 struct sk_buff *pbuf = *pending; 2793 u32 long_msg_seq_no = msg_long_msgno(fragm); 2794 2795 *fb = NULL; 2796 msg_dbg(fragm,"FRG<REC<"); 2797 2798 /* Is there an incomplete message waiting for this fragment? */ 2799 2800 while (pbuf && ((msg_seqno(buf_msg(pbuf)) != long_msg_seq_no) || 2801 (msg_orignode(fragm) != msg_orignode(buf_msg(pbuf))))) { 2802 prev = pbuf; 2803 pbuf = pbuf->next; 2804 } 2805 2806 if (!pbuf && (msg_type(fragm) == FIRST_FRAGMENT)) { 2807 struct tipc_msg *imsg = (struct tipc_msg *)msg_data(fragm); 2808 u32 msg_sz = msg_size(imsg); 2809 u32 fragm_sz = msg_data_sz(fragm); 2810 u32 exp_fragm_cnt = msg_sz/fragm_sz + !!(msg_sz % fragm_sz); 2811 u32 max = TIPC_MAX_USER_MSG_SIZE + LONG_H_SIZE; 2812 if (msg_type(imsg) == TIPC_MCAST_MSG) 2813 max = TIPC_MAX_USER_MSG_SIZE + MCAST_H_SIZE; 2814 if (msg_size(imsg) > max) { 2815 msg_dbg(fragm,"<REC<Oversized: "); 2816 buf_discard(fbuf); 2817 return 0; 2818 } 2819 pbuf = buf_acquire(msg_size(imsg)); 2820 if (pbuf != NULL) { 2821 pbuf->next = *pending; 2822 *pending = pbuf; 2823 skb_copy_to_linear_data(pbuf, imsg, 2824 msg_data_sz(fragm)); 2825 /* Prepare buffer for subsequent fragments. */ 2826 2827 set_long_msg_seqno(pbuf, long_msg_seq_no); 2828 set_fragm_size(pbuf,fragm_sz); 2829 set_expected_frags(pbuf,exp_fragm_cnt - 1); 2830 } else { 2831 warn("Link unable to reassemble fragmented message\n"); 2832 } 2833 buf_discard(fbuf); 2834 return 0; 2835 } else if (pbuf && (msg_type(fragm) != FIRST_FRAGMENT)) { 2836 u32 dsz = msg_data_sz(fragm); 2837 u32 fsz = get_fragm_size(pbuf); 2838 u32 crs = ((msg_fragm_no(fragm) - 1) * fsz); 2839 u32 exp_frags = get_expected_frags(pbuf) - 1; 2840 skb_copy_to_linear_data_offset(pbuf, crs, 2841 msg_data(fragm), dsz); 2842 buf_discard(fbuf); 2843 2844 /* Is message complete? */ 2845 2846 if (exp_frags == 0) { 2847 if (prev) 2848 prev->next = pbuf->next; 2849 else 2850 *pending = pbuf->next; 2851 msg_reset_reroute_cnt(buf_msg(pbuf)); 2852 *fb = pbuf; 2853 *m = buf_msg(pbuf); 2854 return 1; 2855 } 2856 set_expected_frags(pbuf,exp_frags); 2857 return 0; 2858 } 2859 dbg(" Discarding orphan fragment %x\n",fbuf); 2860 msg_dbg(fragm,"ORPHAN:"); 2861 dbg("Pending long buffers:\n"); 2862 dbg_print_buf_chain(*pending); 2863 buf_discard(fbuf); 2864 return 0; 2865 } 2866 2867 /** 2868 * link_check_defragm_bufs - flush stale incoming message fragments 2869 * @l_ptr: pointer to link 2870 */ 2871 2872 static void link_check_defragm_bufs(struct link *l_ptr) 2873 { 2874 struct sk_buff *prev = NULL; 2875 struct sk_buff *next = NULL; 2876 struct sk_buff *buf = l_ptr->defragm_buf; 2877 2878 if (!buf) 2879 return; 2880 if (!link_working_working(l_ptr)) 2881 return; 2882 while (buf) { 2883 u32 cnt = get_timer_cnt(buf); 2884 2885 next = buf->next; 2886 if (cnt < 4) { 2887 incr_timer_cnt(buf); 2888 prev = buf; 2889 } else { 2890 dbg(" Discarding incomplete long buffer\n"); 2891 msg_dbg(buf_msg(buf), "LONG:"); 2892 dbg_print_link(l_ptr, "curr:"); 2893 dbg("Pending long buffers:\n"); 2894 dbg_print_buf_chain(l_ptr->defragm_buf); 2895 if (prev) 2896 prev->next = buf->next; 2897 else 2898 l_ptr->defragm_buf = buf->next; 2899 buf_discard(buf); 2900 } 2901 buf = next; 2902 } 2903 } 2904 2905 2906 2907 static void link_set_supervision_props(struct link *l_ptr, u32 tolerance) 2908 { 2909 l_ptr->tolerance = tolerance; 2910 l_ptr->continuity_interval = 2911 ((tolerance / 4) > 500) ? 500 : tolerance / 4; 2912 l_ptr->abort_limit = tolerance / (l_ptr->continuity_interval / 4); 2913 } 2914 2915 2916 void tipc_link_set_queue_limits(struct link *l_ptr, u32 window) 2917 { 2918 /* Data messages from this node, inclusive FIRST_FRAGM */ 2919 l_ptr->queue_limit[TIPC_LOW_IMPORTANCE] = window; 2920 l_ptr->queue_limit[TIPC_MEDIUM_IMPORTANCE] = (window / 3) * 4; 2921 l_ptr->queue_limit[TIPC_HIGH_IMPORTANCE] = (window / 3) * 5; 2922 l_ptr->queue_limit[TIPC_CRITICAL_IMPORTANCE] = (window / 3) * 6; 2923 /* Transiting data messages,inclusive FIRST_FRAGM */ 2924 l_ptr->queue_limit[TIPC_LOW_IMPORTANCE + 4] = 300; 2925 l_ptr->queue_limit[TIPC_MEDIUM_IMPORTANCE + 4] = 600; 2926 l_ptr->queue_limit[TIPC_HIGH_IMPORTANCE + 4] = 900; 2927 l_ptr->queue_limit[TIPC_CRITICAL_IMPORTANCE + 4] = 1200; 2928 l_ptr->queue_limit[CONN_MANAGER] = 1200; 2929 l_ptr->queue_limit[ROUTE_DISTRIBUTOR] = 1200; 2930 l_ptr->queue_limit[CHANGEOVER_PROTOCOL] = 2500; 2931 l_ptr->queue_limit[NAME_DISTRIBUTOR] = 3000; 2932 /* FRAGMENT and LAST_FRAGMENT packets */ 2933 l_ptr->queue_limit[MSG_FRAGMENTER] = 4000; 2934 } 2935 2936 /** 2937 * link_find_link - locate link by name 2938 * @name - ptr to link name string 2939 * @node - ptr to area to be filled with ptr to associated node 2940 * 2941 * Caller must hold 'tipc_net_lock' to ensure node and bearer are not deleted; 2942 * this also prevents link deletion. 2943 * 2944 * Returns pointer to link (or 0 if invalid link name). 2945 */ 2946 2947 static struct link *link_find_link(const char *name, struct tipc_node **node) 2948 { 2949 struct link_name link_name_parts; 2950 struct bearer *b_ptr; 2951 struct link *l_ptr; 2952 2953 if (!link_name_validate(name, &link_name_parts)) 2954 return NULL; 2955 2956 b_ptr = tipc_bearer_find_interface(link_name_parts.if_local); 2957 if (!b_ptr) 2958 return NULL; 2959 2960 *node = tipc_node_find(link_name_parts.addr_peer); 2961 if (!*node) 2962 return NULL; 2963 2964 l_ptr = (*node)->links[b_ptr->identity]; 2965 if (!l_ptr || strcmp(l_ptr->name, name)) 2966 return NULL; 2967 2968 return l_ptr; 2969 } 2970 2971 struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int req_tlv_space, 2972 u16 cmd) 2973 { 2974 struct tipc_link_config *args; 2975 u32 new_value; 2976 struct link *l_ptr; 2977 struct tipc_node *node; 2978 int res; 2979 2980 if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_CONFIG)) 2981 return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); 2982 2983 args = (struct tipc_link_config *)TLV_DATA(req_tlv_area); 2984 new_value = ntohl(args->value); 2985 2986 if (!strcmp(args->name, tipc_bclink_name)) { 2987 if ((cmd == TIPC_CMD_SET_LINK_WINDOW) && 2988 (tipc_bclink_set_queue_limits(new_value) == 0)) 2989 return tipc_cfg_reply_none(); 2990 return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED 2991 " (cannot change setting on broadcast link)"); 2992 } 2993 2994 read_lock_bh(&tipc_net_lock); 2995 l_ptr = link_find_link(args->name, &node); 2996 if (!l_ptr) { 2997 read_unlock_bh(&tipc_net_lock); 2998 return tipc_cfg_reply_error_string("link not found"); 2999 } 3000 3001 tipc_node_lock(node); 3002 res = -EINVAL; 3003 switch (cmd) { 3004 case TIPC_CMD_SET_LINK_TOL: 3005 if ((new_value >= TIPC_MIN_LINK_TOL) && 3006 (new_value <= TIPC_MAX_LINK_TOL)) { 3007 link_set_supervision_props(l_ptr, new_value); 3008 tipc_link_send_proto_msg(l_ptr, STATE_MSG, 3009 0, 0, new_value, 0, 0); 3010 res = 0; 3011 } 3012 break; 3013 case TIPC_CMD_SET_LINK_PRI: 3014 if ((new_value >= TIPC_MIN_LINK_PRI) && 3015 (new_value <= TIPC_MAX_LINK_PRI)) { 3016 l_ptr->priority = new_value; 3017 tipc_link_send_proto_msg(l_ptr, STATE_MSG, 3018 0, 0, 0, new_value, 0); 3019 res = 0; 3020 } 3021 break; 3022 case TIPC_CMD_SET_LINK_WINDOW: 3023 if ((new_value >= TIPC_MIN_LINK_WIN) && 3024 (new_value <= TIPC_MAX_LINK_WIN)) { 3025 tipc_link_set_queue_limits(l_ptr, new_value); 3026 res = 0; 3027 } 3028 break; 3029 } 3030 tipc_node_unlock(node); 3031 3032 read_unlock_bh(&tipc_net_lock); 3033 if (res) 3034 return tipc_cfg_reply_error_string("cannot change link setting"); 3035 3036 return tipc_cfg_reply_none(); 3037 } 3038 3039 /** 3040 * link_reset_statistics - reset link statistics 3041 * @l_ptr: pointer to link 3042 */ 3043 3044 static void link_reset_statistics(struct link *l_ptr) 3045 { 3046 memset(&l_ptr->stats, 0, sizeof(l_ptr->stats)); 3047 l_ptr->stats.sent_info = l_ptr->next_out_no; 3048 l_ptr->stats.recv_info = l_ptr->next_in_no; 3049 } 3050 3051 struct sk_buff *tipc_link_cmd_reset_stats(const void *req_tlv_area, int req_tlv_space) 3052 { 3053 char *link_name; 3054 struct link *l_ptr; 3055 struct tipc_node *node; 3056 3057 if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_NAME)) 3058 return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); 3059 3060 link_name = (char *)TLV_DATA(req_tlv_area); 3061 if (!strcmp(link_name, tipc_bclink_name)) { 3062 if (tipc_bclink_reset_stats()) 3063 return tipc_cfg_reply_error_string("link not found"); 3064 return tipc_cfg_reply_none(); 3065 } 3066 3067 read_lock_bh(&tipc_net_lock); 3068 l_ptr = link_find_link(link_name, &node); 3069 if (!l_ptr) { 3070 read_unlock_bh(&tipc_net_lock); 3071 return tipc_cfg_reply_error_string("link not found"); 3072 } 3073 3074 tipc_node_lock(node); 3075 link_reset_statistics(l_ptr); 3076 tipc_node_unlock(node); 3077 read_unlock_bh(&tipc_net_lock); 3078 return tipc_cfg_reply_none(); 3079 } 3080 3081 /** 3082 * percent - convert count to a percentage of total (rounding up or down) 3083 */ 3084 3085 static u32 percent(u32 count, u32 total) 3086 { 3087 return (count * 100 + (total / 2)) / total; 3088 } 3089 3090 /** 3091 * tipc_link_stats - print link statistics 3092 * @name: link name 3093 * @buf: print buffer area 3094 * @buf_size: size of print buffer area 3095 * 3096 * Returns length of print buffer data string (or 0 if error) 3097 */ 3098 3099 static int tipc_link_stats(const char *name, char *buf, const u32 buf_size) 3100 { 3101 struct print_buf pb; 3102 struct link *l_ptr; 3103 struct tipc_node *node; 3104 char *status; 3105 u32 profile_total = 0; 3106 3107 if (!strcmp(name, tipc_bclink_name)) 3108 return tipc_bclink_stats(buf, buf_size); 3109 3110 tipc_printbuf_init(&pb, buf, buf_size); 3111 3112 read_lock_bh(&tipc_net_lock); 3113 l_ptr = link_find_link(name, &node); 3114 if (!l_ptr) { 3115 read_unlock_bh(&tipc_net_lock); 3116 return 0; 3117 } 3118 tipc_node_lock(node); 3119 3120 if (tipc_link_is_active(l_ptr)) 3121 status = "ACTIVE"; 3122 else if (tipc_link_is_up(l_ptr)) 3123 status = "STANDBY"; 3124 else 3125 status = "DEFUNCT"; 3126 tipc_printf(&pb, "Link <%s>\n" 3127 " %s MTU:%u Priority:%u Tolerance:%u ms" 3128 " Window:%u packets\n", 3129 l_ptr->name, status, link_max_pkt(l_ptr), 3130 l_ptr->priority, l_ptr->tolerance, l_ptr->queue_limit[0]); 3131 tipc_printf(&pb, " RX packets:%u fragments:%u/%u bundles:%u/%u\n", 3132 l_ptr->next_in_no - l_ptr->stats.recv_info, 3133 l_ptr->stats.recv_fragments, 3134 l_ptr->stats.recv_fragmented, 3135 l_ptr->stats.recv_bundles, 3136 l_ptr->stats.recv_bundled); 3137 tipc_printf(&pb, " TX packets:%u fragments:%u/%u bundles:%u/%u\n", 3138 l_ptr->next_out_no - l_ptr->stats.sent_info, 3139 l_ptr->stats.sent_fragments, 3140 l_ptr->stats.sent_fragmented, 3141 l_ptr->stats.sent_bundles, 3142 l_ptr->stats.sent_bundled); 3143 profile_total = l_ptr->stats.msg_length_counts; 3144 if (!profile_total) 3145 profile_total = 1; 3146 tipc_printf(&pb, " TX profile sample:%u packets average:%u octets\n" 3147 " 0-64:%u%% -256:%u%% -1024:%u%% -4096:%u%% " 3148 "-16354:%u%% -32768:%u%% -66000:%u%%\n", 3149 l_ptr->stats.msg_length_counts, 3150 l_ptr->stats.msg_lengths_total / profile_total, 3151 percent(l_ptr->stats.msg_length_profile[0], profile_total), 3152 percent(l_ptr->stats.msg_length_profile[1], profile_total), 3153 percent(l_ptr->stats.msg_length_profile[2], profile_total), 3154 percent(l_ptr->stats.msg_length_profile[3], profile_total), 3155 percent(l_ptr->stats.msg_length_profile[4], profile_total), 3156 percent(l_ptr->stats.msg_length_profile[5], profile_total), 3157 percent(l_ptr->stats.msg_length_profile[6], profile_total)); 3158 tipc_printf(&pb, " RX states:%u probes:%u naks:%u defs:%u dups:%u\n", 3159 l_ptr->stats.recv_states, 3160 l_ptr->stats.recv_probes, 3161 l_ptr->stats.recv_nacks, 3162 l_ptr->stats.deferred_recv, 3163 l_ptr->stats.duplicates); 3164 tipc_printf(&pb, " TX states:%u probes:%u naks:%u acks:%u dups:%u\n", 3165 l_ptr->stats.sent_states, 3166 l_ptr->stats.sent_probes, 3167 l_ptr->stats.sent_nacks, 3168 l_ptr->stats.sent_acks, 3169 l_ptr->stats.retransmitted); 3170 tipc_printf(&pb, " Congestion bearer:%u link:%u Send queue max:%u avg:%u\n", 3171 l_ptr->stats.bearer_congs, 3172 l_ptr->stats.link_congs, 3173 l_ptr->stats.max_queue_sz, 3174 l_ptr->stats.queue_sz_counts 3175 ? (l_ptr->stats.accu_queue_sz / l_ptr->stats.queue_sz_counts) 3176 : 0); 3177 3178 tipc_node_unlock(node); 3179 read_unlock_bh(&tipc_net_lock); 3180 return tipc_printbuf_validate(&pb); 3181 } 3182 3183 #define MAX_LINK_STATS_INFO 2000 3184 3185 struct sk_buff *tipc_link_cmd_show_stats(const void *req_tlv_area, int req_tlv_space) 3186 { 3187 struct sk_buff *buf; 3188 struct tlv_desc *rep_tlv; 3189 int str_len; 3190 3191 if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_NAME)) 3192 return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR); 3193 3194 buf = tipc_cfg_reply_alloc(TLV_SPACE(MAX_LINK_STATS_INFO)); 3195 if (!buf) 3196 return NULL; 3197 3198 rep_tlv = (struct tlv_desc *)buf->data; 3199 3200 str_len = tipc_link_stats((char *)TLV_DATA(req_tlv_area), 3201 (char *)TLV_DATA(rep_tlv), MAX_LINK_STATS_INFO); 3202 if (!str_len) { 3203 buf_discard(buf); 3204 return tipc_cfg_reply_error_string("link not found"); 3205 } 3206 3207 skb_put(buf, TLV_SPACE(str_len)); 3208 TLV_SET(rep_tlv, TIPC_TLV_ULTRA_STRING, NULL, str_len); 3209 3210 return buf; 3211 } 3212 3213 #if 0 3214 int link_control(const char *name, u32 op, u32 val) 3215 { 3216 int res = -EINVAL; 3217 struct link *l_ptr; 3218 u32 bearer_id; 3219 struct tipc_node * node; 3220 u32 a; 3221 3222 a = link_name2addr(name, &bearer_id); 3223 read_lock_bh(&tipc_net_lock); 3224 node = tipc_node_find(a); 3225 if (node) { 3226 tipc_node_lock(node); 3227 l_ptr = node->links[bearer_id]; 3228 if (l_ptr) { 3229 if (op == TIPC_REMOVE_LINK) { 3230 struct bearer *b_ptr = l_ptr->b_ptr; 3231 spin_lock_bh(&b_ptr->publ.lock); 3232 tipc_link_delete(l_ptr); 3233 spin_unlock_bh(&b_ptr->publ.lock); 3234 } 3235 if (op == TIPC_CMD_BLOCK_LINK) { 3236 tipc_link_reset(l_ptr); 3237 l_ptr->blocked = 1; 3238 } 3239 if (op == TIPC_CMD_UNBLOCK_LINK) { 3240 l_ptr->blocked = 0; 3241 } 3242 res = 0; 3243 } 3244 tipc_node_unlock(node); 3245 } 3246 read_unlock_bh(&tipc_net_lock); 3247 return res; 3248 } 3249 #endif 3250 3251 /** 3252 * tipc_link_get_max_pkt - get maximum packet size to use when sending to destination 3253 * @dest: network address of destination node 3254 * @selector: used to select from set of active links 3255 * 3256 * If no active link can be found, uses default maximum packet size. 3257 */ 3258 3259 u32 tipc_link_get_max_pkt(u32 dest, u32 selector) 3260 { 3261 struct tipc_node *n_ptr; 3262 struct link *l_ptr; 3263 u32 res = MAX_PKT_DEFAULT; 3264 3265 if (dest == tipc_own_addr) 3266 return MAX_MSG_SIZE; 3267 3268 read_lock_bh(&tipc_net_lock); 3269 n_ptr = tipc_node_select(dest, selector); 3270 if (n_ptr) { 3271 tipc_node_lock(n_ptr); 3272 l_ptr = n_ptr->active_links[selector & 1]; 3273 if (l_ptr) 3274 res = link_max_pkt(l_ptr); 3275 tipc_node_unlock(n_ptr); 3276 } 3277 read_unlock_bh(&tipc_net_lock); 3278 return res; 3279 } 3280 3281 #if 0 3282 static void link_dump_rec_queue(struct link *l_ptr) 3283 { 3284 struct sk_buff *crs; 3285 3286 if (!l_ptr->oldest_deferred_in) { 3287 info("Reception queue empty\n"); 3288 return; 3289 } 3290 info("Contents of Reception queue:\n"); 3291 crs = l_ptr->oldest_deferred_in; 3292 while (crs) { 3293 if (crs->data == (void *)0x0000a3a3) { 3294 info("buffer %x invalid\n", crs); 3295 return; 3296 } 3297 msg_dbg(buf_msg(crs), "In rec queue: \n"); 3298 crs = crs->next; 3299 } 3300 } 3301 #endif 3302 3303 static void link_dump_send_queue(struct link *l_ptr) 3304 { 3305 if (l_ptr->next_out) { 3306 info("\nContents of unsent queue:\n"); 3307 dbg_print_buf_chain(l_ptr->next_out); 3308 } 3309 info("\nContents of send queue:\n"); 3310 if (l_ptr->first_out) { 3311 dbg_print_buf_chain(l_ptr->first_out); 3312 } 3313 info("Empty send queue\n"); 3314 } 3315 3316 static void link_print(struct link *l_ptr, struct print_buf *buf, 3317 const char *str) 3318 { 3319 tipc_printf(buf, str); 3320 if (link_reset_reset(l_ptr) || link_reset_unknown(l_ptr)) 3321 return; 3322 tipc_printf(buf, "Link %x<%s>:", 3323 l_ptr->addr, l_ptr->b_ptr->publ.name); 3324 tipc_printf(buf, ": NXO(%u):", mod(l_ptr->next_out_no)); 3325 tipc_printf(buf, "NXI(%u):", mod(l_ptr->next_in_no)); 3326 tipc_printf(buf, "SQUE"); 3327 if (l_ptr->first_out) { 3328 tipc_printf(buf, "[%u..", msg_seqno(buf_msg(l_ptr->first_out))); 3329 if (l_ptr->next_out) 3330 tipc_printf(buf, "%u..", 3331 msg_seqno(buf_msg(l_ptr->next_out))); 3332 tipc_printf(buf, "%u]", 3333 msg_seqno(buf_msg 3334 (l_ptr->last_out)), l_ptr->out_queue_size); 3335 if ((mod(msg_seqno(buf_msg(l_ptr->last_out)) - 3336 msg_seqno(buf_msg(l_ptr->first_out))) 3337 != (l_ptr->out_queue_size - 1)) || 3338 (l_ptr->last_out->next != NULL)) { 3339 tipc_printf(buf, "\nSend queue inconsistency\n"); 3340 tipc_printf(buf, "first_out= %x ", l_ptr->first_out); 3341 tipc_printf(buf, "next_out= %x ", l_ptr->next_out); 3342 tipc_printf(buf, "last_out= %x ", l_ptr->last_out); 3343 link_dump_send_queue(l_ptr); 3344 } 3345 } else 3346 tipc_printf(buf, "[]"); 3347 tipc_printf(buf, "SQSIZ(%u)", l_ptr->out_queue_size); 3348 if (l_ptr->oldest_deferred_in) { 3349 u32 o = msg_seqno(buf_msg(l_ptr->oldest_deferred_in)); 3350 u32 n = msg_seqno(buf_msg(l_ptr->newest_deferred_in)); 3351 tipc_printf(buf, ":RQUE[%u..%u]", o, n); 3352 if (l_ptr->deferred_inqueue_sz != mod((n + 1) - o)) { 3353 tipc_printf(buf, ":RQSIZ(%u)", 3354 l_ptr->deferred_inqueue_sz); 3355 } 3356 } 3357 if (link_working_unknown(l_ptr)) 3358 tipc_printf(buf, ":WU"); 3359 if (link_reset_reset(l_ptr)) 3360 tipc_printf(buf, ":RR"); 3361 if (link_reset_unknown(l_ptr)) 3362 tipc_printf(buf, ":RU"); 3363 if (link_working_working(l_ptr)) 3364 tipc_printf(buf, ":WW"); 3365 tipc_printf(buf, "\n"); 3366 } 3367 3368