src/common/packet-metadata.h
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Sat, 04 Aug 2007 14:10:49 +0200
changeset 1143 7da9f7103447
parent 1141 a75fc1741700
child 1151 527d7b7e25af
permissions -rw-r--r--
implement packet metadata serialization/deserialization
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
 * All rights reserved.
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 *
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * 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
     7
 * 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
     8
 * published by the Free Software Foundation;
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 *
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * 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
    11
 * 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
    12
 * 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
    13
 * GNU General Public License for more details.
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 *
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * 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
    16
 * 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
    17
 * 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
    18
 *
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
 */
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
    21
#ifndef PACKET_METADATA_H
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
    22
#define PACKET_METADATA_H
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
#include <stdint.h>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    25
#include <vector>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
#include "ns3/callback.h"
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
    27
#include "ns3/assert.h"
806
0190f1b49dc8 re-implement PacketHistory to use the PacketPrinter and work on ItemList::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 794
diff changeset
    28
#include "packet-printer.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;
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    34
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    35
/**
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    36
 * \internal
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    37
 * \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
    38
 *
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    39
 * 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
    40
 * 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
    41
 * 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
    42
 * 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
    43
 *
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    44
 * 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
    45
 * "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
    46
 * 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
    47
 * 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
    48
 * 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
    49
 * 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
    50
 *
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    51
 * Each entry in the list also maintains:
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    52
 *   - 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
    53
 *     to the packet)
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    54
 *   - 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
    55
 *     if it is payload or not
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    56
 *   - 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
    57
 *   - 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
    58
 *     if it is one.
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    59
 *
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    60
 * 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
    61
 * 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
    62
 * 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
    63
 * 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
    64
 * 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
    65
 * 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
    66
 * quite unlikely to hit this limit in practice.
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    67
 *
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    68
 * 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
    69
 * 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
    70
 * 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
    71
 * 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
    72
 * 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
    73
 * encoding.
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
    74
 */
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
    75
