Skip to content

Commit

Permalink
Merge pull request #9 from dujeonglee/cwnd
Browse files Browse the repository at this point in the history
Cwnd
  • Loading branch information
dujeonglee authored Jun 17, 2018
2 parents d9b45c3 + fd7e24f commit 97da68f
Show file tree
Hide file tree
Showing 11 changed files with 257 additions and 162 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/lib
.vscode
*.patch
basiclibrary
26 changes: 20 additions & 6 deletions c_cpp/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

// C++ Standard Library Header
#include <iostream>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <atomic>
Expand Down Expand Up @@ -82,9 +82,10 @@ struct Data : Common

struct DataAck : Common
{
uint8_t m_Losses; /*1*/
uint8_t m_Sequences;
uint16_t m_SequenceList[255];
uint8_t m_Rank;
uint8_t m_MaxRank;
uint8_t m_Losses;
uint16_t m_BlockSequenceNumber;
} __attribute__((packed, may_alias));

struct Sync : Common
Expand All @@ -111,6 +112,8 @@ const uint16_t MAXIMUM_BUFFER_SIZE = 1500; /* 1500 Bytes */
const uint16_t PING_INTERVAL = 100; /* 100 ms */
const double CONNECTION_TIMEOUT = 10.0; /* 10 s */
const uint16_t MINIMUM_RETRANSMISSION_INTERVAL = 10; /* 10 ms */
const uint32_t MAXIMUM_CONGESTION_WINDOW_SIZE = 2*1000*1000; /* 10MB */
const uint32_t MINIMUM_CONGESTION_WINDOW_SIZE = 1000*64; /* 10KB */
enum TRANSMISSION_MODE : uint8_t
{
RELIABLE_TRANSMISSION_MODE = 0,
Expand Down Expand Up @@ -146,12 +149,23 @@ inline const SessionKey GetSessionKey(const sockaddr *addr, int size)
{
if (size == sizeof(sockaddr_in))
{
SessionKey ret = {((sockaddr_in *)addr)->sin_addr.s_addr, ((sockaddr_in *)addr)->sin_port};
SessionKey ret;
ret.m_EUI = ((sockaddr_in *)addr)->sin_addr.s_addr;
ret.m_Port = ((sockaddr_in *)addr)->sin_port;
return ret;
}
else
{
SessionKey ret = {((uint64_t *)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr))[1], ((sockaddr_in6 *)addr)->sin6_port};
SessionKey ret;
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[8]);
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[9]) << 8;
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[10]) << 16;
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[11]) << 24;
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[12]) << 32;
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[13]) << 40;
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[14]) << 48;
ret.m_EUI = ((uint64_t)(((sockaddr_in6 *)addr)->sin6_addr.s6_addr)[15]) << 56;
ret.m_Port = ((sockaddr_in6 *)addr)->sin6_port;
return ret;
}
}
Expand Down
59 changes: 13 additions & 46 deletions c_cpp/rx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -348,10 +348,7 @@ bool ReceptionBlock::Decoding()
}
else
{
for (; decodingposition < length; decodingposition++)
{
DecodeOut.back().get()[decodingposition] ^= FiniteField::instance()->mul(m_DecodingMatrix[row].get()[i], m_DecodedPacketBuffer[i].get()[decodingposition]);
}
DecodingPacket<1>::Run(DecodeOut, m_DecodedPacketBuffer, m_DecodingMatrix, decodingposition, i, row);
}
}
}
Expand Down Expand Up @@ -429,9 +426,10 @@ ReceptionBlock::~ReceptionBlock()
void ReceptionBlock::Receive(uint8_t *const buffer, const uint16_t length, const sockaddr *const sender_addr, const uint32_t sender_addr_len)
{
Header::Data *const DataHeader = reinterpret_cast<Header::Data *>(buffer);
uint8_t rank = 0;
if (m_DecodingReady)
{
c_Session->SendDataAck(DataHeader, sender_addr, sender_addr_len);
c_Session->SendDataAck(DataHeader, sender_addr, sender_addr_len, DataHeader->m_MaximumRank);
return;
}
switch (FindAction(buffer, length))
Expand Down Expand Up @@ -527,7 +525,8 @@ void ReceptionBlock::Receive(uint8_t *const buffer, const uint16_t length, const
}
// Continue with decoding.
case DECODING:
if ((DataHeader->m_ExpectedRank == (m_DecodedPacketBuffer.size() + m_EncodedPacketBuffer.size())) &&
rank = m_DecodedPacketBuffer.size() + m_EncodedPacketBuffer.size();
if (DataHeader->m_ExpectedRank == rank &&
(DataHeader->m_Flags & Header::Data::DataHeaderFlag::FLAGS_END_OF_BLK))
{
// Decoding.
Expand Down Expand Up @@ -607,8 +606,8 @@ void ReceptionBlock::Receive(uint8_t *const buffer, const uint16_t length, const
}
}
}
c_Session->SendDataAck(DataHeader, sender_addr, sender_addr_len);
}
c_Session->SendDataAck(DataHeader, sender_addr, sender_addr_len, rank);
break;
}
}
Expand All @@ -625,49 +624,17 @@ ReceptionSession::~ReceptionSession()
m_Blocks.DoSomethingOnAllData([](ReceptionBlock *&block) { delete block; });
}

