View | Details | Raw Unified | Return to bug 738
Collapse All | Expand All

(-)a/src/devices/csma/csma-net-device.cc (-64 / +62 lines)
 Lines 739-830    Link Here 
739
      return;
739
      return;
740
    }
740
    }
741
741
742
743
  if (m_receiveErrorModel && m_receiveErrorModel->IsCorrupt (packet) )
744
    {
745
      NS_LOG_LOGIC ("Dropping pkt due to error model ");
746
      m_phyRxDropTrace (packet);
747
      return;
748
    }
749
742
  //
750
  //
743
  // Trace sinks will expect complete packets, not packets without some of the
751
  // Trace sinks will expect complete packets, not packets without some of the
744
  // headers.
752
  // headers.
745
  //
753
  //
746
  Ptr<Packet> originalPacket = packet->Copy ();
754
  Ptr<Packet> originalPacket = packet->Copy ();
747
748
  EthernetTrailer trailer;
755
  EthernetTrailer trailer;
749
  packet->RemoveTrailer (trailer);
756
  packet->RemoveTrailer (trailer);
750
  trailer.CheckFcs (packet);
757
  trailer.CheckFcs (packet);
751
752
  EthernetHeader header (false);
758
  EthernetHeader header (false);
753
  packet->RemoveHeader (header);
759
  packet->RemoveHeader (header);
754
760
755
  NS_LOG_LOGIC ("Pkt source is " << header.GetSource ());
761
  NS_LOG_LOGIC ("Pkt source is " << header.GetSource ());
756
  NS_LOG_LOGIC ("Pkt destination is " << header.GetDestination ());
762
  NS_LOG_LOGIC ("Pkt destination is " << header.GetDestination ());
757
763
758
  if (m_receiveErrorModel && m_receiveErrorModel->IsCorrupt (packet) )
764
  uint16_t protocol;
765
  //
766
  // If the length/type is less than 1500, it corresponds to a length 
767
  // interpretation packet.  In this case, it is an 802.3 packet and 
768
  // will also have an 802.2 LLC header.  If greater than 1500, we
769
  // find the protocol number (Ethernet type) directly.
770
  //
771
  if (header.GetLengthType () <= 1500)
759
    {
772
    {
760
      NS_LOG_LOGIC ("Dropping pkt due to error model ");
773
      LlcSnapHeader llc;
761
      m_phyRxDropTrace (packet);
774
      packet->RemoveHeader (llc);
775
      protocol = llc.GetType ();
762
    }
776
    }
763
  else
777
  else
764
    {
778
    {
765
      uint16_t protocol;
779
      protocol = header.GetLengthType ();
766
      //
780
    }
767
      // If the length/type is less than 1500, it corresponds to a length 
768
      // interpretation packet.  In this case, it is an 802.3 packet and 
769
      // will also have an 802.2 LLC header.  If greater than 1500, we
770
      // find the protocol number (Ethernet type) directly.
771
      //
772
      if (header.GetLengthType () <= 1500)
773
        {
774
          LlcSnapHeader llc;
775
          packet->RemoveHeader (llc);
776
          protocol = llc.GetType ();
777
        }
778
      else
779
        {
780
          protocol = header.GetLengthType ();
781
        }
782
781
783
      //
782
  //
784
      // Classify the packet based on its destination.
783
  // Classify the packet based on its destination.
785
      //
784
  //
786
      PacketType packetType;
785
  PacketType packetType;
787
786
788
      if (header.GetDestination ().IsBroadcast ())
787
  if (header.GetDestination ().IsBroadcast ())
789
        {
788
    {
790
          packetType = PACKET_BROADCAST;
789
      packetType = PACKET_BROADCAST;
791
        }
790
    }
792
      else if (header.GetDestination ().IsGroup ())
791
  else if (header.GetDestination ().IsGroup ())
793
        {
792
    {
794
          packetType = PACKET_MULTICAST;          
793
      packetType = PACKET_MULTICAST;          
795
        }
794
    }
796
      else if (header.GetDestination () == m_address)
795
  else if (header.GetDestination () == m_address)
797
        {
796
    {
798
          packetType = PACKET_HOST;
797
      packetType = PACKET_HOST;
799
        }
798
    }
800
      else
799
  else
801
        {
800
    {
802
          packetType = PACKET_OTHERHOST;
801
      packetType = PACKET_OTHERHOST;
803
        }
802
    }
804
803
805
      // 
804
  // 
806
      // For all kinds of packetType we receive, we hit the promiscuous sniffer
805
  // For all kinds of packetType we receive, we hit the promiscuous sniffer
807
      // hook and pass a copy up to the promiscuous callback.  Pass a copy to 
806
  // hook and pass a copy up to the promiscuous callback.  Pass a copy to 
808
      // make sure that nobody messes with our packet.
807
  // make sure that nobody messes with our packet.
809
      //
808
  //
810
      m_promiscSnifferTrace (originalPacket);
809
  m_promiscSnifferTrace (originalPacket);
811
      if (!m_promiscRxCallback.IsNull ())
810
  if (!m_promiscRxCallback.IsNull ())
812
        {
811
    {
813
          m_macPromiscRxTrace (originalPacket);
812
      m_macPromiscRxTrace (originalPacket);
814
          m_promiscRxCallback (this, packet, protocol, header.GetSource (), header.GetDestination (), packetType);
813
      m_promiscRxCallback (this, packet, protocol, header.GetSource (), header.GetDestination (), packetType);
815
        }
814
    }
816
815
817
      //
816
  //
818
      // If this packet is not destined for some other host, it must be for us
817
  // If this packet is not destined for some other host, it must be for us
819
      // as either a broadcast, multicast or unicast.  We need to hit the mac
818
  // as either a broadcast, multicast or unicast.  We need to hit the mac
820
      // packet received trace hook and forward the packet up the stack.
819
  // packet received trace hook and forward the packet up the stack.
821
      //
820
  //
822
      if (packetType != PACKET_OTHERHOST)
821
  if (packetType != PACKET_OTHERHOST)
823
        {
822
    {
824
          m_snifferTrace (originalPacket);
823
      m_snifferTrace (originalPacket);
825
          m_macRxTrace (originalPacket);
824
      m_macRxTrace (originalPacket);
826
          m_rxCallback (this, packet, protocol, header.GetSource ());
825
      m_rxCallback (this, packet, protocol, header.GetSource ());
827
        }
828
    }
826
    }
829
}
827
}
830
828

Return to bug 738