Skip to content

Commit 97da68f

Browse files
authored
Merge pull request #9 from dujeonglee/cwnd
Cwnd
2 parents d9b45c3 + fd7e24f commit 97da68f

11 files changed

+257
-162
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/lib
22
.vscode
33
*.patch
4+
basiclibrary

c_cpp/common.h

+20-6
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
// C++ Standard Library Header
1414
#include <iostream>
15-
#include <set>
15+
#include <map>
1616
#include <vector>
1717
#include <queue>
1818
#include <atomic>
@@ -82,9 +82,10 @@ struct Data : Common
8282

8383
struct DataAck : Common
8484
{
85-
uint8_t m_Losses; /*1*/
86-
uint8_t m_Sequences;
87-
uint16_t m_SequenceList[255];
85+
uint8_t m_Rank;
86+
uint8_t m_MaxRank;
87+
uint8_t m_Losses;
88+
uint16_t m_BlockSequenceNumber;
8889
} __attribute__((packed, may_alias));
8990

9091
struct Sync : Common
@@ -111,6 +112,8 @@ const uint16_t MAXIMUM_BUFFER_SIZE = 1500; /* 1500 Bytes */
111112
const uint16_t PING_INTERVAL = 100; /* 100 ms */
112113
const double CONNECTION_TIMEOUT = 10.0; /* 10 s */
113114
const uint16_t MINIMUM_RETRANSMISSION_INTERVAL = 10; /* 10 ms */
115+
const uint32_t MAXIMUM_CONGESTION_WINDOW_SIZE = 2*1000*1000; /* 10MB */
116+
const uint32_t MINIMUM_CONGESTION_WINDOW_SIZE = 1000*64; /* 10KB */
114117
enum TRANSMISSION_MODE : uint8_t
115118
{
116119
RELIABLE_TRANSMISSION_MODE = 0,
@@ -146,12 +149,23 @@ inline const SessionKey GetSessionKey(const sockaddr *addr, int size)
146149
{
147150
if (size == sizeof(sockaddr_in))
148151
{
149-
SessionKey ret = {((sockaddr_in *)addr)->sin_addr.s_addr, ((sockaddr_in *)addr)->sin_port};
152+
SessionKey ret;
153+
ret.m_EUI = ((sockaddr_in *)addr)->sin_addr.s_addr;
154+
ret.m_Port = ((sockaddr_in *)addr)->sin_port;
150155
return ret;
151156
}
152157
else
153158
{
154-
SessionKey ret = {((uint64_t *)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr))[1], ((sockaddr_in6 *)addr)->sin6_port};
159+
SessionKey ret;
160+
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[8]);
161+
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[9]) << 8;
162+
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[10]) << 16;
163+
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[11]) << 24;
164+
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[12]) << 32;
165+
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[13]) << 40;
166+
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[14]) << 48;
167+
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[15]) << 56;
168+
ret.m_Port = ((sockaddr_in6 *)addr)->sin6_port;
155169
return ret;
156170
}
157171
}

c_cpp/rx.cpp

+13-46
Original file line numberDiff line numberDiff line change
@@ -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()
429426
void 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

673640
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
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
}

c_cpp/rx.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class ReceptionSession
6969

7070
ReceptionSession(Reception *const Session, const DataTypes::Address addr);
7171
~ReceptionSession();
72-
void SendDataAck(const Header::Data *const header, const sockaddr *const sender_addr, const uint32_t sender_addr_len);
72+
void SendDataAck(const Header::Data *const header, const sockaddr *const sender_addr, const uint32_t sender_addr_len, const uint8_t completed = 1);
7373
void Receive(uint8_t *const buffer, const uint16_t length, const sockaddr *const sender_addr, const uint32_t sender_addr_len);
7474
};
7575

0 commit comments

Comments
 (0)