aboutsummaryrefslogtreecommitdiffstats
path: root/metis/ccnx/forwarder
diff options
context:
space:
mode:
Diffstat (limited to 'metis/ccnx/forwarder')
-rw-r--r--metis/ccnx/forwarder/metis/core/metis_Connection.c8
-rw-r--r--metis/ccnx/forwarder/metis/core/metis_Message.c14
-rw-r--r--metis/ccnx/forwarder/metis/core/metis_Message.h2
-rw-r--r--metis/ccnx/forwarder/metis/processor/metis_MessageProcessor.c2
-rw-r--r--metis/ccnx/forwarder/metis/tlv/metis_TlvSkeleton.c27
-rw-r--r--metis/ccnx/forwarder/metis/tlv/metis_TlvSkeleton.h2
6 files changed, 54 insertions, 1 deletions
diff --git a/metis/ccnx/forwarder/metis/core/metis_Connection.c b/metis/ccnx/forwarder/metis/core/metis_Connection.c
index c3f28e14..560c75b4 100644
--- a/metis/ccnx/forwarder/metis/core/metis_Connection.c
+++ b/metis/ccnx/forwarder/metis/core/metis_Connection.c
@@ -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;
}
diff --git a/metis/ccnx/forwarder/metis/core/metis_Message.c b/metis/ccnx/forwarder/metis/core/metis_Message.c
index 77295476..aa20d9a3 100644
--- a/metis/ccnx/forwarder/metis/core/metis_Message.c
+++ b/metis/ccnx/forwarder/metis/core/metis_Message.c
@@ -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)
diff --git a/metis/ccnx/forwarder/metis/core/metis_Message.h b/metis/ccnx/forwarder/metis/core/metis_Message.h
index 3b954a4e..a609ac59 100644
--- a/metis/ccnx/forwarder/metis/core/metis_Message.h
+++ b/metis/ccnx/forwarder/metis/core/metis_Message.h
@@ -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);
/**
diff --git a/metis/ccnx/forwarder/metis/processor/metis_MessageProcessor.c b/metis/ccnx/forwarder/metis/processor/metis_MessageProcessor.c
index 26e67761..0451f633 100644
--- a/metis/ccnx/forwarder/metis/processor/metis_MessageProcessor.c
+++ b/metis/ccnx/forwarder/metis/processor/metis_MessageProcessor.c
@@ -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;
diff --git a/metis/ccnx/forwarder/metis/tlv/metis_TlvSkeleton.c b/metis/ccnx/forwarder/metis/tlv/metis_TlvSkeleton.c
index ce479ce5..bc201dc9 100644
--- a/metis/ccnx/forwarder/metis/tlv/metis_TlvSkeleton.c
+++ b/metis/ccnx/forwarder/metis/tlv/metis_TlvSkeleton.c
@@ -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)
{
diff --git a/metis/ccnx/forwarder/metis/tlv/metis_TlvSkeleton.h b/metis/ccnx/forwarder/metis/tlv/metis_TlvSkeleton.h
index 7e4eb603..61910262 100644
--- a/metis/ccnx/forwarder/metis/tlv/metis_TlvSkeleton.h
+++ b/metis/ccnx/forwarder/metis/tlv/metis_TlvSkeleton.h
@@ -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