@@ -348,10 +348,7 @@ bool ReceptionBlock::Decoding()
348348 }
349349 else
350350 {
351- for (; decodingposition < length; decodingposition++)
352- {
353- DecodeOut.back ().get ()[decodingposition] ^= FiniteField::instance ()->mul (m_DecodingMatrix[row].get ()[i], m_DecodedPacketBuffer[i].get ()[decodingposition]);
354- }
351+ DecodingPacket<1 >::Run (DecodeOut, m_DecodedPacketBuffer, m_DecodingMatrix, decodingposition, i, row);
355352 }
356353 }
357354 }
@@ -429,9 +426,10 @@ ReceptionBlock::~ReceptionBlock()
429426void ReceptionBlock::Receive (uint8_t *const buffer, const uint16_t length, const sockaddr *const sender_addr, const uint32_t sender_addr_len)
430427{
431428 Header::Data *const DataHeader = reinterpret_cast <Header::Data *>(buffer);
429+ uint8_t rank = 0 ;
432430 if (m_DecodingReady)
433431 {
434- c_Session->SendDataAck (DataHeader, sender_addr, sender_addr_len);
432+ c_Session->SendDataAck (DataHeader, sender_addr, sender_addr_len, DataHeader-> m_MaximumRank );
435433 return ;
436434 }
437435 switch (FindAction (buffer, length))
@@ -527,7 +525,8 @@ void ReceptionBlock::Receive(uint8_t *const buffer, const uint16_t length, const
527525 }
528526 // Continue with decoding.
529527 case DECODING:
530- if ((DataHeader->m_ExpectedRank == (m_DecodedPacketBuffer.size () + m_EncodedPacketBuffer.size ())) &&
528+ rank = m_DecodedPacketBuffer.size () + m_EncodedPacketBuffer.size ();
529+ if (DataHeader->m_ExpectedRank == rank &&
531530 (DataHeader->m_Flags & Header::Data::DataHeaderFlag::FLAGS_END_OF_BLK))
532531 {
533532 // Decoding.
@@ -607,8 +606,8 @@ void ReceptionBlock::Receive(uint8_t *const buffer, const uint16_t length, const
607606 }
608607 }
609608 }
610- c_Session->SendDataAck (DataHeader, sender_addr, sender_addr_len);
611609 }
610+ c_Session->SendDataAck (DataHeader, sender_addr, sender_addr_len, rank);
612611 break ;
613612 }
614613}
@@ -625,49 +624,17 @@ ReceptionSession::~ReceptionSession()
625624 m_Blocks.DoSomethingOnAllData ([](ReceptionBlock *&block) { delete block; });
626625}
627626
628- void ReceptionSession::SendDataAck (const Header::Data *const header, const sockaddr *const sender_addr, const uint32_t sender_addr_len)
627+ void ReceptionSession::SendDataAck (const Header::Data *const header, const sockaddr *const sender_addr, const uint32_t sender_addr_len, const uint8_t rank )
629628{
630629 Header::DataAck ack;
631- uint16_t MIN_BLOCK_SEQUENCE = 0 ;
632- uint16_t MAX_BLOCK_SEQUENCE = 0 ;
633- if (m_MinSequenceNumberAwaitingAck - (uint16_t )ntohs (header->m_MinBlockSequenceNumber ) > (uint16_t )ntohs (header->m_MinBlockSequenceNumber ) - m_MinSequenceNumberAwaitingAck)
634- {
635- MIN_BLOCK_SEQUENCE = m_MinSequenceNumberAwaitingAck;
636- }
637- else
638- {
639- MIN_BLOCK_SEQUENCE = ntohs (header->m_MinBlockSequenceNumber );
640- }
641- if (m_MaxSequenceNumberAwaitingAck - (uint16_t )ntohs (header->m_MaxBlockSequenceNumber ) < (uint16_t )ntohs (header->m_MaxBlockSequenceNumber ) - m_MaxSequenceNumberAwaitingAck)
642- {
643- MAX_BLOCK_SEQUENCE = m_MaxSequenceNumberAwaitingAck;
644- }
645- else
646- {
647- MAX_BLOCK_SEQUENCE = ntohs (header->m_MaxBlockSequenceNumber );
648- }
649-
650630 ack.m_Type = Header::Common::HeaderType::DATA_ACK;
631+ ack.m_Rank = rank;
632+ ack.m_MaxRank = header->m_MaximumRank ;
651633 ack.m_Losses = header->m_TxCount - header->m_ExpectedRank ;
652- ack.m_Sequences = 0 ;
653- for (uint16_t i = MIN_BLOCK_SEQUENCE; i <= MAX_BLOCK_SEQUENCE; i++)
654- {
655- ReceptionBlock **const blk = m_Blocks.GetPtr (i);
656- if (blk && (*blk)->m_DecodingReady )
657- {
658- ack.m_SequenceList [ack.m_Sequences ++] = htons (i);
659- }
660- if (ack.m_Sequences == 255 )
661- {
662- ack.m_CheckSum = 0 ;
663- ack.m_CheckSum = Checksum::get (reinterpret_cast <uint8_t *>(&ack), sizeof (ack));
664- sendto (c_Reception->c_Socket , (uint8_t *)&ack, sizeof (ack), 0 , (sockaddr *)sender_addr, sender_addr_len);
665- ack.m_Sequences = 0 ;
666- }
667- }
634+ ack.m_BlockSequenceNumber = header->m_CurrentBlockSequenceNumber ;
668635 ack.m_CheckSum = 0 ;
669- ack.m_CheckSum = Checksum::get (reinterpret_cast <uint8_t *>(&ack), sizeof (ack) - ( 255 - ack. m_Sequences ) * sizeof ( uint16_t ) );
670- sendto (c_Reception->c_Socket , (uint8_t *)&ack, sizeof (ack) - ( 255 - ack. m_Sequences ) * sizeof ( uint16_t ) , 0 , (sockaddr *)sender_addr, sender_addr_len);
636+ ack.m_CheckSum = Checksum::get (reinterpret_cast <uint8_t *>(&ack), sizeof (ack));
637+ sendto (c_Reception->c_Socket , (uint8_t *)&ack, sizeof (ack), 0 , (sockaddr *)sender_addr, sender_addr_len);
671638}
672639
673640void ReceptionSession::Receive (uint8_t *const buffer, const uint16_t length, const sockaddr *const sender_addr, const uint32_t sender_addr_len)
@@ -755,7 +722,7 @@ void ReceptionSession::Receive(uint8_t *const buffer, const uint16_t length, con
755722 ReceptionBlock **const pp_block = m_Blocks.GetPtr (ntohs (DataHeader->m_CurrentBlockSequenceNumber ));
756723 if (pp_block && (*pp_block)->m_DecodingReady )
757724 {
758- SendDataAck (DataHeader, sender_addr, sender_addr_len);
725+ SendDataAck (DataHeader, sender_addr, sender_addr_len, DataHeader-> m_MaximumRank );
759726 }
760727 return ;
761728 }
0 commit comments