src/devices/csma-cd/csma-cd-net-device.cc
changeset 1270 1bcaff94bf03
parent 1266 6b27f6b349ba
parent 1235 dc52ea3507ff
equal deleted inserted replaced
1269:86749c52475a 1270:1bcaff94bf03
    33 
    33 
    34 NS_DEBUG_COMPONENT_DEFINE ("CsmaCdNetDevice");
    34 NS_DEBUG_COMPONENT_DEFINE ("CsmaCdNetDevice");
    35 
    35 
    36 namespace ns3 {
    36 namespace ns3 {
    37 
    37 
       
    38 CsmaCdTraceType::CsmaCdTraceType (enum Type type)
       
    39   : m_type (type)
       
    40 {}
       
    41 CsmaCdTraceType::CsmaCdTraceType ()
       
    42   : m_type (RX)
       
    43 {}
       
    44 void 
       
    45 CsmaCdTraceType::Print (std::ostream &os) const
       
    46 {
       
    47   switch (m_type) {
       
    48   case RX:
       
    49     os << "dev-rx";
       
    50     break;
       
    51   case DROP:
       
    52     os << "dev-drop";
       
    53     break;
       
    54   }
       
    55 }
       
    56 uint16_t 
       
    57 CsmaCdTraceType::GetUid (void)
       
    58 {
       
    59   static uint16_t uid = AllocateUid<CsmaCdTraceType> ("CsmaCdTraceType");
       
    60   return uid;
       
    61 }
       
    62 
       
    63 
    38 CsmaCdNetDevice::CsmaCdNetDevice (Ptr<Node> node)
    64 CsmaCdNetDevice::CsmaCdNetDevice (Ptr<Node> node)
    39   : NetDevice (node, Eui48Address::Allocate ().ConvertTo ()),
    65   : NetDevice (node, Eui48Address::Allocate ()),
    40     m_bps (DataRate (0xffffffff))
    66     m_bps (DataRate (0xffffffff))
    41 {
    67 {
    42   NS_DEBUG ("CsmaCdNetDevice::CsmaCdNetDevice (" << node << ")");
    68   NS_DEBUG ("CsmaCdNetDevice::CsmaCdNetDevice (" << node << ")");
    43   m_encapMode = IP_ARP;
    69   m_encapMode = IP_ARP;
    44   Init(true, true);
    70   Init(true, true);
    45 }
    71 }
    46 
    72 
    47 CsmaCdNetDevice::CsmaCdNetDevice (Ptr<Node> node, Eui48Address addr, 
    73 CsmaCdNetDevice::CsmaCdNetDevice (Ptr<Node> node, Eui48Address addr, 
    48                                   CsmaCdEncapsulationMode encapMode) 
    74                                   CsmaCdEncapsulationMode encapMode) 
    49   : NetDevice(node, addr.ConvertTo ()), 
    75   : NetDevice(node, addr), 
    50     m_bps (DataRate (0xffffffff))
    76     m_bps (DataRate (0xffffffff))
    51 {
    77 {
    52   NS_DEBUG ("CsmaCdNetDevice::CsmaCdNetDevice (" << node << ")");
    78   NS_DEBUG ("CsmaCdNetDevice::CsmaCdNetDevice (" << node << ")");
    53   m_encapMode = encapMode;
    79   m_encapMode = encapMode;
    54 
    80 
    56 }
    82 }
    57 
    83 
    58 CsmaCdNetDevice::CsmaCdNetDevice (Ptr<Node> node, Eui48Address addr, 
    84 CsmaCdNetDevice::CsmaCdNetDevice (Ptr<Node> node, Eui48Address addr, 
    59                                   CsmaCdEncapsulationMode encapMode,
    85                                   CsmaCdEncapsulationMode encapMode,
    60                                   bool sendEnable, bool receiveEnable) 
    86                                   bool sendEnable, bool receiveEnable) 
    61   : NetDevice(node, addr.ConvertTo ()), 
    87   : NetDevice(node, addr), 
    62     m_bps (DataRate (0xffffffff))
    88     m_bps (DataRate (0xffffffff))
    63 {
    89 {
    64   NS_DEBUG ("CsmaCdNetDevice::CsmaCdNetDevice (" << node << ")");
    90   NS_DEBUG ("CsmaCdNetDevice::CsmaCdNetDevice (" << node << ")");
    65   m_encapMode = encapMode;
    91   m_encapMode = encapMode;
    66 
    92 
   103   m_txMachineState = READY;
   129   m_txMachineState = READY;
   104   m_tInterframeGap = Seconds(0);
   130   m_tInterframeGap = Seconds(0);
   105   m_channel = 0; 
   131   m_channel = 0; 
   106   m_queue = 0;
   132   m_queue = 0;
   107 
   133 
   108   EnableBroadcast (Eui48Address ("ff:ff:ff:ff:ff:ff").ConvertTo ());
   134   EnableBroadcast (Eui48Address ("ff:ff:ff:ff:ff:ff"));
   109   EnableMulticast();
   135   EnableMulticast();
   110   EnablePointToPoint();
   136   EnablePointToPoint();
   111 
   137 
   112   SetSendEnable (sendEnable);
   138   SetSendEnable (sendEnable);
   113   SetReceiveEnable (receiveEnable);
   139   SetReceiveEnable (receiveEnable);
   175 
   201 
   176   uint16_t lengthType = 0;
   202   uint16_t lengthType = 0;
   177   switch (m_encapMode) 
   203   switch (m_encapMode) 
   178     {
   204     {
   179     case ETHERNET_V1:
   205     case ETHERNET_V1:
   180       lengthType = p.GetSize() + header.GetSize() + trailer.GetSize();
   206       lengthType = p.GetSize() + header.GetSerializedSize() + trailer.GetSerializedSize();
   181       break;
   207       break;
   182     case IP_ARP:
   208     case IP_ARP:
   183       lengthType = protocolNumber;
   209       lengthType = protocolNumber;
   184       break;
   210       break;
   185     case LLC: {
   211     case LLC: {
   208       
   234       
   209   p.RemoveTrailer(trailer);
   235   p.RemoveTrailer(trailer);
   210   trailer.CheckFcs(p);
   236   trailer.CheckFcs(p);
   211   p.RemoveHeader(header);
   237   p.RemoveHeader(header);
   212 
   238 
   213   Eui48Address broadcast = Eui48Address::ConvertFrom (GetBroadcast ());
   239   if ((header.GetDestination() != GetBroadcast ()) &&
   214   Eui48Address destination = Eui48Address::ConvertFrom (GetAddress ());
   240       (header.GetDestination() != GetAddress ()))
   215   if ((header.GetDestination() != broadcast) &&
       
   216       (header.GetDestination() != destination))
       
   217     {
   241     {
   218       return false;
   242       return false;
   219     }
   243     }
   220 
   244 
   221   switch (m_encapMode)
   245   switch (m_encapMode)
   260 
   284 
   261   // Only transmit if send side of net device is enabled
   285   // Only transmit if send side of net device is enabled
   262   if (!IsSendEnabled())
   286   if (!IsSendEnabled())
   263     return false;
   287     return false;
   264 
   288 
   265   Eui48Address address = Eui48Address::ConvertFrom (dest);
   289   Eui48Address destination = Eui48Address::ConvertFrom (dest);
   266   AddHeader(p, address, protocolNumber);
   290   AddHeader(p, destination, protocolNumber);
   267 
   291 
   268   // Place the packet to be sent on the send queue
   292   // Place the packet to be sent on the send queue
   269   if (m_queue->Enqueue(p) == false )
   293   if (m_queue->Enqueue(p) == false )
   270     {
   294     {
   271       return false;
   295       return false;
   430 CsmaCdNetDevice::DoCreateTraceResolver (TraceContext const &context)
   454 CsmaCdNetDevice::DoCreateTraceResolver (TraceContext const &context)
   431 {
   455 {
   432   CompositeTraceResolver *resolver = new CompositeTraceResolver (context);
   456   CompositeTraceResolver *resolver = new CompositeTraceResolver (context);
   433   resolver->Add ("queue", 
   457   resolver->Add ("queue", 
   434                  MakeCallback (&Queue::CreateTraceResolver, 
   458                  MakeCallback (&Queue::CreateTraceResolver, 
   435                                PeekPointer (m_queue)),
   459                                PeekPointer (m_queue)));
   436                  CsmaCdNetDevice::QUEUE);
       
   437   resolver->Add ("rx",
   460   resolver->Add ("rx",
   438                  m_rxTrace,
   461                  m_rxTrace,
   439                  CsmaCdNetDevice::RX);
   462                  CsmaCdTraceType (CsmaCdTraceType::RX));
   440   return resolver;
   463   resolver->Add ("drop",
       
   464                  m_dropTrace,
       
   465                  CsmaCdTraceType (CsmaCdTraceType::DROP));
       
   466    return resolver;
   441 }
   467 }
   442 
   468 
   443 bool
   469 bool
   444 CsmaCdNetDevice::Attach (Ptr<CsmaCdChannel> ch)
   470 CsmaCdNetDevice::Attach (Ptr<CsmaCdChannel> ch)
   445 {
   471 {
   478   NS_DEBUG ("CsmaCdNetDevice::Receive UID is (" << p.GetUid() << ")");
   504   NS_DEBUG ("CsmaCdNetDevice::Receive UID is (" << p.GetUid() << ")");
   479 
   505 
   480   // Only receive if send side of net device is enabled
   506   // Only receive if send side of net device is enabled
   481   if (!IsReceiveEnabled())
   507   if (!IsReceiveEnabled())
   482     {
   508     {
   483       goto drop;
   509       m_dropTrace (p);
       
   510       return;
   484     }
   511     }
   485 
   512 
   486   if (m_encapMode == RAW)
   513   if (m_encapMode == RAW)
   487     {
   514     {
   488       ForwardUp (packet, 0, GetBroadcast ());
   515       ForwardUp (packet, 0, GetBroadcast ());
   489       goto drop;
   516       m_dropTrace (p);
       
   517       return;
   490     }
   518     }
   491   p.RemoveTrailer(trailer);
   519   p.RemoveTrailer(trailer);
   492   trailer.CheckFcs(p);
   520   trailer.CheckFcs(p);
   493   p.RemoveHeader(header);
   521   p.RemoveHeader(header);
   494 
   522 
   496   destination = Eui48Address::ConvertFrom (GetAddress ());
   524   destination = Eui48Address::ConvertFrom (GetAddress ());
   497   if ((header.GetDestination() != broadcast) &&
   525   if ((header.GetDestination() != broadcast) &&
   498       (header.GetDestination() != destination))
   526       (header.GetDestination() != destination))
   499     {
   527     {
   500       // not for us.
   528       // not for us.
   501       goto drop;
   529       m_dropTrace (p);
   502     }
   530       return;
   503 
   531     }
   504   uint16_t protocol;
   532 //
       
   533 // protocol must be initialized to avoid a compiler warning in the RAW
       
   534 // case that breaks the optimized build.
       
   535 //
       
   536   uint16_t protocol = 0;
       
   537 
   505   switch (m_encapMode)
   538   switch (m_encapMode)
   506     {
   539     {
   507     case ETHERNET_V1:
   540     case ETHERNET_V1:
   508     case IP_ARP:
   541     case IP_ARP:
   509       protocol = header.GetLengthType();
   542       protocol = header.GetLengthType();
   517       NS_ASSERT (false);
   550       NS_ASSERT (false);
   518       break;
   551       break;
   519     }
   552     }
   520   
   553   
   521   m_rxTrace (p);
   554   m_rxTrace (p);
   522   ForwardUp (p, protocol, header.GetSource ().ConvertTo ());
   555   ForwardUp (p, protocol, header.GetSource ());
   523   return;
   556   return;
   524  drop:
       
   525   m_dropTrace (p);
       
   526 }
   557 }
   527 
   558 
   528 Ptr<Queue>
   559 Ptr<Queue>
   529 CsmaCdNetDevice::GetQueue(void) const 
   560 CsmaCdNetDevice::GetQueue(void) const 
   530 { 
   561 {