src/common/header.h
author Tom Henderson <tomh@tomh.org>
Fri, 10 Oct 2008 14:22:53 -0700
changeset 3740 4cb1e74d0f9e
parent 3192 702459162fff
child 5227 ecb08c1fc273
permissions -rw-r--r--
branch merge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
150
663120712cd9 fix coding style
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 131
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2005 INRIA
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 */
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
104
3006f1b350ae add header
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 103
diff changeset
    21
#ifndef HEADER_H
3006f1b350ae add header
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 103
diff changeset
    22
#define HEADER_H
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
2647
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2646
diff changeset
    24
#include "chunk.h"
2646
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    25
#include "buffer.h"
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    26
#include <stdint.h>
1253
a2d362dd86b5 use full reference for \relates tag
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1247
diff changeset
    27
16
99e833adbb46 change yans namespace to ns3
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 9
diff changeset
    28
namespace ns3 {
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
628
21122b21924d move doxygen doc into Header and Trailer classes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 463
diff changeset
    30
/**
3183
fc3b2e03e61e more doxygen
Tom Henderson <tomh@tomh.org>
parents: 3182
diff changeset
    31
 * \ingroup packet
3182
61fe7fe81ebd Doxygen organization
Tom Henderson <tomh@tomh.org>
parents: 2834
diff changeset
    32
 *
628
21122b21924d move doxygen doc into Header and Trailer classes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 463
diff changeset
    33
 * \brief Protocol header serialization and deserialization.
21122b21924d move doxygen doc into Header and Trailer classes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 463
diff changeset
    34
 *
21122b21924d move doxygen doc into Header and Trailer classes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 463
diff changeset
    35
 * Every Protocol header which needs to be inserted or removed
1247
d4ce2731bcf5 re-write header and trailer doxygen API doc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1240
diff changeset
    36
 * from a Packet instance must derive from this base class and
3192
702459162fff update doxygen
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3183
diff changeset
    37
 * implement the pure virtual methods defined here. 
1132
de8ccffc8485 doxygen improvements to Packet, Tags, and Headers/Trailers
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 909
diff changeset
    38
 *
1247
d4ce2731bcf5 re-write header and trailer doxygen API doc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1240
diff changeset
    39
 * Sample code which shows how to create a new type of Header, and how to use it, 
1240
4d58e61cd780 update reference to header sample code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1236
diff changeset
    40
 * is shown in the sample file samples/main-packet-header.cc
628
21122b21924d move doxygen doc into Header and Trailer classes.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 463
diff changeset
    41
 */
2647
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2646
diff changeset
    42
class Header : public Chunk
1247
d4ce2731bcf5 re-write header and trailer doxygen API doc
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1240
diff changeset
    43
{
2642
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    44
public:
2643
2a3324f4dabe define a TypeId for each Header/Trailer.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2642
diff changeset
    45
  static TypeId GetTypeId (void);
2642
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    46
  virtual ~Header ();
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    47
  /**
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    48
   * \returns the expected size of the header.
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    49
   *
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    50
   * This method is used by Packet::AddHeader
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    51
   * to store a header into the byte buffer of a packet. This method
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    52
   * should return the number of bytes which are needed to store
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    53
   * the full header data by Serialize.
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    54
   */
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    55
  virtual uint32_t GetSerializedSize (void) const = 0;
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    56
  /**
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    57
   * \param start an iterator which points to where the header should
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    58
   *        be written.
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    59
   *
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    60
   * This method is used by Packet::AddHeader to
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    61
   * store a header into the byte buffer of a packet.
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    62
   * The data written
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    63
   * is expected to match bit-for-bit the representation of this
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    64
   * header in a real network.
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    65
   */
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    66
  virtual void Serialize (Buffer::Iterator start) const = 0;
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    67
  /**
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    68
   * \param start an iterator which points to where the header should
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    69
   *        written.
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    70
   * \returns the number of bytes read.
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    71
   *
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    72
   * This method is used by Packet::RemoveHeader to
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    73
   * re-create a header from the byte buffer of a packet. 
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    74
   * The data read is expected to
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    75
   * match bit-for-bit the representation of this header in real
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    76
   * networks.
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    77
   */
a35a68bdcd88 make the base Header and Trailer classes virtual.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1253
diff changeset
    78
  virtual uint32_t Deserialize (Buffer::Iterator start) = 0;
2646
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    79
  /**
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    80
   * This method is used by Packet::Print to print the 
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    81
   * content of a trailer as ascii data to a c++ output stream.
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    82
   * Although the trailer is free to format its output as it
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    83
   * wishes, it is recommended to follow a few rules to integrate
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    84
   * with the packet pretty printer: start with flags, small field 
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    85
   * values located between a pair of parens. Values should be separated 
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    86
   * by whitespace. Follow the parens with the important fields, 
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    87
   * separated by whitespace.
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    88
   * i.e.: (field1 val1 field2 val2 field3 val3) field4 val4 field5 val5
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    89
   */
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    90
  virtual void Print (std::ostream &os) const = 0;
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    91
};
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
2646
c1fef7686472 remove dead code.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2643
diff changeset
    93
std::ostream & operator << (std::ostream &os, const Header &header);
1151
527d7b7e25af force users to register their header/trailer uid strings by hand rather than do lazy uid allocation.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1132
diff changeset
    94
527d7b7e25af force users to register their header/trailer uid strings by hand rather than do lazy uid allocation.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1132
diff changeset
    95
} // namespace ns3
9
2c31ae7c94db import from yans
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    96
104
3006f1b350ae add header
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 103
diff changeset
    97
#endif /* HEADER_H */