src/devices/wifi/mac-rx-middle.cc
author Mirko Banchi <mk.banchi@gmail.com>
Wed, 03 Feb 2010 20:34:53 +0100
changeset 5964 8a59a619c30e
parent 5819 514ec98954ab
child 6434 ac8b4bf77e50
permissions -rw-r--r--
add support to block ack tear down in MacLow
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
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
namespace ns3 {
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
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    35
class OriginatorRxStatus {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    36
private:
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    37
  typedef std::list<Ptr<const Packet> > Fragments;
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    38
  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
    39
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    40
  bool m_defragmenting;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
  uint16_t m_lastSequenceControl;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    42
  Fragments m_fragments;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    43
public:
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    44
  OriginatorRxStatus () {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    45
    /* this is a magic value necessary. */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    46
    m_lastSequenceControl = 0xffff;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    47
    m_defragmenting = false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    48
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    49
  ~OriginatorRxStatus () {
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    50
    m_fragments.clear ();
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    51
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    52
  bool IsDeFragmenting (void) {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
    return m_defragmenting;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
  }
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    55
  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
    56
    NS_ASSERT (!m_defragmenting);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    57
    m_defragmenting = true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
    m_fragments.push_back (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
  }
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    60
  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
    61
    NS_ASSERT (m_defragmenting);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    62
    m_fragments.push_back (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
    m_defragmenting = false;
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    64
    Ptr<Packet> full = Create<Packet> ();
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    65
    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
    66
      {
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    67
        full->AddAtEnd (*i);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
      }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
    m_fragments.erase (m_fragments.begin (), m_fragments.end ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    70
    return full;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    71
  }
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
    72
  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
    73
    NS_ASSERT (m_defragmenting);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    74
    m_fragments.push_back (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    76
  bool IsNextFragment (uint16_t sequenceControl) {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
    if ((sequenceControl >> 4) == (m_lastSequenceControl >> 4) &&
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
        (sequenceControl & 0x0f) == ((m_lastSequenceControl & 0x0f)+1)) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
      {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
        return true;
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
    else 
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
        return false;
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
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
  uint16_t GetLastSequenceControl (void) 
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
    return m_lastSequenceControl;
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
  void SetSequenceControl (uint16_t sequenceControl) 
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
    m_lastSequenceControl = 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
  
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
MacRxMiddle::MacRxMiddle ()
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   100
{
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   101
  NS_LOG_FUNCTION_NOARGS ();
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   102
}
1927
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
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   106
  NS_LOG_FUNCTION_NOARGS ();
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   107
  for (OriginatorsI i = m_originatorStatus.begin ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
       i != m_originatorStatus.end (); i++) 
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
      delete (*i).second;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   111
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
  m_originatorStatus.erase (m_originatorStatus.begin (),
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
                            m_originatorStatus.end ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   114
  for (QosOriginatorsI i = m_qosOriginatorStatus.begin ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
       i != m_qosOriginatorStatus.end (); i++) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   116
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   117
      delete (*i).second;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   118
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   119
  m_qosOriginatorStatus.erase (m_qosOriginatorStatus.begin (),
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   120
                               m_qosOriginatorStatus.end ());
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
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
void 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   124
MacRxMiddle::SetForwardCallback (ForwardUpCallback callback)
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   125
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   126
  NS_LOG_FUNCTION_NOARGS ();
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   127
  m_callback = 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
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   130
bool
4602
36adfa546b04 bug 601: Small typo in SequenceControlSmaller
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4079
diff changeset
   131
MacRxMiddle::SequenceControlSmaller (uint16_t seqca, uint16_t seqcb)
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   133
  NS_LOG_FUNCTION (seqca << seqcb);
4602
36adfa546b04 bug 601: Small typo in SequenceControlSmaller
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4079
diff changeset
   134
  int16_t seqa = seqca >> 4;
36adfa546b04 bug 601: Small typo in SequenceControlSmaller
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4079
diff changeset
   135
  int16_t seqb = seqcb >> 4;
36adfa546b04 bug 601: Small typo in SequenceControlSmaller
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4079
diff changeset
   136
  int16_t delta = seqb - seqa;
36adfa546b04 bug 601: Small typo in SequenceControlSmaller
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4079
diff changeset
   137
  bool sign = seqa <= seqb;
36adfa546b04 bug 601: Small typo in SequenceControlSmaller
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4079
diff changeset
   138
  uint16_t absDelta = (delta < 0)?-delta:delta;
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   139
  NS_LOG_DEBUG ("seqb="<<seqb<<", seqa="<<seqa<<", delta="<<delta);
4602
36adfa546b04 bug 601: Small typo in SequenceControlSmaller
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4079
diff changeset
   140
  if (absDelta < 2048)
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   141
    {
4602
36adfa546b04 bug 601: Small typo in SequenceControlSmaller
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4079
diff changeset
   142
      return sign;
36adfa546b04 bug 601: Small typo in SequenceControlSmaller
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4079
diff changeset
   143
    }
36adfa546b04 bug 601: Small typo in SequenceControlSmaller
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4079
diff changeset
   144
  else
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   145
    {
4602
36adfa546b04 bug 601: Small typo in SequenceControlSmaller
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 4079
diff changeset
   146
      return !sign;
1927
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
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   151
OriginatorRxStatus *
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5320
diff changeset
   152
MacRxMiddle::Lookup (const WifiMacHeader *hdr)
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   153
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   154
  NS_LOG_FUNCTION (hdr);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   155
  OriginatorRxStatus *originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   156
  Mac48Address source = hdr->GetAddr2 ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   157
  if (hdr->IsQosData () &&
4079
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3923
diff changeset
   158
      !hdr->GetAddr2 ().IsGroup ()) 
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   160
      /* only for qos data non-broadcast frames */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   161
      originator = m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid ())];
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   162
      if (originator == 0) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   163
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   164
          originator = new OriginatorRxStatus ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   165
          m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid ())] = originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   166
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   167
    } 
2093
a4211cfa45a7 update the last sequence control only for non-broadcast frames.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2092
diff changeset
   168
  else
1927
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
      /* - management frames
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   171
       * - qos data broadcast frames
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   172
       * - nqos data frames
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   173
       * see section 7.1.3.4.1
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   174
       */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   175
      originator = m_originatorStatus[source];
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   176
      if (originator == 0) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   178
          originator = new OriginatorRxStatus ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   179
          m_originatorStatus[source] = originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   180
        }
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
  return originator;
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
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   185
bool
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5320
diff changeset
   186
MacRxMiddle::IsDuplicate (const WifiMacHeader* hdr, 
2092
885ebd975e88 set the retry bit and use it to filter duplicates
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2014
diff changeset
   187
                          OriginatorRxStatus *originator) const
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   188
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   189
  NS_LOG_FUNCTION (hdr << originator);
2092
885ebd975e88 set the retry bit and use it to filter duplicates
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2014
diff changeset
   190
  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
   191
      originator->GetLastSequenceControl () == hdr->GetSequenceControl ()) 
1927
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
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   198
Ptr<Packet>
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5320
diff changeset
   199
MacRxMiddle::HandleFragments (Ptr<Packet> packet, const WifiMacHeader *hdr,
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   200
                              OriginatorRxStatus *originator)
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   201
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   202
  NS_LOG_FUNCTION (packet << hdr << originator);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
  if (originator->IsDeFragmenting ()) 
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
      if (hdr->IsMoreFragments ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   206
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   207
          if (originator->IsNextFragment (hdr->GetSequenceControl ())) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   208
            {
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   209
              NS_LOG_DEBUG ("accumulate fragment seq="<<hdr->GetSequenceNumber ()<<
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
                     ", frag="<<hdr->GetFragmentNumber ()<<
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   211
                     ", size="<<packet->GetSize ());
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   212
              originator->AccumulateFragment (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   213
              originator->SetSequenceControl (hdr->GetSequenceControl ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   214
            } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   215
          else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   216
            {
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   217
              NS_LOG_DEBUG ("non-ordered fragment");
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   218
            }
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   219
          return 0;
1927
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
            {
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   225
              NS_LOG_DEBUG ("accumulate last fragment seq="<<hdr->GetSequenceNumber ()<<
1927
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 ());
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   228
              Ptr<Packet> p = originator->AccumulateLastFragment (packet);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   229
              originator->SetSequenceControl (hdr->GetSequenceControl ());
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   230
              return p;
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   231
            } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   232
          else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   233
            {
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   234
              NS_LOG_DEBUG ("non-ordered fragment");
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   235
              return 0;
1927
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
        }
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
  else 
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
      if (hdr->IsMoreFragments ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   242
        {
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   243
          NS_LOG_DEBUG ("accumulate first fragment seq="<<hdr->GetSequenceNumber ()<<
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   244
                 ", frag="<<hdr->GetFragmentNumber ()<<
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   245
                 ", size="<<packet->GetSize ());
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   246
          originator->AccumulateFirstFragment (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   247
          originator->SetSequenceControl (hdr->GetSequenceControl ());
2159
20f882e85b4a port to Ptr<Packet> branch
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2148
diff changeset
   248
          return 0;
1927
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
      else 
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
          return packet;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   253
        }
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
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   256
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   257
void
5819
514ec98954ab Wifi code cleanup: Correcting various const keyword ordering and removing superfluous (boolean)?true:false.
Timo Bingmann <tbns@idlebox.net>
parents: 5320
diff changeset
   258
MacRxMiddle::Receive (Ptr<Packet> packet, const WifiMacHeader *hdr)
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   259
{
2985
fa0747c4ad5e use function logging macros
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2159
diff changeset
   260
  NS_LOG_FUNCTION (packet << hdr);
3923
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   261
  NS_ASSERT (hdr->IsData () || hdr->IsMgt ());
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   262
  OriginatorRxStatus *originator = Lookup (hdr);
3923
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   263
  /**
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   264
   * The check below is really uneeded because it can fail in a lot of
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   265
   * normal cases. Specifically, it is possible for sequence numbers to 
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   266
   * loop back to zero once they reach 0xfff0 and to go up to 0xf7f0 in 
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   267
   * which case the check below will report the two sequence numbers to 
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   268
   * not have the correct order relationship.
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   269
   * So, this check cannot be used to discard old duplicate frames. It is
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   270
   * thus here only for documentation purposes.
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   271
   */
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   272
  if (!SequenceControlSmaller (originator->GetLastSequenceControl (), 
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   273
                               hdr->GetSequenceControl ()))
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   274
    {
3923
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   275
      NS_LOG_DEBUG ("Sequence numbers have looped back. last recorded="<<originator->GetLastSequenceControl ()<<
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   276
                    " currently seen="<< hdr->GetSequenceControl ());
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   277
    }
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   278
  // filter duplicates.
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   279
  if (IsDuplicate (hdr, originator)) 
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   280
    {
3923
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   281
      NS_LOG_DEBUG ("duplicate from="<<hdr->GetAddr2 ()<<
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   282
                    ", seq="<<hdr->GetSequenceNumber ()<<
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   283
                    ", frag="<<hdr->GetFragmentNumber ());
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   284
      return;
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   285
    }
3923
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   286
  Ptr<Packet> agregate = HandleFragments (packet, hdr, originator);
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   287
  if (agregate == 0) 
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   288
    {
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   289
      return;
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   290
    }
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   291
  NS_LOG_DEBUG ("forwarding data from="<<hdr->GetAddr2 ()<<
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   292
                ", seq="<<hdr->GetSequenceNumber ()<<
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   293
                ", frag="<<hdr->GetFragmentNumber ());
4079
210d64d11998 add wifi multicast support. Based on patch by Mauchle Fabian.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 3923
diff changeset
   294
  if (!hdr->GetAddr1 ().IsGroup ())
3923
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   295
    {
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   296
      originator->SetSequenceControl (hdr->GetSequenceControl ());
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   297
    }
f38616f83c3b bug 408: ensure that we perform duplicate detection and defragmentation for both management and data frames. bug 214: make the sequence smaller check a debug log message rather than an unconditional message.
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 2985
diff changeset
   298
  m_callback (agregate, hdr);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   299
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   300
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   301
} // namespace ns3