linux/net/tipc/msg.h
<<
>>
Prefs
   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
  96struct tipc_msg {
  97        __be32 hdr[15];
  98};
  99
 100
 101static inline u32 msg_word(struct tipc_msg *m, u32 pos)
 102{
 103        return ntohl(m->hdr[pos]);
 104}
 105
 106static inline void msg_set_word(struct tipc_msg *m, u32 w, u32 val)
 107{
 108        m->hdr[w] = htonl(val);
 109}
 110
 111static 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
 116static 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
 125static 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
 137static inline u32 msg_version(struct tipc_msg *m)
 138{
 139        return msg_bits(m, 0, 29, 7);
 140}
 141
 142static inline void msg_set_version(struct tipc_msg *m)
 143{
 144        msg_set_bits(m, 0, 29, 7, TIPC_VERSION);
 145}
 146
 147static inline u32 msg_user(struct tipc_msg *m)
 148{
 149        return msg_bits(m, 0, 25, 0xf);
 150}
 151
 152static inline u32 msg_isdata(struct tipc_msg *m)
 153{
 154        return msg_user(m) <= TIPC_CRITICAL_IMPORTANCE;
 155}
 156
 157static inline void msg_set_user(struct tipc_msg *m, u32 n)
 158{
 159        msg_set_bits(m, 0, 25, 0xf, n);
 160}
 161
 162static inline u32 msg_importance(struct tipc_msg *m)
 163{
 164        return msg_bits(m, 0, 25, 0xf);
 165}
 166
 167static inline void msg_set_importance(struct tipc_msg *m, u32 i)
 168{
 169        msg_set_user(m, i);
 170}
 171
 172static inline u32 msg_hdr_sz(struct tipc_msg *m)
 173{
 174        return msg_bits(m, 0, 21, 0xf) << 2;
 175}
 176
 177static 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
 182static inline u32 msg_size(struct tipc_msg *m)
 183{
 184        return msg_bits(m, 0, 0, 0x1ffff);
 185}
 186
 187static inline u32 msg_data_sz(struct tipc_msg *m)
 188{
 189        return msg_size(m) - msg_hdr_sz(m);
 190}
 191
 192static inline int msg_non_seq(struct tipc_msg *m)
 193{
 194        return msg_bits(m, 0, 20, 1);
 195}
 196
 197static inline void msg_set_non_seq(struct tipc_msg *m, u32 n)
 198{
 199        msg_set_bits(m, 0, 20, 1, n);
 200}
 201
 202static inline int msg_dest_droppable(struct tipc_msg *m)
 203{
 204        return msg_bits(m, 0, 19, 1);
 205}
 206
 207static inline void msg_set_dest_droppable(struct tipc_msg *m, u32 d)
 208{
 209        msg_set_bits(m, 0, 19, 1, d);
 210}
 211
 212static inline int msg_src_droppable(struct tipc_msg *m)
 213{
 214        return msg_bits(m, 0, 18, 1);
 215}
 216
 217static inline void msg_set_src_droppable(struct tipc_msg *m, u32 d)
 218{
 219        msg_set_bits(m, 0, 18, 1, d);
 220}
 221
 222static 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
 232static inline u32 msg_type(struct tipc_msg *m)
 233{
 234        return msg_bits(m, 1, 29, 0x7);
 235}
 236
 237static inline void msg_set_type(struct tipc_msg *m, u32 n)
 238{
 239        msg_set_bits(m, 1, 29, 0x7, n);
 240}
 241
 242static inline u32 msg_named(struct tipc_msg *m)
 243{
 244        return msg_type(m) == TIPC_NAMED_MSG;
 245}
 246
 247static inline u32 msg_mcast(struct tipc_msg *m)
 248{
 249        return msg_type(m) == TIPC_MCAST_MSG;
 250}
 251
 252static inline u32 msg_connected(struct tipc_msg *m)
 253{
 254        return msg_type(m) == TIPC_CONN_MSG;
 255}
 256
 257static inline u32 msg_errcode(struct tipc_msg *m)
 258{
 259        return msg_bits(m, 1, 25, 0xf);
 260}
 261
 262static inline void msg_set_errcode(struct tipc_msg *m, u32 err)
 263{
 264        msg_set_bits(m, 1, 25, 0xf, err);
 265}
 266
 267static inline u32 msg_reroute_cnt(struct tipc_msg *m)
 268{
 269        return msg_bits(m, 1, 21, 0xf);
 270}
 271
 272static 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
 277static inline void msg_reset_reroute_cnt(struct tipc_msg *m)
 278{
 279        msg_set_bits(m, 1, 21, 0xf, 0);
 280}
 281
 282static inline u32 msg_lookup_scope(struct tipc_msg *m)
 283{
 284        return msg_bits(m, 1, 19, 0x3);
 285}
 286
 287static inline void msg_set_lookup_scope(struct tipc_msg *m, u32 n)
 288{
 289        msg_set_bits(m, 1, 19, 0x3, n);
 290}
 291
 292static inline u32 msg_bcast_ack(struct tipc_msg *m)
 293{
 294        return msg_bits(m, 1, 0, 0xffff);
 295}
 296
 297static 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
 307static inline u32 msg_ack(struct tipc_msg *m)
 308{
 309        return msg_bits(m, 2, 16, 0xffff);
 310}
 311
 312static inline void msg_set_ack(struct tipc_msg *m, u32 n)
 313{
 314        msg_set_bits(m, 2, 16, 0xffff, n);
 315}
 316
 317static inline u32 msg_seqno(struct tipc_msg *m)
 318{
 319        return msg_bits(m, 2, 0, 0xffff);
 320}
 321
 322static 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
 337static inline u32 msg_destnode_cache(struct tipc_msg *m)
 338{
 339        return m->hdr[2];
 340}
 341
 342static 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
 352static inline u32 msg_prevnode(struct tipc_msg *m)
 353{
 354        return msg_word(m, 3);
 355}
 356
 357static inline void msg_set_prevnode(struct tipc_msg *m, u32 a)
 358{
 359        msg_set_word(m, 3, a);
 360}
 361
 362static inline u32 msg_origport(struct tipc_msg *m)
 363{
 364        return msg_word(m, 4);
 365}
 366
 367static inline void msg_set_origport(struct tipc_msg *m, u32 p)
 368{
 369        msg_set_word(m, 4, p);
 370}
 371
 372static inline u32 msg_destport(struct tipc_msg *m)
 373{
 374        return msg_word(m, 5);
 375}
 376
 377static inline void msg_set_destport(struct tipc_msg *m, u32 p)
 378{
 379        msg_set_word(m, 5, p);
 380}
 381
 382static inline u32 msg_mc_netid(struct tipc_msg *m)
 383{
 384        return msg_word(m, 5);
 385}
 386
 387static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p)
 388{
 389        msg_set_word(m, 5, p);
 390}
 391
 392static inline int msg_short(struct tipc_msg *m)
 393{
 394        return msg_hdr_sz(m) == 24;
 395}
 396
 397static 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
 404static inline void msg_set_orignode(struct tipc_msg *m, u32 a)
 405{
 406        msg_set_word(m, 6, a);
 407}
 408
 409static inline u32 msg_destnode(struct tipc_msg *m)
 410{
 411        return msg_word(m, 7);
 412}
 413
 414static inline void msg_set_destnode(struct tipc_msg *m, u32 a)
 415{
 416        msg_set_word(m, 7, a);
 417}
 418
 419static inline int msg_is_dest(struct tipc_msg *m, u32 d)
 420{
 421        return msg_short(m) || (msg_destnode(m) == d);
 422}
 423
 424static 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
 431static inline u32 msg_nametype(struct tipc_msg *m)
 432{
 433        return msg_word(m, 8);
 434}
 435
 436static inline void msg_set_nametype(struct tipc_msg *m, u32 n)
 437{
 438        msg_set_word(m, 8, n);
 439}
 440
 441static inline u32 msg_transp_seqno(struct tipc_msg *m)
 442{
 443        return msg_word(m, 8);
 444}
 445
 446static inline void msg_set_timestamp(struct tipc_msg *m, u32 n)
 447{
 448        msg_set_word(m, 8, n);
 449}
 450
 451static inline u32 msg_timestamp(struct tipc_msg *m)
 452{
 453        return msg_word(m, 8);
 454}
 455
 456static inline void msg_set_transp_seqno(struct tipc_msg *m, u32 n)
 457{
 458        msg_set_word(m, 8, n);
 459}
 460
 461static inline u32 msg_nameinst(struct tipc_msg *m)
 462{
 463        return msg_word(m, 9);
 464}
 465
 466static inline u32 msg_namelower(struct tipc_msg *m)
 467{
 468        return msg_nameinst(m);
 469}
 470
 471static inline void msg_set_namelower(struct tipc_msg *m, u32 n)
 472{
 473        msg_set_word(m, 9, n);
 474}
 475
 476static inline void msg_set_nameinst(struct tipc_msg *m, u32 n)
 477{
 478        msg_set_namelower(m, n);
 479}
 480
 481static inline u32 msg_nameupper(struct tipc_msg *m)
 482{
 483        return msg_word(m, 10);
 484}
 485
 486static inline void msg_set_nameupper(struct tipc_msg *m, u32 n)
 487{
 488        msg_set_word(m, 10, n);
 489}
 490
 491static inline unchar *msg_data(struct tipc_msg *m)
 492{
 493        return ((unchar *)m) + msg_hdr_sz(m);
 494}
 495
 496static 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
 570static inline u32 msg_seq_gap(struct tipc_msg *m)
 571{
 572        return msg_bits(m, 1, 16, 0x1fff);
 573}
 574
 575static inline void msg_set_seq_gap(struct tipc_msg *m, u32 n)
 576{
 577        msg_set_bits(m, 1, 16, 0x1fff, n);
 578}
 579
 580static inline u32 msg_req_links(struct tipc_msg *m)
 581{
 582        return msg_bits(m, 1, 16, 0xfff);
 583}
 584
 585static 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
 595static inline u32 msg_dest_domain(struct tipc_msg *m)
 596{
 597        return msg_word(m, 2);
 598}
 599
 600static inline void msg_set_dest_domain(struct tipc_msg *m, u32 n)
 601{
 602        msg_set_word(m, 2, n);
 603}
 604
 605static inline u32 msg_bcgap_after(struct tipc_msg *m)
 606{
 607        return msg_bits(m, 2, 16, 0xffff);
 608}
 609
 610static inline void msg_set_bcgap_after(struct tipc_msg *m, u32 n)
 611{
 612        msg_set_bits(m, 2, 16, 0xffff, n);
 613}
 614
 615static inline u32 msg_bcgap_to(struct tipc_msg *m)
 616{
 617        return msg_bits(m, 2, 0, 0xffff);
 618}
 619
 620static 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
 630static inline u32 msg_last_bcast(struct tipc_msg *m)
 631{
 632        return msg_bits(m, 4, 16, 0xffff);
 633}
 634
 635static 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
 641static inline u32 msg_fragm_no(struct tipc_msg *m)
 642{
 643        return msg_bits(m, 4, 16, 0xffff);
 644}
 645
 646static 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
 652static inline u32 msg_next_sent(struct tipc_msg *m)
 653{
 654        return msg_bits(m, 4, 0, 0xffff);
 655}
 656
 657static 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
 663static inline u32 msg_long_msgno(struct tipc_msg *m)
 664{
 665        return msg_bits(m, 4, 0, 0xffff);
 666}
 667
 668static inline void msg_set_long_msgno(struct tipc_msg *m, u32 n)
 669{
 670        msg_set_bits(m, 4, 0, 0xffff, n);
 671}
 672
 673static inline u32 msg_bc_netid(struct tipc_msg *m)
 674{
 675        return msg_word(m, 4);
 676}
 677
 678static inline void msg_set_bc_netid(struct tipc_msg *m, u32 id)
 679{
 680        msg_set_word(m, 4, id);
 681}
 682
 683static inline u32 msg_link_selector(struct tipc_msg *m)
 684{
 685        return msg_bits(m, 4, 0, 1);
 686}
 687
 688static 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
 697static inline u32 msg_session(struct tipc_msg *m)
 698{
 699        return msg_bits(m, 5, 16, 0xffff);
 700}
 701
 702static inline void msg_set_session(struct tipc_msg *m, u32 n)
 703{
 704        msg_set_bits(m, 5, 16, 0xffff, n);
 705}
 706
 707static inline u32 msg_probe(struct tipc_msg *m)
 708{
 709        return msg_bits(m, 5, 0, 1);
 710}
 711
 712static inline void msg_set_probe(struct tipc_msg *m, u32 val)
 713{
 714        msg_set_bits(m, 5, 0, 1, (val & 1));
 715}
 716
 717static inline char msg_net_plane(struct tipc_msg *m)
 718{
 719        return msg_bits(m, 5, 1, 7) + 'A';
 720}
 721
 722static 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
 727static inline u32 msg_linkprio(struct tipc_msg *m)
 728{
 729        return msg_bits(m, 5, 4, 0x1f);
 730}
 731
 732static inline void msg_set_linkprio(struct tipc_msg *m, u32 n)
 733{
 734        msg_set_bits(m, 5, 4, 0x1f, n);
 735}
 736
 737static inline u32 msg_bearer_id(struct tipc_msg *m)
 738{
 739        return msg_bits(m, 5, 9, 0x7);
 740}
 741
 742static inline void msg_set_bearer_id(struct tipc_msg *m, u32 n)
 743{
 744        msg_set_bits(m, 5, 9, 0x7, n);
 745}
 746
 747static inline u32 msg_redundant_link(struct tipc_msg *m)
 748{
 749        return msg_bits(m, 5, 12, 0x1);
 750}
 751
 752static inline void msg_set_redundant_link(struct tipc_msg *m)
 753{
 754        msg_set_bits(m, 5, 12, 0x1, 1);
 755}
 756
 757static 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
 767static inline u32 msg_msgcnt(struct tipc_msg *m)
 768{
 769        return msg_bits(m, 9, 16, 0xffff);
 770}
 771
 772static inline void msg_set_msgcnt(struct tipc_msg *m, u32 n)
 773{
 774        msg_set_bits(m, 9, 16, 0xffff, n);
 775}
 776
 777static inline u32 msg_bcast_tag(struct tipc_msg *m)
 778{
 779        return msg_bits(m, 9, 16, 0xffff);
 780}
 781
 782static inline void msg_set_bcast_tag(struct tipc_msg *m, u32 n)
 783{
 784        msg_set_bits(m, 9, 16, 0xffff, n);
 785}
 786
 787static inline u32 msg_max_pkt(struct tipc_msg *m)
 788{
 789        return msg_bits(m, 9, 16, 0xffff) * 4;
 790}
 791
 792static 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
 797static inline u32 msg_link_tolerance(struct tipc_msg *m)
 798{
 799        return msg_bits(m, 9, 0, 0xffff);
 800}
 801
 802static 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
 812static inline u32 msg_remote_node(struct tipc_msg *m)
 813{
 814        return msg_word(m, msg_hdr_sz(m)/4);
 815}
 816
 817static 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
 860u32 tipc_msg_tot_importance(struct tipc_msg *m);
 861void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type,
 862                            u32 hsize, u32 destnode);
 863int tipc_msg_calc_data_size(struct iovec const *msg_sect, u32 num_sect);
 864int 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
 868static 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
 873static 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