add non-debugged udp stack

This commit is contained in:
Mathieu Lacage
2007-02-10 11:29:44 +01:00
parent ec6e1ff8bc
commit 96d809c983
11 changed files with 460 additions and 59 deletions

View File

@@ -25,6 +25,8 @@
#include "l3-demux.h"
#include "ipv4-l4-demux.h"
#include "internet-node.h"
#include "udp.h"
#include "ipv4.h"
namespace ns3 {
@@ -34,12 +36,12 @@ InternetNode::InternetNode()
m_netDevices = new NetDeviceList();
m_l3Demux = new L3Demux();
m_ipv4L4Demux = new Ipv4L4Demux();
// Configure the capabilities
// Insert an IPv4 protocol at layer 3
//m_l3Protocols->Insert(ns3::IPV4());
// L4 protocols (instances of TCP or UDP layer 4 objects)
// are inserted as created by process socket creations
// or bind calls.
// add an ipv4 protocol handler.
Ipv4 ipv4;
m_l3Demux->Insert (ipv4);
// add a udp protocol handler.
Udp udp = Udp (this);
m_ipv4L4Demux->Insert (udp);
}
InternetNode::InternetNode(const InternetNode& rhs)

View File

@@ -24,7 +24,7 @@
#include <stdint.h>
#include <list>
#include "ns3/ipv4-address.h"
#include "ipv4-address.h"
namespace ns3 {
@@ -45,6 +45,7 @@ public:
T *Allocate (void);
T *Allocate (Ipv4Address address);
T *Allocate (uint16_t port);
T *Allocate (Ipv4Address address, uint16_t port);
T *Allocate (Ipv4Address localAddress,
uint16_t localPort,
@@ -54,7 +55,7 @@ public:
private:
uint16_t AllocateEphemeralPort (void);
typedef std::list<T *> EndPoints;
typedef std::list<T *>::iterator EndPointsI;
typedef typename std::list<T *>::iterator EndPointsI;
uint16_t m_ephemeral;
EndPoints m_endPoints;
@@ -125,12 +126,17 @@ Ipv4EndPointDemux<T>::Allocate (Ipv4Address address)
return 0;
}
T *endPoint = new T (address, port);
endPoint->SetDestroyCallback (MakeCallback (&Ipv4EndPointDemux::DestroyEndPoint, this));
m_endPoints.push_back (endPoint);
return endPoint;
}
template <typename T>
T *
Ipv4EndPointDemux<T>::Allocate (uint16_t port)
{
return Allocate (Ipv4Address::GetAny (), port);
}
template <typename T>
T *
Ipv4EndPointDemux<T>::Allocate (Ipv4Address address, uint16_t port)
{
if (LookupLocal (address, port))
@@ -138,7 +144,6 @@ Ipv4EndPointDemux<T>::Allocate (Ipv4Address address, uint16_t port)
return 0;
}
T *endPoint = new T (address, port);
endPoint->SetDestroyCallback (MakeCallback (&Ipv4EndPointDemux::DestroyEndPoint, this));
m_endPoints.push_back (endPoint);
return endPoint;
}
@@ -161,7 +166,6 @@ Ipv4EndPointDemux<T>::Allocate (Ipv4Address localAddress, uint16_t localPort,
}
T *endPoint = new T (localAddress, localPort);
endPoint->SetPeer (peerAddress, peerPort);
endPoint->SetDestroyCallback (MakeCallback (&Ipv4EndPointDemux::DestroyEndPoint, this));
m_endPoints.push_back (endPoint);
return endPoint;
}

View File

@@ -0,0 +1,48 @@
// -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*-
//
// Copyright (c) 2006 Georgia Tech Research Corporation
// All rights reserved.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as
// published by the Free Software Foundation;
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// Author: George F. Riley<riley@ece.gatech.edu>
//
// NS3 - Layer 4 Protocol base class
// George F. Riley, Georgia Tech, Spring 2007
#include "ipv4-l4-protocol.h"
namespace ns3 {
Ipv4L4Protocol::Ipv4L4Protocol(int protocolNumber, int version)
: m_protocolNumber (protocolNumber),
m_version (version)
{}
Ipv4L4Protocol::~Ipv4L4Protocol ()
{}
int
Ipv4L4Protocol::GetProtocolNumber (void) const
{
return m_protocolNumber;
}
int
Ipv4L4Protocol::GetVersion() const
{
return m_version;
}
}//namespace ns3

