src/devices/wifi/mac-rx-middle.cc
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Tue, 23 Oct 2007 13:11:23 +0200
changeset 2014 c1bc06ac5152
parent 1974 0d6b3bead74a
child 2092 885ebd975e88
permissions -rw-r--r--
add logging support
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     1
/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     2
/*
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     3
 * Copyright (c) 2005 INRIA
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     4
 *
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or modify
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     6
 * it under the terms of the GNU General Public License version 2 as 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     7
 * published by the Free Software Foundation;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     8
 *
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
     9
 * This program is distributed in the hope that it will be useful,
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    12
 * GNU General Public License for more details.
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    13
 *
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    15
 * along with this program; if not, write to the Free Software
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    16
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    17
 *
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    18
 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    19
 */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    20
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    21
#include "mac-rx-middle.h"
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    22
#include "wifi-mac-header.h"
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
    24
#include "ns3/assert.h"
2014
c1bc06ac5152 add logging support
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1974
diff changeset
    25
#include "ns3/log.h"
c1bc06ac5152 add logging support
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1974
diff changeset
    26
#include "ns3/packet.h"
c1bc06ac5152 add logging support
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1974
diff changeset
    27
#include "ns3/simulator.h"
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
#include <list>
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
2014
c1bc06ac5152 add logging support
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1974
diff changeset
    30
NS_LOG_COMPONENT_DEFINE ("MacRxMiddle");
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    31
2014
c1bc06ac5152 add logging support
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1974
diff changeset
    32
