# HG changeset patch # User Mathieu Lacage # Date 1185621304 -7200 # Node ID 22821dd9152e043e64a005cd7d0720ffe78e939e # Parent a7252b11c8d286754a0777bf497627209e7eb082 param is a 16 bit integer. implement proper llc encapsulation/decapsulation diff -r a7252b11c8d2 -r 22821dd9152e src/devices/csma-cd/csma-cd-net-device.cc --- 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); } } diff -r a7252b11c8d2 -r 22821dd9152e src/devices/csma-cd/csma-cd-net-device.h --- a/src/devices/csma-cd/csma-cd-net-device.h Sat Jul 28 13:14:24 2007 +0200 +++ b/src/devices/csma-cd/csma-cd-net-device.h Sat Jul 28 13:15:04 2007 +0200 @@ -222,7 +222,7 @@ * \return Returns true if the packet should be forwarded up the * protocol stack. */ - bool ProcessHeader (Packet& p, int& param); + bool ProcessHeader (Packet& p, uint16_t & param); private: // disable copy constructor and operator =