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, 2010-2011, 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_nametype(struct tipc_msg *m) 425 { 426 return msg_word(m, 8); 427 } 428 429 static inline void msg_set_nametype(struct tipc_msg *m, u32 n) 430 { 431 msg_set_word(m, 8, n); 432 } 433 434 static inline u32 msg_nameinst(struct tipc_msg *m) 435 { 436 return msg_word(m, 9); 437 } 438 439 static inline u32 msg_namelower(struct tipc_msg *m) 440 { 441 return msg_nameinst(m); 442 } 443 444 static inline void msg_set_namelower(struct tipc_msg *m, u32 n) 445 { 446 msg_set_word(m, 9, n); 447 } 448 449 static inline void msg_set_nameinst(struct tipc_msg *m, u32 n) 450 { 451 msg_set_namelower(m, n); 452 } 453 454 static inline u32 msg_nameupper(struct tipc_msg *m) 455 { 456 return msg_word(m, 10); 457 } 458 459 static inline void msg_set_nameupper(struct tipc_msg *m, u32 n) 460 { 461 msg_set_word(m, 10, n); 462 } 463 464 static inline unchar *msg_data(struct tipc_msg *m) 465 { 466 return ((unchar *)m) + msg_hdr_sz(m); 467 } 468 469 static inline struct tipc_msg *msg_get_wrapped(struct tipc_msg *m) 470 { 471 return (struct tipc_msg *)msg_data(m); 472 } 473 474 475 /* 476 TIPC internal message header format, version 2 477 478 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 479 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 480 w0:|vers |msg usr|hdr sz |n|resrv| packet size | 481 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 482 w1:|m typ| sequence gap | broadcast ack no | 483 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 484 w2:| link level ack no/bc_gap_from | seq no / bcast_gap_to | 485 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 486 w3:| previous node | 487 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 488 w4:| next sent broadcast/fragm no | next sent pkt/ fragm msg no | 489 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 490 w5:| session no |rsv=0|r|berid|link prio|netpl|p| 491 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 492 w6:| originating node | 493 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 494 w7:| destination node | 495 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 496 w8:| transport sequence number | 497 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 498 w9:| msg count / bcast tag | link tolerance | 499 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 500 \ \ 501 / User Specific Data / 502 \ \ 503 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 504 505 NB: CONN_MANAGER use data message format. LINK_CONFIG has own format. 506 */ 507 508 /* 509 * Internal users 510 */ 511 512 #define BCAST_PROTOCOL 5 513 #define MSG_BUNDLER 6 514 #define LINK_PROTOCOL 7 515 #define CONN_MANAGER 8 516 #define ROUTE_DISTRIBUTOR 9 /* obsoleted */ 517 #define CHANGEOVER_PROTOCOL 10 518 #define NAME_DISTRIBUTOR 11 519 #define MSG_FRAGMENTER 12 520 #define LINK_CONFIG 13 521 522 /* 523 * Connection management protocol messages 524 */ 525 526 #define CONN_PROBE 0 527 #define CONN_PROBE_REPLY 1 528 #define CONN_ACK 2 529 530 /* 531 * Name distributor messages 532 */ 533 534 #define PUBLICATION 0 535 #define WITHDRAWAL 1 536 537 538 /* 539 * Word 1 540 */ 541 542 static inline u32 msg_seq_gap(struct tipc_msg *m) 543 { 544 return msg_bits(m, 1, 16, 0x1fff); 545 } 546 547 static inline void msg_set_seq_gap(struct tipc_msg *m, u32 n) 548 { 549 msg_set_bits(m, 1, 16, 0x1fff, n); 550 } 551 552 553 /* 554 * Word 2 555 */ 556 557 static inline u32 msg_dest_domain(struct tipc_msg *m) 558 { 559 return msg_word(m, 2); 560 } 561 562 static inline void msg_set_dest_domain(struct tipc_msg *m, u32 n) 563 { 564 msg_set_word(m, 2, n); 565 } 566 567 static inline u32 msg_bcgap_after(struct tipc_msg *m) 568 { 569 return msg_bits(m, 2, 16, 0xffff); 570 } 571 572 static inline void msg_set_bcgap_after(struct tipc_msg *m, u32 n) 573 { 574 msg_set_bits(m, 2, 16, 0xffff, n); 575 } 576 577 static inline u32 msg_bcgap_to(struct tipc_msg *m) 578 { 579 return msg_bits(m, 2, 0, 0xffff); 580 } 581 582 static inline void msg_set_bcgap_to(struct tipc_msg *m, u32 n) 583 { 584 msg_set_bits(m, 2, 0, 0xffff, n); 585 } 586 587 588 /* 589 * Word 4 590 */ 591 592 static inline u32 msg_last_bcast(struct tipc_msg *m) 593 { 594 return msg_bits(m, 4, 16, 0xffff); 595 } 596 597 static inline void msg_set_last_bcast(struct tipc_msg *m, u32 n) 598 { 599 msg_set_bits(m, 4, 16, 0xffff, n); 600 } 601 602 603 static inline u32 msg_fragm_no(struct tipc_msg *m) 604 { 605 return msg_bits(m, 4, 16, 0xffff); 606 } 607 608 static inline void msg_set_fragm_no(struct tipc_msg *m, u32 n) 609 { 610 msg_set_bits(m, 4, 16, 0xffff, n); 611 } 612 613 614 static inline u32 msg_next_sent(struct tipc_msg *m) 615 { 616 return msg_bits(m, 4, 0, 0xffff); 617 } 618 619 static inline void msg_set_next_sent(struct tipc_msg *m, u32 n) 620 { 621 msg_set_bits(m, 4, 0, 0xffff, n); 622 } 623 624 625 static inline u32 msg_long_msgno(struct tipc_msg *m) 626 { 627 return msg_bits(m, 4, 0, 0xffff); 628 } 629 630 static inline void msg_set_long_msgno(struct tipc_msg *m, u32 n) 631 { 632 msg_set_bits(m, 4, 0, 0xffff, n); 633 } 634 635 static inline u32 msg_bc_netid(struct tipc_msg *m) 636 { 637 return msg_word(m, 4); 638 } 639 640 static inline void msg_set_bc_netid(struct tipc_msg *m, u32 id) 641 { 642 msg_set_word(m, 4, id); 643 } 644 645 static inline u32 msg_link_selector(struct tipc_msg *m) 646 { 647 return msg_bits(m, 4, 0, 1); 648 } 649 650 static inline void msg_set_link_selector(struct tipc_msg *m, u32 n) 651 { 652 msg_set_bits(m, 4, 0, 1, (n & 1)); 653 } 654 655 /* 656 * Word 5 657 */ 658 659 static inline u32 msg_session(struct tipc_msg *m) 660 { 661 return msg_bits(m, 5, 16, 0xffff); 662 } 663 664 static inline void msg_set_session(struct tipc_msg *m, u32 n) 665 { 666 msg_set_bits(m, 5, 16, 0xffff, n); 667 } 668 669 static inline u32 msg_probe(struct tipc_msg *m) 670 { 671 return msg_bits(m, 5, 0, 1); 672 } 673 674 static inline void msg_set_probe(struct tipc_msg *m, u32 val) 675 { 676 msg_set_bits(m, 5, 0, 1, (val & 1)); 677 } 678 679 static inline char msg_net_plane(struct tipc_msg *m) 680 { 681 return msg_bits(m, 5, 1, 7) + 'A'; 682 } 683 684 static inline void msg_set_net_plane(struct tipc_msg *m, char n) 685 { 686 msg_set_bits(m, 5, 1, 7, (n - 'A')); 687 } 688 689 static inline u32 msg_linkprio(struct tipc_msg *m) 690 { 691 return msg_bits(m, 5, 4, 0x1f); 692 } 693 694 static inline void msg_set_linkprio(struct tipc_msg *m, u32 n) 695 { 696 msg_set_bits(m, 5, 4, 0x1f, n); 697 } 698 699 static inline u32 msg_bearer_id(struct tipc_msg *m) 700 { 701 return msg_bits(m, 5, 9, 0x7); 702 } 703 704 static inline void msg_set_bearer_id(struct tipc_msg *m, u32 n) 705 { 706 msg_set_bits(m, 5, 9, 0x7, n); 707 } 708 709 static inline u32 msg_redundant_link(struct tipc_msg *m) 710 { 711 return msg_bits(m, 5, 12, 0x1); 712 } 713 714 static inline void msg_set_redundant_link(struct tipc_msg *m, u32 r) 715 { 716 msg_set_bits(m, 5, 12, 0x1, r); 717 } 718 719 720 /* 721 * Word 9 722 */ 723 724 static inline u32 msg_msgcnt(struct tipc_msg *m) 725 { 726 return msg_bits(m, 9, 16, 0xffff); 727 } 728 729 static inline void msg_set_msgcnt(struct tipc_msg *m, u32 n) 730 { 731 msg_set_bits(m, 9, 16, 0xffff, n); 732 } 733 734 static inline u32 msg_bcast_tag(struct tipc_msg *m) 735 { 736 return msg_bits(m, 9, 16, 0xffff); 737 } 738 739 static inline void msg_set_bcast_tag(struct tipc_msg *m, u32 n) 740 { 741 msg_set_bits(m, 9, 16, 0xffff, n); 742 } 743 744 static inline u32 msg_max_pkt(struct tipc_msg *m) 745 { 746 return msg_bits(m, 9, 16, 0xffff) * 4; 747 } 748 749 static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n) 750 { 751 msg_set_bits(m, 9, 16, 0xffff, (n / 4)); 752 } 753 754 static inline u32 msg_link_tolerance(struct tipc_msg *m) 755 { 756 return msg_bits(m, 9, 0, 0xffff); 757 } 758 759 static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n) 760 { 761 msg_set_bits(m, 9, 0, 0xffff, n); 762 } 763 764 /* 765 * Segmentation message types 766 */ 767 768 #define FIRST_FRAGMENT 0 769 #define FRAGMENT 1 770 #define LAST_FRAGMENT 2 771 772 /* 773 * Link management protocol message types 774 */ 775 776 #define STATE_MSG 0 777 #define RESET_MSG 1 778 #define ACTIVATE_MSG 2 779 780 /* 781 * Changeover tunnel message types 782 */ 783 #define DUPLICATE_MSG 0 784 #define ORIGINAL_MSG 1 785 786 /* 787 * Routing table message types 788 */ 789 #define EXT_ROUTING_TABLE 0 790 #define LOCAL_ROUTING_TABLE 1 /* obsoleted */ 791 #define SLAVE_ROUTING_TABLE 2 792 #define ROUTE_ADDITION 3 793 #define ROUTE_REMOVAL 4 794 795 /* 796 * Config protocol message types 797 */ 798 799 #define DSC_REQ_MSG 0 800 #define DSC_RESP_MSG 1 801 802 u32 tipc_msg_tot_importance(struct tipc_msg *m); 803 void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type, 804 u32 hsize, u32 destnode); 805 int tipc_msg_calc_data_size(struct iovec const *msg_sect, u32 num_sect); 806 int tipc_msg_build(struct tipc_msg *hdr, 807 struct iovec const *msg_sect, u32 num_sect, 808 int max_size, int usrmem, struct sk_buff **buf); 809 810 static inline void msg_set_media_addr(struct tipc_msg *m, struct tipc_media_addr *a) 811 { 812 memcpy(&((int *)m)[5], a, sizeof(*a)); 813 } 814 815 static inline void msg_get_media_addr(struct tipc_msg *m, struct tipc_media_addr *a) 816 { 817 memcpy(a, &((int *)m)[5], sizeof(*a)); 818 } 819 820 #endif 821