corrected bug with pathlabel 05/10605/1
authormicpapal <[email protected]>
Fri, 16 Feb 2018 13:31:44 +0000 (05:31 -0800)
committermicpapal <[email protected]>
Fri, 16 Feb 2018 13:31:44 +0000 (05:31 -0800)
Change-Id: Iab04f89b71c905f7f2ad55576f18b00c13ae6b7f
Signed-off-by: micpapal <[email protected]>
metis/ccnx/forwarder/metis/core/metis_Connection.c
metis/ccnx/forwarder/metis/core/metis_Message.c
metis/ccnx/forwarder/metis/core/metis_Message.h
metis/ccnx/forwarder/metis/processor/metis_MessageProcessor.c
metis/ccnx/forwarder/metis/tlv/metis_TlvSkeleton.c
metis/ccnx/forwarder/metis/tlv/metis_TlvSkeleton.h

index c3f28e1..560c75b 100644 (file)
@@ -210,7 +210,13 @@ metisConnection_ReSend(const MetisConnection *conn, MetisMessage *message)
         //message has the same path label. However it could be a good idea to remove the path label
         //so that raaqm will discard this packet for the RTT estimation.
 
-        return metisIoOperations_Send(conn->ops, NULL, message);
+         //NEED here to recompute the path label (to avoid wrong path labeling, due to PIT aggregation)
+        uint8_t connectionId = (uint8_t) metisConnection_GetConnectionId(conn);
+        int old_label =  metisMessage_GetPathLabel(message); 
+        metisMessage_UpdatePathLabel(message, connectionId);
+        bool ret = metisIoOperations_Send(conn->ops, NULL, message);
+        metisMessage_SetPathLabel(message, (uint8_t)old_label);
+        return ret;
     }
     return false;
 }
index 7729547..aa20d9a 100644 (file)
@@ -694,6 +694,20 @@ metisMessage_ResetPathLabel(MetisMessage *message)
     assertNotNull(message, "Parameter must be non-null");
     metisTlvSkeleton_ResetPathLabel(&message->skeleton);
 }
+int
+metisMessage_GetPathLabel(MetisMessage *message)
+{
+    assertNotNull(message, "Parameter must be non-null");
+    return metisTlvSkeleton_GetPathLabelValue(&message->skeleton);
+}
+
+void
+metisMessage_SetPathLabel(MetisMessage *message, uint8_t pathLabel)
+{
+    assertNotNull(message, "Parameter must be non-null");
+    return metisTlvSkeleton_SetPathLabelValue(&message->skeleton, pathLabel);
+}
+
 
 MetisMessagePacketType
 metisMessage_GetType(const MetisMessage *message)
index 3b954a4..a609ac5 100644 (file)
@@ -236,6 +236,8 @@ MetisMessagePacketType  metisMessage_GetType(const MetisMessage *message);
 bool metisMessage_HasHopLimit(const MetisMessage *message);
 
 void metisMessage_UpdatePathLabel(MetisMessage *message, uint8_t outFace);
+void metisMessage_SetPathLabel(MetisMessage *message, uint8_t outFace);
+int metisMessage_GetPathLabel(MetisMessage *message);
 void metisMessage_ResetPathLabel(MetisMessage *message);
 
 /**
index 26e6776..0451f63 100644 (file)
@@ -734,11 +734,13 @@ metisMessageProcessor_ForwardToNexthops(MetisMessageProcessor *processor, MetisM
     size_t length = metisNumberSet_Length(nexthops);
 
     unsigned ingressId = metisMessage_GetIngressConnectionId(message);
+    int old_label =  metisMessage_GetPathLabel(message);
     for (size_t i = 0; i < length; i++) {
         unsigned egressId = metisNumberSet_GetItem(nexthops, i);
         if (egressId != ingressId) {
             forwardedCopies++;
             metisMessageProcessor_ForwardToInterfaceId(processor, message, egressId);
+            metisMessage_SetPathLabel(message, (uint8_t)old_label);
         }
     }
     return forwardedCopies;
index ce479ce..bc201dc 100644 (file)
@@ -280,6 +280,33 @@ metisTlvSkeleton_UpdateHopLimit(MetisTlvSkeleton *opaque, uint8_t hoplimit)
     return updated;
 }
 
+int
+metisTlvSkeleton_GetPathLabelValue(MetisTlvSkeleton *opaque)
+{
+    _InternalSkeleton *skeleton = (_InternalSkeleton *) opaque;
+    int label = -1;
+    if (!metisTlvExtent_Equals(&skeleton->array[INDEX_PATHLABEL], &metisTlvExtent_NotFound)) {
+        if (skeleton->array[INDEX_PATHLABEL].length == 1) {
+            uint8_t *value = skeleton->packet + skeleton->array[INDEX_PATHLABEL].offset;
+            label = *value;
+        }
+    }
+    return label;
+}
+
+void
+metisTlvSkeleton_SetPathLabelValue(MetisTlvSkeleton *opaque, uint8_t pathLabel)
+{
+    _InternalSkeleton *skeleton = (_InternalSkeleton *) opaque;
+    if (!metisTlvExtent_Equals(&skeleton->array[INDEX_PATHLABEL], &metisTlvExtent_NotFound)) {
+        if (skeleton->array[INDEX_PATHLABEL].length == 1) {
+            uint8_t *value = skeleton->packet + skeleton->array[INDEX_PATHLABEL].offset;
+            *value = pathLabel;
+        }
+    }
+}
+
+
 bool
 metisTlvSkeleton_UpdatePathLabel(MetisTlvSkeleton *opaque, uint8_t outFace)
 {
index 7e4eb60..6191026 100644 (file)
@@ -361,6 +361,8 @@ bool metisTlvSkeleton_UpdateHopLimit(MetisTlvSkeleton *skeleton, uint8_t hoplimi
 void metisTlvSkeleton_SetPathLabel(MetisTlvSkeleton *skeleton, size_t offset, size_t length);
 bool metisTlvSkeleton_UpdatePathLabel(MetisTlvSkeleton *opaque, uint8_t outFace);
 bool metisTlvSkeleton_ResetPathLabel(MetisTlvSkeleton *opaque);
+int metisTlvSkeleton_GetPathLabelValue(MetisTlvSkeleton *opaque);
+void metisTlvSkeleton_SetPathLabelValue(MetisTlvSkeleton *opaque, uint8_t pathLabel);
 
 // ====================================
 // Getters