1 /* 2 * net/tipc/msg.h: Include file for TIPC message header routines 3 * 4 * Copyright (c) 2000-2007, Ericsson AB 5 * Copyright (c) 2005-2008, 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 #ifndef _TIPC_MSG_H 38 #define _TIPC_MSG_H 39 40 #include "bearer.h" 41 42 #define TIPC_VERSION 2 43 44 /* 45 * TIPC user data message header format, version 2: 46 * 47 * 48 * 1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0 49 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 50 * w0:|vers | user |hdr sz |n|d|s|-| message size | 51 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 52 * w1:|mstyp| error |rer cnt|lsc|opt p| broadcast ack no | 53 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 54 * w2:| link level ack no | broadcast/link level seq no | 55 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 56 * w3:| previous node | 57 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 58 * w4:| originating port | 59 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 60 * w5:| destination port | 61 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 62 * w6:| originating node | 63 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 64 * w7:| destination node | 65 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 66 * w8:| name type / transport sequence number | 67 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 68 * w9:| name instance/multicast lower bound | 69 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 70 * wA:| multicast upper bound | 71 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 72 * / / 73 * \ options \ 74 * / / 75 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 76 * 77 */ 78 79 #define TIPC_CONN_MSG 0 80 #define TIPC_MCAST_MSG 1 81 #define TIPC_NAMED_MSG 2 82 #define TIPC_DIRECT_MSG 3 83 84 85 #define SHORT_H_SIZE 24 /* Connected, in-cluster messages */ 86 #define DIR_MSG_H_SIZE 32 /* Directly addressed messages */ 87 #define LONG_H_SIZE 40 /* Named messages */ 88 #define MCAST_H_SIZE 44 /* Multicast messages */ 89 #define INT_H_SIZE 40 /* Internal messages */ 90 #define MIN_H_SIZE 24 /* Smallest legal TIPC header size */ 91 #define MAX_H_SIZE 60 /* Largest possible TIPC header size */ 92 93 #define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE) 94 95 96 struct tipc_msg { 97 __be32 hdr[15]; 98 }; 99 100 101 static inline u32 msg_word(struct tipc_msg *m, u32 pos) 102 { 103 return ntohl(m->hdr[pos]); 104 } 105 106 static inline void msg_set_word(struct tipc_msg *m, u32 w, u32 val) 107 { 108 m->hdr[w] = htonl(val); 109 } 110 111 static inline u32 msg_bits(struct tipc_msg *m, u32 w, u32 pos, u32 mask) 112 { 113 return (msg_word(m, w) >> pos) & mask; 114 } 115 116 static inline void msg_set_bits(struct tipc_msg *m, u32 w, 117 u32 pos, u32 mask, u32 val) 118 { 119 val = (val & mask) << pos; 120 mask = mask << pos; 121 m->hdr[w] &= ~htonl(mask); 122 m->hdr[w] |= htonl(val); 123 } 124 125 static inline void msg_swap_words(struct tipc_msg *msg, u32 a, u32 b) 126 { 127 u32 temp = msg->hdr[a]; 128 129 msg->hdr[a] = msg->hdr[b]; 130 msg->hdr[b] = temp; 131 } 132 133 /* 134 * Word 0 135 */ 136 137 static inline u32 msg_version(struct tipc_msg *m) 138 { 139 return msg_bits(m, 0, 29, 7); 140 } 141 142 static inline void msg_set_version(struct tipc_msg *m) 143 { 144 msg_set_bits(m, 0, 29, 7, TIPC_VERSION); 145 } 146 147 static inline u32 msg_user(struct tipc_msg *m) 148 { 149 return msg_bits(m, 0, 25, 0xf); 150 } 151 152 static inline u32 msg_isdata(struct tipc_msg *m) 153 { 154 return msg_user(m) <= TIPC_CRITICAL_IMPORTANCE; 155 } 156 157 static inline void msg_set_user(struct tipc_msg *m, u32 n) 158 { 159 msg_set_bits(m, 0, 25, 0xf, n); 160 } 161 162 static inline u32 msg_importance(struct tipc_msg *m) 163 { 164 return msg_bits(m, 0, 25, 0xf); 165 } 166 167 static inline void msg_set_importance(struct tipc_msg *m, u32 i) 168 { 169 msg_set_user(m, i); 170 } 171 172 static inline u32 msg_hdr_sz(struct tipc_msg *m) 173 { 174 return msg_bits(m, 0, 21, 0xf) << 2; 175 } 176 177 static inline void msg_set_hdr_sz(struct tipc_msg *m, u32 n) 178 { 179 msg_set_bits(m, 0, 21, 0xf, n>>2); 180 } 181 182 static inline u32 msg_size(struct tipc_msg *m) 183 { 184 return msg_bits(m, 0, 0, 0x1ffff); 185 } 186 187 static inline u32 msg_data_sz(struct tipc_msg *m) 188 { 189 return msg_size(m) - msg_hdr_sz(m); 190 } 191 192 static inline int msg_non_seq(struct tipc_msg *m) 193 { 194 return msg_bits(m, 0, 20, 1); 195 } 196 197 static inline void msg_set_non_seq(struct tipc_msg *m, u32 n) 198 { 199 msg_set_bits(m, 0, 20, 1, n); 200 } 201 202 static inline int msg_dest_droppable(struct tipc_msg *m) 203 { 204 return msg_bits(m, 0, 19, 1); 205 } 206 207 static inline void msg_set_dest_droppable(struct tipc_msg *m, u32 d) 208 { 209 msg_set_bits(m, 0, 19, 1, d); 210 } 211 212 static inline int msg_src_droppable(struct tipc_msg *m) 213 { 214 return msg_bits(m, 0, 18, 1); 215 } 216 217 static inline void msg_set_src_droppable(struct tipc_msg *m, u32 d) 218 { 219 msg_set_bits(m, 0, 18, 1, d); 220 } 221 222 static inline void msg_set_size(struct tipc_msg *m, u32 sz) 223 { 224 m->hdr[0] = htonl((msg_word(m, 0) & ~0x1ffff) | sz); 225 } 226 227 228 /* 229 * Word 1 230 */ 231 232 static inline u32 msg_type(struct tipc_msg *m) 233 { 234 return msg_bits(m, 1, 29, 0x7); 235 } 236 237 static inline void msg_set_type(struct tipc_msg *m, u32 n) 238 { 239 msg_set_bits(m, 1, 29, 0x7, n); 240 } 241 242 static inline u32 msg_named(struct tipc_msg *m) 243 { 244 return msg_type(m) == TIPC_NAMED_MSG; 245 } 246 247 static inline u32 msg_mcast(struct tipc_msg *m) 248 { 249 return msg_type(m) == TIPC_MCAST_MSG; 250 } 251 252 static inline u32 msg_connected(struct tipc_msg *m) 253 { 254 return msg_type(m) == TIPC_CONN_MSG; 255 } 256 257 static inline u32 msg_errcode(struct tipc_msg *m) 258 { 259 return msg_bits(m, 1, 25, 0xf); 260 } 261 262 static inline void msg_set_errcode(struct tipc_msg *m, u32 err) 263 { 264 msg_set_bits(m, 1, 25, 0xf, err); 265 } 266 267 static inline u32 msg_reroute_cnt(struct tipc_msg *m) 268 { 269 return msg_bits(m, 1, 21, 0xf); 270 } 271 272 static inline void msg_incr_reroute_cnt(struct tipc_msg *m) 273 { 274 msg_set_bits(m, 1, 21, 0xf, msg_reroute_cnt(m) + 1); 275 } 276 277 static inline void msg_reset_reroute_cnt(struct tipc_msg *m) 278 { 279 msg_set_bits(m, 1, 21, 0xf, 0); 280 } 281 282 static inline u32 msg_lookup_scope(struct tipc_msg *m) 283 { 284 return msg_bits(m, 1, 19, 0x3); 285 } 286 287 static inline void msg_set_lookup_scope(struct tipc_msg *m, u32 n) 288 { 289 msg_set_bits(m, 1, 19, 0x3, n); 290 } 291 292 static inline u32 msg_bcast_ack(struct tipc_msg *m) 293 { 294 return msg_bits(m, 1, 0, 0xffff); 295 } 296 297 static inline void msg_set_bcast_ack(struct tipc_msg *m, u32 n) 298 { 299 msg_set_bits(m, 1, 0, 0xffff, n); 300 } 301 302 303 /* 304 * Word 2 305 */ 306 307 static inline u32 msg_ack(struct tipc_msg *m) 308 { 309 return msg_bits(m, 2, 16, 0xffff); 310 } 311 312 static inline void msg_set_ack(struct tipc_msg *m, u32 n) 313 { 314 msg_set_bits(m, 2, 16, 0xffff, n); 315 } 316 317 static inline u32 msg_seqno(struct tipc_msg *m) 318 { 319 return msg_bits(m, 2, 0, 0xffff); 320 } 321 322 static inline void msg_set_seqno(struct tipc_msg *m, u32 n) 323 { 324 msg_set_bits(m, 2, 0, 0xffff, n); 325 } 326 327 /* 328 * TIPC may utilize the "link ack #" and "link seq #" fields of a short 329 * message header to hold the destination node for the message, since the 330 * normal "dest node" field isn't present. This cache is only referenced 331 * when required, so populating the cache of a longer message header is 332 * harmless (as long as the header has the two link sequence fields present). 333 * 334 * Note: Host byte order is OK here, since the info never goes off-card. 335 */ 336 337 static inline u32 msg_destnode_cache(struct tipc_msg *m) 338 { 339 return m->hdr[2]; 340 } 341 342 static inline void msg_set_destnode_cache(struct tipc_msg *m, u32 dnode) 343 { 344 m->hdr[2] = dnode; 345 } 346 347 /* 348 * Words 3-10 349 */ 350 351 352 static inline u32 msg_prevnode(struct tipc_msg *m) 353 { 354 return msg_word(m, 3); 355 } 356 357 static inline void msg_set_prevnode(struct tipc_msg *m, u32 a) 358 { 359 msg_set_word(m, 3, a); 360 } 361 362 static inline u32 msg_origport(struct tipc_msg *m) 363 { 364 return msg_word(m, 4); 365 } 366 367 static inline void msg_set_origport(struct tipc_msg *m, u32 p) 368 { 369 msg_set_word(m, 4, p); 370 } 371 372 static inline u32 msg_destport(struct tipc_msg *m) 373 { 374 return msg_word(m, 5); 375 } 376 377 static inline void msg_set_destport(struct tipc_msg *m, u32 p) 378 { 379 msg_set_word(m, 5, p); 380 } 381 382 static inline u32 msg_mc_netid(struct tipc_msg *m) 383 { 384 return msg_word(m, 5); 385 } 386 387 static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p) 388 { 389 msg_set_word(m, 5, p); 390 } 391 392 static inline int msg_short(struct tipc_msg *m) 393 { 394 return msg_hdr_sz(m) == 24; 395 } 396 397 static inline u32 msg_orignode(struct tipc_msg *m) 398 { 399 if (likely(msg_short(m))) 400 return msg_prevnode(m); 401 return msg_word(m, 6); 402 } 403 404 static inline void msg_set_orignode(struct tipc_msg *m, u32 a) 405 { 406 msg_set_word(m, 6, a); 407 } 408 409 static inline u32 msg_destnode(struct tipc_msg *m) 410 { 411 return msg_word(m, 7); 412 } 413 414 static inline void msg_set_destnode(struct tipc_msg *m, u32 a) 415 { 416 msg_set_word(m, 7, a); 417 } 418 419 static inline int msg_is_dest(struct tipc_msg *m, u32 d) 420 { 421 return msg_short(m) || (msg_destnode(m) == d); 422 } 423 424 static inline u32 msg_routed(struct tipc_msg *m) 425 { 426 if (likely(msg_short(m))) 427 return 0; 428 return (msg_destnode(m) ^ msg_orignode(m)) >> 11; 429 } 430 431 static inline u32 msg_nametype(struct tipc_msg *m) 432 { 433 return msg_word(m, 8); 434 } 435 436 static inline void msg_set_nametype(struct tipc_msg *m, u32 n) 437 { 438 msg_set_word(m, 8, n); 439 } 440 441 static inline u32 msg_transp_seqno(struct tipc_msg *m) 442 { 443 return msg_word(m, 8); 444 } 445 446 static inline void msg_set_timestamp(struct tipc_msg *m, u32 n) 447 { 448 msg_set_word(m, 8, n); 449 } 450 451 static inline u32 msg_timestamp(struct tipc_msg *m) 452 { 453 return msg_word(m, 8); 454 } 455 456 static inline void msg_set_transp_seqno(struct tipc_msg *m, u32 n) 457 { 458 msg_set_word(m, 8, n); 459 } 460 461 static inline u32 msg_nameinst(struct tipc_msg *m) 462 { 463 return msg_word(m, 9); 464 } 465 466 static inline u32 msg_namelower(struct tipc_msg *m) 467 { 468 return msg_nameinst(m); 469 } 470 471 static inline void msg_set_namelower(struct tipc_msg *m, u32 n) 472 { 473 msg_set_word(m, 9, n); 474 } 475 476 static inline void msg_set_nameinst(struct tipc_msg *m, u32 n) 477 { 478 msg_set_namelower(m, n); 479 } 480 481 static inline u32 msg_nameupper(struct tipc_msg *m) 482 { 483 return msg_word(m, 10); 484 } 485 486 static inline void msg_set_nameupper(struct tipc_msg *m, u32 n) 487 { 488 msg_set_word(m, 10, n); 489 } 490 491 static inline unchar *msg_data(struct tipc_msg *m) 492 { 493 return ((unchar *)m) + msg_hdr_sz(m); 494 } 495 496 static inline struct tipc_msg *msg_get_wrapped(struct tipc_msg *m) 497 { 498 return (struct tipc_msg *)msg_data(m); 499 } 500 501 502 /* 503 TIPC internal message header format, version 2 504 505 1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0 506 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 507 w0:|vers |msg usr|hdr sz |n|resrv| packet size | 508 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 509 w1:|m typ| sequence gap | broadcast ack no | 510 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 511 w2:| link level ack no/bc_gap_from | seq no / bcast_gap_to | 512 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 513 w3:| previous node | 514 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 515 w4:| next sent broadcast/fragm no | next sent pkt/ fragm msg no | 516 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 517 w5:| session no |rsv=0|r|berid|link prio|netpl|p| 518 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 519 w6:| originating node | 520 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 521 w7:| destination node | 522 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 523 w8:| transport sequence number | 524 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 525 w9:| msg count / bcast tag | link tolerance | 526 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 527 \ \ 528 / User Specific Data / 529 \ \ 530 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 531 532 NB: CONN_MANAGER use data message format. LINK_CONFIG has own format. 533 */ 534 535 /* 536 * Internal users 537 */ 538 539 #define BCAST_PROTOCOL 5 540 #define MSG_BUNDLER 6 541 #define LINK_PROTOCOL 7 542 #define CONN_MANAGER 8 543 #define ROUTE_DISTRIBUTOR 9 /* obsoleted */ 544 #define CHANGEOVER_PROTOCOL 10 545 #define NAME_DISTRIBUTOR 11 546 #define MSG_FRAGMENTER 12 547 #define LINK_CONFIG 13 548 #define DSC_H_SIZE 40 549 550 /* 551 * Connection management protocol messages 552 */ 553 554 #define CONN_PROBE 0 555 #define CONN_PROBE_REPLY 1 556 #define CONN_ACK 2 557 558 /* 559 * Name distributor messages 560 */ 561 562 #define PUBLICATION 0 563 #define WITHDRAWAL 1 564 565 566 /* 567 * Word 1 568 */ 569 570 static inline u32 msg_seq_gap(struct tipc_msg *m) 571 { 572 return msg_bits(m, 1, 16, 0x1fff); 573 } 574 575 static inline void msg_set_seq_gap(struct tipc_msg *m, u32 n) 576 { 577 msg_set_bits(m, 1, 16, 0x1fff, n); 578 } 579 580 static inline u32 msg_req_links(struct tipc_msg *m) 581 { 582 return msg_bits(m, 1, 16, 0xfff); 583 } 584 585 static inline void msg_set_req_links(struct tipc_msg *m, u32 n) 586 { 587 msg_set_bits(m, 1, 16, 0xfff, n); 588 } 589 590 591 /* 592 * Word 2 593 */ 594 595 static inline u32 msg_dest_domain(struct tipc_msg *m) 596 { 597 return msg_word(m, 2); 598 } 599 600 static inline void msg_set_dest_domain(struct tipc_msg *m, u32 n) 601 { 602 msg_set_word(m, 2, n); 603 } 604 605 static inline u32 msg_bcgap_after(struct tipc_msg *m) 606 { 607 return msg_bits(m, 2, 16, 0xffff); 608 } 609 610 static inline void msg_set_bcgap_after(struct tipc_msg *m, u32 n) 611 { 612 msg_set_bits(m, 2, 16, 0xffff, n); 613 } 614 615 static inline u32 msg_bcgap_to(struct tipc_msg *m) 616 { 617 return msg_bits(m, 2, 0, 0xffff); 618 } 619 620 static inline void msg_set_bcgap_to(struct tipc_msg *m, u32 n) 621 { 622 msg_set_bits(m, 2, 0, 0xffff, n); 623 } 624 625 626 /* 627 * Word 4 628 */ 629 630 static inline u32 msg_last_bcast(struct tipc_msg *m) 631 { 632 return msg_bits(m, 4, 16, 0xffff); 633 } 634 635 static inline void msg_set_last_bcast(struct tipc_msg *m, u32 n) 636 { 637 msg_set_bits(m, 4, 16, 0xffff, n); 638 } 639 640 641 static inline u32 msg_fragm_no(struct tipc_msg *m) 642 { 643 return msg_bits(m, 4, 16, 0xffff); 644 } 645 646 static inline void msg_set_fragm_no(struct tipc_msg *m, u32 n) 647 { 648 msg_set_bits(m, 4, 16, 0xffff, n); 649 } 650 651 652 static inline u32 msg_next_sent(struct tipc_msg *m) 653 { 654 return msg_bits(m, 4, 0, 0xffff); 655 } 656 657 static inline void msg_set_next_sent(struct tipc_msg *m, u32 n) 658 { 659 msg_set_bits(m, 4, 0, 0xffff, n); 660 } 661 662 663 static inline u32 msg_long_msgno(struct tipc_msg *m) 664 { 665 return msg_bits(m, 4, 0, 0xffff); 666 } 667 668 static inline void msg_set_long_msgno(struct tipc_msg *m, u32 n) 669 { 670 msg_set_bits(m, 4, 0, 0xffff, n); 671 } 672 673 static inline u32 msg_bc_netid(struct tipc_msg *m) 674 { 675 return msg_word(m, 4); 676 } 677 678 static inline void msg_set_bc_netid(struct tipc_msg *m, u32 id) 679 { 680 msg_set_word(m, 4, id); 681 } 682 683 static inline u32 msg_link_selector(struct tipc_msg *m) 684 { 685 return msg_bits(m, 4, 0, 1); 686 } 687 688 static inline void msg_set_link_selector(struct tipc_msg *m, u32 n) 689 { 690 msg_set_bits(m, 4, 0, 1, (n & 1)); 691 } 692 693 /* 694 * Word 5 695 */ 696 697 static inline u32 msg_session(struct tipc_msg *m) 698 { 699 return msg_bits(m, 5, 16, 0xffff); 700 } 701 702 static inline void msg_set_session(struct tipc_msg *m, u32 n) 703 { 704 msg_set_bits(m, 5, 16, 0xffff, n); 705 } 706 707 static inline u32 msg_probe(struct tipc_msg *m) 708 { 709 return msg_bits(m, 5, 0, 1); 710 } 711 712 static inline void msg_set_probe(struct tipc_msg *m, u32 val) 713 { 714 msg_set_bits(m, 5, 0, 1, (val & 1)); 715 } 716 717 static inline char msg_net_plane(struct tipc_msg *m) 718 { 719 return msg_bits(m, 5, 1, 7) + 'A'; 720 } 721 722 static inline void msg_set_net_plane(struct tipc_msg *m, char n) 723 { 724 msg_set_bits(m, 5, 1, 7, (n - 'A')); 725 } 726 727 static inline u32 msg_linkprio(struct tipc_msg *m) 728 { 729 return msg_bits(m, 5, 4, 0x1f); 730 } 731 732 static inline void msg_set_linkprio(struct tipc_msg *m, u32 n) 733 { 734 msg_set_bits(m, 5, 4, 0x1f, n); 735 } 736 737 static inline u32 msg_bearer_id(struct tipc_msg *m) 738 { 739 return msg_bits(m, 5, 9, 0x7); 740 } 741 742 static inline void msg_set_bearer_id(struct tipc_msg *m, u32 n) 743 { 744 msg_set_bits(m, 5, 9, 0x7, n); 745 } 746 747 static inline u32 msg_redundant_link(struct tipc_msg *m) 748 { 749 return msg_bits(m, 5, 12, 0x1); 750 } 751 752 static inline void msg_set_redundant_link(struct tipc_msg *m) 753 { 754 msg_set_bits(m, 5, 12, 0x1, 1); 755 } 756 757 static inline void msg_clear_redundant_link(struct tipc_msg *m) 758 { 759 msg_set_bits(m, 5, 12, 0x1, 0); 760 } 761 762 763 /* 764 * Word 9 765 */ 766 767 static inline u32 msg_msgcnt(struct tipc_msg *m) 768 { 769 return msg_bits(m, 9, 16, 0xffff); 770 } 771 772 static inline void msg_set_msgcnt(struct tipc_msg *m, u32 n) 773 { 774 msg_set_bits(m, 9, 16, 0xffff, n); 775 } 776 777 static inline u32 msg_bcast_tag(struct tipc_msg *m) 778 { 779 return msg_bits(m, 9, 16, 0xffff); 780 } 781 782 static inline void msg_set_bcast_tag(struct tipc_msg *m, u32 n) 783 { 784 msg_set_bits(m, 9, 16, 0xffff, n); 785 } 786 787 static inline u32 msg_max_pkt(struct tipc_msg *m) 788 { 789 return msg_bits(m, 9, 16, 0xffff) * 4; 790 } 791 792 static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n) 793 { 794 msg_set_bits(m, 9, 16, 0xffff, (n / 4)); 795 } 796 797 static inline u32 msg_link_tolerance(struct tipc_msg *m) 798 { 799 return msg_bits(m, 9, 0, 0xffff); 800 } 801 802 static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n) 803 { 804 msg_set_bits(m, 9, 0, 0xffff, n); 805 } 806 807 /* 808 * Routing table message data 809 */ 810 811 812 static inline u32 msg_remote_node(struct tipc_msg *m) 813 { 814 return msg_word(m, msg_hdr_sz(m)/4); 815 } 816 817 static inline void msg_set_remote_node(struct tipc_msg *m, u32 a) 818 { 819 msg_set_word(m, msg_hdr_sz(m)/4, a); 820 } 821 822 /* 823 * Segmentation message types 824 */ 825 826 #define FIRST_FRAGMENT 0 827 #define FRAGMENT 1 828 #define LAST_FRAGMENT 2 829 830 /* 831 * Link management protocol message types 832 */ 833 834 #define STATE_MSG 0 835 #define RESET_MSG 1 836 #define ACTIVATE_MSG 2 837 838 /* 839 * Changeover tunnel message types 840 */ 841 #define DUPLICATE_MSG 0 842 #define ORIGINAL_MSG 1 843 844 /* 845 * Routing table message types 846 */ 847 #define EXT_ROUTING_TABLE 0 848 #define LOCAL_ROUTING_TABLE 1 /* obsoleted */ 849 #define SLAVE_ROUTING_TABLE 2 850 #define ROUTE_ADDITION 3 851 #define ROUTE_REMOVAL 4 852 853 /* 854 * Config protocol message types 855 */ 856 857 #define DSC_REQ_MSG 0 858 #define DSC_RESP_MSG 1 859 860 u32 tipc_msg_tot_importance(struct tipc_msg *m); 861 void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type, 862 u32 hsize, u32 destnode); 863 int tipc_msg_calc_data_size(struct iovec const *msg_sect, u32 num_sect); 864 int tipc_msg_build(struct tipc_msg *hdr, 865 struct iovec const *msg_sect, u32 num_sect, 866 int max_size, int usrmem, struct sk_buff **buf); 867 868 static inline void msg_set_media_addr(struct tipc_msg *m, struct tipc_media_addr *a) 869 { 870 memcpy(&((int *)m)[5], a, sizeof(*a)); 871 } 872 873 static inline void msg_get_media_addr(struct tipc_msg *m, struct tipc_media_addr *a) 874 { 875 memcpy(a, &((int *)m)[5], sizeof(*a)); 876 } 877 878 #endif 879