diff --git a/prrt/proto/packet.c b/prrt/proto/packet.c index 721ea6f292dd3bf73f8aa5525956607737a11e83..858d4c7a790bcad0c0317a70f42c55bd222e3814 100644 --- a/prrt/proto/packet.c +++ b/prrt/proto/packet.c @@ -54,10 +54,6 @@ int PrrtPacket_print(PrrtPacket *packet_ptr) { printf("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"); printf("| %61u |\n", payload->packetTimeout_us); printf("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"); - printf("| %61u |\n", payload->decodingTimeout_us); - printf("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"); - printf("| %61u |\n", payload->feedbackTimer_us); - printf("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"); printf("| %61s |\n", (char *) (packet_ptr->payload + PRRT_PACKET_DATA_HEADER_SIZE)); printf("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"); } else if (type == PACKET_TYPE_REDUNDANCY) { @@ -69,12 +65,6 @@ int PrrtPacket_print(PrrtPacket *packet_ptr) { PrrtPacketFeedbackPayload *payload = packet_ptr->payload; - struct sockaddr_in receiver; - receiver.sin_addr.s_addr = payload->receiverAddress; - char *address = inet_ntoa(receiver.sin_addr); - - printf("| %61s |\n", address); - printf("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"); printf("| %61u |\n", payload->groupRTT_us); printf("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"); printf("| %61u |\n", payload->forwardTripTimestamp_us); @@ -85,8 +75,6 @@ int PrrtPacket_print(PrrtPacket *packet_ptr) { printf("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"); printf("| %29u | %29u |\n", payload->burstLength, payload->burstCount); printf("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"); - printf("| %61u |\n", payload->bandwidthEstimate); - printf("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"); prrtPacketLength_t remainingSpace = ((prrtPacketLength_t) (packet_ptr->payloadLength - PRRT_PACKET_FEEDBACK_HEADER_SIZE)); @@ -191,10 +179,6 @@ void *encode_redundancy_header(void *buf_ptr, const void *payload) { void *encode_feedback_header(void *buf_ptr, const void *payload) { const PrrtPacketFeedbackPayload *feedbackPayload = payload; - uint32_t *receiverAddress = (uint32_t *) buf_ptr; - *receiverAddress = feedbackPayload->receiverAddress; - buf_ptr += sizeof(uint32_t); - prrtTimedelta_t *groupRoundTripTime = (prrtTimedelta_t *) buf_ptr; *groupRoundTripTime = htonl(feedbackPayload->groupRTT_us); buf_ptr += sizeof(prrtTimedelta_t); @@ -227,10 +211,6 @@ void *encode_feedback_header(void *buf_ptr, const void *payload) { *burstCount = htons(feedbackPayload->burstCount); buf_ptr += sizeof(prrtSequenceNumber_t); - uint32_t *bandwidth_estimate = (uint32_t *) buf_ptr; - *bandwidth_estimate = htonl(feedbackPayload->bandwidthEstimate); - buf_ptr += sizeof(uint32_t); - // TODO: encode variable number of incomplete blocks return buf_ptr; } @@ -254,13 +234,6 @@ void *encode_data_header(void *buf_ptr, const void *payload) { *packet_timeout = htonl(data_payload->packetTimeout_us); buf_ptr += sizeof(prrtTimedelta_t); - prrtTimedelta_t *decoding_timeout = (prrtTimedelta_t *) buf_ptr; - *decoding_timeout = htonl(data_payload->decodingTimeout_us); - buf_ptr += sizeof(prrtTimedelta_t); - - prrtTimedelta_t *feedback_timeout = (prrtTimedelta_t *) buf_ptr; - *feedback_timeout = htonl(data_payload->feedbackTimer_us); - buf_ptr += sizeof(prrtTimedelta_t); return buf_ptr; } @@ -336,10 +309,6 @@ void *decode_redundancy_header(void *dstBuffer, const void *srcBuffer) { void *decode_feedback_header(void *dstBuffer, const void *srcBuffer) { PrrtPacketFeedbackPayload *feedback_payload = (PrrtPacketFeedbackPayload *) srcBuffer; - uint32_t *receiverAddr = (uint32_t *) dstBuffer; - feedback_payload->receiverAddress = *receiverAddr; - dstBuffer += sizeof(uint32_t); - prrtTimedelta_t *groupRoundTripTime = (prrtTimedelta_t *) dstBuffer; feedback_payload->groupRTT_us = ntohl(*groupRoundTripTime); dstBuffer += sizeof(prrtTimedelta_t); @@ -372,10 +341,6 @@ void *decode_feedback_header(void *dstBuffer, const void *srcBuffer) { feedback_payload->burstCount = ntohs(*nburst); dstBuffer += sizeof(prrtSequenceNumber_t); - uint32_t *bandwidthEstimate = (uint32_t *) dstBuffer; - feedback_payload->bandwidthEstimate = ntohl(*bandwidthEstimate); - dstBuffer += sizeof(uint32_t); - // TODO: decode variable number of incomplete blocks return dstBuffer; } @@ -399,13 +364,6 @@ void *decode_data_header(void *dstBuffer, const void *srcBuffer) { data_payload->packetTimeout_us = ntohl(*packet_timeout); dstBuffer += sizeof(prrtTimedelta_t); - prrtTimedelta_t *decoding_timeout = (prrtTimedelta_t *) dstBuffer; - data_payload->decodingTimeout_us = ntohl(*decoding_timeout); - dstBuffer += sizeof(prrtTimedelta_t); - - prrtTimedelta_t *feedback_timeout = (prrtTimedelta_t *) dstBuffer; - data_payload->feedbackTimer_us = ntohl(*feedback_timeout); - dstBuffer += sizeof(prrtTimedelta_t); return dstBuffer; } @@ -432,8 +390,6 @@ PrrtPacket *PrrtPacket_create_data_packet(uint8_t priority, const void *payloadP dataPayload->timestamp = PrrtClock_get_current_time_us(); dataPayload->packetTimeout_us = dataPayload->timestamp + targetDelay; dataPayload->groupRTprop_us = 0; - dataPayload->decodingTimeout_us = 150; // TODO: payload->decodingTimeout_us - dataPayload->feedbackTimer_us = 170; // TODO: payload->feedback_timer PrrtPacket_copy_buffer_to_payload(packet, payloadPointer, PRRT_PACKET_DATA_HEADER_SIZE) return packet; @@ -489,20 +445,18 @@ PrrtPacket *PrrtPacket_create_redundancy_packet(uint8_t priority, void *payloadP return NULL; } -PrrtPacket *PrrtPacket_create_feedback_packet(uint8_t priority, uint8_t index, prrtSequenceNumber_t sequenceNumber, - prrtTimedelta_t groupRTT, prrtSequenceNumber_t gapLength, - prrtSequenceNumber_t gapCount, prrtSequenceNumber_t burstLength, - prrtSequenceNumber_t burstCount, uint32_t bandwidth, - uint32_t receiverAddr, prrtTimestamp_t forwardTripTime, - prrtSequenceNumber_t erasureCount, prrtSequenceNumber_t packetCount) { +PrrtPacket *PrrtPacket_create_feedback_packet(uint8_t priority, prrtSequenceNumber_t sequenceNumber, prrtTimedelta_t groupRTT, + prrtSequenceNumber_t gapLength, prrtSequenceNumber_t gapCount, + prrtSequenceNumber_t burstLength, prrtSequenceNumber_t burstCount, + prrtTimestamp_t forwardTripTime, prrtSequenceNumber_t erasureCount, + prrtSequenceNumber_t packetCount) { PrrtPacket *packet = create_header(priority, sequenceNumber, PRRT_PACKET_FEEDBACK_HEADER_SIZE, PACKET_TYPE_FEEDBACK, - index); + 0); PrrtPacketFeedbackPayload *payload = calloc(1, packet->payloadLength); check_mem(payload); packet->payload = payload; - payload->receiverAddress = receiverAddr; payload->groupRTT_us = groupRTT; payload->forwardTripTimestamp_us = forwardTripTime; payload->erasureCount = erasureCount; @@ -511,9 +465,8 @@ PrrtPacket *PrrtPacket_create_feedback_packet(uint8_t priority, uint8_t index, p payload->gapCount = gapCount; payload->burstLength = burstLength; payload->burstCount = burstCount; - payload->bandwidthEstimate = bandwidth; - // TODO: insert incomplete blocks + // TODO: Acknowledged packet. return packet; diff --git a/prrt/proto/packet.h b/prrt/proto/packet.h index c3e47546bd85e930b2139eb50da9a18934711bdf..94c9ebaaa48f7f78c41c6c4020047fcfb10b3841 100644 --- a/prrt/proto/packet.h +++ b/prrt/proto/packet.h @@ -45,8 +45,6 @@ typedef struct prrtPacketDataPayload { prrtTimestamp_t timestamp; prrtTimedelta_t groupRTprop_us; prrtTimestamp_t packetTimeout_us; - prrtTimestamp_t decodingTimeout_us; - prrtTimedelta_t feedbackTimer_us; } PrrtPacketDataPayload; #define PRRT_PACKET_DATA_HEADER_SIZE sizeof(PrrtPacketDataPayload) @@ -58,7 +56,6 @@ typedef struct prrtPacketRedundancyPayload { #define PRRT_PACKET_REDUNDANCY_HEADER_SIZE sizeof(PrrtPacketRedundancyPayload) typedef struct prrtPacketFeedbackPayload { - uint32_t receiverAddress; prrtTimedelta_t groupRTT_us; prrtTimestamp_t forwardTripTimestamp_us; prrtSequenceNumber_t erasureCount; @@ -67,7 +64,6 @@ typedef struct prrtPacketFeedbackPayload { prrtSequenceNumber_t gapCount; prrtSequenceNumber_t burstLength; prrtSequenceNumber_t burstCount; - uint32_t bandwidthEstimate; PrrtIncompleteBlock *incompleteBlocks; } PrrtPacketFeedbackPayload; #define PRRT_PACKET_FEEDBACK_HEADER_SIZE (sizeof(PrrtPacketFeedbackPayload) - sizeof(PrrtIncompleteBlock*)) @@ -87,12 +83,11 @@ PrrtPacket *PrrtPacket_create_data_packet(uint8_t priority, const void *payloadP prrtTimedelta_t targetDelay); PrrtPacket* PrrtPacket_reconstruct_data_packet(PrrtPacketDataPayload* payload, prrtIndex_t index, prrtSequenceNumber_t sequenceNumber); -PrrtPacket *PrrtPacket_create_feedback_packet(uint8_t priority, uint8_t index, prrtSequenceNumber_t sequenceNumber, - prrtTimedelta_t groupRTT, prrtSequenceNumber_t gapLength, - prrtSequenceNumber_t gapCount, prrtSequenceNumber_t burstLength, - prrtSequenceNumber_t burstCount, uint32_t bandwidth, - uint32_t receiverAddr, prrtTimestamp_t forwardTripTime, - prrtSequenceNumber_t erasureCount, prrtSequenceNumber_t packetCount); +PrrtPacket *PrrtPacket_create_feedback_packet(uint8_t priority, prrtSequenceNumber_t sequenceNumber, prrtTimedelta_t groupRTT, + prrtSequenceNumber_t gapLength, prrtSequenceNumber_t gapCount, + prrtSequenceNumber_t burstLength, prrtSequenceNumber_t burstCount, + prrtTimestamp_t forwardTripTime, prrtSequenceNumber_t erasureCount, + prrtSequenceNumber_t packetCount); PrrtPacket *PrrtPacket_create_redundancy_packet(uint8_t priority, void *payloadPointer, prrtPacketLength_t payloadLength, diff --git a/prrt/proto/processes/dataReceiver.c b/prrt/proto/processes/dataReceiver.c index 51f2224e7920a2cfdabe55814fa623ece3f3e2e2..d6c9fb740829562f2a27251e3ee9bdd03860f9fd 100644 --- a/prrt/proto/processes/dataReceiver.c +++ b/prrt/proto/processes/dataReceiver.c @@ -50,7 +50,7 @@ static void decode_block(PrrtSocket *sock_ptr, PrrtBlock *block) { PERROR("Decoding failed.%s", "") } -static bool send_feedback(const PrrtSocket *sock_ptr, struct sockaddr_in remote) { +static bool send_feedback(PrrtSocket *sock_ptr, struct sockaddr_in remote) { uint16_t remote_port = ntohs(remote.sin_port); char *remote_host = inet_ntoa(remote.sin_addr); @@ -68,9 +68,11 @@ static bool send_feedback(const PrrtSocket *sock_ptr, struct sockaddr_in remote) PrrtLossStatistics stats = sock_ptr->lossStatistics; - PrrtPacket *feedback_pkt_ptr = PrrtPacket_create_feedback_packet(0, 19, 4715, 0, 4, 6, 8, 9, 5, - sock_ptr->address->sin_addr.s_addr, - forwardTripTime, stats.erasureCount, stats.packetCount); + int group_RTT = 0; // TODO: To be determined. + PrrtPacket *feedback_pkt_ptr = PrrtPacket_create_feedback_packet(0, sock_ptr->sequenceNumberFeedback++, group_RTT, + stats.gapLength, stats.gapCount, stats.burstLength, + stats.burstCount, forwardTripTime, + stats.erasureCount, stats.packetCount); prrtPacketLength_t length = PrrtPacket_size(feedback_pkt_ptr); void *buf = calloc(1, length); check_mem(buf); diff --git a/prrt/proto/socket.c b/prrt/proto/socket.c index 3bb4718bcca688c456e5e11a465b848ead7cd09e..8d0b2c4984f7892d7b89a71c890342e2d023ae46 100644 --- a/prrt/proto/socket.c +++ b/prrt/proto/socket.c @@ -71,6 +71,7 @@ PrrtSocket *PrrtSocket_create(const bool is_sender, prrtTimedelta_t target_delay s->sequenceNumberSource = 1; s->sequenceNumberRedundancy = 1; + s->sequenceNumberFeedback = 1; check(target_delay_us < HALF_TIMESTAMP, "Specify target delay between 0 and %i", HALF_TIMESTAMP-1)