src/devices/wifi/mac-rx-middle.cc
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Tue, 16 Oct 2007 15:57:45 +0200
changeset 1974 0d6b3bead74a
parent 1927 7ef830068f1d
child 2014 c1bc06ac5152
permissions -rw-r--r--
replace cassert by ns3/assert.h
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 "ns3/packet.h"
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    23
#include "wifi-mac-header.h"
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    24
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
    25
#include "ns3/assert.h"
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    26
#include <list>
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    27
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    28
#define noRX_MIDDLE_TRACE 1
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    29
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    30
#ifdef RX_MIDDLE_TRACE
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    31
#include <iostream>
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    32
# define TRACE(x) \
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    33
  std::cout <<"RX MIDDLE "<<x<<std::endl;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    34
#else /* RX_MIDDLE_TRACE */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    35
# define TRACE(x)
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    36
#endif /* RX_MIDDLE_TRACE */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    37
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    38
namespace ns3 {
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
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    41
class OriginatorRxStatus {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    42
private:
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    43
  typedef std::list<Packet> Fragments;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    44
  typedef std::list<Packet>::const_iterator FragmentsCI;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    45
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    46
  bool m_defragmenting;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    47
  uint16_t m_lastSequenceControl;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    48
  Fragments m_fragments;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    49
public:
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    50
  OriginatorRxStatus () {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    51
    /* this is a magic value necessary. */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    52
    m_lastSequenceControl = 0xffff;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    53
    m_defragmenting = false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    54
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    55
  ~OriginatorRxStatus () {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    56
    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
    57
      {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    58
        // XXX ?
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    59
      }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    60
    m_fragments.erase (m_fragments.begin (), m_fragments.end ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    61
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    62
  bool IsDeFragmenting (void) {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    63
    return m_defragmenting;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    64
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    65
  void AccumulateFirstFragment (Packet const packet) {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
    66
    NS_ASSERT (!m_defragmenting);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    67
    m_defragmenting = true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    68
    m_fragments.push_back (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    69
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    70
  Packet AccumulateLastFragment (Packet const packet) {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
    71
    NS_ASSERT (m_defragmenting);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    72
    m_fragments.push_back (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    73
    m_defragmenting = false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    74
    Packet full;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    75
    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
    76
      {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    77
        full.AddAtEnd (*i);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    78
      }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    79
    m_fragments.erase (m_fragments.begin (), m_fragments.end ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    80
    return full;
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
  void AccumulateFragment (Packet const packet) {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
    83
    NS_ASSERT (m_defragmenting);
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    84
    m_fragments.push_back (packet);
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
  bool IsNextFragment (uint16_t sequenceControl) {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    87
    if ((sequenceControl >> 4) == (m_lastSequenceControl >> 4) &&
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    88
        (sequenceControl & 0x0f) == ((m_lastSequenceControl & 0x0f)+1)) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    89
      {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    90
        return true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    91
      } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    92
    else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    93
      {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
    94
        return false;
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
  uint16_t GetLastSequenceControl (void) 
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
    return m_lastSequenceControl;
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
  void SetSequenceControl (uint16_t sequenceControl) 
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
    m_lastSequenceControl = sequenceControl;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   104
  }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   105
  
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   106
};
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   107
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   108
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   109
MacRxMiddle::MacRxMiddle ()
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
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   112
MacRxMiddle::~MacRxMiddle ()
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   113
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   114
  for (OriginatorsI i = m_originatorStatus.begin ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   115
       i != m_originatorStatus.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_originatorStatus.erase (m_originatorStatus.begin (),
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   120
                            m_originatorStatus.end ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   121
  for (QosOriginatorsI i = m_qosOriginatorStatus.begin ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   122
       i != m_qosOriginatorStatus.end (); i++) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   123
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   124
      delete (*i).second;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   125
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   126
  m_qosOriginatorStatus.erase (m_qosOriginatorStatus.begin (),
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   127
                               m_qosOriginatorStatus.end ());
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
void 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   131
MacRxMiddle::SetForwardCallback (ForwardUpCallback callback)
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   132
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   133
  m_callback = callback;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   134
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   135
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   136
bool
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   137
MacRxMiddle::SequenceControlSmaller (int seqca, int seqcb)
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
  int seqa = seqca >> 4;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   140
  int seqb = seqcb >> 4;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   141
  int delta = seqb - seqa;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   142
  TRACE ("seqb="<<seqb<<", seqa="<<seqa<<", delta="<<delta);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   143
  if (delta <= 0 && delta < -2048) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   144
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   145
      return true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   146
    } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   147
  else if (delta >= 0 && delta < 2048) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   148
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   149
      return true;
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
  else 
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
      return false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   154
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   155
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   156
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   157
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   158
OriginatorRxStatus *
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   159
MacRxMiddle::Lookup (WifiMacHeader const *hdr)
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   160
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   161
  OriginatorRxStatus *originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   162
  Mac48Address source = hdr->GetAddr2 ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   163
  if (hdr->IsQosData () &&
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   164
      !hdr->GetAddr2 ().IsBroadcast ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   165
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   166
      /* only for qos data non-broadcast frames */
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   167
      originator = m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid ())];
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   168
      if (originator == 0) 
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
          originator = new OriginatorRxStatus ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   171
          m_qosOriginatorStatus[std::make_pair(source, hdr->GetQosTid ())] = originator;
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
    } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   174
  else 
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
      /* - management frames
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   177
       * - qos data broadcast frames
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   178
       * - nqos data frames
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   179
       * see section 7.1.3.4.1
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
      originator = m_originatorStatus[source];
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   182
      if (originator == 0) 
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
          originator = new OriginatorRxStatus ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   185
          m_originatorStatus[source] = originator;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   186
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   187
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   188
  return originator;
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
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   191
bool
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   192
MacRxMiddle::IsDuplicate (WifiMacHeader const*hdr, 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   193
         OriginatorRxStatus *originator) const
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
  if (originator->GetLastSequenceControl () == hdr->GetSequenceControl ()) 
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
      return true;
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
  return false;
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
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   202
Packet 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   203
MacRxMiddle::HandleFragments (Packet packet, WifiMacHeader const*hdr,
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   204
             OriginatorRxStatus *originator, bool *complete)
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   205
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   206
  if (originator->IsDeFragmenting ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   207
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   208
      if (hdr->IsMoreFragments ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   209
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   210
          if (originator->IsNextFragment (hdr->GetSequenceControl ())) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   211
            {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   212
              TRACE ("accumulate fragment seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   213
                     ", frag="<<hdr->GetFragmentNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   214
                     ", size="<<packet.GetSize ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   215
              originator->AccumulateFragment (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   216
              originator->SetSequenceControl (hdr->GetSequenceControl ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   217
            } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   218
          else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   219
            {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   220
              TRACE ("non-ordered fragment");
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   221
            }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   222
          *complete = false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   223
          return Packet ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   224
        } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   225
      else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   226
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   227
          if (originator->IsNextFragment (hdr->GetSequenceControl ())) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   228
            {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   229
              TRACE ("accumulate last fragment seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   230
                     ", frag="<<hdr->GetFragmentNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   231
                     ", size="<<hdr->GetSize ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   232
              packet = originator->AccumulateLastFragment (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   233
              originator->SetSequenceControl (hdr->GetSequenceControl ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   234
              *complete = true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   235
              return packet;
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
          else 
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 ("non-ordered fragment");
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   240
              *complete = false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   241
              return Packet ();
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   242
            }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   243
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   244
    } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   245
  else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   246
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   247
      if (hdr->IsMoreFragments ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   248
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   249
          TRACE ("accumulate first fragment seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   250
                 ", frag="<<hdr->GetFragmentNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   251
                 ", size="<<packet.GetSize ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   252
          originator->AccumulateFirstFragment (packet);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   253
          originator->SetSequenceControl (hdr->GetSequenceControl ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   254
          *complete = false;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   255
          return Packet ();
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
      else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   258
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   259
          *complete = true;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   260
          return packet;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   261
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   262
    }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   263
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   264
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   265
void
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   266
MacRxMiddle::Receive (Packet packet, WifiMacHeader const *hdr)
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   267
{
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   268
  OriginatorRxStatus *originator = Lookup (hdr);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   269
  if (hdr->IsData ()) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   270
    {
1974
0d6b3bead74a replace cassert by ns3/assert.h
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents: 1927
diff changeset
   271
      NS_ASSERT (SequenceControlSmaller (originator->GetLastSequenceControl (), 
1927
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   272
                                      hdr->GetSequenceControl ()));
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   273
      // filter duplicates.
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   274
      if (IsDuplicate (hdr, originator)) 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   275
        {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   276
          TRACE ("duplicate from="<<hdr->GetAddr2 ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   277
                 ", seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   278
                 ", frag="<<hdr->GetFragmentNumber ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   279
          return;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   280
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   281
      bool complete;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   282
      Packet agregate = HandleFragments (packet, hdr, originator, &complete);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   283
      if (!complete) 
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
          return;
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   286
        }
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   287
      TRACE ("forwarding data from="<<hdr->GetAddr2 ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   288
             ", seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   289
             ", frag="<<hdr->GetFragmentNumber ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   290
      originator->SetSequenceControl (hdr->GetSequenceControl ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   291
      m_callback (agregate, hdr);
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   292
    } 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   293
  else 
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   294
    {
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   295
      TRACE ("forwarding "<<hdr->GetTypeString ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   296
             ", seq="<<hdr->GetSequenceNumber ()<<
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   297
             ", frag="<<hdr->GetFragmentNumber ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   298
      originator->SetSequenceControl (hdr->GetSequenceControl ());
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   299
      m_callback (packet, hdr);
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
}
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   302
7ef830068f1d add MacRxMiddle to build
Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
parents:
diff changeset
   303
} // namespace ns3