void ReceptionSession::SendDataAck(const Header::Data *const header, const sockaddr *const sender_addr, const uint32_t sender_addr_len)
void ReceptionSession::SendDataAck(const Header::Data *const header, const sockaddr *const sender_addr, const uint32_t sender_addr_len, const uint8_t rank)
{
Header::DataAck ack;
uint16_t MIN_BLOCK_SEQUENCE = 0;
uint16_t MAX_BLOCK_SEQUENCE = 0;
if (m_MinSequenceNumberAwaitingAck - (uint16_t)ntohs(header->m_MinBlockSequenceNumber) > (uint16_t)ntohs(header->m_MinBlockSequenceNumber) - m_MinSequenceNumberAwaitingAck)
{
MIN_BLOCK_SEQUENCE = m_MinSequenceNumberAwaitingAck;
}
else
{
MIN_BLOCK_SEQUENCE = ntohs(header->m_MinBlockSequenceNumber);
}
if (m_MaxSequenceNumberAwaitingAck - (uint16_t)ntohs(header->m_MaxBlockSequenceNumber) < (uint16_t)ntohs(header->m_MaxBlockSequenceNumber) - m_MaxSequenceNumberAwaitingAck)
{
MAX_BLOCK_SEQUENCE = m_MaxSequenceNumberAwaitingAck;
}
else
{
MAX_BLOCK_SEQUENCE = ntohs(header->m_MaxBlockSequenceNumber);
}

ack.m_Type = Header::Common::HeaderType::DATA_ACK;
ack.m_Rank = rank;
ack.m_MaxRank = header->m_MaximumRank;
ack.m_Losses = header->m_TxCount - header->m_ExpectedRank;
ack.m_Sequences = 0;
for (uint16_t i = MIN_BLOCK_SEQUENCE; i <= MAX_BLOCK_SEQUENCE; i++)
{
ReceptionBlock **const blk = m_Blocks.GetPtr(i);
if (blk && (*blk)->m_DecodingReady)
{
ack.m_SequenceList[ack.m_Sequences++] = htons(i);
}
if (ack.m_Sequences == 255)
{
ack.m_CheckSum = 0;
ack.m_CheckSum = Checksum::get(reinterpret_cast<uint8_t *>(&ack), sizeof(ack));
sendto(c_Reception->c_Socket, (uint8_t *)&ack, sizeof(ack), 0, (sockaddr *)sender_addr, sender_addr_len);
ack.m_Sequences = 0;
}
}
ack.m_BlockSequenceNumber = header->m_CurrentBlockSequenceNumber;
ack.m_CheckSum = 0;
ack.m_CheckSum = Checksum::get(reinterpret_cast<uint8_t *>(&ack), sizeof(ack) - (255 - ack.m_Sequences) * sizeof(uint16_t));
sendto(c_Reception->c_Socket, (uint8_t *)&ack, sizeof(ack) - (255 - ack.m_Sequences) * sizeof(uint16_t), 0, (sockaddr *)sender_addr, sender_addr_len);
ack.m_CheckSum = Checksum::get(reinterpret_cast<uint8_t *>(&ack), sizeof(ack));
sendto(c_Reception->c_Socket, (uint8_t *)&ack, sizeof(ack), 0, (sockaddr *)sender_addr, sender_addr_len);
}

void ReceptionSession::Receive(uint8_t *const buffer, const uint16_t length, const sockaddr *const sender_addr, const uint32_t sender_addr_len)
Expand Down Expand Up @@ -755,7 +722,7 @@ void ReceptionSession::Receive(uint8_t *const buffer, const uint16_t length, con
ReceptionBlock **const pp_block = m_Blocks.GetPtr(ntohs(DataHeader->m_CurrentBlockSequenceNumber));
if (pp_block && (*pp_block)->m_DecodingReady)
{
SendDataAck(DataHeader, sender_addr, sender_addr_len);
SendDataAck(DataHeader, sender_addr, sender_addr_len, DataHeader->m_MaximumRank);
}
return;
}
Expand Down
2 changes: 1 addition & 1 deletion c_cpp/rx.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class ReceptionSession

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

Expand Down
Loading

0 comments on commit 97da68f

Please sign in to comment.