Index: net/third_party/udt/src/packet.cpp |
=================================================================== |
--- net/third_party/udt/src/packet.cpp (revision 78992) |
+++ net/third_party/udt/src/packet.cpp (working copy) |
@@ -1,410 +0,0 @@ |
-/***************************************************************************** |
-Copyright (c) 2001 - 2011, The Board of Trustees of the University of Illinois. |
-All rights reserved. |
- |
-Redistribution and use in source and binary forms, with or without |
-modification, are permitted provided that the following conditions are |
-met: |
- |
-* Redistributions of source code must retain the above |
- copyright notice, this list of conditions and the |
- following disclaimer. |
- |
-* Redistributions in binary form must reproduce the |
- above copyright notice, this list of conditions |
- and the following disclaimer in the documentation |
- and/or other materials provided with the distribution. |
- |
-* Neither the name of the University of Illinois |
- nor the names of its contributors may be used to |
- endorse or promote products derived from this |
- software without specific prior written permission. |
- |
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
-*****************************************************************************/ |
- |
-/***************************************************************************** |
-written by |
- Yunhong Gu, last updated 02/12/2011 |
-*****************************************************************************/ |
- |
- |
-////////////////////////////////////////////////////////////////////////////// |
-// 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 |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// | Packet Header | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// | | |
-// ~ Data / Control Information Field ~ |
-// | | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// |
-// 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 |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// |0| Sequence Number | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// |ff |o| Message Number | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// | Time Stamp | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// | Destination Socket ID | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// |
-// bit 0: |
-// 0: Data Packet |
-// 1: Control Packet |
-// bit ff: |
-// 11: solo message packet |
-// 10: first packet of a message |
-// 01: last packet of a message |
-// bit o: |
-// 0: in order delivery not required |
-// 1: in order delivery required |
-// |
-// 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 |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// |1| Type | Reserved | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// | Additional Info | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// | Time Stamp | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// | Destination Socket ID | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// |
-// bit 1-15: |
-// 0: Protocol Connection Handshake |
-// Add. Info: Undefined |
-// Control Info: Handshake information (see CHandShake) |
-// 1: Keep-alive |
-// Add. Info: Undefined |
-// Control Info: None |
-// 2: Acknowledgement (ACK) |
-// Add. Info: The ACK sequence number |
-// Control Info: The sequence number to which (but not include) all the previous packets have beed received |
-// Optional: RTT |
-// RTT Variance |
-// available receiver buffer size (in bytes) |
-// advertised flow window size (number of packets) |
-// estimated bandwidth (number of packets per second) |
-// 3: Negative Acknowledgement (NAK) |
-// Add. Info: Undefined |
-// Control Info: Loss list (see loss list coding below) |
-// 4: Congestion/Delay Warning |
-// Add. Info: Undefined |
-// Control Info: None |
-// 5: Shutdown |
-// Add. Info: Undefined |
-// Control Info: None |
-// 6: Acknowledgement of Acknowledement (ACK-square) |
-// Add. Info: The ACK sequence number |
-// Control Info: None |
-// 7: Message Drop Request |
-// Add. Info: Message ID |
-// Control Info: first sequence number of the message |
-// last seqeunce number of the message |
-// 8: Error Signal from the Peer Side |
-// Add. Info: Error code |
-// Control Info: None |
-// 0x7FFF: Explained by bits 16 - 31 |
-// |
-// bit 16 - 31: |
-// This space is used for future expansion or user defined control packets. |
-// |
-// 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 |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// |1| Sequence Number a (first) | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// |0| Sequence Number b (last) | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// |0| Sequence Number (single) | |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
-// |
-// Loss List Field Coding: |
-// For any consectutive lost seqeunce numbers that the differnece between |
-// the last and first is more than 1, only record the first (a) and the |
-// the last (b) sequence numbers in the loss list field, and modify the |
-// the first bit of a to 1. |
-// For any single loss or consectutive loss less than 2 packets, use |
-// the original sequence numbers in the field. |
- |
- |
-#include <cstring> |
-#include "packet.h" |
- |
- |
-const int CPacket::m_iPktHdrSize = 16; |
-const int CHandShake::m_iContentSize = 48; |
- |
- |
-// Set up the aliases in the constructure |
-CPacket::CPacket(): |
-m_iSeqNo((int32_t&)(m_nHeader[0])), |
-m_iMsgNo((int32_t&)(m_nHeader[1])), |
-m_iTimeStamp((int32_t&)(m_nHeader[2])), |
-m_iID((int32_t&)(m_nHeader[3])), |
-m_pcData((char*&)(m_PacketVector[1].iov_base)), |
-__pad() |
-{ |
- for (int i = 0; i < 4; ++ i) |
- m_nHeader[i] = 0; |
- m_PacketVector[0].iov_base = (char *)m_nHeader; |
- m_PacketVector[0].iov_len = CPacket::m_iPktHdrSize; |
- m_PacketVector[1].iov_base = NULL; |
- m_PacketVector[1].iov_len = 0; |
-} |
- |
-CPacket::~CPacket() |
-{ |
-} |
- |
-int CPacket::getLength() const |
-{ |
- return m_PacketVector[1].iov_len; |
-} |
- |
-void CPacket::setLength(const int& len) |
-{ |
- m_PacketVector[1].iov_len = len; |
-} |
- |
-void CPacket::pack(const int& pkttype, void* lparam, void* rparam, const int& size) |
-{ |
- // Set (bit-0 = 1) and (bit-1~15 = type) |
- m_nHeader[0] = 0x80000000 | (pkttype << 16); |
- |
- // Set additional information and control information field |
- switch (pkttype) |
- { |
- case 2: //0010 - Acknowledgement (ACK) |
- // ACK packet seq. no. |
- if (NULL != lparam) |
- m_nHeader[1] = *(int32_t *)lparam; |
- |
- // data ACK seq. no. |
- // optional: RTT (microsends), RTT variance (microseconds) advertised flow window size (packets), and estimated link capacity (packets per second) |
- m_PacketVector[1].iov_base = (char *)rparam; |
- m_PacketVector[1].iov_len = size; |
- |
- break; |
- |
- case 6: //0110 - Acknowledgement of Acknowledgement (ACK-2) |
- // ACK packet seq. no. |
- m_nHeader[1] = *(int32_t *)lparam; |
- |
- // control info field should be none |
- // but "writev" does not allow this |
- m_PacketVector[1].iov_base = (char *)&__pad; //NULL; |
- m_PacketVector[1].iov_len = 4; //0; |
- |
- break; |
- |
- case 3: //0011 - Loss Report (NAK) |
- // loss list |
- m_PacketVector[1].iov_base = (char *)rparam; |
- m_PacketVector[1].iov_len = size; |
- |
- break; |
- |
- case 4: //0100 - Congestion Warning |
- // control info field should be none |
- // but "writev" does not allow this |
- m_PacketVector[1].iov_base = (char *)&__pad; //NULL; |
- m_PacketVector[1].iov_len = 4; //0; |
- |
- break; |
- |
- case 1: //0001 - Keep-alive |
- // control info field should be none |
- // but "writev" does not allow this |
- m_PacketVector[1].iov_base = (char *)&__pad; //NULL; |
- m_PacketVector[1].iov_len = 4; //0; |
- |
- break; |
- |
- case 0: //0000 - Handshake |
- // control info filed is handshake info |
- m_PacketVector[1].iov_base = (char *)rparam; |
- m_PacketVector[1].iov_len = size; //sizeof(CHandShake); |
- |
- break; |
- |
- case 5: //0101 - Shutdown |
- // control info field should be none |
- // but "writev" does not allow this |
- m_PacketVector[1].iov_base = (char *)&__pad; //NULL; |
- m_PacketVector[1].iov_len = 4; //0; |
- |
- break; |
- |
- case 7: //0111 - Message Drop Request |
- // msg id |
- m_nHeader[1] = *(int32_t *)lparam; |
- |
- //first seq no, last seq no |
- m_PacketVector[1].iov_base = (char *)rparam; |
- m_PacketVector[1].iov_len = size; |
- |
- break; |
- |
- case 8: //1000 - Error Signal from the Peer Side |
- // Error type |
- m_nHeader[1] = *(int32_t *)lparam; |
- |
- // control info field should be none |
- // but "writev" does not allow this |
- m_PacketVector[1].iov_base = (char *)&__pad; //NULL; |
- m_PacketVector[1].iov_len = 4; //0; |
- |
- break; |
- |
- case 32767: //0x7FFF - Reserved for user defined control packets |
- // for extended control packet |
- // "lparam" contains the extended type information for bit 16 - 31 |
- // "rparam" is the control information |
- m_nHeader[0] |= *(int32_t *)lparam; |
- |
- if (NULL != rparam) |
- { |
- m_PacketVector[1].iov_base = (char *)rparam; |
- m_PacketVector[1].iov_len = size; |
- } |
- else |
- { |
- m_PacketVector[1].iov_base = (char *)&__pad; |
- m_PacketVector[1].iov_len = 4; |
- } |
- |
- break; |
- |
- default: |
- break; |
- } |
-} |
- |
-iovec* CPacket::getPacketVector() |
-{ |
- return m_PacketVector; |
-} |
- |
-int CPacket::getFlag() const |
-{ |
- // read bit 0 |
- return m_nHeader[0] >> 31; |
-} |
- |
-int CPacket::getType() const |
-{ |
- // read bit 1~15 |
- return (m_nHeader[0] >> 16) & 0x00007FFF; |
-} |
- |
-int CPacket::getExtendedType() const |
-{ |
- // read bit 16~31 |
- return m_nHeader[0] & 0x0000FFFF; |
-} |
- |
-int32_t CPacket::getAckSeqNo() const |
-{ |
- // read additional information field |
- return m_nHeader[1]; |
-} |
- |
-int CPacket::getMsgBoundary() const |
-{ |
- // read [1] bit 0~1 |
- return m_nHeader[1] >> 30; |
-} |
- |
-bool CPacket::getMsgOrderFlag() const |
-{ |
- // read [1] bit 2 |
- return (1 == ((m_nHeader[1] >> 29) & 1)); |
-} |
- |
-int32_t CPacket::getMsgSeq() const |
-{ |
- // read [1] bit 3~31 |
- return m_nHeader[1] & 0x1FFFFFFF; |
-} |
- |
-CPacket* CPacket::clone() const |
-{ |
- CPacket* pkt = new CPacket; |
- memcpy(pkt->m_nHeader, m_nHeader, m_iPktHdrSize); |
- pkt->m_pcData = new char[m_PacketVector[1].iov_len]; |
- memcpy(pkt->m_pcData, m_pcData, m_PacketVector[1].iov_len); |
- pkt->m_PacketVector[1].iov_len = m_PacketVector[1].iov_len; |
- |
- return pkt; |
-} |
- |
-CHandShake::CHandShake(): |
-m_iVersion(0), |
-m_iType(0), |
-m_iISN(0), |
-m_iMSS(0), |
-m_iFlightFlagSize(0), |
-m_iReqType(0), |
-m_iID(0), |
-m_iCookie(0), |
-m_piPeerIP() |
-{ |
-} |
- |
-int CHandShake::serialize(char* buf, int& size) |
-{ |
- if (size < m_iContentSize) |
- return -1; |
- |
- int32_t* p = (int32_t*)buf; |
- *p++ = m_iVersion; |
- *p++ = m_iType; |
- *p++ = m_iISN; |
- *p++ = m_iMSS; |
- *p++ = m_iFlightFlagSize; |
- *p++ = m_iReqType; |
- *p++ = m_iID; |
- *p++ = m_iCookie; |
- for (int i = 0; i < 4; ++ i) |
- *p++ = m_piPeerIP[i]; |
- |
- size = m_iContentSize; |
- |
- return 0; |
-} |
- |
-int CHandShake::deserialize(const char* buf, const int& size) |
-{ |
- if (size < m_iContentSize) |
- return -1; |
- |
- int32_t* p = (int32_t*)buf; |
- m_iVersion = *p++; |
- m_iType = *p++; |
- m_iISN = *p++; |
- m_iMSS = *p++; |
- m_iFlightFlagSize = *p++; |
- m_iReqType = *p++; |
- m_iID = *p++; |
- m_iCookie = *p++; |
- for (int i = 0; i < 4; ++ i) |
- m_piPeerIP[i] = *p++; |
- |
- return 0; |
-} |