norm-ccd initial checkin

norm-ccd
bebopagogo 2025-04-23 09:51:34 -04:00
parent 9500578e89
commit 8238ddf91a
1 changed files with 38 additions and 5 deletions

View File

@ -732,7 +732,8 @@ class NormObjectMsg : public NormMsg
FLAG_UNRELIABLE = 0x08, FLAG_UNRELIABLE = 0x08,
FLAG_FILE = 0x10, FLAG_FILE = 0x10,
FLAG_STREAM = 0x20, FLAG_STREAM = 0x20,
FLAG_SYN = 0x40 FLAG_SYN = 0x40,
FLAG_PAIR = 0x80
//FLAG_MSG_START = 0x40 deprecated //FLAG_MSG_START = 0x40 deprecated
}; };
UINT16 GetInstanceId() const UINT16 GetInstanceId() const
@ -1458,8 +1459,12 @@ class NormCmdCCMsg : public NormCmdMsg
sendTime.tv_usec = ntohl(buffer[SEND_TIME_USEC_OFFSET]); sendTime.tv_usec = ntohl(buffer[SEND_TIME_USEC_OFFSET]);
} }
bool AppendCCNode(UINT16 segMax, NormNodeId nodeId, UINT8 flags, bool AppendCCNode(UINT16 segMax,
UINT8 rtt, UINT16 rate) NormNodeId nodeId,
UINT8 flags,
UINT8 rtt,
UINT16 rate
UINT8 minRtt)
{ {
if ((length-header_length+CC_ITEM_SIZE)> segMax) return false; if ((length-header_length+CC_ITEM_SIZE)> segMax) return false;
UINT32* ptr = buffer + length/4; UINT32* ptr = buffer + length/4;
@ -1467,10 +1472,13 @@ class NormCmdCCMsg : public NormCmdMsg
((UINT8*)ptr)[CC_FLAGS_OFFSET] = flags; ((UINT8*)ptr)[CC_FLAGS_OFFSET] = flags;
((UINT8*)ptr)[CC_RTT_OFFSET] = rtt; ((UINT8*)ptr)[CC_RTT_OFFSET] = rtt;
((UINT16*)ptr)[CC_RATE_OFFSET] = htons(rate); ((UINT16*)ptr)[CC_RATE_OFFSET] = htons(rate);
#ifdef NORM_CCD
((UINT8*)ptr)[CC_MIN_RTT_OFFSET] = minRtt;
#endif // NORM_CCD
length += CC_ITEM_SIZE; length += CC_ITEM_SIZE;
return true; return true;
} }
bool GetCCNode(NormNodeId nodeId, UINT8& flags, UINT8& rtt, UINT16& rate) const; bool GetCCNode(NormNodeId nodeId, UINT8& flags, UINT8& rtt, UINT16& rate UINT8& minRtt) const;
// This function uses the "reserved" field of the NORM_CMD(CC) message // This function uses the "reserved" field of the NORM_CMD(CC) message
// and is not strictly compliant with RFC 5740 when invoked. // and is not strictly compliant with RFC 5740 when invoked.
@ -1512,13 +1520,24 @@ class NormCmdCCMsg : public NormCmdMsg
CC_FLAGS_OFFSET = CC_NODE_ID_OFFSET + 4, CC_FLAGS_OFFSET = CC_NODE_ID_OFFSET + 4,
CC_RTT_OFFSET = CC_FLAGS_OFFSET + 1, CC_RTT_OFFSET = CC_FLAGS_OFFSET + 1,
CC_RATE_OFFSET = (CC_RTT_OFFSET + 1)/2, CC_RATE_OFFSET = (CC_RTT_OFFSET + 1)/2,
CC_ITEM_SIZE = (CC_RATE_OFFSET*2)+2 #ifdef NORM_CCD
CC_MIN_RATE_OFFSET = (CC_RATE_OFFSET*2) + 2,
CC_ITEM_SIZE = CC_MIN_RATE_OFFSET + 4 // to maintain 32-bit alignment
#else
CC_ITEM_SIZE = (CC_RATE_OFFSET*2) + 2
#endif // if/else NORM_CCD
}; };
}; // end class NormCmdCCMsg }; // end class NormCmdCCMsg
class NormCCRateExtension : public NormHeaderExtension class NormCCRateExtension : public NormHeaderExtension
{ {
// FORMAT:
// 0 1 2 3
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// | het = 128 | reserved | send_rate |
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
public: public:
virtual void Init(UINT32* theBuffer, UINT16 numBytes) virtual void Init(UINT32* theBuffer, UINT16 numBytes)
@ -1532,6 +1551,20 @@ class NormCCRateExtension : public NormHeaderExtension
UINT16 GetSendRate() UINT16 GetSendRate()
{return (ntohs(((UINT16*)buffer)[SEND_RATE_OFFSET]));} {return (ntohs(((UINT16*)buffer)[SEND_RATE_OFFSET]));}
// For experimental NORM-CCD congestion control, we use
// a bit of the "reserved" field for the FLAG_PAIR marker
enum Flag {PAIR = 0x01};
void ResetFlags()
{flags = 0;}
void SetFlag(NormCCRateExtension::Flag theFlag)
{flags |= theFlag;}
void ClearFlag(NormRepairRequest::Flag theFlag)
{flags &= ~theFlag;}
void SetFlags(int theFlags)
{flags = theFlags;}
bool FlagIsSet(NormCCRateExtension::Flag theFlag) const
{return (0 != (theFlag & flags));}
private: private:
enum enum
{ {