src/common/packet-metadata.h
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Mon, 25 Aug 2008 15:21:01 -0700
changeset 3553 065488d0420c
parent 3304 6ea20d776d55
child 3754 ee45d2d71f01
permissions -rw-r--r--
bug 279: Packets need metadata support for printing without header checking
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2006,2007 INRIA
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 */
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
    20
#ifndef PACKET_METADATA_H
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
    21
#define PACKET_METADATA_H
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
#include <stdint.h>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
#include <vector>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
#include "ns3/callback.h"
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
    26
#include "ns3/assert.h"
2647
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2645
diff changeset
    27
#include "ns3/type-id.h"
2639
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    28
#include "buffer.h"
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
namespace ns3 {
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    31
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
class Chunk;
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
class Buffer;
2645
139b2dec56c0 stop using ChunkRegistry to get header and trailer uids
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2639
diff changeset
    34
class Header;
139b2dec56c0 stop using ChunkRegistry to get header and trailer uids
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2639
diff changeset
    35
class Trailer;
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    36
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    37
/**
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    38
 * \internal
3182
61fe7fe81ebd Doxygen organization
Tom Henderson <tomh@tomh.org>
parents: 3053
diff changeset
    39
 * \ingroup packet
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    40
 * \brief handle packet metadata about packet headers and trailers
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    41
 *
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    42
 * This class is used by the Packet class to record every operation
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    43
 * performed on the packet's buffer. This class also provides
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    44
 * an implementation of the Packet::Print methods which uses
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    45
 * the metadata to analyse the content of the packet's buffer.
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    46
 *
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    47
 * To achieve this, this class maintains a linked list of so-called
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    48
 * "items", each of which represents a header or a trailer, or 
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    49
 * payload, or a fragment of any of these. Each item contains a "next"
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    50
 * and a "prev" field which point to the next and previous entries
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    51
 * in the linked list. The PacketMetadata class maintains a pair
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    52
 * of pointers to the head and the tail of the linked list.
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    53
 *
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    54
 * Each entry in the list also maintains:
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    55
 *   - its native size (the size it had when it was first added
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    56
 *     to the packet)
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    57
 *   - its type: identifies what kind of header, what kind of trailer,
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    58
 *     if it is payload or not
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    59
 *   - the uid of the packet to which it was first added
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    60
 *   - the start and end of the area represented by a fragment
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    61
 *     if it is one.
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    62
 *
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    63
 * This linked list is flattened in a byte buffer stored in
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    64
 * struct PacketMetadata::Data. Each entry of the linked list is
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    65
 * identified by an offset which identifies the first byte of the
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    66
 * entry from the start of the data buffer. The size of this data
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    67
 * buffer is 2^16-1 bytes maximum which somewhat limits the number
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    68
 * of entries which can be stored in this linked list but it is
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    69
 * quite unlikely to hit this limit in practice.
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    70
 *
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    71
 * Each item of the linked list is a variable-sized byte buffer
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    72
 * made of a number of fields. Some of these fields are stored
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    73
 * as fixed-size 32 bit integers, others as fixed-size 16 bit 
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    74
 * integers, and some others as variable-size 32-bit integers.
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    75
 * The variable-size 32 bit integers are stored using the uleb128
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    76
 * encoding.
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    77
 */
2639
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    78
class PacketMetadata 
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    79
{
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
public:
2639
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    81
  struct Item 
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    82
  {
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    83
    enum {
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    84
      PAYLOAD,
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    85
      HEADER,
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    86
      TRAILER
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    87
    } type;
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    88
    /* true: this is a fragmented header, trailer, or, payload.
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    89
     * false: this is a whole header, trailer, or, payload.
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    90
     */
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    91
    bool isFragment;
2647
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2645
diff changeset
    92
    /* TypeId of Header or Trailer. Valid only if type is 
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2645
diff changeset
    93
     * header or trailer.
2639
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    94
     */
2647
3e9474e1d77b implement Packet::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2645
diff changeset
    95
    TypeId tid;
2639
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    96
    /* size of item. If fragment, size of fragment. Otherwise, 
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    97
     * size of original item. 
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    98
     */
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
    99
    uint32_t currentSize;
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   100
    /* how many bytes were trimed from the start of a fragment.
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   101
     * if isFragment is true, this field is zero.
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   102
     */
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   103
    uint32_t currentTrimedFromStart;
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   104
    /* how many bytes were trimed from the end of a fragment.
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   105
     * if isFragment is true, this field is zero.
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   106
     */
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   107
    uint32_t currentTrimedFromEnd;
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   108
    /* an iterator which can be fed to Deserialize. Valid only
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   109
     * if isFragment and isPayload are false.
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   110
     */
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   111
    Buffer::Iterator current;
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   112
  };
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   113
  class ItemIterator 
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   114
  {
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   115
  public:
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   116
    ItemIterator (const PacketMetadata *metadata, Buffer buffer);
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   117
    bool HasNext (void) const;
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   118
    Item Next (void);
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   119
  private:
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   120
    const PacketMetadata *m_metadata;
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   121
    Buffer m_buffer;
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   122
    uint16_t m_current;
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   123
    uint32_t m_offset;
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   124
    bool m_hasReadTail;
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   125
  };
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   126
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   127
  static void Enable (void);
3553
065488d0420c bug 279: Packets need metadata support for printing without header checking
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3304
diff changeset
   128
  static void EnableChecking (void);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   129
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   130
  inline PacketMetadata (uint32_t uid, uint32_t size);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   131
  inline PacketMetadata (PacketMetadata const &o);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   132
  inline PacketMetadata &operator = (PacketMetadata const& o);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   133
  inline ~PacketMetadata ();
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   134
2645
139b2dec56c0 stop using ChunkRegistry to get header and trailer uids
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2639
diff changeset
   135
  void AddHeader (Header const &header, uint32_t size);
139b2dec56c0 stop using ChunkRegistry to get header and trailer uids
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2639
diff changeset
   136
  void RemoveHeader (Header const &header, uint32_t size);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   137
2645
139b2dec56c0 stop using ChunkRegistry to get header and trailer uids
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2639
diff changeset
   138
  void AddTrailer (Trailer const &trailer, uint32_t size);
139b2dec56c0 stop using ChunkRegistry to get header and trailer uids
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2639
diff changeset
   139
  void RemoveTrailer (Trailer const &trailer, uint32_t size);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   140
3304
6ea20d776d55 add documentation comment.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3200
diff changeset
   141
  /**
6ea20d776d55 add documentation comment.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3200
diff changeset
   142
   * \param start the amount of stuff to remove from the start
6ea20d776d55 add documentation comment.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3200
diff changeset
   143
   * \param end the amount of stuff to remove from the end
6ea20d776d55 add documentation comment.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3200
diff changeset
   144
   *
6ea20d776d55 add documentation comment.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3200
diff changeset
   145
   * Calling this method is equivalent to calling RemoveAtStart (start)
6ea20d776d55 add documentation comment.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3200
diff changeset
   146
   * and then, RemoveAtEnd (end).
6ea20d776d55 add documentation comment.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3200
diff changeset
   147
   */
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   148
  PacketMetadata CreateFragment (uint32_t start, uint32_t end) const;
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   149
  void AddAtEnd (PacketMetadata const&o);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
  void AddPaddingAtEnd (uint32_t end);
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   151
  void RemoveAtStart (uint32_t start);
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   152
  void RemoveAtEnd (uint32_t end);
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   153
887
acd1bbdf4f2f avoid duplicating the packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 883
diff changeset
   154
  uint32_t GetUid (void) const;
acd1bbdf4f2f avoid duplicating the packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 883
diff changeset
   155
1143
7da9f7103447 implement packet metadata serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1141
diff changeset
   156
  uint32_t GetSerializedSize (void) const;
7da9f7103447 implement packet metadata serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1141
diff changeset
   157
  void Serialize (Buffer::Iterator i, uint32_t size) const;
7da9f7103447 implement packet metadata serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1141
diff changeset
   158
  uint32_t Deserialize (Buffer::Iterator i);
7da9f7103447 implement packet metadata serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1141
diff changeset
   159
876
850783184c36 add back optimization option
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 874
diff changeset
   160
  static void PrintStats (void);
850783184c36 add back optimization option
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 874
diff changeset
   161
2639
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   162
  ItemIterator BeginItem (Buffer buffer) const;
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   163
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   164
private:
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   165
  struct Data {
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   166
    /* number of references to this struct Data instance. */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   167
    uint16_t m_count;
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   168
    /* size (in bytes) of m_data buffer below */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   169
    uint16_t m_size;
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   170
    /* max of the m_used field over all objects which 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   171
     * reference this struct Data instance */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   172
    uint16_t m_dirtyEnd;
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   173
    /* variable-sized buffer of bytes */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   174
    uint8_t m_data[10];
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   175
  };
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   176
  /* Note that since the next and prev fields are 16 bit integers
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   177
     and since the value 0xffff is reserved to identify the 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   178
     fact that the end or the start of the list is reached,
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   179
     only a limited number of elements can be stored in 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   180
     a m_data byte buffer.
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   181
   */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   182
  struct SmallItem {
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   183
    /* offset (in bytes) from start of m_data buffer 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   184
       to next element in linked list. value is 0xffff 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   185
       if next element does not exist.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   186
       stored as a fixed-size 16 bit integer.
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   187
    */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   188
    uint16_t next;
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   189
    /* offset (in bytes) from start of m_data buffer 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   190
       to previous element in linked list. value is 0xffff 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   191
       if previous element does not exist.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   192
       stored as a fixed-size 16 bit integer.
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   193
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   194
    uint16_t prev;
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   195
    /* the high 31 bits of this field identify the 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   196
       type of the header or trailer represented by 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   197
       this item: the value zero represents payload.
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   198
       If the low bit of this uid is one, an ExtraItem
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   199
       structure follows this SmallItem structure.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   200
       stored as a variable-size 32 bit integer.
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   201
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   202
    uint32_t typeUid;
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   203
    /* the size (in bytes) of the header or trailer represented
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   204
       by this element.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   205
       stored as a variable-size 32 bit integer.
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   206
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   207
    uint32_t size;
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   208
    /* this field tries to uniquely identify each header or 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   209
       trailer _instance_ while the typeUid field uniquely
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   210
       identifies each header or trailer _type_. This field
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   211
       is used to test whether two items are equal in the sense 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   212
       that they represent the same header or trailer instance.
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   213
       That equality test is based on the typeUid and chunkUid
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   214
       fields so, the likelyhood that two header instances 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   215
       share the same chunkUid _and_ typeUid is very small 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   216
       unless they are really representations of the same header
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   217
       instance.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   218
       stored as a fixed-size 16 bit integer.
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   219
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   220
    uint16_t chunkUid;
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   221
  };
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   222
  struct ExtraItem {
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   223
    /* offset (in bytes) from start of original header to 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   224
       the start of the fragment still present.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   225
       stored as a variable-size 32 bit integer.
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   226
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   227
    uint32_t fragmentStart;
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   228
    /* offset (in bytes) from start of original header to 
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   229
       the end of the fragment still present.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   230
       stored as a variable-size 32 bit integer.
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   231
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   232
    uint32_t fragmentEnd;
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   233
    /* the packetUid of the packet in which this header or trailer
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   234
       was first added. It could be different from the m_packetUid
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   235
       field if the user has aggregated multiple packets into one.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   236
       stored as a fixed-size 32 bit integer.
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   237
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   238
    uint32_t packetUid;
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   239
  };
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   240
957
426b85bab45f fix bug 57
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 908
diff changeset
   241
  class DataFreeList : public std::vector<struct Data *>
426b85bab45f fix bug 57
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 908
diff changeset
   242
  {
426b85bab45f fix bug 57
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 908
diff changeset
   243
  public:
426b85bab45f fix bug 57
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 908
diff changeset
   244
    ~DataFreeList ();
426b85bab45f fix bug 57
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 908
diff changeset
   245
  };
1700
2f03a3b8a225 Fix bug 80 (valgrind error when finalizing PacketMetadata).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1525
diff changeset
   246
2f03a3b8a225 Fix bug 80 (valgrind error when finalizing PacketMetadata).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1525
diff changeset
   247
  friend DataFreeList::~DataFreeList ();
2639
588221b7f892 replace PacketPrinter with an iterator
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1700
diff changeset
   248
  friend class ItemIterator;
1700
2f03a3b8a225 Fix bug 80 (valgrind error when finalizing PacketMetadata).
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1525
diff changeset
   249
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   250
  PacketMetadata ();
794
f30d69393a24 implement ItemList::AddAtEnd
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 792
diff changeset
   251
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   252
  inline uint16_t AddSmall (const PacketMetadata::SmallItem *item);
867
e98cde9aae4a remove atStart arg to AddBig
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 866
diff changeset
   253
  uint16_t AddBig (uint32_t head, uint32_t tail,
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   254
                   const PacketMetadata::SmallItem *item, 
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   255
                   const PacketMetadata::ExtraItem *extraItem);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   256
  void ReplaceTail (PacketMetadata::SmallItem *item, 
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   257
                    PacketMetadata::ExtraItem *extraItem,
855
6b27e6180fcb implement ReplaceTail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 854
diff changeset
   258
                    uint32_t available);
863
768945a45089 Update -> UpdateHead + UpdateTail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 862
diff changeset
   259
  inline void UpdateHead (uint16_t written);
768945a45089 Update -> UpdateHead + UpdateTail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 862
diff changeset
   260
  inline void UpdateTail (uint16_t written);
3052
f64799121881 simplify code logic
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2877
diff changeset
   261
  inline uint32_t GetUleb128Size (uint32_t value) const;
868
390916503061 optimize a bit AddHeader
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 867
diff changeset
   262
  uint32_t ReadUleb128 (const uint8_t **pBuffer) const;
857
6f7593400c82 a few micro-optimizations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 855
diff changeset
   263
  inline void Append16 (uint16_t value, uint8_t *buffer);
3053
a14d83bacc9c simplify code logic
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3052
diff changeset
   264
  inline void Append32 (uint32_t value, uint8_t *buffer);
3052
f64799121881 simplify code logic
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2877
diff changeset
   265
  inline void AppendValue (uint32_t value, uint8_t *buffer);
876
850783184c36 add back optimization option
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 874
diff changeset
   266
  void AppendValueExtra (uint32_t value, uint8_t *buffer);
870
e335d37541c3 try alternative implementation of AddSmall
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 869
diff changeset
   267
  inline void Reserve (uint32_t n);
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   268
  void ReserveCopy (uint32_t n);
837
b73b63e84130 implement PacketHistory::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 835
diff changeset
   269
  uint32_t GetTotalSize (void) const;
855
6b27e6180fcb implement ReplaceTail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 854
diff changeset
   270
  uint32_t ReadItems (uint16_t current, 
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   271
                      struct PacketMetadata::SmallItem *item,
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   272
                      struct PacketMetadata::ExtraItem *extraItem) const;
2645
139b2dec56c0 stop using ChunkRegistry to get header and trailer uids
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2639
diff changeset
   273
  void DoAddHeader (uint32_t uid, uint32_t size);
847
319d107f2435 rewrite PacketHistory::RemoveAtstart
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 845
diff changeset
   274
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   275
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   276
  static struct PacketMetadata::Data *Create (uint32_t size);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   277
  static void Recycle (struct PacketMetadata::Data *data);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   278
  static struct PacketMetadata::Data *Allocate (uint32_t n);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   279
  static void Deallocate (struct PacketMetadata::Data *data);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   280
  
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   281
  static DataFreeList m_freeList;
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   282
  static bool m_enable;
3553
065488d0420c bug 279: Packets need metadata support for printing without header checking
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3304
diff changeset
   283
  static bool m_enableChecking;
1525
648048bca501 Check for the common error of enabling packet metadata in the middle of a simulation, and give appropriate advice in this case. Closes #78.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1312
diff changeset
   284
648048bca501 Check for the common error of enabling packet metadata in the middle of a simulation, and give appropriate advice in this case. Closes #78.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1312
diff changeset
   285
  // set to true when adding metadata to a packet is skipped because
648048bca501 Check for the common error of enabling packet metadata in the middle of a simulation, and give appropriate advice in this case. Closes #78.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1312
diff changeset
   286
  // m_enable is false; used to detect enabling of metadata in the
648048bca501 Check for the common error of enabling packet metadata in the middle of a simulation, and give appropriate advice in this case. Closes #78.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1312
diff changeset
   287
  // middle of a simulation, which isn't allowed.
648048bca501 Check for the common error of enabling packet metadata in the middle of a simulation, and give appropriate advice in this case. Closes #78.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1312
diff changeset
   288
  static bool m_metadataSkipped;
648048bca501 Check for the common error of enabling packet metadata in the middle of a simulation, and give appropriate advice in this case. Closes #78.
Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
parents: 1312
diff changeset
   289
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   290
  static uint32_t m_maxSize;
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   291
  static uint16_t m_chunkUid;
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   292
  
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   293
  struct Data *m_data;
900
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   294
  /**
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   295
     head -(next)-> tail
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   296
       ^             |
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   297
        \---(prev)---|
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   298
   */
840
e473844a60c2 rename begin to head and end to tail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 837
diff changeset
   299
  uint16_t m_head;
e473844a60c2 rename begin to head and end to tail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 837
diff changeset
   300
  uint16_t m_tail;
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   301
  uint16_t m_used;
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   302
  uint32_t m_packetUid;
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   303
};
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   304
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   305
}; // namespace ns3
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   306
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   307
namespace ns3 {
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   308
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   309
PacketMetadata::PacketMetadata (uint32_t uid, uint32_t size)
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   310
  : m_data (m_data = PacketMetadata::Create (10)),
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   311
    m_head (0xffff),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   312
    m_tail (0xffff),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   313
    m_used (0),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   314
    m_packetUid (uid)
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   315
{
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   316
  memset (m_data->m_data, 0xff, 4);
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   317
  if (size > 0)
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   318
    {
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   319
      DoAddHeader (0, size);
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   320
    }
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   321
}
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   322
PacketMetadata::PacketMetadata (PacketMetadata const &o)
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   323
  : m_data (o.m_data),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   324
    m_head (o.m_head),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   325
    m_tail (o.m_tail),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   326
    m_used (o.m_used),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   327
    m_packetUid (o.m_packetUid)
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   328
{
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   329
  NS_ASSERT (m_data != 0);
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   330
  m_data->m_count++;
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   331
}
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   332
PacketMetadata &
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   333
PacketMetadata::operator = (PacketMetadata const& o)
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   334
{
1312
8bc3f26344b9 add failing test and fix for assignment to self
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1151
diff changeset
   335
  if (m_data != o.m_data) 
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   336
    {
1312
8bc3f26344b9 add failing test and fix for assignment to self
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1151
diff changeset
   337
      // not self assignment
8bc3f26344b9 add failing test and fix for assignment to self
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1151
diff changeset
   338
      NS_ASSERT (m_data != 0);
8bc3f26344b9 add failing test and fix for assignment to self
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1151
diff changeset
   339
      m_data->m_count--;
8bc3f26344b9 add failing test and fix for assignment to self
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1151
diff changeset
   340
      if (m_data->m_count == 0) 
8bc3f26344b9 add failing test and fix for assignment to self
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1151
diff changeset
   341
        {
8bc3f26344b9 add failing test and fix for assignment to self
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1151
diff changeset
   342
          PacketMetadata::Recycle (m_data);
8bc3f26344b9 add failing test and fix for assignment to self
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1151
diff changeset
   343
        }
8bc3f26344b9 add failing test and fix for assignment to self
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1151
diff changeset
   344
      m_data = o.m_data;
8bc3f26344b9 add failing test and fix for assignment to self
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1151
diff changeset
   345
      NS_ASSERT (m_data != 0);
8bc3f26344b9 add failing test and fix for assignment to self
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1151
diff changeset
   346
      m_data->m_count++;
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   347
    }
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   348
  m_head = o.m_head;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   349
  m_tail = o.m_tail;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   350
  m_used = o.m_used;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   351
  m_packetUid = o.m_packetUid;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   352
  return *this;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   353
}
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   354
PacketMetadata::~PacketMetadata ()
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   355
{
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   356
  NS_ASSERT (m_data != 0);
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   357
  m_data->m_count--;
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   358
  if (m_data->m_count == 0) 
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   359
    {
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   360
      PacketMetadata::Recycle (m_data);
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   361
    }
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   362
}
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   363
2664
c009dd1e626d remove trailing ;
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2647
diff changeset
   364
} // namespace ns3
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   365
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   366
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   367
#endif /* PACKET_METADATA_H */