src/devices/wifi/mac-rx-middle.cc
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 22 Nov 2007 14:27:22 +0100
changeset 2159 20f882e85b4a
parent 2148 4c9b6134023a
child 2985 fa0747c4ad5e
permissions -rw-r--r--
port to Ptr<Packet> branch
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:
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    39
  typedef std::list<Ptr<const Packet> > Fragments;
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    40
  typedef std::list<Ptr<const Packet> >::const_iterator FragmentsCI;
1927
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 () {
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    52
    m_fragments.clear ();
1927
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
  bool IsDeFragmenting (void) {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    55
    return m_defragmenting;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
  }
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    57
  void AccumulateFirstFragment (Ptr<const Packet> packet) {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
    58
    NS_ASSERT (!m_defragmenting);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
    m_defragmenting = true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
    m_fragments.push_back (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
  }
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    62
  Ptr<Packet> AccumulateLastFragment (Ptr<const Packet> packet) {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
    63
    NS_ASSERT (m_defragmenting);
1927
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
    m_defragmenting = false;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    66
    Ptr<Packet> full = Create<Packet> ();
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    67
    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
    68
      {
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    69
        full->AddAtEnd (*i);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    70
      }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
    m_fragments.erase (m_fragments.begin (), m_fragments.end ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    72
    return full;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
  }
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    74
  void AccumulateFragment (Ptr<const Packet> packet) {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
    75
    NS_ASSERT (m_defragmenting);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    76
    m_fragments.push_back (packet);
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
  bool IsNextFragment (uint16_t sequenceControl) {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
    if ((sequenceControl >> 4) == (m_lastSequenceControl >> 4) &&
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
        (sequenceControl & 0x0f) == ((m_lastSequenceControl & 0x0f)+1)) 
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
        return true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    83
      } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    84
    else 
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 false;
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
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
  uint16_t GetLastSequenceControl (void) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
  {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    91
    return m_lastSequenceControl;
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
  void SetSequenceControl (uint16_t sequenceControl) 
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
    m_lastSequenceControl = sequenceControl;
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
  
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
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
MacRxMiddle::MacRxMiddle ()
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
MacRxMiddle::~MacRxMiddle ()
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   105
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
  for (OriginatorsI i = m_originatorStatus.begin ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   107
       i != m_originatorStatus.end (); i++) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
      delete (*i).second;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   110
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   111
  m_originatorStatus.erase (m_originatorStatus.begin (),
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
                            m_originatorStatus.end ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
  for (QosOriginatorsI i = m_qosOriginatorStatus.begin ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   114
       i != m_qosOriginatorStatus.end (); i++) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   116
      delete (*i).second;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   118
  m_qosOriginatorStatus.erase (m_qosOriginatorStatus.begin (),
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   119
                               m_qosOriginatorStatus.end ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   120
}
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
void 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
MacRxMiddle::SetForwardCallback (ForwardUpCallback callback)
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
  m_callback = callback;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   126
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   127
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   128
bool
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   129
MacRxMiddle::SequenceControlSmaller (int seqca, int seqcb)
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
  int seqa = seqca >> 4;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
  int seqb = seqcb >> 4;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   133
  int delta = seqb - seqa;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   134
  TRACE ("seqb="<<seqb<<", seqa="<<seqa<<", delta="<<delta);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   135
  if (delta <= 0 && delta < -2048) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   136
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   137
      return true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   138
    } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   139
  else 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 
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 false;
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
}
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
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   150
OriginatorRxStatus *
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   151
MacRxMiddle::Lookup (WifiMacHeader const *hdr)
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
  OriginatorRxStatus *originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   154
  Mac48Address source = hdr->GetAddr2 ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   155
  if (hdr->IsQosData () &&
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   156
      !hdr->GetAddr2 ().IsBroadcast ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   157
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
      /* only for qos data non-broadcast frames */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
      originator = m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid ())];
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   160
      if (originator == 0) 
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
          originator = new OriginatorRxStatus ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   163
          m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid ())] = originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   164
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   165
    } 
