From d19bba7656f580b70fde8309dab55d1b1a79bbd4 Mon Sep 17 00:00:00 2001
From: cni <cni@wiback.org>
Date: Wed, 1 Jul 2009 09:38:41 +0000
Subject: [PATCH] Packets/DefaultBundle/MPSPacket: updated finalize method,
 enhanced unit test

---
 Packets/DefaultBundle/MPLSPacket.cc      |  4 ++++
 Packets/DefaultBundle/MPLSPacket.hh      | 10 ++++++----
 Packets/DefaultBundle/MPLSPacket.test.cc | 20 +++++++++++++++++---
 3 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/Packets/DefaultBundle/MPLSPacket.cc b/Packets/DefaultBundle/MPLSPacket.cc
index d191e5baf..543d70932 100644
--- a/Packets/DefaultBundle/MPLSPacket.cc
+++ b/Packets/DefaultBundle/MPLSPacket.cc
@@ -63,6 +63,10 @@ prefix_ senf::PacketInterpreterBase::factory_t senf::MPLSPacketType::nextPacketT
 
 prefix_ void senf::MPLSPacketType::finalize(packet p)
 {
+    if (p.prev(senf::nothrow).is<MPLSPacket>()) //not the last label on the MPLS stack
+        p->s_() << false;
+    else
+        p->s_() << true;
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////
diff --git a/Packets/DefaultBundle/MPLSPacket.hh b/Packets/DefaultBundle/MPLSPacket.hh
index 5413f3b35..9b1d2ab2a 100644
--- a/Packets/DefaultBundle/MPLSPacket.hh
+++ b/Packets/DefaultBundle/MPLSPacket.hh
@@ -49,10 +49,12 @@ namespace senf {
 
         SENF_PARSER_BITFIELD( label, 20, unsigned);
         SENF_PARSER_BITFIELD( tc, 3, unsigned);
-        SENF_PARSER_BITFIELD( s, 1, bool);
+        SENF_PARSER_BITFIELD_RO( s, 1, bool);
         SENF_PARSER_FIELD( ttl, UInt8Parser);
 
         SENF_PARSER_FINALIZE(MPLSPacketParser);
+
+        friend class MPLSPacketType;
     };
 
     /** \brief MPLS packet
@@ -62,7 +64,7 @@ namespace senf {
 
         \par Fields:
             \ref MPLSPacketParser
-          
+
 
         \ingroup protocolbundle_default
      */
@@ -82,7 +84,7 @@ namespace senf {
 
         static factory_t nextPacketType(packet p);
         /// Dump given MPLSPacket in readable form to given output stream
-        static void dump(packet p, std::ostream & os); 
+        static void dump(packet p, std::ostream & os);
         static void finalize(packet p);
     };
 
@@ -100,7 +102,7 @@ namespace senf {
 //#include "MPLSPacket.cti"
 #endif
 
-
+
 // Local Variables:
 // mode: c++
 // fill-column: 100
diff --git a/Packets/DefaultBundle/MPLSPacket.test.cc b/Packets/DefaultBundle/MPLSPacket.test.cc
index a5254f7ce..a81d35f56 100644
--- a/Packets/DefaultBundle/MPLSPacket.test.cc
+++ b/Packets/DefaultBundle/MPLSPacket.test.cc
@@ -28,6 +28,7 @@
 
 // Custom includes
 #include "MPLSPacket.hh"
+#include "EthernetPacket.hh"
 
 
 #include "../../Utils/auto_unit_test.hh"
@@ -72,13 +73,26 @@ BOOST_AUTO_UNIT_TEST(mplsPacket_parse_chain)
 
 BOOST_AUTO_UNIT_TEST(mplsPacket_create)
 {
-    senf::MPLSPacket p (senf::MPLSPacket::create());
+    senf::EthernetPacket eth (senf::EthernetPacket::create());
+    eth->source() = senf::MACAddress::from_string("01:02:03:04:05:06");
+    eth->destination() = senf::MACAddress::from_string("07:08:09:0a:0b:0c");
+
+    senf::MPLSPacket p (senf::MPLSPacket::createAfter(eth));
     p->label()=4444u;
     p->ttl()=10u;
-    p->s()=true;
     p->tc()=0x0u;
 
-    SENF_CHECK_NO_THROW(p.finalizeThis());
+    senf::MPLSPacket p2 (senf::MPLSPacket::createAfter(p));
+    p->label()=5555u;
+    p->ttl()=10u;
+    p->tc()=0x0u;
+
+    SENF_CHECK_NO_THROW(eth.finalizeAll());
+
+    BOOST_REQUIRE( eth.next().is<senf::MPLSPacket>() );
+    BOOST_REQUIRE( p.next().is<senf::MPLSPacket>() );
+    BOOST_CHECK( p->s());
+    BOOST_CHECK( !p2->s());
 
 }
 
-- 
GitLab