src/devices/bridge/bridge-net-device.cc
changeset 3460 99698bc858e8
parent 3449 c3dcecc4825a
child 3519 a6113320f46a
equal deleted inserted replaced
3459:a67df503c7bc 3460:99698bc858e8
    66   NS_LOG_DEBUG ("UID is " << packet->GetUid ());
    66   NS_LOG_DEBUG ("UID is " << packet->GetUid ());
    67 
    67 
    68   Mac48Address src48 = Mac48Address::ConvertFrom (src);
    68   Mac48Address src48 = Mac48Address::ConvertFrom (src);
    69   Mac48Address dst48 = Mac48Address::ConvertFrom (dst);
    69   Mac48Address dst48 = Mac48Address::ConvertFrom (dst);
    70 
    70 
       
    71   if (!m_promiscRxCallback.IsNull ())
       
    72     {
       
    73       m_promiscRxCallback (this, packet, protocol, src, dst, packetType);
       
    74     }
    71 
    75 
    72   switch (packetType)
    76   switch (packetType)
    73     {
    77     {
    74     case PACKET_HOST:
    78     case PACKET_HOST:
    75       if (dst48 == m_address)
    79       if (dst48 == m_address)
    76         {
    80         {
    77           m_rxCallback (this, packet, protocol, src, dst, packetType);
    81           m_rxCallback (this, packet, protocol, src);
    78         }
    82         }
    79       break;
    83       break;
    80 
    84 
    81     case PACKET_BROADCAST:
    85     case PACKET_BROADCAST:
    82     case PACKET_MULTICAST:
    86     case PACKET_MULTICAST:
    83       m_rxCallback (this, packet, protocol, src, dst, packetType);
    87       m_rxCallback (this, packet, protocol, src);
    84       ForwardBroadcast (incomingPort, packet, protocol, src48, dst48);
    88       ForwardBroadcast (incomingPort, packet, protocol, src48, dst48);
    85       break;
    89       break;
    86 
    90 
    87     case PACKET_OTHERHOST:
    91     case PACKET_OTHERHOST:
    88       ForwardUnicast (incomingPort, packet, protocol, src48, dst48);
    92       ForwardUnicast (incomingPort, packet, protocol, src48, dst48);
   158 
   162 
   159 Ptr<NetDevice> BridgeNetDevice::GetLearnedState (Mac48Address source)
   163 Ptr<NetDevice> BridgeNetDevice::GetLearnedState (Mac48Address source)
   160 {
   164 {
   161   if (m_enableLearning)
   165   if (m_enableLearning)
   162     {
   166     {
       
   167       Time now = Simulator::Now ();
   163       std::map<Mac48Address, LearnedState>::iterator iter =
   168       std::map<Mac48Address, LearnedState>::iterator iter =
   164         m_learnState.find (source);
   169         m_learnState.find (source);
   165       if (iter != m_learnState.end ())
   170       if (iter != m_learnState.end ())
   166         {
   171         {
   167           LearnedState &state = iter->second;
   172           LearnedState &state = iter->second;
   168           if (state.expirationTime > Simulator::Now ())
   173           if (state.expirationTime > now)
   169             {
   174             {
   170               return state.associatedPort;
   175               return state.associatedPort;
   171             }
   176             }
   172           else
   177           else
   173             {
   178             {
   185   if (m_address == Mac48Address ())
   190   if (m_address == Mac48Address ())
   186     {
   191     {
   187       m_address = Mac48Address::ConvertFrom (bridgePort->GetAddress ());
   192       m_address = Mac48Address::ConvertFrom (bridgePort->GetAddress ());
   188     }
   193     }
   189 
   194 
       
   195   NS_LOG_DEBUG ("RegisterProtocolHandler for " << bridgePort->GetName ());
   190   m_node->RegisterProtocolHandler (MakeCallback (&BridgeNetDevice::ReceiveFromDevice, this),
   196   m_node->RegisterProtocolHandler (MakeCallback (&BridgeNetDevice::ReceiveFromDevice, this),
   191                                    0, bridgePort);
   197                                    0, bridgePort, true);
   192   m_ports.push_back (bridgePort);
   198   m_ports.push_back (bridgePort);
   193   m_channel->AddChannel (bridgePort->GetChannel ());
   199   m_channel->AddChannel (bridgePort->GetChannel ());
   194 }
   200 }
   195 
   201 
   196 void 
   202 void 
   394 BridgeNetDevice::SetReceiveCallback (NetDevice::ReceiveCallback cb)
   400 BridgeNetDevice::SetReceiveCallback (NetDevice::ReceiveCallback cb)
   395 {
   401 {
   396   m_rxCallback = cb;
   402   m_rxCallback = cb;
   397 }
   403 }
   398 
   404 
       
   405 void 
       
   406 BridgeNetDevice::SetPromiscReceiveCallback (NetDevice::PromiscReceiveCallback cb)
       
   407 {
       
   408   m_promiscRxCallback = cb;
       
   409 }
       
   410 
       
   411 bool
       
   412 BridgeNetDevice::SupportsPromiscuous () const
       
   413 {
       
   414   return true;
       
   415 }
       
   416 
   399 
   417 
   400 void
   418 void
   401 BridgeNetDevice::DoDispose (void)
   419 BridgeNetDevice::DoDispose (void)
   402 {
   420 {
   403   m_node = 0;
   421   m_node = 0;