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); |
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(); |