lp: add CongestionMark field and tag

refs #3797

Change-Id: I6ac6663c874abde1df2102af81fc03567ad87029
diff --git a/src/util/dummy-client-face.cpp b/src/util/dummy-client-face.cpp
index 43efff9..911d3bb 100644
--- a/src/util/dummy-client-face.cpp
+++ b/src/util/dummy-client-face.cpp
@@ -137,12 +137,18 @@
         if (lpPacket.has<lp::NextHopFaceIdField>()) {
           nack->setTag(make_shared<lp::NextHopFaceIdTag>(lpPacket.get<lp::NextHopFaceIdField>()));
         }
+        if (lpPacket.has<lp::CongestionMarkField>()) {
+          nack->setTag(make_shared<lp::CongestionMarkTag>(lpPacket.get<lp::CongestionMarkField>()));
+        }
         onSendNack(*nack);
       }
       else {
         if (lpPacket.has<lp::NextHopFaceIdField>()) {
           interest->setTag(make_shared<lp::NextHopFaceIdTag>(lpPacket.get<lp::NextHopFaceIdField>()));
         }
+        if (lpPacket.has<lp::CongestionMarkField>()) {
+          interest->setTag(make_shared<lp::CongestionMarkTag>(lpPacket.get<lp::CongestionMarkField>()));
+        }
         onSendInterest(*interest);
       }
     }
@@ -152,6 +158,9 @@
       if (lpPacket.has<lp::CachePolicyField>()) {
         data->setTag(make_shared<lp::CachePolicyTag>(lpPacket.get<lp::CachePolicyField>()));
       }
+      if (lpPacket.has<lp::CongestionMarkField>()) {
+        data->setTag(make_shared<lp::CongestionMarkTag>(lpPacket.get<lp::CongestionMarkField>()));
+      }
 
       onSendData(*data);
     }
@@ -208,23 +217,26 @@
   });
 }
 
+template<typename Packet, typename Field, typename Tag>
+static void
+addFieldFromTag(lp::Packet& lpPacket, const Packet& packet)
+{
+  shared_ptr<Tag> tag = static_cast<const TagHost&>(packet).getTag<Tag>();
+  if (tag != nullptr) {
+    lpPacket.add<Field>(*tag);
+  }
+}
+
 template<typename Packet>
 void
 DummyClientFace::receive(const Packet& packet)
 {
   lp::Packet lpPacket(packet.wireEncode());
 
-  shared_ptr<lp::IncomingFaceIdTag> incomingFaceIdTag =
-    static_cast<const TagHost&>(packet).getTag<lp::IncomingFaceIdTag>();
-  if (incomingFaceIdTag != nullptr) {
-    lpPacket.add<lp::IncomingFaceIdField>(*incomingFaceIdTag);
-  }
+  addFieldFromTag<Packet, lp::IncomingFaceIdField, lp::IncomingFaceIdTag>(lpPacket, packet);
+  addFieldFromTag<Packet, lp::NextHopFaceIdField, lp::NextHopFaceIdTag>(lpPacket, packet);
+  addFieldFromTag<Packet, lp::CongestionMarkField, lp::CongestionMarkTag>(lpPacket, packet);
 
-  shared_ptr<lp::NextHopFaceIdTag> nextHopFaceIdTag =
-    static_cast<const TagHost&>(packet).getTag<lp::NextHopFaceIdTag>();
-  if (nextHopFaceIdTag != nullptr) {
-    lpPacket.add<lp::NextHopFaceIdField>(*nextHopFaceIdTag);
-  }
   static_pointer_cast<Transport>(getTransport())->receive(lpPacket.wireEncode());
 }
 
@@ -243,10 +255,8 @@
   Block interest = nack.getInterest().wireEncode();
   lpPacket.add<lp::FragmentField>(make_pair(interest.begin(), interest.end()));
 
-  shared_ptr<lp::IncomingFaceIdTag> incomingFaceIdTag = nack.getTag<lp::IncomingFaceIdTag>();
-  if (incomingFaceIdTag != nullptr) {
-    lpPacket.add<lp::IncomingFaceIdField>(*incomingFaceIdTag);
-  }
+  addFieldFromTag<lp::Nack, lp::IncomingFaceIdField, lp::IncomingFaceIdTag>(lpPacket, nack);
+  addFieldFromTag<lp::Nack, lp::CongestionMarkField, lp::CongestionMarkTag>(lpPacket, nack);
 
   static_pointer_cast<Transport>(getTransport())->receive(lpPacket.wireEncode());
 }