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, 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/*
  43 * Constants and routines used to read and write TIPC payload message headers
  44 *
  45 * Note: Some items are also used with TIPC internal message headers
  46 */
  47
  48#define TIPC_VERSION              2
  49
  50/*
  51 * Payload message users are defined in TIPC's public API:
  52 * - TIPC_LOW_IMPORTANCE
  53 * - TIPC_MEDIUM_IMPORTANCE
  54 * - TIPC_HIGH_IMPORTANCE
  55 * - TIPC_CRITICAL_IMPORTANCE
  56 */
  57
  58/*
  59 * Payload message types
  60 */
  61
  62#define TIPC_CONN_MSG           0
  63#define TIPC_MCAST_MSG          1
  64#define TIPC_NAMED_MSG          2
  65#define TIPC_DIRECT_MSG         3
  66
  67/*
  68 * Message header sizes
  69 */
  70
  71#define SHORT_H_SIZE              24    /* In-cluster basic payload message */
  72#define BASIC_H_SIZE              32    /* Basic payload message */
  73#define NAMED_H_SIZE              40    /* Named payload message */
  74#define MCAST_H_SIZE              44    /* Multicast payload message */
  75#define INT_H_SIZE                40    /* Internal messages */
  76#define MIN_H_SIZE                24    /* Smallest legal TIPC header size */
  77#define MAX_H_SIZE                60    /* Largest possible TIPC header size */
  78
  79#define MAX_MSG_SIZE (MAX_H_SIZE + TIPC_MAX_USER_MSG_SIZE)
  80
  81
  82struct tipc_msg {
  83        __be32 hdr[15];
  84};
  85
  86
  87static inline u32 msg_word(struct tipc_msg *m, u32 pos)
  88{
  89        return ntohl(m->hdr[pos]);
  90}
  91
  92static inline void msg_set_word(struct tipc_msg *m, u32 w, u32 val)
  93{
  94        m->hdr[w] = htonl(val);
  95}
  96
  97static inline u32 msg_bits(struct tipc_msg *m, u32 w, u32 pos, u32 mask)
  98{
  99        return (msg_word(m, w) >> pos) & mask;
 100}
 101
 102static inline void msg_set_bits(struct tipc_msg *m, u32 w,
 103                                u32 pos, u32 mask, u32 val)
 104{
 105        val = (val & mask) << pos;
 106        mask = mask << pos;
 107        m->hdr[w] &= ~htonl(mask);
 108        m->hdr[w] |= htonl(val);
 109}
 110
 111static inline void msg_swap_words(struct tipc_msg *msg, u32 a, u32 b)
 112{
 113        u32 temp = msg->hdr[a];
 114
 115        msg->hdr[a] = msg->hdr[b];
 116        msg->hdr[b] = temp;
 117}
 118
 119/*
 120 * Word 0
 121 */
 122
 123static inline u32 msg_version(struct tipc_msg *m)
 124{
 125        return msg_bits(m, 0, 29, 7);
 126}
 127
 128static inline void msg_set_version(struct tipc_msg *m)
 129{
 130        msg_set_bits(m, 0, 29, 7, TIPC_VERSION);
 131}
 132
 133static inline u32 msg_user(struct tipc_msg *m)
 134{
 135        return msg_bits(m, 0, 25, 0xf);
 136}
 137
 138static inline u32 msg_isdata(struct tipc_msg *m)
 139{
 140        return msg_user(m) <= TIPC_CRITICAL_IMPORTANCE;
 141}
 142
 143static inline void msg_set_user(struct tipc_msg *m, u32 n)
 144{
 145        msg_set_bits(m, 0, 25, 0xf, n);
 146}
 147
 148static inline u32 msg_importance(struct tipc_msg *m)
 149{
 150        return msg_bits(m, 0, 25, 0xf);
 151}
 152
 153static inline void msg_set_importance(struct tipc_msg *m, u32 i)
 154{
 155        msg_set_user(m, i);
 156}
 157
 158static inline u32 msg_hdr_sz(struct tipc_msg *m)
 159{
 160        return msg_bits(m, 0, 21, 0xf) << 2;
 161}
 162
 163static inline void msg_set_hdr_sz(struct tipc_msg *m, u32 n)
 164{
 165        msg_set_bits(m, 0, 21, 0xf, n>>2);
 166}
 167
 168static inline u32 msg_size(struct tipc_msg *m)
 169{
 170        return msg_bits(m, 0, 0, 0x1ffff);
 171}
 172
 173static inline u32 msg_data_sz(struct tipc_msg *m)
 174{
 175        return msg_size(m) - msg_hdr_sz(m);
 176}
 177
 178static inline int msg_non_seq(struct tipc_msg *m)
 179{
 180        return msg_bits(m, 0, 20, 1);
 181}
 182
 183static inline void msg_set_non_seq(struct tipc_msg *m, u32 n)
 184{
 185        msg_set_bits(m, 0, 20, 1, n);
 186}
 187
 188static inline int msg_dest_droppable(struct tipc_msg *m)
 189{
 190        return msg_bits(m, 0, 19, 1);
 191}
 192
 193static inline void msg_set_dest_droppable(struct tipc_msg *m, u32 d)
 194{
 195        msg_set_bits(m, 0, 19, 1, d);
 196}
 197
 198static inline int msg_src_droppable(struct tipc_msg *m)
 199{
 200        return msg_bits(m, 0, 18, 1);
 201}
 202
 203static inline void msg_set_src_droppable(struct tipc_msg *m, u32 d)
 204{
 205        msg_set_bits(m, 0, 18, 1, d);
 206}
 207
 208static inline void msg_set_size(struct tipc_msg *m, u32 sz)
 209{
 210        m->hdr[0] = htonl((msg_word(m, 0) & ~0x1ffff) | sz);
 211}
 212
 213
 214/*
 215 * Word 1
 216 */
 217
 218static inline u32 msg_type(struct tipc_msg *m)
 219{
 220        return msg_bits(m, 1, 29, 0x7);
 221}
 222
 223static inline void msg_set_type(struct tipc_msg *m, u32 n)
 224{
 225        msg_set_bits(m, 1, 29, 0x7, n);
 226}
 227
 228static inline u32 msg_named(struct tipc_msg *m)
 229{
 230        return msg_type(m) == TIPC_NAMED_MSG;
 231}
 232
 233static inline u32 msg_mcast(struct tipc_msg *m)
 234{
 235        return msg_type(m) == TIPC_MCAST_MSG;
 236}
 237
 238static inline u32 msg_connected(struct tipc_msg *m)
 239{
 240        return msg_type(m) == TIPC_CONN_MSG;
 241}
 242
 243static inline u32 msg_errcode(struct tipc_msg *m)
 244{
 245        return msg_bits(m, 1, 25, 0xf);
 246}
 247
 248static inline void msg_set_errcode(struct tipc_msg *m, u32 err)
 249{
 250        msg_set_bits(m, 1, 25, 0xf, err);
 251}
 252
 253static inline u32 msg_reroute_cnt(struct tipc_msg *m)
 254{
 255        return msg_bits(m, 1, 21, 0xf);
 256}
 257
 258static inline void msg_incr_reroute_cnt(struct tipc_msg *m)
 259{
 260        msg_set_bits(m, 1, 21, 0xf, msg_reroute_cnt(m) + 1);
 261}
 262
 263static inline void msg_reset_reroute_cnt(struct tipc_msg *m)
 264{
 265        msg_set_bits(m, 1, 21, 0xf, 0);
 266}
 267
 268static inline u32 msg_lookup_scope(struct tipc_msg *m)
 269{
 270        return msg_bits(m, 1, 19, 0x3);
 271}
 272
 273static inline void msg_set_lookup_scope(struct tipc_msg *m, u32 n)
 274{
 275        msg_set_bits(m, 1, 19, 0x3, n);
 276}
 277
 278static inline u32 msg_bcast_ack(struct tipc_msg *m)
 279{
 280        return msg_bits(m, 1, 0, 0xffff);
 281}
 282
 283static inline void msg_set_bcast_ack(struct tipc_msg *m, u32 n)
 284{
 285        msg_set_bits(m, 1, 0, 0xffff, n);
 286}
 287
 288
 289/*
 290 * Word 2
 291 */
 292
 293static inline u32 msg_ack(struct tipc_msg *m)
 294{
 295        return msg_bits(m, 2, 16, 0xffff);
 296}
 297
 298static inline void msg_set_ack(struct tipc_msg *m, u32 n)
 299{
 300        msg_set_bits(m, 2, 16, 0xffff, n);
 301}
 302
 303static inline u32 msg_seqno(struct tipc_msg *m)
 304{
 305        return msg_bits(m, 2, 0, 0xffff);
 306}
 307
 308static inline void msg_set_seqno(struct tipc_msg *m, u32 n)
 309{
 310        msg_set_bits(m, 2, 0, 0xffff, n);
 311}
 312
 313/*
 314 * Words 3-10
 315 */
 316
 317
 318static inline u32 msg_prevnode(struct tipc_msg *m)
 319{
 320        return msg_word(m, 3);
 321}
 322
 323static inline void msg_set_prevnode(struct tipc_msg *m, u32 a)
 324{
 325        msg_set_word(m, 3, a);
 326}
 327
 328static inline u32 msg_origport(struct tipc_msg *m)
 329{
 330        return msg_word(m, 4);
 331}
 332
 333static inline void msg_set_origport(struct tipc_msg *m, u32 p)
 334{
 335        msg_set_word(m, 4, p);
 336}
 337
 338static inline u32 msg_destport(struct tipc_msg *m)
 339{
 340        return msg_word(m, 5);
 341}
 342
 343static inline void msg_set_destport(struct tipc_msg *m, u32 p)
 344{
 345        msg_set_word(m, 5, p);
 346}
 347
 348static inline u32 msg_mc_netid(struct tipc_msg *m)
 349{
 350        return msg_word(m, 5);
 351}
 352
 353static inline void msg_set_mc_netid(struct tipc_msg *m, u32 p)
 354{
 355        msg_set_word(m, 5, p);
 356}
 357
 358static inline int msg_short(struct tipc_msg *m)
 359{
 360        return msg_hdr_sz(m) == SHORT_H_SIZE;
 361}
 362
 363static inline u32 msg_orignode(struct tipc_msg *m)
 364{
 365        if (likely(msg_short(m)))
 366                return msg_prevnode(m);
 367        return msg_word(m, 6);
 368}
 369
 370static inline void msg_set_orignode(struct tipc_msg *m, u32 a)
 371{
 372        msg_set_word(m, 6, a);
 373}
 374
 375static inline u32 msg_destnode(struct tipc_msg *m)
 376{
 377        return msg_word(m, 7);
 378}
 379
 380static inline void msg_set_destnode(struct tipc_msg *m, u32 a)
 381{
 382        msg_set_word(m, 7, a);
 383}
 384
 385static inline int msg_is_dest(struct tipc_msg *m, u32 d)
 386{
 387        return msg_short(m) || (msg_destnode(m) == d);
 388}
 389
 390static inline u32 msg_nametype(struct tipc_msg *m)
 391{
 392        return msg_word(m, 8);
 393}
 394
 395static inline void msg_set_nametype(struct tipc_msg *m, u32 n)
 396{
 397        msg_set_word(m, 8, n);
 398}
 399
 400static inline u32 msg_nameinst(struct tipc_msg *m)
 401{
 402        return msg_word(m, 9);
 403}
 404
 405static inline u32 msg_namelower(struct tipc_msg *m)
 406{
 407        return msg_nameinst(m);
 408}
 409
 410static inline void msg_set_namelower(struct tipc_msg *m, u32 n)
 411{
 412        msg_set_word(m, 9, n);
 413}
 414
 415static inline void msg_set_nameinst(struct tipc_msg *m, u32 n)
 416{
 417        msg_set_namelower(m, n);
 418}
 419
 420static inline u32 msg_nameupper(struct tipc_msg *m)
 421{
 422        return msg_word(m, 10);
 423}
 424
 425static inline void msg_set_nameupper(struct tipc_msg *m, u32 n)
 426{
 427        msg_set_word(m, 10, n);
 428}
 429
 430static inline unchar *msg_data(struct tipc_msg *m)
 431{
 432        return ((unchar *)m) + msg_hdr_sz(m);
 433}
 434
 435static inline struct tipc_msg *msg_get_wrapped(struct tipc_msg *m)
 436{
 437        return (struct tipc_msg *)msg_data(m);
 438}
 439
 440
 441/*
 442 * Constants and routines used to read and write TIPC internal message headers
 443 */
 444
 445/*
 446 * Internal message users
 447 */
 448
 449#define  BCAST_PROTOCOL       5
 450#define  MSG_BUNDLER          6
 451#define  LINK_PROTOCOL        7
 452#define  CONN_MANAGER         8
 453#define  ROUTE_DISTRIBUTOR    9         /* obsoleted */
 454#define  CHANGEOVER_PROTOCOL  10
 455#define  NAME_DISTRIBUTOR     11
 456#define  MSG_FRAGMENTER       12
 457#define  LINK_CONFIG          13
 458
 459/*
 460 *  Connection management protocol message types
 461 */
 462
 463#define CONN_PROBE        0
 464#define CONN_PROBE_REPLY  1
 465#define CONN_ACK          2
 466
 467/*
 468 * Name distributor message types
 469 */
 470
 471#define PUBLICATION       0
 472#define WITHDRAWAL        1
 473
 474/*
 475 * Segmentation message types
 476 */
 477
 478#define FIRST_FRAGMENT          0
 479#define FRAGMENT                1
 480#define LAST_FRAGMENT           2
 481
 482/*
 483 * Link management protocol message types
 484 */
 485
 486#define STATE_MSG               0
 487#define RESET_MSG               1
 488#define ACTIVATE_MSG            2
 489
 490/*
 491 * Changeover tunnel message types
 492 */
 493#define DUPLICATE_MSG           0
 494#define ORIGINAL_MSG            1
 495
 496/*
 497 * Config protocol message types
 498 */
 499
 500#define DSC_REQ_MSG             0
 501#define DSC_RESP_MSG            1
 502
 503
 504/*
 505 * Word 1
 506 */
 507
 508static inline u32 msg_seq_gap(struct tipc_msg *m)
 509{
 510        return msg_bits(m, 1, 16, 0x1fff);
 511}
 512
 513static inline void msg_set_seq_gap(struct tipc_msg *m, u32 n)
 514{
 515        msg_set_bits(m, 1, 16, 0x1fff, n);
 516}
 517
 518
 519/*
 520 * Word 2
 521 */
 522
 523static inline u32 msg_dest_domain(struct tipc_msg *m)
 524{
 525        return msg_word(m, 2);
 526}
 527
 528static inline void msg_set_dest_domain(struct tipc_msg *m, u32 n)
 529{
 530        msg_set_word(m, 2, n);
 531}
 532
 533static inline u32 msg_bcgap_after(struct tipc_msg *m)
 534{
 535        return msg_bits(m, 2, 16, 0xffff);
 536}
 537
 538static inline void msg_set_bcgap_after(struct tipc_msg *m, u32 n)
 539{
 540        msg_set_bits(m, 2, 16, 0xffff, n);
 541}
 542
 543static inline u32 msg_bcgap_to(struct tipc_msg *m)
 544{
 545        return msg_bits(m, 2, 0, 0xffff);
 546}
 547
 548static inline void msg_set_bcgap_to(struct tipc_msg *m, u32 n)
 549{
 550        msg_set_bits(m, 2, 0, 0xffff, n);
 551}
 552
 553
 554/*
 555 * Word 4
 556 */
 557
 558static inline u32 msg_last_bcast(struct tipc_msg *m)
 559{
 560        return msg_bits(m, 4, 16, 0xffff);
 561}
 562
 563static inline void msg_set_last_bcast(struct tipc_msg *m, u32 n)
 564{
 565        msg_set_bits(m, 4, 16, 0xffff, n);
 566}
 567
 568
 569static inline u32 msg_fragm_no(struct tipc_msg *m)
 570{
 571        return msg_bits(m, 4, 16, 0xffff);
 572}
 573
 574static inline void msg_set_fragm_no(struct tipc_msg *m, u32 n)
 575{
 576        msg_set_bits(m, 4, 16, 0xffff, n);
 577}
 578
 579
 580static inline u32 msg_next_sent(struct tipc_msg *m)
 581{
 582        return msg_bits(m, 4, 0, 0xffff);
 583}
 584
 585static inline void msg_set_next_sent(struct tipc_msg *m, u32 n)
 586{
 587        msg_set_bits(m, 4, 0, 0xffff, n);
 588}
 589
 590
 591static inline u32 msg_long_msgno(struct tipc_msg *m)
 592{
 593        return msg_bits(m, 4, 0, 0xffff);
 594}
 595
 596static inline void msg_set_long_msgno(struct tipc_msg *m, u32 n)
 597{
 598        msg_set_bits(m, 4, 0, 0xffff, n);
 599}
 600
 601static inline u32 msg_bc_netid(struct tipc_msg *m)
 602{
 603        return msg_word(m, 4);
 604}
 605
 606static inline void msg_set_bc_netid(struct tipc_msg *m, u32 id)
 607{
 608        msg_set_word(m, 4, id);
 609}
 610
 611static inline u32 msg_link_selector(struct tipc_msg *m)
 612{
 613        return msg_bits(m, 4, 0, 1);
 614}
 615
 616static inline void msg_set_link_selector(struct tipc_msg *m, u32 n)
 617{
 618        msg_set_bits(m, 4, 0, 1, n);
 619}
 620
 621/*
 622 * Word 5
 623 */
 624
 625static inline u32 msg_session(struct tipc_msg *m)
 626{
 627        return msg_bits(m, 5, 16, 0xffff);
 628}
 629
 630static inline void msg_set_session(struct tipc_msg *m, u32 n)
 631{
 632        msg_set_bits(m, 5, 16, 0xffff, n);
 633}
 634
 635static inline u32 msg_probe(struct tipc_msg *m)
 636{
 637        return msg_bits(m, 5, 0, 1);
 638}
 639
 640static inline void msg_set_probe(struct tipc_msg *m, u32 val)
 641{
 642        msg_set_bits(m, 5, 0, 1, val);
 643}
 644
 645static inline char msg_net_plane(struct tipc_msg *m)
 646{
 647        return msg_bits(m, 5, 1, 7) + 'A';
 648}
 649
 650static inline void msg_set_net_plane(struct tipc_msg *m, char n)
 651{
 652        msg_set_bits(m, 5, 1, 7, (n - 'A'));
 653}
 654
 655static inline u32 msg_linkprio(struct tipc_msg *m)
 656{
 657        return msg_bits(m, 5, 4, 0x1f);
 658}
 659
 660static inline void msg_set_linkprio(struct tipc_msg *m, u32 n)
 661{
 662        msg_set_bits(m, 5, 4, 0x1f, n);
 663}
 664
 665static inline u32 msg_bearer_id(struct tipc_msg *m)
 666{
 667        return msg_bits(m, 5, 9, 0x7);
 668}
 669
 670static inline void msg_set_bearer_id(struct tipc_msg *m, u32 n)
 671{
 672        msg_set_bits(m, 5, 9, 0x7, n);
 673}
 674
 675static inline u32 msg_redundant_link(struct tipc_msg *m)
 676{
 677        return msg_bits(m, 5, 12, 0x1);
 678}
 679
 680static inline void msg_set_redundant_link(struct tipc_msg *m, u32 r)
 681{
 682        msg_set_bits(m, 5, 12, 0x1, r);
 683}
 684
 685
 686/*
 687 * Word 9
 688 */
 689
 690static inline u32 msg_msgcnt(struct tipc_msg *m)
 691{
 692        return msg_bits(m, 9, 16, 0xffff);
 693}
 694
 695static inline void msg_set_msgcnt(struct tipc_msg *m, u32 n)
 696{
 697        msg_set_bits(m, 9, 16, 0xffff, n);
 698}
 699
 700static inline u32 msg_bcast_tag(struct tipc_msg *m)
 701{
 702        return msg_bits(m, 9, 16, 0xffff);
 703}
 704
 705static inline void msg_set_bcast_tag(struct tipc_msg *m, u32 n)
 706{
 707        msg_set_bits(m, 9, 16, 0xffff, n);
 708}
 709
 710static inline u32 msg_max_pkt(struct tipc_msg *m)
 711{
 712        return msg_bits(m, 9, 16, 0xffff) * 4;
 713}
 714
 715static inline void msg_set_max_pkt(struct tipc_msg *m, u32 n)
 716{
 717        msg_set_bits(m, 9, 16, 0xffff, (n / 4));
 718}
 719
 720static inline u32 msg_link_tolerance(struct tipc_msg *m)
 721{
 722        return msg_bits(m, 9, 0, 0xffff);
 723}
 724
 725static inline void msg_set_link_tolerance(struct tipc_msg *m, u32 n)
 726{
 727        msg_set_bits(m, 9, 0, 0xffff, n);
 728}
 729
 730u32 tipc_msg_tot_importance(struct tipc_msg *m);
 731void tipc_msg_init(struct tipc_msg *m, u32 user, u32 type,
 732                            u32 hsize, u32 destnode);
 733int tipc_msg_build(struct tipc_msg *hdr, struct iovec const *msg_sect,
 734                   u32 num_sect, unsigned int total_len,
 735                            int max_size, int usrmem, struct sk_buff **buf);
 736
 737static inline void msg_set_media_addr(struct tipc_msg *m, struct tipc_media_addr *a)
 738{
 739        memcpy(&((int *)m)[5], a, sizeof(*a));
 740}
 741
 742static inline void msg_get_media_addr(struct tipc_msg *m, struct tipc_media_addr *a)
 743{
 744        memcpy(a, &((int *)m)[5], sizeof(*a));
 745}
 746
 747#endif
 748