fix bug 161
authorCraig Dowell <craigdo@ee.washington.edu>
Sun, 11 May 2008 11:18:21 -0700
changeset 3012 56a4c75f9422
parent 3011 2d507430219e
child 3013 81949bbc6349
child 3111 006e834d436d
fix bug 161
examples/tcp-large-transfer.cc
src/common/pcap-writer.cc
src/common/pcap-writer.h
src/devices/point-to-point/point-to-point-net-device.cc
src/devices/point-to-point/ppp-header.cc
src/devices/point-to-point/ppp-header.h
src/devices/point-to-point/wscript
src/helper/point-to-point-helper.cc
--- 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));