2093
a4211cfa45a7 update the last sequence control only for non-broadcast frames.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2092
diff changeset
   166
  else
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   167
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   168
      /* - management frames
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   169
       * - qos data broadcast frames
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   170
       * - nqos data frames
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   171
       * see section 7.1.3.4.1
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   172
       */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   173
      originator = m_originatorStatus[source];
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   174
      if (originator == 0) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   175
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   176
          originator = new OriginatorRxStatus ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
          m_originatorStatus[source] = originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   178
        }
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
  return originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   181
}
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
bool
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   184
MacRxMiddle::IsDuplicate (WifiMacHeader const*hdr, 
2092
885ebd975e88 set the retry bit and use it to filter duplicates
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2014
diff changeset
   185
                          OriginatorRxStatus *originator) const
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
{
2092
885ebd975e88 set the retry bit and use it to filter duplicates
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2014
diff changeset
   187
  if (hdr->IsRetry () &&
885ebd975e88 set the retry bit and use it to filter duplicates
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2014
diff changeset
   188
      originator->GetLastSequenceControl () == hdr->GetSequenceControl ()) 
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   189
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   190
      return true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   191
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   192
  return false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   193
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   194
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   195
Ptr<Packet>
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   196
MacRxMiddle::HandleFragments (Ptr<Packet> packet, WifiMacHeader const*hdr,
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   197
                              OriginatorRxStatus *originator)
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   198
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   199
  if (originator->IsDeFragmenting ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   200
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   201
      if (hdr->IsMoreFragments ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   202
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
          if (originator->IsNextFragment (hdr->GetSequenceControl ())) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   204
            {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   205
              TRACE ("accumulate fragment seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   206
                     ", frag="<<hdr->GetFragmentNumber ()<<
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   207
                     ", size="<<packet->GetSize ());
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   208
              originator->AccumulateFragment (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   209
              originator->SetSequenceControl (hdr->GetSequenceControl ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
            } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   211
          else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   212
            {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   213
              TRACE ("non-ordered fragment");
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   214
            }
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   215
          return 0;
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   216
        } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   217
      else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   218
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   219
          if (originator->IsNextFragment (hdr->GetSequenceControl ())) 
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
              TRACE ("accumulate last fragment seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   222
                     ", frag="<<hdr->GetFragmentNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   223
                     ", size="<<hdr->GetSize ());
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   224
              Ptr<Packet> p = originator->AccumulateLastFragment (packet);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   225
              originator->SetSequenceControl (hdr->GetSequenceControl ());
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   226
              return p;
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   227
            } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   228
          else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   229
            {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   230
              TRACE ("non-ordered fragment");
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   231
              return 0;
1927
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
        }
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
  else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   236
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   237
      if (hdr->IsMoreFragments ()) 
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
          TRACE ("accumulate first fragment seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   240
                 ", frag="<<hdr->GetFragmentNumber ()<<
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   241
                 ", size="<<packet->GetSize ());
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   242
          originator->AccumulateFirstFragment (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   243
          originator->SetSequenceControl (hdr->GetSequenceControl ());
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   244
          return 0;
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   245
        } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   246
      else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   247
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   248
          return packet;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   249
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   250
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   251
}
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
void
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   254
MacRxMiddle::Receive (Ptr<Packet> packet, WifiMacHeader const *hdr)
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   255
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   256
  OriginatorRxStatus *originator = Lookup (hdr);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   257
  if (hdr->IsData ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   258
    {
2148
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   259
      /**
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   260
       * Note that the check below is not deterministic: it is possible
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   261
       * for sequence numbers to loop back to zero once they reach 0xfff0
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   262
       * and to go up to 0xf7f0 in which case the check below will report the
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   263
       * two sequence numbers to not have the correct order relationship.
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   264
       * This is why this check generates a warning only.
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   265
       */
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   266
      if (!SequenceControlSmaller (originator->GetLastSequenceControl (), 
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   267
                                   hdr->GetSequenceControl ()))
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   268
        {
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   269
          NS_LOG_UNCOND ("Sequence numbers have looped back. last recorded="<<originator->GetLastSequenceControl ()<<
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   270
                         " currently seen="<< hdr->GetSequenceControl ());
4c9b6134023a replace a buggy assert with a check with warning.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2093
diff changeset
   271
        }
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   272
      // filter duplicates.
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   273
      if (IsDuplicate (hdr, originator)) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   274
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   275
          TRACE ("duplicate from="<<hdr->GetAddr2 ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   276
                 ", seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   277
                 ", frag="<<hdr->GetFragmentNumber ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   278
          return;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   279
        }
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   280
      Ptr<Packet> agregate = HandleFragments (packet, hdr, originator);
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   281
      if (agregate == 0) 
1927
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
          return;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   284
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   285
      TRACE ("forwarding data from="<<hdr->GetAddr2 ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   286
             ", seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   287
             ", frag="<<hdr->GetFragmentNumber ());
2093
a4211cfa45a7 update the last sequence control only for non-broadcast frames.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2092
diff changeset
   288
      if (!hdr->GetAddr1 ().IsBroadcast ())
a4211cfa45a7 update the last sequence control only for non-broadcast frames.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2092
diff changeset
   289
        {
a4211cfa45a7 update the last sequence control only for non-broadcast frames.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2092
diff changeset
   290
          originator->SetSequenceControl (hdr->GetSequenceControl ());
a4211cfa45a7 update the last sequence control only for non-broadcast frames.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2092
diff changeset
   291
        }
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   292
      m_callback (agregate, hdr);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   293
    } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   294
  else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   295
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   296
      TRACE ("forwarding "<<hdr->GetTypeString ()<<
2093
a4211cfa45a7 update the last sequence control only for non-broadcast frames.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2092
diff changeset
   297
             ", from="<<hdr->GetAddr2 ()<<
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   298
             ", seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   299
             ", frag="<<hdr->GetFragmentNumber ());
2093
a4211cfa45a7 update the last sequence control only for non-broadcast frames.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2092
diff changeset
   300
      if (!hdr->GetAddr1 ().IsBroadcast ())
a4211cfa45a7 update the last sequence control only for non-broadcast frames.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2092
diff changeset
   301
        {
a4211cfa45a7 update the last sequence control only for non-broadcast frames.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2092
diff changeset
   302
          originator->SetSequenceControl (hdr->GetSequenceControl ());
a4211cfa45a7 update the last sequence control only for non-broadcast frames.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2092
diff changeset
   303
        }
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   304
      m_callback (packet, hdr);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   305
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   306
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   307
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   308
} // namespace ns3