src/devices/csma-cd/csma-cd-net-device.cc
changeset 995 22821dd9152e
parent 993 9f9d5048b710
child 997 d95ffcec6523
--- a/src/devices/csma-cd/csma-cd-net-device.cc	Sat Jul 28 13:14:24 2007 +0200
+++ b/src/devices/csma-cd/csma-cd-net-device.cc	Sat Jul 28 13:15:04 2007 +0200
@@ -150,65 +150,76 @@
 }
 void 
 CsmaCdNetDevice::AddHeader (Packet& p, const MacAddress& dest,
-                                  uint16_t protocolNumber)
+                            uint16_t protocolNumber)
 {
-  if ((m_encapMode == ETHERNET_V1) || (m_encapMode == IP_ARP))
+  if (m_encapMode == RAW)
     {
-      EthernetHeader  header;
-      EthernetTrailer trailer;
-      
-      header.SetSource(this->GetAddress());
-      header.SetDestination(dest);
-      switch (m_encapMode)
-        {
-        case IP_ARP:
-          header.SetLengthType(protocolNumber);
-          break;
-        default:
-          header.SetLengthType(p.GetSize() + header.GetSize() + trailer.GetSize());
-          break;
-        }
-      p.AddHeader(header);
-      trailer.CalcFcs(p);
-      p.AddTrailer(trailer);
-    } 
-  else if (m_encapMode == LLC) 
+      return;
+    }
+  EthernetHeader header (false);
+  EthernetTrailer trailer;
+  header.SetSource(this->GetAddress());
+  header.SetDestination(dest);
+
+  uint16_t lengthType;
+  switch (m_encapMode) 
     {
+    case ETHERNET_V1:
+      lengthType = p.GetSize() + header.GetSize() + trailer.GetSize();
+      break;
+    case IP_ARP:
+      lengthType = protocolNumber;
+      break;
+    case LLC: {
       LlcSnapHeader llc;
       llc.SetType (protocolNumber);
       p.AddHeader (llc);
+    } break;
+    case RAW:
+      NS_ASSERT (false);
+      break;
     }
+  header.SetLengthType (lengthType);
+  p.AddHeader(header);
+  trailer.CalcFcs(p);
+  p.AddTrailer(trailer);
 }
 bool 
-CsmaCdNetDevice::ProcessHeader(Packet& p, int& param)
+CsmaCdNetDevice::ProcessHeader (Packet& p, uint16_t & param)
 {
-  bool retVal = true;
-
-  if ((m_encapMode == ETHERNET_V1) || (m_encapMode == IP_ARP))
+  if (m_encapMode == RAW)
     {
-      EthernetHeader  header;
-      EthernetTrailer trailer;
+      return true;
+    }
+  EthernetHeader header (false);
+  EthernetTrailer trailer;
       
-      p.RemoveTrailer(trailer);
-      trailer.CheckFcs(p);
-      p.RemoveHeader(header);
-      
+  p.RemoveTrailer(trailer);
+  trailer.CheckFcs(p);
+  p.RemoveHeader(header);
+
+  if ((header.GetDestination() != this->GetBroadcast()) &&
+      (header.GetDestination() != this->GetAddress()))
+    {
+      return false;
+    }
+
+  switch (m_encapMode)
+    {
+    case ETHERNET_V1:
+    case IP_ARP:
       param = header.GetLengthType();
-      if ((header.GetDestination() != this->GetBroadcast()) &&
-          (header.GetDestination() != this->GetAddress()))
-        {
-          retVal = false;
-        }
-    }
-  else if (m_encapMode == LLC)
-    {
+      break;
+    case LLC: {
       LlcSnapHeader llc;
       p.RemoveHeader (llc);
-
       param = llc.GetType ();
+    } break;
+    case RAW:
+      NS_ASSERT (false);
+      break;
     }
-
-  return retVal;
+  return true;
 }
 
 bool
@@ -440,14 +451,16 @@
   if (!IsReceiveEnabled())
     return;
 
-  int param = 0;
+  uint16_t param = 0;
   Packet packet = p;
 
   if (ProcessHeader(packet, param))
     {
       m_rxTrace (packet);
       ForwardUp (packet, param);
-    } else {
+    } 
+  else 
+    {
       m_dropTrace (packet);
     }
 }