1.1 --- a/wns3.tex Fri Feb 27 17:11:24 2009 +0100
1.2 +++ b/wns3.tex Sat Feb 28 23:26:19 2009 +0100
1.3 @@ -1,8 +1,9 @@
1.4 \documentclass{beamer}
1.5 \usepackage{beamertexpower}
1.6 \usetheme{Madrid}
1.7 -\title{}
1.8 -\date{march 2nd 2009}
1.9 +\author{Tom Henderson \and Mathieu Lacage}
1.10 +\title{An end-to-end tour of a simulation}
1.11 +\date{WNS3, March 2nd 2009}
1.12 \begin{document}
1.13
1.14
1.15 @@ -14,13 +15,7 @@
1.16 \end{frame}
1.17 }
1.18
1.19 -\AtBeginSubsection[]
1.20 -{
1.21 - \begin{frame}<beamer>
1.22 - \frametitle{Outline}
1.23 - \tableofcontents[currentsection,currentsubsection,subsectionstyle=show/shaded/hide]
1.24 - \end{frame}
1.25 -}
1.26 +
1.27
1.28 \begin{frame}
1.29 \titlepage
1.30 @@ -84,17 +79,23 @@
1.31
1.32 \begin{frame}[fragile]{Why are objects so complicated to create ?}
1.33 We do:
1.34 +\begin{block}{}
1.35 \begin{verbatim}
1.36 Ptr<Node> node0 = CreateObject<Node> ();
1.37 \end{verbatim}
1.38 +\end{block}
1.39 Why not:
1.40 +\begin{block}{}
1.41 \begin{verbatim}
1.42 Node *node0 = new Node ();
1.43 \end{verbatim}
1.44 +\end{block}
1.45 Or:
1.46 +\begin{block}{}
1.47 \begin{verbatim}
1.48 Node node0 = Node ();
1.49 \end{verbatim}
1.50 +\end{block}
1.51 \end{frame}
1.52
1.53 \begin{frame}{Templates: the Nasty Brackets}
1.54 @@ -132,11 +133,13 @@
1.55
1.56 \begin{frame}[fragile]{Why don't we have a MobileNode ?}
1.57
1.58 +\begin{block}{}
1.59 \begin{verbatim}
1.60 Ptr<Node> node = CreateObject<Node> ();
1.61 Ptr<MobilityModel> mobility = CreateObject<...> ();
1.62 node->AggregateObject (mobility);
1.63 \end{verbatim}
1.64 +\end{block}
1.65
1.66 \begin{itemize}
1.67 \item Some nodes need an IPv4 stack, a position, an energy model.
1.68 @@ -199,13 +202,16 @@
1.69 \begin{itemize}
1.70 \item Derive from the \code{ns3::Object} base class
1.71 \item Define a \code{GetTypeId} static method:
1.72 +\begin{block}{}
1.73 \begin{verbatim}
1.74 class Foo : public Object {
1.75 public:
1.76 static TypeId GetTypeId (void);
1.77 };
1.78 \end{verbatim}
1.79 +\end{block}
1.80 \item Define the features of your object:
1.81 +\begin{block}{}
1.82 \begin{verbatim}
1.83 static TypeId tid = TypeId ("ns3::Foo")
1.84 .SetParent<Object> ()
1.85 @@ -213,6 +219,7 @@
1.86 .AddTraceSource ("Name", "Help", ...);
1.87 return tid;
1.88 \end{verbatim}
1.89 +\end{block}
1.90 \item call \code{NS\_OBJECT\_ENSURE\_REGISTERED}
1.91 \end{itemize}
1.92 \end{frame}
1.93 @@ -224,64 +231,95 @@
1.94
1.95 \section{Diving In: an End To End Tour of a Packet}
1.96
1.97 -\begin{frame}{The first event scheduled}
1.98 +\begin{frame}[fragile,allowframebreaks]{Application Transmission}
1.99
1.100 -\begin{itemize}
1.101 -\item User calls \code{ApplicationContainer::Start}
1.102 -\item Calls \code{Application::Start}
1.103 -\item Calls virtual \code{Application::StartApplication}
1.104 -\item Calls \code{OnOffApplication::StartApplication}
1.105 -\item Creates a socket with \code{Socket::CreateSocket}
1.106 -\begin{itemize}
1.107 -\item Calls \code {Node::GetObject ("ns3::UdpSocketFactory")}
1.108 -\item Calls \code{SocketFactory::CreateSocket}
1.109 -\end{itemize}
1.110 -\item Calls \code{OnOffApplication::ScheduleStartEvent}
1.111 -\item Calls \code{Simulator::Schedule} on \code{OnOffApplication::StartSending}
1.112 -\item Later (very later), user calls \code{Simulator::Run}
1.113 -\end{itemize}
1.114 +User writes:
1.115 +\begin{block}{}
1.116 +\begin{verbatim}
1.117 +Ptr<Application> app = ...;
1.118 +app->Start (Seconds (1.0));
1.119 +\end{verbatim}
1.120 +\end{block}
1.121 +
1.122 +\code{Application::Start}:
1.123 +\begin{block}{}
1.124 +\begin{verbatim}
1.125 +m_startEvent = Simulator::Schedule (startTime,
1.126 + &Application::StartApplication, this);
1.127 +\end{verbatim}
1.128 +\end{block}
1.129 +
1.130 +\break
1.131 +
1.132 +User calls \code{Simulator::Run}:
1.133 +\begin{block}{}
1.134 +\begin{verbatim}
1.135 +m_socket = Socket::CreateSocket (GetNode(), m_tid);
1.136 +m_socket->Bind ();
1.137 +m_socket->Connect (m_peer);
1.138 +...
1.139 +m_startStopEvent = Simulator::Schedule(offInterval,
1.140 + &OnOffApplication::StartSending, this);
1.141 +\end{verbatim}
1.142 +\end{block}
1.143 +
1.144 +\code{Socket::CreateSocket}:
1.145 +\begin{block}{}
1.146 +\begin{verbatim}
1.147 +Ptr<SocketFactory> socketFactory;
1.148 +socketFactory = node->GetObject<SocketFactory> (tid);
1.149 +s = socketFactory->CreateSocket ();
1.150 +\end{verbatim}
1.151 +\end{block}
1.152 +
1.153 +\break
1.154 +
1.155 +\code{OnOffApplication::StartSending}:
1.156 +\begin{block}{}
1.157 +\begin{verbatim}
1.158 +m_sendEvent = Simulator::Schedule(nextTime,
1.159 + &OnOffApplication::SendPacket, this);
1.160 +\end{verbatim}
1.161 +\end{block}
1.162 +
1.163 +\code{OnOffApplication::SendPacket}:
1.164 +\begin{block}{}
1.165 +\begin{verbatim}
1.166 +Ptr<Packet> packet = Create<Packet> (m_pktSize);
1.167 +m_txTrace (packet);
1.168 +m_socket->Send (packet);
1.169 +...
1.170 +m_sendEvent = Simulator::Schedule(nextTime,
1.171 + &OnOffApplication::SendPacket, this);
1.172 +\end{verbatim}
1.173 +\end{block}
1.174 +
1.175 \end{frame}
1.176
1.177
1.178 -\begin{frame}{The first event executed}
1.179 +\begin{frame}[fragile]{Summary: how applications access network stacks}
1.180
1.181 -This is the first event called by \code{Simulator::Run}:
1.182 -\code{OnOffApplication::StartSending}
1.183 -\begin{itemize}
1.184 -\item Calls \code{OnOffApplication::ScheduleNextTx}
1.185 -\item Calls \code{Simulator::Schedule} on \code{OnOffApplication::SendPacket}
1.186 -\end{itemize}
1.187 -And the second event: \code{OnOffApplication::SendPacket}
1.188 -\begin{itemize}
1.189 -\item Calls \code{Create<Packet>}
1.190 -\item Calls \code{m\_txTrace::operator()}
1.191 -\item Calls all connected trace sinks
1.192 -\item Calls virtual \code{Socket::Send}
1.193 -\item Calls \code{UdpSocketImpl::Send}
1.194 -\item Calls \code{UdpSocketImpl::DoSendTo}
1.195 -\end{itemize}
1.196 -\end{frame}
1.197 +How to use a new protocol \code{Foo}:
1.198 +\begin{block}{}
1.199 +\begin{verbatim}
1.200 +Ptr<SocketFactory> factory =
1.201 + node->GetObject<FooSocketFactory> ();
1.202 +Ptr<Socket> socket = factory->CreateSocket ();
1.203 +socket->...
1.204 +\end{verbatim}
1.205 +\end{block}
1.206
1.207 -\begin{frame}{Summary: how applications access network stacks}
1.208 -
1.209 -Applications who wish to use protocol \code{Foo} must:
1.210 -\begin{itemize}
1.211 -\item Call \code{Node::GetObject<FooSocketFactory>}
1.212 -\item Call \code{SocketFactory::CreateSocket} (calls \code{FooSocketFactoryImpl::CreateSocket})
1.213 -\item Call \code{Socket::Send} (calls \code{FooSocketImpl::Send})
1.214 -\end{itemize}
1.215 -
1.216 -New protocol \code{Foo} must:
1.217 +How to implement a new protocol \code{Foo}:
1.218 \begin{itemize}
1.219 \item Create \code{FooSocketFactory}, a subclass of \code{SocketFactory}
1.220 \item Aggregate \code{FooSocketFactory} to a \code{Node} during
1.221 topology construction (for UDP, done by InternetStackHelper::Install)
1.222 -\item Create \code{FooSocket}, a subclass of \code{Socket} from
1.223 -\code{FooSocketFactory::CreateSocket}
1.224 +\item From \code{FooSocketFactory::CreateSocket}, create instances of type
1.225 +\code{FooSocket}, a subclass of \code{Socket}
1.226 \end{itemize}
1.227 \end{frame}
1.228
1.229 -\begin{frame}{Magic COW Packets}
1.230 +\begin{frame}[allowframebreaks]{Note: Magic COW Packets}
1.231 ns-3 packets contain a lot of information:
1.232 \begin{itemize}
1.233 \item Buffer: a byte buffer which contains payload,
1.234 @@ -301,9 +339,9 @@
1.235 \item Payload is zero-filled and never allocated by default: only headers
1.236 and trailers use memory
1.237 \end{itemize}
1.238 -\end{frame}
1.239
1.240 -\begin{frame}{Magic COW Packets}
1.241 +\break
1.242 +
1.243 \begin{columns}[T]
1.244 \begin{column}{0.7\textwidth}
1.245 \includegraphics[width=8cm]{buffer}
1.246 @@ -314,51 +352,400 @@
1.247 \end{columns}
1.248 \end{frame}
1.249
1.250 -\begin{frame}{The first packet reaches the UDP layer}
1.251 +\begin{frame}[fragile,allowframebreaks]{UDP Transmission}
1.252
1.253 -Through a Socket... and reaches the UDP layer.
1.254 +\code{UdpSocketImpl::Send} eventually calls
1.255 +\code{UdpSocketImpl::DoSendTo} which calls
1.256 +\code{UdpL4Protocol::Send}:
1.257 +\begin{block}{}
1.258 +\begin{verbatim}
1.259 +UdpHeader udpHeader;
1.260 +...
1.261 +udpHeader.SetDestinationPort (dport);
1.262 +udpHeader.SetSourcePort (sport);
1.263 +packet->AddHeader (udpHeader);
1.264 +Ptr<Ipv4L3Protocol> ipv4 =
1.265 + m_node->GetObject<Ipv4L3Protocol> ();
1.266 +ipv4->Send (packet, saddr, daddr, PROT_NUMBER);
1.267 +\end{verbatim}
1.268 +\end{block}
1.269 \end{frame}
1.270
1.271 -\begin{frame}{How the first (UDP) header is added}
1.272 +\begin{frame}[fragile,allowframebreaks]{IPv4 Transmission}
1.273 +
1.274 +\code{Ipv4L3Protocol::Send}:
1.275 +\begin{block}{}
1.276 +\begin{verbatim}
1.277 +Ipv4Header ipHeader;
1.278 +...
1.279 +ipHeader.SetSource (source);
1.280 +ipHeader.SetDestination (destination);
1.281 +ipHeader.SetProtocol (protocol);
1.282 +ipHeader.SetPayloadSize (packet->GetSize ());
1.283 +...
1.284 +ipHeader.SetTtl (...);
1.285 +...
1.286 +Lookup (ipHeader, packet,
1.287 + MakeCallback (&Ipv4L3Protocol::SendRealOut, this));
1.288 +\end{verbatim}
1.289 +\end{block}
1.290 +
1.291 +\break
1.292 +
1.293 +\code{Ipv4L3Protocol::Lookup} searches a protocol which has an outgoing
1.294 +route for the packet and calls \code{Ipv4L3Protocol::SendRealOut}:
1.295 +\begin{block}{}
1.296 +\begin{verbatim}
1.297 +packet->AddHeader (ipHeader);
1.298 +Ptr<Ipv4Interface> outInterface =
1.299 + GetInterface (route.GetInterface ());
1.300 +outInterface->Send (packet, ipHeader.GetDestination ())
1.301 +\end{verbatim}
1.302 +\end{block}
1.303 +Down, in \code{ArpIpv4Interface}:
1.304 +\begin{block}{}
1.305 +\begin{verbatim}
1.306 +Ptr<ArpL3Protocol> arp = m_node->GetObject<ArpL3Protocol> ();
1.307 +Address hardwareDestination;
1.308 +arp->Lookup (p, dest, GetDevice (), m_cache, &hardwareDestination);
1.309 +GetDevice ()->Send (p, hardwareDestination,
1.310 + Ipv4L3Protocol::PROT_NUMBER);
1.311 +\end{verbatim}
1.312 +\end{block}
1.313 \end{frame}
1.314
1.315 -\begin{frame}{Reaching the IP layer, ip routing}
1.316 +\begin{frame}[fragile,allowframebreaks]{Note: How Do you Implement a new Header ?}
1.317 +
1.318 +The class declaration:
1.319 +\begin{block}{}
1.320 +\begin{verbatim}
1.321 +class MyHeader : public Header
1.322 +...
1.323 + void SetData (uint16_t data);
1.324 + uint16_t GetData (void) const;
1.325 +...
1.326 + static TypeId GetTypeId (void);
1.327 + virtual TypeId GetInstanceTypeId (void) const;
1.328 + virtual void Print (std::ostream &os) const;
1.329 + virtual void Serialize (Buffer::Iterator start) const;
1.330 + virtual uint32_t Deserialize (Buffer::Iterator start);
1.331 + virtual uint32_t GetSerializedSize (void) const;
1.332 +private:
1.333 + uint16_t m_data;
1.334 +\end{verbatim}
1.335 +\end{block}
1.336 +
1.337 +\break
1.338 +
1.339 +The implementation:
1.340 +\begin{block}{}
1.341 +\begin{verbatim}
1.342 +void
1.343 +MyHeader::Serialize (Buffer::Iterator start) const
1.344 +{
1.345 + start.WriteHtonU16 (m_data);
1.346 +}
1.347 +uint32_t
1.348 +MyHeader::Deserialize (Buffer::Iterator start)
1.349 +{
1.350 + m_data = start.ReadNtohU16 ();
1.351 + return 2;
1.352 +}
1.353 +\end{verbatim}
1.354 +\end{block}
1.355 +
1.356 +\break
1.357 +
1.358 +What really matters:
1.359 +\begin{itemize}
1.360 +\item Copy/Paste the code for \code{GetTypeId} and \code{GetInstanceTypeId}
1.361 +\item Make sure \code{GetSerializedSize} returns enough for \code{Serialize}
1.362 +\item Make sure \code{Hton} are balanced with \code{Ntoh}
1.363 +\item Remember that what is written in \code{Buffer::Iterator} must be faithful
1.364 +the the real network representation of the protocol header
1.365 +\end{itemize}
1.366 +
1.367 \end{frame}
1.368
1.369 -\begin{frame}{ARP cache}
1.370 +\begin{frame}{Arp}
1.371 +
1.372 +\code{ArpL3Protocol::Lookup}:
1.373 +\begin{itemize}
1.374 +\item Try to find a matching live entry
1.375 +\item If needed, send an ARP request on \code{NetDevice::Send}
1.376 +\item Wait for reply
1.377 +\end{itemize}
1.378 +\code{ArpL3Protocol::Receive}:
1.379 +\begin{itemize}
1.380 +\item If request for us, send reply
1.381 +\item If reply, check if request pending, update cache entry,
1.382 +flush packets from cache entry
1.383 +\end{itemize}
1.384 \end{frame}
1.385
1.386 -\begin{frame}{CsmaNetDevice delays, reception of first broadcast}
1.387 +\begin{frame}{CsmaNetDevice Transmission}
1.388 +
1.389 +\code{CsmaNetDevice::Send}:
1.390 +\begin{itemize}
1.391 +\item Add ethernet header and trailer
1.392 +\item Queue packet in tx queue
1.393 +\item Perform backoff if medium is busy
1.394 +\item When medium is idle, start transmission (delay is bytes*8/throughput)
1.395 +\item When transmission completes, request packet forwarding on medium
1.396 +\end{itemize}
1.397 +\code{CsmaChannel::TransmitEnd}:
1.398 +\begin{itemize}
1.399 +\item Apply propagation delay on transmission
1.400 +\item Distribute packet to all devices on the medium for reception
1.401 +\end{itemize}
1.402 +\code{CsmaNetDevice::Receive}:
1.403 +\begin{itemize}
1.404 +\item Remove ethernet header and trailer
1.405 +\item Filter unwanted packets
1.406 +\item Apply packet error model
1.407 +\item Call device \emph{receive} callback
1.408 +\end{itemize}
1.409 +
1.410 \end{frame}
1.411
1.412 -\begin{frame}{IP forwarding}
1.413 +\begin{frame}{Summary: From layer 2 to layer 3}
1.414 +
1.415 +During topology setup:
1.416 +\begin{itemize}
1.417 +\item Call \code{Node::RegisterProtocolHandler} to register
1.418 +a layer 3 protocol handler by its protocol number
1.419 +\item \code{Node::AddDevice} sets device \emph{receive} callback to
1.420 +\code{Node::NonPromiscReceiveFromDevice}
1.421 +\end{itemize}
1.422 +
1.423 +At runtime:
1.424 +\begin{itemize}
1.425 +\item Device calls \emph{receive} callback to send packet to layer 3
1.426 +\item \code{Node::NonPromiscReceiveFromDevice} searches matching
1.427 +protocol handlers by protocol number
1.428 +\end{itemize}
1.429 \end{frame}
1.430
1.431 -\begin{frame}{Wifi MAC high}
1.432 +\begin{frame}{IPv4 Reception}
1.433 +
1.434 +\code{Ipv4L3Protocol::Receive}:
1.435 +\begin{itemize}
1.436 +\item Remove IPv4 header, verify checksum
1.437 +\item Forward packet to matching raw IPv4 sockets
1.438 +\item If needed, forward packet down to outgoing interfaces
1.439 +\item If needed, forward packet up the stack to
1.440 +matching layer 4 protocol with \code{Ipv4L3Protocol::GetProtocol}
1.441 +\end{itemize}
1.442 +
1.443 \end{frame}
1.444
1.445 -\begin{frame}{Wifi DcaTxop}
1.446 +\begin{frame}[fragile]{Wifi Transmission}
1.447 +
1.448 +\code{WifiNetDevice::Send} is fairly simple:
1.449 +\begin{block}{}
1.450 +\begin{verbatim}
1.451 +LlcSnapHeader llc;
1.452 +llc.SetType (protocolNumber);
1.453 +packet->AddHeader (llc);
1.454 +m_txLogger (packet, realTo);
1.455 +m_mac->Enqueue (packet, realTo);
1.456 +\end{verbatim}
1.457 +\end{block}
1.458 +
1.459 +It's an AP so, in \code{NqapWifiMac::ForwardDown}:
1.460 +\begin{block}{}
1.461 +\begin{verbatim}
1.462 + WifiMacHeader hdr;
1.463 + hdr.SetAddr1 (to);
1.464 + hdr.SetAddr2 (GetAddress ());
1.465 + hdr.SetAddr3 (from);
1.466 +...
1.467 + m_dca->Queue (packet, hdr);
1.468 +\end{verbatim}
1.469 +\end{block}
1.470 +
1.471 \end{frame}
1.472
1.473 -\begin{frame}{Wifi Dcf}
1.474 +\begin{frame}{Wifi Transmission: \code{DcaTxop}}
1.475 +
1.476 +\code{DcaTxop::Queue}:
1.477 +\begin{itemize}
1.478 +\item Queue outgoing packet in \code{WifiMacQueue}
1.479 +\item Use DCF (\code{DcfManager} and \code{DcfState} to obtain a tx opportunity
1.480 +\end{itemize}
1.481 +
1.482 +
1.483 +When the tx opportunity happens, \code{DcaTxop::NotifyAccessGranted} is called:
1.484 +\begin{itemize}
1.485 +\item Dequeue packet
1.486 +\item Prepare the first fragment if needed
1.487 +\item Enable RTS if needed
1.488 +\item Call \code{MacLow::StartTransmission}
1.489 +\item Wait for notifications about transmission success or
1.490 +failure from \code{MacLow}
1.491 +\item Eventually, start retransmissions, send more fragments
1.492 +\end{itemize}
1.493 \end{frame}
1.494
1.495 -\begin{frame}{Wifi phy}
1.496 +\begin{frame}[fragile,allowframebreaks]{Wifi Transmission: \code{MacLow}}
1.497 +
1.498 +\begin{itemize}
1.499 +\item \code{MacLow::StartTransmission} starts a CtsTimeout
1.500 +or an AckTimeout timer and, then calls \code{WifiPhy::SendPacket}:
1.501 +\begin{block}{}
1.502 +\begin{verbatim}
1.503 +if (m_txParams.MustSendRts ())
1.504 + SendRtsForPacket ();
1.505 +else
1.506 + SendDataPacket ();
1.507 +\end{verbatim}
1.508 +\end{block}
1.509 +\item \code{MacLow::CtsTimeout} and \code{MacLow::NormalAckTimeout}
1.510 +notify upper layers
1.511 +\end{itemize}
1.512 +
1.513 \end{frame}
1.514
1.515 -\begin{frame}{Wifi MAC rx}
1.516 +\begin{frame}{Wifi layer 1}
1.517 +
1.518 +From the perspective of layer 2, it is a black box
1.519 +whose content is the topic of some presentations
1.520 +this afternoon !
1.521 +
1.522 \end{frame}
1.523
1.524 -\begin{frame}{IP up}
1.525 +\begin{frame}[fragile]{Wifi Reception: \code{MacLow}}
1.526 +\code{MacLow::ReceiveOk} handles incoming packets:
1.527 +\begin{block}{}
1.528 +\begin{verbatim}
1.529 +WifiMacHeader hdr;
1.530 +packet->RemoveHeader (hdr);
1.531 +if (hdr.IsRts ())
1.532 + ...
1.533 +else if (hdr.IsCts () &&
1.534 + ...
1.535 +else if (hdr.IsAck () &&
1.536 + ...
1.537 +else if (hdr.GetAddr1 () == m_self)
1.538 + ...
1.539 +else if (hdr.GetAddr1 ().IsGroup ())
1.540 + ...
1.541 +\end{verbatim}
1.542 +\end{block}
1.543 +And notifies upper layers with its \emph{receive} callback
1.544 \end{frame}
1.545
1.546 -\begin{frame}{UDP up}
1.547 +\begin{frame}[fragile]{Wifi Reception: Defragmentation, Duplicate Detection}
1.548 +
1.549 +\code{MacRxMiddle::Receive}:
1.550 +\begin{block}{}
1.551 +\begin{verbatim}
1.552 +if (IsDuplicate (hdr, originator))
1.553 + return;
1.554 +Ptr<Packet> agregate = HandleFragments (packet, hdr, originator);
1.555 +if (agregate == 0)
1.556 + return;
1.557 +m_callback (agregate, hdr);
1.558 +\end{verbatim}
1.559 +\end{block}
1.560 \end{frame}
1.561
1.562 -\begin{frame}{socket up}
1.563 +\begin{frame}[fragile]{Wifi Reception: \code{MacHigh}}
1.564 +
1.565 +\begin{itemize}
1.566 +\item \code{NqstaWifiMac::Receive}:
1.567 +\begin{block}{}
1.568 +\begin{verbatim}
1.569 +else if (hdr->IsData ())
1.570 + ...
1.571 +else if (hdr->IsProbeReq () ||
1.572 + hdr->IsAssocReq ())
1.573 + ...
1.574 +else if (hdr->IsBeacon ())
1.575 + ...
1.576 +else if (hdr->IsProbeResp ())
1.577 + ...
1.578 +else if (hdr->IsAssocResp ())
1.579 + ...
1.580 +\end{verbatim}
1.581 +\end{block}
1.582 +\item \code{WifiNetDevice::ForwardUp}: call the device \emph{receive} callback
1.583 +\end{itemize}
1.584 \end{frame}
1.585
1.586 -\begin{frame}{application sink}
1.587 +\begin{frame}{Summary: From Layer 3 to Layer 4}
1.588 +
1.589 +\begin{itemize}
1.590 +\item During topology setup, call \code{Ipv4L3Protocol::Insert}
1.591 +to register a layer 4 protocol with its protocol number
1.592 +\item At runtime:
1.593 +\begin{itemize}
1.594 +\item Call \code{Ipv4L3Protocol::GetProtocol}
1.595 +\item Call \code{Ipv4L4Protocol::Receive}
1.596 +\end{itemize}
1.597 +\end{itemize}
1.598 +\end{frame}
1.599 +
1.600 +\begin{frame}[fragile]{UDP Reception}
1.601 +
1.602 +\begin{block}{}
1.603 +\begin{verbatim}
1.604 +UdpHeader udpHeader;
1.605 +packet->RemoveHeader (udpHeader);
1.606 +Ipv4EndPointDemux::EndPoints endPoints =
1.607 + m_endPoints->Lookup (destination,
1.608 + udpHeader.GetDestinationPort (),
1.609 + source,
1.610 + udpHeader.GetSourcePort (), ...);
1.611 +for (endPoint = endPoints.begin ();
1.612 + endPoint != endPoints.end (); endPoint++)
1.613 + {
1.614 + (*endPoint)->ForwardUp (...);
1.615 + }
1.616 +\end{verbatim}
1.617 +\end{block}
1.618 +\code{Ipv4EndPoint::ForwardUp} calls into \code{UdpSocketImpl::ForwardUp}
1.619 +\end{frame}
1.620 +
1.621 +\begin{frame}[fragile,allowframebreaks]{Application Reception}
1.622 +
1.623 +\code{UdpSocketImpl::ForwardUp}
1.624 +\begin{block}{}
1.625 +\begin{verbatim}
1.626 +if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize) {
1.627 + m_deliveryQueue.push (packet);
1.628 + m_rxAvailable += packet->GetSize ();
1.629 + NotifyDataRecv ();
1.630 +}
1.631 +\end{verbatim}
1.632 +\end{block}
1.633 +
1.634 +\code{PacketSink::HandleRead}:
1.635 +\begin{block}{}
1.636 +\begin{verbatim}
1.637 +packet = socket->RecvFrom (from)
1.638 +\end{verbatim}
1.639 +\end{block}
1.640 +
1.641 +\break
1.642 +
1.643 +\code{UdpSocketImpl::Recv}
1.644 +\begin{block}{}
1.645 +\begin{verbatim}
1.646 +if (m_deliveryQueue.empty() )
1.647 + {
1.648 + m_errno = ERROR_AGAIN;
1.649 + return 0;
1.650 + }
1.651 +Ptr<Packet> p = m_deliveryQueue.front ();
1.652 +if (p->GetSize () <= maxSize)
1.653 + {
1.654 + m_deliveryQueue.pop ();
1.655 + m_rxAvailable -= p->GetSize ();
1.656 + }
1.657 +return p;
1.658 +\end{verbatim}
1.659 +\end{block}
1.660 \end{frame}
1.661
1.662 \end{document}