src/common/packet-metadata.h
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 28 Jun 2007 13:59:51 +0200
changeset 908 a8bfc0d02134
parent 907 c67b33c30a8e
child 957 426b85bab45f
permissions -rw-r--r--
add more internal documentation
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
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   103
  void PrintDefault (std::ostream &os, Buffer buffer) const;
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
   104
  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
   105
876
850783184c36 add back optimization option
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 874
diff changeset
   106
  static void PrintStats (void);
850783184c36 add back optimization option
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 874
diff changeset
   107
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
private:
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   109
  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
   110
    /* 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
   111
    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
   112
    /* 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
   113
    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
   114
    /* 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
   115
     * 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
   116
    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
   117
    /* 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
   118
    uint8_t m_data[10];
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   119
  };
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
  /* 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
   121
     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
   122
     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
   123
     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
   124
     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
   125
   */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   126
  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
   127
    /* 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
   128
       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
   129
       if next element does not exist.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   130
       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
   131
    */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   132
    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
   133
    /* 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
   134
       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
   135
       if previous element does not exist.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   136
       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
   137
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   138
    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
   139
    /* 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
   140
       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
   141
       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
   142
       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
   143
       structure follows this SmallItem structure.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   144
       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
   145
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   146
    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
   147
    /* 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
   148
       by this element.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   149
       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
   150
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   151
    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
   152
    /* 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
   153
       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
   154
       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
   155
       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
   156
       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
   157
       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
   158
       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
   159
       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
   160
       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
   161
       instance.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   162
       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
   163
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   164
    uint16_t chunkUid;
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   165
  };
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   166
  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
   167
    /* 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
   168
       the start of the fragment still present.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   169
       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
   170
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   171
    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
   172
    /* 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
   173
       the end of the fragment still present.
908
a8bfc0d02134 add more internal documentation
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 907
diff changeset
   174
       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
   175
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   176
    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
   177
    /* 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
   178
       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
   179
       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
   180
       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
   181
     */
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   182
    uint32_t packetUid;
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   183
  };
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   184
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   185
  typedef std::vector<struct Data *> DataFreeList;
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
  
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   187
  PacketMetadata ();
862
4add4fe2020f simplify a bit the small item logic
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 859
diff changeset
   188
  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
   189
  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
   190
  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
   191
  void DoRemoveTrailer (uint32_t uid, uint32_t size);
794
f30d69393a24 implement ItemList::AddAtEnd
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 792
diff changeset
   192
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   193
  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
   194
  uint16_t AddBig (uint32_t head, uint32_t tail,
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   195
                   const PacketMetadata::SmallItem *item, 
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   196
                   const PacketMetadata::ExtraItem *extraItem);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   197
  void ReplaceTail (PacketMetadata::SmallItem *item, 
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   198
                    PacketMetadata::ExtraItem *extraItem,
855
6b27e6180fcb implement ReplaceTail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 854
diff changeset
   199
                    uint32_t available);
863
768945a45089 Update -> UpdateHead + UpdateTail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 862
diff changeset
   200
  inline void UpdateHead (uint16_t written);
768945a45089 Update -> UpdateHead + UpdateTail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 862
diff changeset
   201
  inline void UpdateTail (uint16_t written);
870
e335d37541c3 try alternative implementation of AddSmall
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 869
diff changeset
   202
  uint32_t GetUleb128Size (uint32_t value) const;
868
390916503061 optimize a bit AddHeader
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 867
diff changeset
   203
  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
   204
  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
   205
  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
   206
  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
   207
  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
   208
  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
   209
  void AppendValue (uint32_t value, uint8_t *buffer);
850783184c36 add back optimization option
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 874
diff changeset
   210
  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
   211
  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
   212
  void ReserveCopy (uint32_t n);
907
c67b33c30a8e test and fix backward printing
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 900
diff changeset
   213
  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
   214
                    const struct PacketMetadata::ExtraItem *extraItem,
837
b73b63e84130 implement PacketHistory::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 835
diff changeset
   215
                    Buffer data, uint32_t offset, const PacketPrinter &printer,
b73b63e84130 implement PacketHistory::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 835
diff changeset
   216
                    std::ostream &os) const;
b73b63e84130 implement PacketHistory::Print
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 835
diff changeset
   217
  uint32_t GetTotalSize (void) const;
855
6b27e6180fcb implement ReplaceTail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 854
diff changeset
   218
  uint32_t ReadItems (uint16_t current, 
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   219
                      struct PacketMetadata::SmallItem *item,
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   220
                      struct PacketMetadata::ExtraItem *extraItem) const;
