@@ -348,10 +348,7 @@ bool ReceptionBlock::Decoding()
348
348
}
349
349
else
350
350
{
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);
355
352
}
356
353
}
357
354
}
@@ -429,9 +426,10 @@ ReceptionBlock::~ReceptionBlock()
429
426
void ReceptionBlock::Receive (uint8_t *const buffer, const uint16_t length, const sockaddr *const sender_addr, const uint32_t sender_addr_len)
430
427
{
431
428
Header::Data *const DataHeader = reinterpret_cast <Header::Data *>(buffer);
429
+ uint8_t rank = 0 ;
432
430
if (m_DecodingReady)
433
431
{
434
- c_Session->SendDataAck (DataHeader, sender_addr, sender_addr_len);
432
+ c_Session->SendDataAck (DataHeader, sender_addr, sender_addr_len, DataHeader-> m_MaximumRank );
435
433
return ;
436
434
}
437
435
switch (FindAction (buffer, length))
@@ -527,7 +525,8 @@ void ReceptionBlock::Receive(uint8_t *const buffer, const uint16_t length, const
527
525
}
528
526
// Continue with decoding.
529
527
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 &&
531
530
(DataHeader->m_Flags & Header::Data::DataHeaderFlag::FLAGS_END_OF_BLK))
532
531
{
533
532
// Decoding.
@@ -607,8 +606,8 @@ void ReceptionBlock::Receive(uint8_t *const buffer, const uint16_t length, const
607
606
}
608
607
}
609
608
}
610
- c_Session->SendDataAck (DataHeader, sender_addr, sender_addr_len);
611
609
}
610
+ c_Session->SendDataAck (DataHeader, sender_addr, sender_addr_len, rank);
612
611
break ;
613
612
}
614
613
}
@@ -625,49 +624,17 @@ ReceptionSession::~ReceptionSession()
625
624
m_Blocks.DoSomethingOnAllData ([](ReceptionBlock *&block) { delete block; });
626
625
}
627
626
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 )
629
628
{
630
629
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
-
650
630
ack.m_Type = Header::Common::HeaderType::DATA_ACK;
631
+ ack.m_Rank = rank;
632
+ ack.m_MaxRank = header->m_MaximumRank ;
651
633
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 ;
668
635
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);
671
638
}
672
639
673
640
void 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
755
722
ReceptionBlock **const pp_block = m_Blocks.GetPtr (ntohs (DataHeader->m_CurrentBlockSequenceNumber ));
756
723
if (pp_block && (*pp_block)->m_DecodingReady )
757
724
{
758
- SendDataAck (DataHeader, sender_addr, sender_addr_len);
725
+ SendDataAck (DataHeader, sender_addr, sender_addr_len, DataHeader-> m_MaximumRank );
759
726
}
760
727
return ;
761
728
}
0 commit comments