//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;
}
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)
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);
/**
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;
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)
{
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