finish first draft of crap
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Sat Feb 28 23:26:19 2009 +0100 (11 months ago)
changeset 117dc0ba86f063
parent 10 6a89ba28d9ea
child 12 86ca98abf53a
finish first draft of crap
wns3.tex
     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}