class PacketMetadata {
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    76
public:
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
  static void Enable (void);
876
850783184c36 add back optimization option
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 874
diff changeset
    78
  static void SetOptOne (bool optOne);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
    80
  inline PacketMetadata (uint32_t uid, uint32_t size);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
    81
  inline PacketMetadata (PacketMetadata const &o);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
    82
  inline PacketMetadata &operator = (PacketMetadata const& o);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
    83
  inline ~PacketMetadata ();
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    84
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    85
  template <typename T>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
  void AddHeader (T const &header, uint32_t size);
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
  template <typename T>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
  void RemoveHeader (T const &header, uint32_t size);
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
  template <typename T>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    91
  void AddTrailer (T const &trailer, uint32_t size);
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
  template <typename T>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    93
  void RemoveTrailer (T const &trailer, uint32_t size);
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    94
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
    95
  PacketMetadata CreateFragment (uint32_t start, uint32_t end) const;
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
    96
  void AddAtEnd (PacketMetadata const&o);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    97
  void AddPaddingAtEnd (uint32_t end);
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    98
  void RemoveAtStart (uint32_t start);
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    99
  void RemoveAtEnd (uint32_t end);
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   100
887
acd1bbdf4f2f avoid duplicating the packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 883
diff changeset
   101
  uint32_t GetUid (void) const;
acd1bbdf4f2f avoid duplicating the packet uid
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 883
diff changeset
   102
806
0190f1b49dc8 re-implement PacketHistory to use the PacketPrinter and work on ItemList::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 794
diff changeset
   103
  void Print (std::ostream &os, Buffer buffer, PacketPrinter const &printer) const;
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   104
1143
7da9f7103447 implement packet metadata serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1141
diff changeset
   105
  uint32_t GetSerializedSize (void) const;
7da9f7103447 implement packet metadata serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1141
diff changeset
   106
  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
   107
  uint32_t Deserialize (Buffer::Iterator i);
7da9f7103447 implement packet metadata serialization/deserialization
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1141
diff changeset
   108
876
850783184c36 add back optimization option
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 874
diff changeset
   109
  static void PrintStats (void);
850783184c36 add back optimization option
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 874
diff changeset
   110
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   111
private:
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   112
  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
   113
    /* 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
   114
    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
   115
    /* 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
   116
    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
   117
    /* 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
   118
     * 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
   119
    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
   120
    /* 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
   121
    uint8_t m_data[10];
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   122
  };
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
   123
  /* 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
   124
     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
   125
     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
   126
     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
   127
     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
   128
   */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   129
  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
   130
    /* 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
   131
       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
   132
       if next element does not exist.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   133
       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
   134
    */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   135
    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
   136
    /* 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
   137
       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
   138
       if previous element does not exist.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   139
       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
   140
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   141
    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
   142
    /* 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
   143
       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
   144
       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
   145
       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
   146
       structure follows this SmallItem structure.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   147
       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
   148
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   149
    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
   150
    /* 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
   151
       by this element.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   152
       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
   153
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   154
    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
   155
    /* 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
   156
       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
   157
       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
   158
       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
   159
       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
   160
       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
   161
       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
   162
       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
   163
       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
   164
       instance.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   165
       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
   166
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   167
    uint16_t chunkUid;
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   168
  };
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   169
  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
   170
    /* 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
   171
       the start of the fragment still present.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   172
       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
   173
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   174
    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
   175
    /* 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
   176
       the end of the fragment still present.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   177
       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
   178
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   179
    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
   180
    /* 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
   181
       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
   182
       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
   183
       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
   184
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   185
    uint32_t packetUid;
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   186
  };
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   187
957
426b85bab45f fix bug 57
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 908
diff changeset
   188
  class DataFreeList : public std::vector<struct Data *>
426b85bab45f fix bug 57
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 908
diff changeset
   189
  {
426b85bab45f fix bug 57
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 908
diff changeset
   190
  public:
426b85bab45f fix bug 57
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 908
diff changeset
   191
    ~DataFreeList ();
426b85bab45f fix bug 57
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 908
diff changeset
   192
  };
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   193
  
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   194
  PacketMetadata ();
862
4add4fe2020f simplify a bit the small item logic
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 859
diff changeset
   195
  void DoAddHeader (uint32_t uid, uint32_t size);
4add4fe2020f simplify a bit the small item logic
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 859
diff changeset
   196
  void DoRemoveHeader (uint32_t uid, uint32_t size);
4add4fe2020f simplify a bit the small item logic
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 859
diff changeset
   197
  void DoAddTrailer (uint32_t uid, uint32_t size);
4add4fe2020f simplify a bit the small item logic
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 859
diff changeset
   198
  void DoRemoveTrailer (uint32_t uid, uint32_t size);
794
f30d69393a24 implement ItemList::AddAtEnd
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 792
diff changeset
   199
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   200
  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
   201
  uint16_t AddBig (uint32_t head, uint32_t tail,
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   202
                   const PacketMetadata::SmallItem *item, 
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   203
                   const PacketMetadata::ExtraItem *extraItem);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   204
  void ReplaceTail (PacketMetadata::SmallItem *item, 
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   205
                    PacketMetadata::ExtraItem *extraItem,
855
6b27e6180fcb implement ReplaceTail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 854
diff changeset
   206
                    uint32_t available);
863
768945a45089 Update -> UpdateHead + UpdateTail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 862
diff changeset
   207
  inline void UpdateHead (uint16_t written);
768945a45089 Update -> UpdateHead + UpdateTail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 862
diff changeset
   208
  inline void UpdateTail (uint16_t written);
870
e335d37541c3 try alternative implementation of AddSmall
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 869
diff changeset
   209
  uint32_t GetUleb128Size (uint32_t value) const;
868
390916503061 optimize a bit AddHeader
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 867
diff changeset
   210
  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
   211
  inline void Append16 (uint16_t value, uint8_t *buffer);
6f7593400c82 a few micro-optimizations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 855
diff changeset
   212
  inline bool TryToAppend (uint32_t value, uint8_t **pBuffer, uint8_t *end);
6f7593400c82 a few micro-optimizations
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 855
diff changeset
   213
  inline bool TryToAppendFast (uint32_t value, uint8_t **pBuffer, uint8_t *end);
873
2aab1eb32b12 store chunkUid and packetUid as fixed-size fields
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 872
diff changeset
   214
  inline bool TryToAppend32 (uint32_t value, uint8_t **pBuffer, uint8_t *end);
2aab1eb32b12 store chunkUid and packetUid as fixed-size fields
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 872
diff changeset
   215
  inline bool TryToAppend16 (uint16_t value, uint8_t **pBuffer, uint8_t *end);
876
850783184c36 add back optimization option
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 874
diff changeset
   216
  void AppendValue (uint32_t value, uint8_t *buffer);
850783184c36 add back optimization option
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 874
diff changeset
   217
  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
   218
  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
   219
  void ReserveCopy (uint32_t n);
907
c67b33c30a8e test and fix backward printing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 900
diff changeset
   220
  uint32_t DoPrint (const struct PacketMetadata::SmallItem *item,
c67b33c30a8e test and fix backward printing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 900
diff changeset
   221
                    const struct PacketMetadata::ExtraItem *extraItem,
837
b73b63e84130 implement PacketHistory::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 835
diff changeset
   222
                    Buffer data, uint32_t offset, const PacketPrinter &printer,
b73b63e84130 implement PacketHistory::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 835
diff changeset
   223
                    std::ostream &os) const;
b73b63e84130 implement PacketHistory::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 835
diff changeset
   224
  uint32_t GetTotalSize (void) const;
855
6b27e6180fcb implement ReplaceTail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 854
diff changeset
   225
  uint32_t ReadItems (uint16_t current, 
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   226
                      struct PacketMetadata::SmallItem *item,
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   227
                      struct PacketMetadata::ExtraItem *extraItem) const;
847
319d107f2435 rewrite PacketHistory::RemoveAtstart
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 845
diff changeset
   228
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   229
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   230
  static struct PacketMetadata::Data *Create (uint32_t size);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   231
  static void Recycle (struct PacketMetadata::Data *data);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   232
  static struct PacketMetadata::Data *Allocate (uint32_t n);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   233
  static void Deallocate (struct PacketMetadata::Data *data);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   234
  
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   235
  static DataFreeList m_freeList;
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   236
  static bool m_enable;
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   237
  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
   238
  static uint16_t m_chunkUid;
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   239
  
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   240
  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
   241
  /**
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   242
     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
   243
       ^             |
2087082ba3ed change default pretty printing output format, add doc to metadata data structures
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 887
diff changeset
   244
        \---(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
   245
   */
840
e473844a60c2 rename begin to head and end to tail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 837
diff changeset
   246
  uint16_t m_head;
e473844a60c2 rename begin to head and end to tail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 837
diff changeset
   247
  uint16_t m_tail;
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   248
  uint16_t m_used;
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   249
  uint32_t m_packetUid;
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   250
};
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   251
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   252
}; // namespace ns3
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   253
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   254
namespace ns3 {
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   255
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   256
template <typename T>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   257
void 
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   258
PacketMetadata::AddHeader (T const &header, uint32_t size)
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   259
{
1141
a75fc1741700 rework the PacketPrinter API and implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1127
diff changeset
   260
  DoAddHeader (ChunkRegistry::GetHeaderUid<T> () << 1, size);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   261
}
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   262
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   263
template <typename T>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   264
void 
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   265
PacketMetadata::RemoveHeader (T const &header, uint32_t size)
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   266
{
1141
a75fc1741700 rework the PacketPrinter API and implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1127
diff changeset
   267
  DoRemoveHeader (ChunkRegistry::GetHeaderUid<T> () << 1, size);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   268
}
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   269
template <typename T>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   270
void 
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   271
PacketMetadata::AddTrailer (T const &trailer, uint32_t size)
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   272
{
1141
a75fc1741700 rework the PacketPrinter API and implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1127
diff changeset
   273
  DoAddTrailer (ChunkRegistry::GetTrailerUid<T> () << 1, size);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   274
}
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   275
template <typename T>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   276
void 
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   277
PacketMetadata::RemoveTrailer (T const &trailer, uint32_t size)
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   278
{
1141
a75fc1741700 rework the PacketPrinter API and implementation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1127
diff changeset
   279
  DoRemoveTrailer (ChunkRegistry::GetTrailerUid<T> () << 1, size);
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
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   282
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   283
PacketMetadata::PacketMetadata (uint32_t uid, uint32_t size)
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   284
  : m_data (m_data = PacketMetadata::Create (10)),
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   285
    m_head (0xffff),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   286
    m_tail (0xffff),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   287
    m_used (0),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   288
    m_packetUid (uid)
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   289
{
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   290
  memset (m_data->m_data, 0xff, 4);
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   291
  if (size > 0)
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   292
    {
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   293
      DoAddHeader (0, size);
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   294
    }
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   295
}
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   296
PacketMetadata::PacketMetadata (PacketMetadata const &o)
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   297
  : m_data (o.m_data),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   298
    m_head (o.m_head),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   299
    m_tail (o.m_tail),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   300
    m_used (o.m_used),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   301
    m_packetUid (o.m_packetUid)
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   302
{
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   303
  NS_ASSERT (m_data != 0);
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   304
  m_data->m_count++;
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   305
}
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   306
PacketMetadata &
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   307
PacketMetadata::operator = (PacketMetadata const& o)
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   308
{
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   309
  if (m_data == o.m_data) 
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   310
    {
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   311
      // self assignment
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   312
      return *this;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   313
    }
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   314
  NS_ASSERT (m_data != 0);
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   315
  m_data->m_count--;
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   316
  if (m_data->m_count == 0) 
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   317
    {
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   318
      PacketMetadata::Recycle (m_data);
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   319
    }
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   320
  m_data = o.m_data;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   321
  m_head = o.m_head;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   322
  m_tail = o.m_tail;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   323
  m_used = o.m_used;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   324
  m_packetUid = o.m_packetUid;
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   325
  NS_ASSERT (m_data != 0);
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   326
  m_data->m_count++;
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   327
  return *this;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   328
}
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   329
PacketMetadata::~PacketMetadata ()
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   330
{
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   331
  NS_ASSERT (m_data != 0);
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   332
  m_data->m_count--;
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   333
  if (m_data->m_count == 0) 
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   334
    {
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   335
      PacketMetadata::Recycle (m_data);
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   336
    }
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   337
}
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   338
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   339
}; // namespace ns3
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   340
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   341
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   342
#endif /* PACKET_METADATA_H */