847
319d107f2435 rewrite PacketHistory::RemoveAtstart
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 845
diff changeset
   221
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   222
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   223
  static struct PacketMetadata::Data *Create (uint32_t size);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   224
  static void Recycle (struct PacketMetadata::Data *data);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   225
  static struct PacketMetadata::Data *Allocate (uint32_t n);
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   226
  static void Deallocate (struct PacketMetadata::Data *data);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   227
  
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   228
  static DataFreeList m_freeList;
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   229
  static bool m_enable;
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   230
  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
   231
  static uint16_t m_chunkUid;
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   232
  
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   233
  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
   234
  /**
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
     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
   236
       ^             |
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
        \---(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
   238
   */
840
e473844a60c2 rename begin to head and end to tail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 837
diff changeset
   239
  uint16_t m_head;
e473844a60c2 rename begin to head and end to tail
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 837
diff changeset
   240
  uint16_t m_tail;
835
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   241
  uint16_t m_used;
ea5ca71d6c0c a new implementation of the PacketHistory API
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 834
diff changeset
   242
  uint32_t m_packetUid;
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   243
};
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   244
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   245
}; // namespace ns3
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   246
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   247
namespace ns3 {
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   248
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   249
template <typename T>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   250
void 
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   251
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
   252
{
862
4add4fe2020f simplify a bit the small item logic
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 859
diff changeset
   253
  DoAddHeader (PacketPrinter::GetHeaderUid<T> (), size);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   254
}
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::RemoveHeader (T const &header, uint32_t size)
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   259
{
862
4add4fe2020f simplify a bit the small item logic
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 859
diff changeset
   260
  DoRemoveHeader (PacketPrinter::GetHeaderUid<T> (), 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
template <typename T>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   263
void 
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   264
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
   265
{
862
4add4fe2020f simplify a bit the small item logic
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 859
diff changeset
   266
  DoAddTrailer (PacketPrinter::GetTrailerUid<T> (), size);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   267
}
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   268
template <typename T>
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   269
void 
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   270
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
   271
{
862
4add4fe2020f simplify a bit the small item logic
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 859
diff changeset
   272
  DoRemoveTrailer (PacketPrinter::GetTrailerUid<T> (), size);
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   273
}
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   274
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   275
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   276
PacketMetadata::PacketMetadata (uint32_t uid, uint32_t size)
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   277
  : m_data (m_data = PacketMetadata::Create (10)),
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   278
    m_head (0xffff),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   279
    m_tail (0xffff),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   280
    m_used (0),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   281
    m_packetUid (uid)
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   282
{
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   283
  memset (m_data->m_data, 0xff, 4);
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   284
  if (size > 0)
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   285
    {
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   286
      DoAddHeader (0, size);
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   287
    }
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   288
}
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   289
PacketMetadata::PacketMetadata (PacketMetadata const &o)
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   290
  : m_data (o.m_data),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   291
    m_head (o.m_head),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   292
    m_tail (o.m_tail),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   293
    m_used (o.m_used),
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   294
    m_packetUid (o.m_packetUid)
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   295
{
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   296
  NS_ASSERT (m_data != 0);
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   297
  m_data->m_count++;
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   298
}
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   299
PacketMetadata &
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   300
PacketMetadata::operator = (PacketMetadata const& o)
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   301
{
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   302
  if (m_data == o.m_data) 
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   303
    {
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   304
      // self assignment
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   305
      return *this;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   306
    }
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   307
  NS_ASSERT (m_data != 0);
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   308
  m_data->m_count--;
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   309
  if (m_data->m_count == 0) 
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   310
    {
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   311
      PacketMetadata::Recycle (m_data);
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   312
    }
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   313
  m_data = o.m_data;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   314
  m_head = o.m_head;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   315
  m_tail = o.m_tail;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   316
  m_used = o.m_used;
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   317
  m_packetUid = o.m_packetUid;
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   318
  NS_ASSERT (m_data != 0);
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   319
  m_data->m_count++;
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   320
  return *this;
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 ()
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   323
{
872
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   324
  NS_ASSERT (m_data != 0);
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   325
  m_data->m_count--;
cd19d2692521 unconditionally set m_data
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 870
diff changeset
   326
  if (m_data->m_count == 0) 
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   327
    {
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   328
      PacketMetadata::Recycle (m_data);
864
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   329
    }
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   330
}
0cd573b2a506 make some methods inline
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 863
diff changeset
   331
789
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   332
}; // namespace ns3
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   333
1e19322e9012 merge unfinished packet history code
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   334
883
4d2da35c09b0 PacketHistory -> PacketMetadata
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 882
diff changeset
   335
#endif /* PACKET_METADATA_H */