#define TRACE(x) NS_LOG_DEBUG(Simulator::Now () << " " << x)
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    34
namespace ns3 {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    35
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    36
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    37
class OriginatorRxStatus {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    38
private:
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    39
  typedef std::list<Packet> Fragments;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    40
  typedef std::list<Packet>::const_iterator FragmentsCI;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    42
  bool m_defragmenting;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    43
  uint16_t m_lastSequenceControl;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    44
  Fragments m_fragments;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    45
public:
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    46
  OriginatorRxStatus () {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    47
    /* this is a magic value necessary. */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    48
    m_lastSequenceControl = 0xffff;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    49
    m_defragmenting = false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    50
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    51
  ~OriginatorRxStatus () {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    52
    for (FragmentsCI i = m_fragments.begin (); i != m_fragments.end (); i++) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
      {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
        // XXX ?
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    55
      }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
    m_fragments.erase (m_fragments.begin (), m_fragments.end ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    57
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
  bool IsDeFragmenting (void) {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
    return m_defragmenting;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
  void AccumulateFirstFragment (Packet const packet) {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
    62
    NS_ASSERT (!m_defragmenting);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
    m_defragmenting = true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    64
    m_fragments.push_back (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    65
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    66
  Packet AccumulateLastFragment (Packet const packet) {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
    67
    NS_ASSERT (m_defragmenting);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
    m_fragments.push_back (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
    m_defragmenting = false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    70
    Packet full;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
    for (FragmentsCI i = m_fragments.begin (); i != m_fragments.end (); i++) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    72
      {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
        full.AddAtEnd (*i);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    74
      }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
    m_fragments.erase (m_fragments.begin (), m_fragments.end ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    76
    return full;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
  void AccumulateFragment (Packet const packet) {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
    79
    NS_ASSERT (m_defragmenting);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
    m_fragments.push_back (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    81
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    82
  bool IsNextFragment (uint16_t sequenceControl) {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    83
    if ((sequenceControl >> 4) == (m_lastSequenceControl >> 4) &&
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    84
        (sequenceControl & 0x0f) == ((m_lastSequenceControl & 0x0f)+1)) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    85
      {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    86
        return true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
      } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
    else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
      {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
        return false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    91
      }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    93
  uint16_t GetLastSequenceControl (void) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    94
  {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    95
    return m_lastSequenceControl;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    96
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    97
  void SetSequenceControl (uint16_t sequenceControl) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    98
  {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    99
    m_lastSequenceControl = sequenceControl;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   100
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   101
  
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   102
};
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   103
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   104
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   105
MacRxMiddle::MacRxMiddle ()
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
{}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   107
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
MacRxMiddle::~MacRxMiddle ()
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   110
  for (OriginatorsI i = m_originatorStatus.begin ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   111
       i != m_originatorStatus.end (); i++) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
      delete (*i).second;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   114
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
  m_originatorStatus.erase (m_originatorStatus.begin (),
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   116
                            m_originatorStatus.end ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
  for (QosOriginatorsI i = m_qosOriginatorStatus.begin ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   118
       i != m_qosOriginatorStatus.end (); i++) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   119
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   120
      delete (*i).second;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   121
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   122
  m_qosOriginatorStatus.erase (m_qosOriginatorStatus.begin (),
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
                               m_qosOriginatorStatus.end ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   124
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   125
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   126
void 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   127
MacRxMiddle::SetForwardCallback (ForwardUpCallback callback)
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   128
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   129
  m_callback = callback;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   130
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   131
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
bool
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   133
MacRxMiddle::SequenceControlSmaller (int seqca, int seqcb)
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   134
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   135
  int seqa = seqca >> 4;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   136
  int seqb = seqcb >> 4;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   137
  int delta = seqb - seqa;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   138
  TRACE ("seqb="<<seqb<<", seqa="<<seqa<<", delta="<<delta);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   139
  if (delta <= 0 && delta < -2048) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   140
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   141
      return true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
    } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   143
  else if (delta >= 0 && delta < 2048) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   144
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   145
      return true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   146
    } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   147
  else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   148
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   149
      return false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   151
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   152
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   153
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   154
OriginatorRxStatus *
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   155
MacRxMiddle::Lookup (WifiMacHeader const *hdr)
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   156
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   157
  OriginatorRxStatus *originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
  Mac48Address source = hdr->GetAddr2 ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
  if (hdr->IsQosData () &&
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   160
      !hdr->GetAddr2 ().IsBroadcast ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   161
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   162
      /* only for qos data non-broadcast frames */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   163
      originator = m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid ())];
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   164
      if (originator == 0) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   165
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   166
          originator = new OriginatorRxStatus ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   167
          m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid ())] = originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   168
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   169
    } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   170
  else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   171
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   172
      /* - management frames
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   173
       * - qos data broadcast frames
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   174
       * - nqos data frames
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   175
       * see section 7.1.3.4.1
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   176
       */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
      originator = m_originatorStatus[source];
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   178
      if (originator == 0) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   179
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   180
          originator = new OriginatorRxStatus ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   181
          m_originatorStatus[source] = originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   182
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   183
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   184
  return originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   185
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
bool
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   188
MacRxMiddle::IsDuplicate (WifiMacHeader const*hdr, 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   189
         OriginatorRxStatus *originator) const
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   190
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   191
  if (originator->GetLastSequenceControl () == hdr->GetSequenceControl ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   192
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   193
      return true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   194
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   195
  return false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   196
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   197
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   198
Packet 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   199
MacRxMiddle::HandleFragments (Packet packet, WifiMacHeader const*hdr,
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   200
             OriginatorRxStatus *originator, bool *complete)
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   201
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   202
  if (originator->IsDeFragmenting ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   204
      if (hdr->IsMoreFragments ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   205
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   206
          if (originator->IsNextFragment (hdr->GetSequenceControl ())) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   207
            {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   208
              TRACE ("accumulate fragment seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   209
                     ", frag="<<hdr->GetFragmentNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
                     ", size="<<packet.GetSize ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   211
              originator->AccumulateFragment (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   212
              originator->SetSequenceControl (hdr->GetSequenceControl ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   213
            } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   214
          else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   215
            {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   216
              TRACE ("non-ordered fragment");
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   217
            }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   218
          *complete = false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   219
          return Packet ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   220
        } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   221
      else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   222
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   223
          if (originator->IsNextFragment (hdr->GetSequenceControl ())) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   224
            {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   225
              TRACE ("accumulate last fragment seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   226
                     ", frag="<<hdr->GetFragmentNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   227
                     ", size="<<hdr->GetSize ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   228
              packet = originator->AccumulateLastFragment (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   229
              originator->SetSequenceControl (hdr->GetSequenceControl ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   230
              *complete = true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   231
              return packet;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   232
            } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   233
          else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   234
            {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   235
              TRACE ("non-ordered fragment");
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   236
              *complete = false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   237
              return Packet ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   238
            }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   239
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   240
    } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   241
  else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   242
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   243
      if (hdr->IsMoreFragments ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   244
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   245
          TRACE ("accumulate first fragment seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   246
                 ", frag="<<hdr->GetFragmentNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   247
                 ", size="<<packet.GetSize ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   248
          originator->AccumulateFirstFragment (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   249
          originator->SetSequenceControl (hdr->GetSequenceControl ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   250
          *complete = false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   251
          return Packet ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   252
        } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   253
      else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   254
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   255
          *complete = true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   256
          return packet;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   257
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   258
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   259
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   260
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   261
void
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   262
MacRxMiddle::Receive (Packet packet, WifiMacHeader const *hdr)
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   263
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   264
  OriginatorRxStatus *originator = Lookup (hdr);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   265
  if (hdr->IsData ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   266
    {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
   267
      NS_ASSERT (SequenceControlSmaller (originator->GetLastSequenceControl (), 
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   268
                                      hdr->GetSequenceControl ()));
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   269
      // filter duplicates.
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   270
      if (IsDuplicate (hdr, originator)) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   271
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   272
          TRACE ("duplicate from="<<hdr->GetAddr2 ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   273
                 ", seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   274
                 ", frag="<<hdr->GetFragmentNumber ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   275
          return;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   276
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   277
      bool complete;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   278
      Packet agregate = HandleFragments (packet, hdr, originator, &complete);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   279
      if (!complete) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   280
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   281
          return;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   282
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   283
      TRACE ("forwarding data from="<<hdr->GetAddr2 ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   284
             ", seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   285
             ", frag="<<hdr->GetFragmentNumber ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   286
      originator->SetSequenceControl (hdr->GetSequenceControl ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   287
      m_callback (agregate, hdr);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   288
    } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   289
  else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   290
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   291
      TRACE ("forwarding "<<hdr->GetTypeString ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   292
             ", seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   293
             ", frag="<<hdr->GetFragmentNumber ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   294
      originator->SetSequenceControl (hdr->GetSequenceControl ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   295
      m_callback (packet, hdr);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   296
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   297
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   298
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   299
} // namespace ns3