View File

@@ -34,7 +34,7 @@ class Ipv4Address;
class Ipv4L4Protocol {
public:
Ipv4L4Protocol(int protocolNumber, int version, int layer);
Ipv4L4Protocol(int protocolNumber, int version);
virtual ~Ipv4L4Protocol ();
int GetProtocolNumber (void) const;

View File

@@ -21,13 +21,13 @@
#include "ns3/packet.h"
#include "ipv4-l3-protocol.h"
#include "ipv4.h"
#include "ipv4-l4-protocol.h"
#include "ipv4-address.h"
#include "ipv4-header.h"
#include "ipv4-interface.h"
#include "ipv4-route.h"
// the two following headers are needed for Ipv4L3Protocol::ForwardUp
// the two following headers are needed for Ipv4::ForwardUp
#include "node.h"
#include "ipv4-l4-demux.h"
@@ -35,14 +35,14 @@
namespace ns3 {
Ipv4L3Protocol::Ipv4L3Protocol()
Ipv4::Ipv4()
: L3Protocol (0x0800, 4),
m_nInterfaces (0),
m_defaultTtl (64),
m_identification (0),
m_defaultRoute (0)
{}
Ipv4L3Protocol::Ipv4L3Protocol(Ipv4L3Protocol const &o)
Ipv4::Ipv4(Ipv4 const &o)
: L3Protocol (o),
m_nInterfaces (0),
m_defaultTtl (o.m_defaultTtl),
@@ -52,7 +52,7 @@ Ipv4L3Protocol::Ipv4L3Protocol(Ipv4L3Protocol const &o)
// We do not copy the list of interfaces or the routes
// purposedly.
}
Ipv4L3Protocol::~Ipv4L3Protocol ()
Ipv4::~Ipv4 ()
{
// XXX I am not sure we are really allowed to do this here.
for (Ipv4InterfaceList::iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++)
@@ -75,14 +75,14 @@ Ipv4L3Protocol::~Ipv4L3Protocol ()
}
void
Ipv4L3Protocol::SetDefaultTtl (uint8_t ttl)
Ipv4::SetDefaultTtl (uint8_t ttl)
{
m_defaultTtl = ttl;
}
void
Ipv4L3Protocol::AddHostRouteTo (Ipv4Address dest,
Ipv4::AddHostRouteTo (Ipv4Address dest,
Ipv4Address nextHop,
uint32_t interface)
{
@@ -91,7 +91,7 @@ Ipv4L3Protocol::AddHostRouteTo (Ipv4Address dest,
m_hostRoutes.push_back (route);
}
void
Ipv4L3Protocol::AddHostRouteTo (Ipv4Address dest,
Ipv4::AddHostRouteTo (Ipv4Address dest,
uint32_t interface)
{
Ipv4Route *route = new Ipv4Route ();
@@ -99,7 +99,7 @@ Ipv4L3Protocol::AddHostRouteTo (Ipv4Address dest,
m_hostRoutes.push_back (route);
}
void
Ipv4L3Protocol::AddNetworkRouteTo (Ipv4Address network,
Ipv4::AddNetworkRouteTo (Ipv4Address network,
Ipv4Mask networkMask,
Ipv4Address nextHop,
uint32_t interface)
@@ -112,7 +112,7 @@ Ipv4L3Protocol::AddNetworkRouteTo (Ipv4Address network,
m_networkRoutes.push_back (route);
}
void
Ipv4L3Protocol::AddNetworkRouteTo (Ipv4Address network,
Ipv4::AddNetworkRouteTo (Ipv4Address network,
Ipv4Mask networkMask,
uint32_t interface)
{
@@ -123,7 +123,7 @@ Ipv4L3Protocol::AddNetworkRouteTo (Ipv4Address network,
m_networkRoutes.push_back (route);
}
void
Ipv4L3Protocol::SetDefaultRoute (Ipv4Address nextHop,
Ipv4::SetDefaultRoute (Ipv4Address nextHop,
uint32_t interface)
{
Ipv4Route *route = new Ipv4Route ();
@@ -133,7 +133,7 @@ Ipv4L3Protocol::SetDefaultRoute (Ipv4Address nextHop,
}
Ipv4Route *
Ipv4L3Protocol::Lookup (Ipv4Address dest)
Ipv4::Lookup (Ipv4Address dest)
{
for (HostRoutesCI i = m_hostRoutes.begin ();
i != m_hostRoutes.end ();
@@ -166,7 +166,7 @@ Ipv4L3Protocol::Lookup (Ipv4Address dest)
}
uint32_t
Ipv4L3Protocol::GetNRoutes (void)
Ipv4::GetNRoutes (void)
{
uint32_t n = 0;
if (m_defaultRoute != 0)
@@ -178,7 +178,7 @@ Ipv4L3Protocol::GetNRoutes (void)
return n;
}
Ipv4Route *
Ipv4L3Protocol::GetRoute (uint32_t index)
Ipv4::GetRoute (uint32_t index)
{
if (index == 0 && m_defaultRoute != 0)
{
@@ -216,7 +216,7 @@ Ipv4L3Protocol::GetRoute (uint32_t index)
return 0;
}
void
Ipv4L3Protocol::RemoveRoute (uint32_t index)
Ipv4::RemoveRoute (uint32_t index)
{
if (index == 0 && m_defaultRoute != 0)
{
@@ -259,7 +259,7 @@ Ipv4L3Protocol::RemoveRoute (uint32_t index)
uint32_t
Ipv4L3Protocol::AddInterface (Ipv4Interface *interface)
Ipv4::AddInterface (Ipv4Interface *interface)
{
uint32_t index = m_nInterfaces;
m_interfaces.push_back (interface);
@@ -267,7 +267,7 @@ Ipv4L3Protocol::AddInterface (Ipv4Interface *interface)
return index;
}
Ipv4Interface *
Ipv4L3Protocol::GetInterface (uint32_t index)
Ipv4::GetInterface (uint32_t index)
{
uint32_t tmp = 0;
for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin (); i != m_interfaces.end (); i++)
@@ -281,20 +281,20 @@ Ipv4L3Protocol::GetInterface (uint32_t index)
return 0;
}
uint32_t
Ipv4L3Protocol::GetNInterfaces (void) const
Ipv4::GetNInterfaces (void) const
{
return m_nInterfaces;
}
Ipv4L3Protocol*
Ipv4L3Protocol::Copy() const
Ipv4*
Ipv4::Copy() const
{
return new Ipv4L3Protocol (*this);
return new Ipv4 (*this);
}
void
Ipv4L3Protocol::Receive(Packet& packet, NetDevice &device)
Ipv4::Receive(Packet& packet, NetDevice &device)
{
// XXX trace here.
Ipv4Header ipHeader;
@@ -315,7 +315,7 @@ Ipv4L3Protocol::Receive(Packet& packet, NetDevice &device)
}
void
Ipv4L3Protocol::Send (Packet const &packet,
Ipv4::Send (Packet const &packet,
Ipv4Address source,
Ipv4Address destination,
uint8_t protocol)
@@ -351,7 +351,7 @@ Ipv4L3Protocol::Send (Packet const &packet,
}
void
Ipv4L3Protocol::SendRealOut (Packet const &p, Ipv4Header const &ip, Ipv4Route const &route)
Ipv4::SendRealOut (Packet const &p, Ipv4Header const &ip, Ipv4Route const &route)
{
Packet packet = p;
packet.Add (ip);
@@ -370,7 +370,7 @@ Ipv4L3Protocol::SendRealOut (Packet const &p, Ipv4Header const &ip, Ipv4Route co
bool
Ipv4L3Protocol::Forwarding (Packet const &packet, Ipv4Header &ipHeader, NetDevice &device)
Ipv4::Forwarding (Packet const &packet, Ipv4Header &ipHeader, NetDevice &device)
{
for (Ipv4InterfaceList::const_iterator i = m_interfaces.begin ();
i != m_interfaces.end (); i++)
@@ -428,7 +428,7 @@ Ipv4L3Protocol::Forwarding (Packet const &packet, Ipv4Header &ipHeader, NetDevic
void
Ipv4L3Protocol::ForwardUp (Packet p, Ipv4Header const&ip)
Ipv4::ForwardUp (Packet p, Ipv4Header const&ip)
{
Ipv4L4Protocol *protocol = m_node->GetIpv4L4Demux ()->Lookup (ip.GetProtocol ());
protocol->Receive (p, ip.GetSource (), ip.GetDestination ());

View File

@@ -19,8 +19,8 @@
// Author: George F. Riley<riley@ece.gatech.edu>
//
#ifndef IPV4_L3_PROTOCOL_H
#define IPV4_L3_PROTOCOL_H
#ifndef IPV4_H
#define IPV4_H
#include <list>
#include <stdint.h>
@@ -41,11 +41,11 @@ class Node;
/**
* ::Send is always defined in subclasses.
*/
class Ipv4L3Protocol : public L3Protocol {
class Ipv4 : public L3Protocol {
public:
Ipv4L3Protocol();
Ipv4L3Protocol(Ipv4L3Protocol const &o);
virtual ~Ipv4L3Protocol ();
Ipv4();
Ipv4(Ipv4 const &o);
virtual ~Ipv4 ();
void SetDefaultTtl (uint8_t ttl);
@@ -89,7 +89,7 @@ public:
uint32_t GetNInterfaces (void) const;
virtual Ipv4L3Protocol* Copy() const;
virtual Ipv4* Copy() const;
/**
* Lower layer calls this method after calling L3Demux::Lookup
* The ARP subclass needs to know from which NetDevice this

172
src/node/udp-socket.cc Normal file
View File

@@ -0,0 +1,172 @@
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2007 INRIA
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
#include "udp-socket.h"
#include "udp.h"
#include "udp-end-point.h"
#include "node.h"
#include "ipv4-l4-demux.h"
namespace ns3 {
UdpSocket::UdpSocket (Node *node)
: m_endPoint (0),
m_node (node)
{
assert (GetUdp () != 0);
}
UdpSocket::~UdpSocket ()
{
delete m_endPoint;
}
int
UdpSocket::Bind (void)
{
m_endPoint = GetUdp ()->Allocate ();
if (m_endPoint == 0)
{
return -1;
}
m_endPoint->SetSocket (this);
return 0;
}
int
UdpSocket::Bind (Ipv4Address address)
{
m_endPoint = GetUdp ()->Allocate (address);
if (m_endPoint == 0)
{
return -1;
}
m_endPoint->SetSocket (this);
return 0;
}
int
UdpSocket::Bind (uint16_t port)
{
m_endPoint = GetUdp ()->Allocate (port);
if (m_endPoint == 0)
{
return -1;
}
m_endPoint->SetSocket (this);
return 0;
}
int
UdpSocket::Bind (Ipv4Address address, uint16_t port)
{
m_endPoint = GetUdp ()->Allocate (address, port);
if (m_endPoint == 0)
{
return -1;
}
m_endPoint->SetSocket (this);
return 0;
}
void
UdpSocket::SetDefaultDestination (Ipv4Address daddr, uint16_t dport)
{
m_defaultAddress = daddr;
m_defaultPort = dport;
}
void
UdpSocket::SendDummy (uint32_t size)
{
SendDummyTo (size, m_defaultAddress, m_defaultPort);
}
void
UdpSocket::SendDummyTo (uint32_t size, Ipv4Address daddr, uint16_t dport)
{
if (m_endPoint == 0)
{
Bind ();
if (m_endPoint == 0)
{
return;
}
}
Packet p = Packet (size);
GetUdp ()->Send (p, m_endPoint->GetLocalAddress (), daddr,
m_endPoint->GetLocalPort (), dport);
}
void
UdpSocket::Send (uint8_t const*buffer, uint32_t size)
{
SendTo (buffer, size, m_defaultAddress, m_defaultPort);
}
void
UdpSocket::SendTo (uint8_t const*buffer, uint32_t size,
Ipv4Address daddr, uint16_t dport)
{
if (m_endPoint == 0)
{
Bind ();
if (m_endPoint == 0)
{
return;
}
}
Packet p = Packet (buffer, size);
GetUdp ()->Send (p, m_endPoint->GetLocalAddress (), daddr,
m_endPoint->GetLocalPort (), dport);
}
void
UdpSocket::SetDummyRxCallback (Callback<void,UdpSocket*,
uint32_t,
Ipv4Address,uint16_t> cb)
{
m_dummyRxCallback = cb;
}
void
UdpSocket::SetRxCallback (Callback<void,UdpSocket*,
uint8_t const*,uint32_t,
Ipv4Address,uint16_t> cb)
{
m_rxCallback = cb;
}
void
UdpSocket::ForwardUp (Packet &p, Ipv4Address saddr, uint16_t sport)
{
if (!m_dummyRxCallback.IsNull ())
{
m_dummyRxCallback (this, p.GetSize (), saddr, sport);
}
if (!m_rxCallback.IsNull ())
{
m_rxCallback (this, p.PeekData (), p.GetSize (), saddr, sport);
}
}
Udp *
UdpSocket::GetUdp (void) const
{
if (m_node->GetIpv4L4Demux () != 0)
{
// udp protocol number
return static_cast<Udp *> (m_node->GetIpv4L4Demux ()->Lookup (17));
}
return 0;
}
}//namespace ns3

134
src/node/udp-socket.h Normal file
View File

@@ -0,0 +1,134 @@
/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
* Copyright (c) 2007 INRIA
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
*/
#ifndef UDP_SOCKET_H
#define UDP_SOCKET_H
#include <stdint.h>
#include "ns3/callback.h"
#include "ipv4-address.h"
namespace ns3 {
class UdpEndPoint;
class Node;
class Packet;
class Udp;
/**
* Before any data is sent, the socket must be bound with
* one of the Bind methods.
* If none of these Bind methods are called prior to
* one of the ::Send methods, the socket is implicitely
* bound to a random port and to all interfaces.
*/
class UdpSocket
{
public:
/**
* Create an unbound udp socket.
*/
UdpSocket (Node *node);
~UdpSocket ();
/**
* Allocate a free port number and
* bind this socket to this port number on all
* interfaces of this system.
*
* return 0 on success, -1 on failure.
*/
int Bind (void);
/**
* Allocate a free port number and
* bind this socket to this port number on the
* specified interface.
*
* return 0 on success, -1 on failure.
*/
int Bind (Ipv4Address address);
/**
* Bind this socket to this port number
* on all interfaces of this system.
*
* return 0 on success, -1 on failure.
*/
int Bind (uint16_t port);
/**
* Bind this socket to this port number
* on the interface specified by address.
*
* return 0 on success, -1 on failure.
*/
int Bind (Ipv4Address address, uint16_t port);
/**
* Set the default destination address and port
* number for all packets outgoing from this socket.
*/
void SetDefaultDestination (Ipv4Address daddr, uint16_t dport);
/**
* Send dummy data to default destination
*/
void SendDummy (uint32_t size);
/**
* Send dummy data to specified destination
*/
void SendDummyTo (uint32_t size, Ipv4Address daddr, uint16_t dport);
void Send (uint8_t const*buffer, uint32_t size);
void SendTo (uint8_t const*buffer, uint32_t size,
Ipv4Address daddr, uint16_t dport);
/**
* When a packet is received by this socket, it invokes the "dummy callback" which
* forwards to the application the number of bytes received and from who they
* were received.
*/
void SetDummyRxCallback (Callback<void,UdpSocket*,uint32_t,Ipv4Address,uint16_t> cb);
/**
* When a packet is received by this socket, it invokes the "normal callback" which
* forwards to the application the buffer of bytes received and from who they
* were received. The application is responsible for copying that buffer if it wants
* to keep track of it.
*/
void SetRxCallback (Callback<void,UdpSocket*,uint8_t const*,uint32_t,Ipv4Address,uint16_t> cb);
private:
friend class Udp;
// invoked by Udp class
void ForwardUp (Packet &p, Ipv4Address saddr, uint16_t sport);
Udp *GetUdp (void) const;
UdpEndPoint *m_endPoint;
Node *m_node;
Ipv4Address m_defaultAddress;
uint16_t m_defaultPort;
Callback<void,UdpSocket*,uint32_t,Ipv4Address,uint16_t> m_dummyRxCallback;
Callback<void,UdpSocket*,uint8_t const*,uint32_t,Ipv4Address,uint16_t> m_rxCallback;
};
}//namespace ns3
#endif /* UDP_SOCKET_H */

View File

@@ -25,15 +25,27 @@
#include "udp-header.h"
#include "ipv4-end-point-demux.h"
#include "udp-end-point.h"
#include "udp-socket.h"
#include "node.h"
#include "ipv4.h"
#include "l3-demux.h"
namespace ns3 {
/* see http://www.iana.org/assignments/protocol-numbers */
const uint8_t Udp::UDP_PROTOCOL = 17;
Udp::Udp ()
Udp::Udp (Node *node)
: Ipv4L4Protocol (UDP_PROTOCOL, 2),
m_node (node),
m_endPoints (new Ipv4EndPointDemux<UdpEndPoint> ())
{}
Udp::Udp (Udp const &o)
: Ipv4L4Protocol (UDP_PROTOCOL, 2),
m_node (o.m_node),
m_endPoints (new Ipv4EndPointDemux<UdpEndPoint> ())
{
m_endPoints = new Ipv4EndPoints ();
// we do not copy the udp endpoints on purpose.
}
Udp::~Udp ()
@@ -52,6 +64,11 @@ Udp::Allocate (Ipv4Address address)
return m_endPoints->Allocate (address);
}
UdpEndPoint *
Udp::Allocate (uint16_t port)
{
return m_endPoints->Allocate (port);
}
UdpEndPoint *
Udp::Allocate (Ipv4Address address, uint16_t port)
{
return m_endPoints->Allocate (address, port);
@@ -64,12 +81,17 @@ Udp::Allocate (Ipv4Address localAddress, uint16_t localPort,
peerAddress, peerPort);
}
Udp*
Udp::Copy() const
{
return new Udp (*this);
}
void
Udp::Receive(Packet& p,
Udp::Receive(Packet& packet,
Ipv4Address const &source,
Ipv4Address const &destination)
{
m_recvLogger (packet);
UdpHeader udpHeader;
packet.Peek (udpHeader);
packet.Remove (udpHeader);
@@ -79,7 +101,8 @@ Udp::Receive(Packet& p,
{
return;
}
UdpSocket *socket = endPoint->GetSocket (packet, &udpHeader);
UdpSocket *socket = endPoint->GetSocket ();
socket->ForwardUp (packet, source, udpHeader.GetSource ());
assert (socket != 0);
}
@@ -98,9 +121,15 @@ Udp::Send (Packet packet,
packet.Add (udpHeader);
//XXX
// Send to ipv4 layer.
ip.Send (p, saddr, daddr, UDP_PROTOCOL);
if (m_node->GetL3Demux () != 0 )
{
Ipv4 *ipv4 = static_cast<Ipv4 *> (m_node->GetL3Demux ()->Lookup (0x0800));
if (ipv4 != 0)
{
ipv4->Send (packet, saddr, daddr, UDP_PROTOCOL);
}
}
}

View File

@@ -24,34 +24,41 @@
#include <stdint.h>
#include "ns3/ipv4-address.h"
#include "ns3/packet.h"
#include "ipv4-address.h"
#include "ipv4-l4-protocol.h"
#include "ipv4-end-point-demux.h"
#include "udp-end-point.h"
namespace ns3 {
class Node;
class Udp : public Ipv4L4Protocol {
public:
Udp ();
Udp (Node *node);
Udp (Udp const &o);
virtual ~Udp ();
UdpEndPoint *Allocate (void);
UdpEndPoint *Allocate (Ipv4Address address);
UdpEndPoint *Allocate (uint16_t port);
UdpEndPoint *Allocate (Ipv4Address address, uint16_t port);
UdpEndPoint *Allocate (Ipv4Address localAddress, uint16_t localPort,
Ipv4Address peerAddress, uint16_t peerPort);
void Send (Packet packet);
// called by UdpSocket.
void Send (Packet packet,
Ipv4Address saddr, Ipv4Address daddr,
uint16_t sport, uint16_t dport);
// inherited from Ipv4L4Protocol
virtual Ipv4L4Protocol* Copy() const;
virtual Udp* Copy() const;
virtual void Receive(Packet& p,
Ipv4Address const &source,
Ipv4Address const &destination);
private:
static const uint8_t UDP_PROTOCOL;
//Ipv4 *m_ipv4;
Node *m_node;
Ipv4EndPointDemux<UdpEndPoint> *m_endPoints;
};