--- a/examples/tcp-large-transfer.cc Thu May 08 13:26:49 2008 -0700
+++ b/examples/tcp-large-transfer.cc Sun May 11 11:18:21 2008 -0700
@@ -190,7 +190,7 @@
ascii.open ("tcp-large-transfer.tr");
PointToPointHelper::EnableAsciiAll (ascii);
- InternetStackHelper::EnablePcapAll ("tcp-large-transfer");
+ PointToPointHelper::EnablePcapAll ("tcp-large-transfer");
Simulator::StopAt (Seconds(1000));
Simulator::Run ();
--- a/src/common/pcap-writer.cc Thu May 08 13:26:49 2008 -0700
+++ b/src/common/pcap-writer.cc Sun May 11 11:18:21 2008 -0700
@@ -34,6 +34,7 @@
enum {
PCAP_ETHERNET = 1,
+ PCAP_PPP = 9,
PCAP_RAW_IP = 101,
PCAP_80211 = 105,
};
@@ -42,6 +43,7 @@
{
m_writer = 0;
}
+
PcapWriter::~PcapWriter ()
{
delete m_writer;
@@ -73,6 +75,12 @@
}
void
+PcapWriter::WritePppHeader (void)
+{
+ WriteHeader (PCAP_PPP);
+}
+
+void
PcapWriter::WriteHeader (uint32_t network)
{
Write32 (0xa1b2c3d4);
@@ -84,9 +92,6 @@
Write32 (network);
}
-
-
-
void
PcapWriter::WritePacket (Ptr<const Packet> packet)
{
@@ -108,6 +113,7 @@
{
m_writer->write ((char const *)buffer, size);
}
+
void
PcapWriter::Write32 (uint32_t data)
{
@@ -118,6 +124,7 @@
buffer[3] = (data >> 24) & 0xff;
WriteData (buffer, 4);
}
+
void
PcapWriter::Write16 (uint16_t data)
{
--- a/src/common/pcap-writer.h Thu May 08 13:26:49 2008 -0700
+++ b/src/common/pcap-writer.h Sun May 11 11:18:21 2008 -0700
@@ -60,6 +60,8 @@
void WriteWifiHeader (void);
+ void WritePppHeader (void);
+
/**
* \param packet packet to write to output file
*/
--- a/src/devices/point-to-point/point-to-point-net-device.cc Thu May 08 13:26:49 2008 -0700
+++ b/src/devices/point-to-point/point-to-point-net-device.cc Sun May 11 11:18:21 2008 -0700
@@ -29,6 +29,7 @@
#include "ns3/pointer.h"
#include "point-to-point-net-device.h"
#include "point-to-point-channel.h"
+#include "ppp-header.h"
NS_LOG_COMPONENT_DEFINE ("PointToPointNetDevice");
@@ -96,20 +97,19 @@
PointToPointNetDevice::AddHeader(Ptr<Packet> p, uint16_t protocolNumber)
{
NS_LOG_FUNCTION_NOARGS ();
- LlcSnapHeader llc;
- llc.SetType (protocolNumber);
- p->AddHeader (llc);
+ NS_ASSERT_MSG (protocolNumber == 0x800,
+ "PointToPointNetDevice::AddHeader(): protocolNumber must be 0x800");
+ PppHeader ppp;
+ p->AddHeader (ppp);
}
bool
PointToPointNetDevice::ProcessHeader(Ptr<Packet> p, uint16_t& param)
{
NS_LOG_FUNCTION_NOARGS ();
- LlcSnapHeader llc;
- p->RemoveHeader (llc);
-
- param = llc.GetType ();
-
+ PppHeader ppp;
+ p->RemoveHeader (ppp);
+ param = 0x800;
return true;
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/point-to-point/ppp-header.cc Sun May 11 11:18:21 2008 -0700
@@ -0,0 +1,82 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 University of Washington
+ *
+ * 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
+ */
+
+#include <iostream>
+#include "ns3/assert.h"
+#include "ns3/log.h"
+#include "ns3/header.h"
+#include "ppp-header.h"
+
+NS_LOG_COMPONENT_DEFINE ("PppHeader");
+
+namespace ns3 {
+
+NS_OBJECT_ENSURE_REGISTERED (PppHeader);
+
+PppHeader::PppHeader ()
+{
+}
+
+PppHeader::~PppHeader ()
+{
+}
+
+ TypeId
+PppHeader::GetTypeId (void)
+{
+ static TypeId tid = TypeId ("ns3::PppHeader")
+ .SetParent<Header> ()
+ .AddConstructor<PppHeader> ()
+ ;
+ return tid;
+}
+
+ TypeId
+PppHeader::GetInstanceTypeId (void) const
+{
+ return GetTypeId ();
+}
+
+void
+PppHeader::Print (std::ostream &os) const
+{
+ os << "Point-to-Point Protocol: IP (0x0021)" << std::endl;
+}
+
+ uint32_t
+PppHeader::GetSerializedSize (void) const
+{
+ return 2;
+}
+
+ void
+PppHeader::Serialize (Buffer::Iterator start) const
+{
+ start.WriteHtonU16 (0x0021);
+}
+
+ uint32_t
+PppHeader::Deserialize (Buffer::Iterator start)
+{
+ uint16_t __attribute__((unused))data = start.ReadNtohU16 ();
+ NS_ASSERT_MSG (data == 0x0021, "MyHeader::Deserialize(): "
+ "expected protocol 0x0021");
+ return 2;
+}
+
+} // namespace ns3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/point-to-point/ppp-header.h Sun May 11 11:18:21 2008 -0700
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 University of Washington
+ *
+ * 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
+ */
+
+#ifndef PPP_HEADER_H
+#define PPP_HEADER_H
+
+#include "ns3/header.h"
+
+namespace ns3 {
+
+/**
+ * \brief Packet header for PPP
+ *
+ * This class can be used to add a header to PPP packet. Currently we do not
+ * implement any of the state machine in RFC 1661, we just encapsulate the
+ * inbound packet as an IP version 4 type and send it on. The goal here is
+ * not really to implement the point-to-point protocol, but to encapsulate our
+ * packets in a known protocol so packet sniffers can parse them.
+ *
+ * if PPP is transmitted over a serial link, it will typically be framed in
+ * some way derivative of IBM SDLC (HDLC) with all that that entails.
+ * Thankfully, we don't have to deal with all of that -- we can use our own
+ * protocol for getting bits across the serial link which we call an ns3
+ * Packet. What we do have to worry about is being able to capture PPP frames
+ * which are understandable by Wireshark. All this means is that we need to
+ * teach the PcapWriter about the appropriate data link type (DLT_PPP = 9),
+ * and we need to add a PPP header to each packet. Since we are not using
+ * framed PPP, this just means prepending the sixteen bit PPP protocol number
+ * (0x0021) to the packet. The ns-3 way to do this is via a class that
+ * inherits from class Header.
+ */
+class PppHeader : public Header
+{
+public:
+
+ /**
+ * \brief Construct an IP version 4 PPP header.
+ */
+ PppHeader ();
+
+ /**
+ * \brief Destroy an IP version 4 PPP header.
+ */
+ virtual ~PppHeader ();
+
+ static TypeId GetTypeId (void);
+ virtual TypeId GetInstanceTypeId (void) const;
+ virtual void Print (std::ostream &os) const;
+ virtual void Serialize (Buffer::Iterator start) const;
+ virtual uint32_t Deserialize (Buffer::Iterator start);
+ virtual uint32_t GetSerializedSize (void) const;
+};
+
+}; // namespace ns3
+
+
+#endif /* PPP_HEADER_H */
--- a/src/devices/point-to-point/wscript Thu May 08 13:26:49 2008 -0700
+++ b/src/devices/point-to-point/wscript Sun May 11 11:18:21 2008 -0700
@@ -7,6 +7,7 @@
'point-to-point-net-device.cc',
'point-to-point-channel.cc',
'point-to-point-test.cc',
+ 'ppp-header.cc',
]
headers = bld.create_obj('ns3header')
headers.module = 'point-to-point'
--- a/src/helper/point-to-point-helper.cc Thu May 08 13:26:49 2008 -0700
+++ b/src/helper/point-to-point-helper.cc Sun May 11 11:18:21 2008 -0700
@@ -70,7 +70,7 @@
oss << filename << "-" << nodeid << "-" << deviceid << ".pcap";
Ptr<PcapWriter> pcap = Create<PcapWriter> ();
pcap->Open (oss.str ());
- pcap->WriteEthernetHeader ();
+ pcap->WritePppHeader ();
oss.str ("");
oss << "/NodeList/" << nodeid << "/DeviceList/" << deviceid << "/$ns3::PointToPointNetDevice/Rx";
Config::ConnectWithoutContext (oss.str (), MakeBoundCallback (&PointToPointHelper::RxEvent, pcap));