Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Side by Side Diff: net/third_party/udt/src/core.h

Issue 6708091: Remove UDT. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/third_party/udt/src/common.cpp ('k') | net/third_party/udt/src/core.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*****************************************************************************
2 Copyright (c) 2001 - 2011, The Board of Trustees of the University of Illinois.
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are
7 met:
8
9 * Redistributions of source code must retain the above
10 copyright notice, this list of conditions and the
11 following disclaimer.
12
13 * Redistributions in binary form must reproduce the
14 above copyright notice, this list of conditions
15 and the following disclaimer in the documentation
16 and/or other materials provided with the distribution.
17
18 * Neither the name of the University of Illinois
19 nor the names of its contributors may be used to
20 endorse or promote products derived from this
21 software without specific prior written permission.
22
23 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
24 IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
25 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26 PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
27 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
28 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
29 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 *****************************************************************************/
35
36 /*****************************************************************************
37 written by
38 Yunhong Gu, last updated 01/27/2011
39 *****************************************************************************/
40
41 #ifndef __UDT_CORE_H__
42 #define __UDT_CORE_H__
43
44
45 #include "udt.h"
46 #include "common.h"
47 #include "list.h"
48 #include "buffer.h"
49 #include "window.h"
50 #include "packet.h"
51 #include "channel.h"
52 #include "api.h"
53 #include "ccc.h"
54 #include "cache.h"
55 #include "queue.h"
56
57 enum UDTSockType {UDT_STREAM = 1, UDT_DGRAM};
58
59 class CUDT
60 {
61 friend class CUDTSocket;
62 friend class CUDTUnited;
63 friend class CCC;
64 friend struct CUDTComp;
65 friend class CCache;
66 friend class CSndQueue;
67 friend class CRcvQueue;
68 friend class CSndUList;
69 friend class CRcvUList;
70
71 private: // constructor and desctructor
72 CUDT();
73 CUDT(const CUDT& ancestor);
74 const CUDT& operator=(const CUDT&) {return *this;}
75 ~CUDT();
76
77 public: //API
78 static int startup();
79 static int cleanup();
80 static UDTSOCKET socket(int af, int type = SOCK_STREAM, int protocol = 0);
81 static int bind(UDTSOCKET u, const sockaddr* name, int namelen);
82 static int bind(UDTSOCKET u, UDPSOCKET udpsock);
83 static int listen(UDTSOCKET u, int backlog);
84 static UDTSOCKET accept(UDTSOCKET u, sockaddr* addr, int* addrlen);
85 static int connect(UDTSOCKET u, const sockaddr* name, int namelen);
86 static int close(UDTSOCKET u);
87 static int getpeername(UDTSOCKET u, sockaddr* name, int* namelen);
88 static int getsockname(UDTSOCKET u, sockaddr* name, int* namelen);
89 static int getsockopt(UDTSOCKET u, int level, UDTOpt optname, void* optval, i nt* optlen);
90 static int setsockopt(UDTSOCKET u, int level, UDTOpt optname, const void* opt val, int optlen);
91 static int send(UDTSOCKET u, const char* buf, int len, int flags);
92 static int recv(UDTSOCKET u, char* buf, int len, int flags);
93 static int sendmsg(UDTSOCKET u, const char* buf, int len, int ttl = -1, bool inorder = false);
94 static int recvmsg(UDTSOCKET u, char* buf, int len);
95 static int64_t sendfile(UDTSOCKET u, std::fstream& ifs, int64_t& offset, cons t int64_t& size, const int& block = 364000);
96 static int64_t recvfile(UDTSOCKET u, std::fstream& ofs, int64_t& offset, cons t int64_t& size, const int& block = 7280000);
97 static int select(int nfds, ud_set* readfds, ud_set* writefds, ud_set* except fds, const timeval* timeout);
98 static int selectEx(const std::vector<UDTSOCKET>& fds, std::vector<UDTSOCKET> * readfds, std::vector<UDTSOCKET>* writefds, std::vector<UDTSOCKET>* exceptfds, int64_t msTimeOut);
99 static int epoll_create();
100 static int epoll_add_usock(const int eid, const UDTSOCKET u, const int* event s = NULL);
101 static int epoll_add_ssock(const int eid, const SYSSOCKET s, const int* event s = NULL);
102 static int epoll_remove_usock(const int eid, const UDTSOCKET u, const int* ev ents = NULL);
103 static int epoll_remove_ssock(const int eid, const SYSSOCKET s, const int* ev ents = NULL);
104 static int epoll_wait(const int eid, std::set<UDTSOCKET>* readfds, std::set<U DTSOCKET>* writefds, int64_t msTimeOut, std::set<SYSSOCKET>* lrfds = NULL, std:: set<SYSSOCKET>* wrfds = NULL);
105 static int epoll_release(const int eid);
106 static CUDTException& getlasterror();
107 static int perfmon(UDTSOCKET u, CPerfMon* perf, bool clear = true);
108 static UDTSTATUS getsockstate(UDTSOCKET u);
109
110 public: // internal API
111 static CUDT* getUDTHandle(UDTSOCKET u);
112
113 private:
114 // Functionality:
115 // initialize a UDT entity and bind to a local address.
116 // Parameters:
117 // None.
118 // Returned value:
119 // None.
120
121 void open();
122
123 // Functionality:
124 // Start listening to any connection request.
125 // Parameters:
126 // None.
127 // Returned value:
128 // None.
129
130 void listen();
131
132 // Functionality:
133 // Connect to a UDT entity listening at address "peer".
134 // Parameters:
135 // 0) [in] peer: The address of the listening UDT entity.
136 // Returned value:
137 // None.
138
139 void connect(const sockaddr* peer);
140
141 // Functionality:
142 // Connect to a UDT entity listening at address "peer", which has sent "hs" request.
143 // Parameters:
144 // 0) [in] peer: The address of the listening UDT entity.
145 // 1) [in/out] hs: The handshake information sent by the peer side (in) , negotiated value (out).
146 // Returned value:
147 // None.
148
149 void connect(const sockaddr* peer, CHandShake* hs);
150
151 // Functionality:
152 // Close the opened UDT entity.
153 // Parameters:
154 // None.
155 // Returned value:
156 // None.
157
158 void close();
159
160 // Functionality:
161 // Request UDT to send out a data block "data" with size of "len".
162 // Parameters:
163 // 0) [in] data: The address of the application data to be sent.
164 // 1) [in] len: The size of the data block.
165 // Returned value:
166 // Actual size of data sent.
167
168 int send(const char* data, const int& len);
169
170 // Functionality:
171 // Request UDT to receive data to a memory block "data" with size of "l en".
172 // Parameters:
173 // 0) [out] data: data received.
174 // 1) [in] len: The desired size of data to be received.
175 // Returned value:
176 // Actual size of data received.
177
178 int recv(char* data, const int& len);
179
180 // Functionality:
181 // send a message of a memory block "data" with size of "len".
182 // Parameters:
183 // 0) [out] data: data received.
184 // 1) [in] len: The desired size of data to be received.
185 // 2) [in] ttl: the time-to-live of the message.
186 // 3) [in] inorder: if the message should be delivered in order.
187 // Returned value:
188 // Actual size of data sent.
189
190 int sendmsg(const char* data, const int& len, const int& ttl, const bool& ino rder);
191
192 // Functionality:
193 // Receive a message to buffer "data".
194 // Parameters:
195 // 0) [out] data: data received.
196 // 1) [in] len: size of the buffer.
197 // Returned value:
198 // Actual size of data received.
199
200 int recvmsg(char* data, const int& len);
201
202 // Functionality:
203 // Request UDT to send out a file described as "fd", starting from "off set", with size of "size".
204 // Parameters:
205 // 0) [in] ifs: The input file stream.
206 // 1) [in, out] offset: From where to read and send data; output is the new offset when the call returns.
207 // 2) [in] size: How many data to be sent.
208 // 3) [in] block: size of block per read from disk
209 // Returned value:
210 // Actual size of data sent.
211
212 int64_t sendfile(std::fstream& ifs, int64_t& offset, const int64_t& size, con st int& block = 366000);
213
214 // Functionality:
215 // Request UDT to receive data into a file described as "fd", starting from "offset", with expected size of "size".
216 // Parameters:
217 // 0) [out] ofs: The output file stream.
218 // 1) [in, out] offset: From where to write data; output is the new off set when the call returns.
219 // 2) [in] size: How many data to be received.
220 // 3) [in] block: size of block per write to disk
221 // Returned value:
222 // Actual size of data received.
223
224 int64_t recvfile(std::fstream& ofs, int64_t& offset, const int64_t& size, con st int& block = 7320000);
225
226 // Functionality:
227 // Configure UDT options.
228 // Parameters:
229 // 0) [in] optName: The enum name of a UDT option.
230 // 1) [in] optval: The value to be set.
231 // 2) [in] optlen: size of "optval".
232 // Returned value:
233 // None.
234
235 void setOpt(UDTOpt optName, const void* optval, const int& optlen);
236
237 // Functionality:
238 // Read UDT options.
239 // Parameters:
240 // 0) [in] optName: The enum name of a UDT option.
241 // 1) [in] optval: The value to be returned.
242 // 2) [out] optlen: size of "optval".
243 // Returned value:
244 // None.
245
246 void getOpt(UDTOpt optName, void* optval, int& optlen);
247
248 // Functionality:
249 // read the performance data since last sample() call.
250 // Parameters:
251 // 0) [in, out] perf: pointer to a CPerfMon structure to record the per formance data.
252 // 1) [in] clear: flag to decide if the local performance trace should be cleared.
253 // Returned value:
254 // None.
255
256 void sample(CPerfMon* perf, bool clear = true);
257
258 private:
259 static CUDTUnited s_UDTUnited; // UDT global management base
260
261 public:
262 static const UDTSOCKET INVALID_SOCK; // invalid socket descriptor
263 static const int ERROR; // socket api error returned val ue
264
265 private: // Identification
266 UDTSOCKET m_SocketID; // UDT socket number
267 UDTSockType m_iSockType; // Type of the UDT connection (S OCK_STREAM or SOCK_DGRAM)
268 UDTSOCKET m_PeerID; // peer id, for multiplexer
269 static const int m_iVersion; // UDT version, for compatibilit y use
270
271 private: // Packet sizes
272 int m_iPktSize; // Maximum/regular packet size, in bytes
273 int m_iPayloadSize; // Maximum/regular payload size, in bytes
274
275 private: // Options
276 int m_iMSS; // Maximum Segment Size, in byte s
277 bool m_bSynSending; // Sending syncronization mode
278 bool m_bSynRecving; // Receiving syncronization mode
279 int m_iFlightFlagSize; // Maximum number of packets in flight from the peer side
280 int m_iSndBufSize; // Maximum UDT sender buffer siz e
281 int m_iRcvBufSize; // Maximum UDT receiver buffer s ize
282 linger m_Linger; // Linger information on close
283 int m_iUDPSndBufSize; // UDP sending buffer size
284 int m_iUDPRcvBufSize; // UDP receiving buffer size
285 int m_iIPversion; // IP version
286 bool m_bRendezvous; // Rendezvous connection mode
287 int m_iSndTimeOut; // sending timeout in millisecon ds
288 int m_iRcvTimeOut; // receiving timeout in millisec onds
289 bool m_bReuseAddr; // reuse an exiting port or not, for UDP multiplexer
290 int64_t m_llMaxBW; // maximum data transfer rate (t hreshold)
291
292 private: // congestion control
293 CCCVirtualFactory* m_pCCFactory; // Factory class to create a spe cific CC instance
294 CCC* m_pCC; // congestion control class
295 CCache* m_pCache; // network information cache
296
297 private: // Status
298 volatile bool m_bListening; // If the UDT entit is listening to connection
299 volatile bool m_bConnected; // Whether the connection is on or off
300 volatile bool m_bClosing; // If the UDT entity is closing
301 volatile bool m_bShutdown; // If the peer side has shutdown the connection
302 volatile bool m_bBroken; // If the connection has been br oken
303 volatile bool m_bPeerHealth; // If the peer status is normal
304 bool m_bOpened; // If the UDT entity has been op ened
305 int m_iBrokenCounter; // a counter (number of GC check s) to let the GC tag this socket as disconnected
306
307 int m_iEXPCount; // Expiration counter
308 int m_iBandwidth; // Estimated bandwidth, number o f packets per second
309 int m_iRTT; // RTT, in microseconds
310 int m_iRTTVar; // RTT variance
311 int m_iDeliveryRate; // Packet arrival rate at the re ceiver side
312
313 uint64_t m_ullLingerExpiration; // Linger expiration time (for G C to close a socket with data in sending buffer)
314
315 private: // Sending related data
316 CSndBuffer* m_pSndBuffer; // Sender buffer
317 CSndLossList* m_pSndLossList; // Sender loss list
318 CPktTimeWindow* m_pSndTimeWindow; // Packet sending time window
319
320 volatile uint64_t m_ullInterval; // Inter-packet time, in CPU clo ck cycles
321 uint64_t m_ullTimeDiff; // aggregate difference in inter -packet time
322
323 volatile int m_iFlowWindowSize; // Flow control window size
324 volatile double m_dCongestionWindow; // congestion window size
325
326 volatile int32_t m_iSndLastAck; // Last ACK received
327 volatile int32_t m_iSndLastDataAck; // The real last ACK that update s the sender buffer and loss list
328 volatile int32_t m_iSndCurrSeqNo; // The largest sequence number t hat has been sent
329 int32_t m_iLastDecSeq; // Sequence number sent last dec rease occurs
330 int32_t m_iSndLastAck2; // Last ACK2 sent back
331 uint64_t m_ullSndLastAck2Time; // The time when last ACK2 was s ent back
332
333 int32_t m_iISN; // Initial Sequence Number
334
335 private: // Receiving related data
336 CRcvBuffer* m_pRcvBuffer; // Receiver buffer
337 CRcvLossList* m_pRcvLossList; // Receiver loss list
338 CACKWindow* m_pACKWindow; // ACK history window
339 CPktTimeWindow* m_pRcvTimeWindow; // Packet arrival time window
340
341 int32_t m_iRcvLastAck; // Last sent ACK
342 uint64_t m_ullLastAckTime; // Timestamp of last ACK
343 int32_t m_iRcvLastAckAck; // Last sent ACK that has been a cknowledged
344 int32_t m_iAckSeqNo; // Last ACK sequence number
345 int32_t m_iRcvCurrSeqNo; // Largest received sequence num ber
346
347 uint64_t m_ullLastWarningTime; // Last time that a warning mess age is sent
348
349 int32_t m_iPeerISN; // Initial Sequence Number of th e peer side
350
351 private: // synchronization: mutexes and conditions
352 pthread_mutex_t m_ConnectionLock; // used to synchronize connectio n operation
353
354 pthread_cond_t m_SendBlockCond; // used to block "send" call
355 pthread_mutex_t m_SendBlockLock; // lock associated to m_SendBloc kCond
356
357 pthread_mutex_t m_AckLock; // used to protected sender's lo ss list when processing ACK
358
359 pthread_cond_t m_RecvDataCond; // used to block "recv" when the re is no data
360 pthread_mutex_t m_RecvDataLock; // lock associated to m_RecvData Cond
361
362 pthread_mutex_t m_SendLock; // used to synchronize "send" ca ll
363 pthread_mutex_t m_RecvLock; // used to synchronize "recv" ca ll
364
365 void initSynch();
366 void destroySynch();
367 void releaseSynch();
368
369 private: // Generation and processing of packets
370 void sendCtrl(const int& pkttype, void* lparam = NULL, void* rparam = NULL, c onst int& size = 0);
371 void processCtrl(CPacket& ctrlpkt);
372 int packData(CPacket& packet, uint64_t& ts);
373 int processData(CUnit* unit);
374 int listen(sockaddr* addr, CPacket& packet);
375
376 private: // Trace
377 uint64_t m_StartTime; // timestamp when the UDT entity is started
378 int64_t m_llSentTotal; // total number of sent data pac kets, including retransmissions
379 int64_t m_llRecvTotal; // total number of received pack ets
380 int m_iSndLossTotal; // total number of lost packets (sender side)
381 int m_iRcvLossTotal; // total number of lost packets (receiver side)
382 int m_iRetransTotal; // total number of retransmitted packets
383 int m_iSentACKTotal; // total number of sent ACK pack ets
384 int m_iRecvACKTotal; // total number of received ACK packets
385 int m_iSentNAKTotal; // total number of sent NAK pack ets
386 int m_iRecvNAKTotal; // total number of received NAK packets
387 int64_t m_llSndDurationTotal; // total real time for sending
388
389 uint64_t m_LastSampleTime; // last performance sample time
390 int64_t m_llTraceSent; // number of pakctes sent in the last trace interval
391 int64_t m_llTraceRecv; // number of pakctes received in the last trace interval
392 int m_iTraceSndLoss; // number of lost packets in the last trace interval (sender side)
393 int m_iTraceRcvLoss; // number of lost packets in the last trace interval (receiver side)
394 int m_iTraceRetrans; // number of retransmitted packe ts in the last trace interval
395 int m_iSentACK; // number of ACKs sent in the la st trace interval
396 int m_iRecvACK; // number of ACKs received in th e last trace interval
397 int m_iSentNAK; // number of NAKs sent in the la st trace interval
398 int m_iRecvNAK; // number of NAKs received in th e last trace interval
399 int64_t m_llSndDuration; // real time for sending
400 int64_t m_llSndDurationCounter; // timers to record the sending duration
401
402 private: // Timers
403 uint64_t m_ullCPUFrequency; // CPU clock frequency, used for Timer, ticks per microsecond
404
405 static const int m_iSYNInterval; // Periodical Rate Control Inter val, 10000 microsecond
406 static const int m_iSelfClockInterval; // ACK interval for self-clockin g
407
408 uint64_t m_ullNextACKTime; // Next ACK time, in CPU clock c ycles, same below
409 uint64_t m_ullNextNAKTime; // Next NAK time
410 uint64_t m_ullNextEXPTime; // Next timeout
411
412 volatile uint64_t m_ullSYNInt; // SYN interval
413 volatile uint64_t m_ullACKInt; // ACK interval
414 volatile uint64_t m_ullNAKInt; // NAK interval
415 volatile uint64_t m_ullEXPInt; // EXP interval
416 volatile int64_t m_llLastRspTime; // time stamp of last response f rom the peer
417
418 uint64_t m_ullMinNakInt; // NAK timeout lower bound; too small value can cause unnecessary retransmission
419 uint64_t m_ullMinExpInt; // timeout lower bound threshold : too small timeout can cause problem
420
421 int m_iPktCount; // packet counter for ACK
422 int m_iLightACKCount; // light ACK counter
423
424 uint64_t m_ullTargetTime; // scheduled time of next packet sending
425
426 void checkTimers();
427
428 private: // for UDP multiplexer
429 CSndQueue* m_pSndQueue; // packet sending queue
430 CRcvQueue* m_pRcvQueue; // packet receiving queue
431 sockaddr* m_pPeerAddr; // peer address
432 uint32_t m_piSelfIP[4]; // local UDP IP address
433 CSNode* m_pSNode; // node information for UDT list used in snd queue
434 CRNode* m_pRNode; // node information for UDT list used in rcv queue
435
436 private: // for epoll
437 std::set<int> m_sPollID; // set of epoll ID to trigger
438 void addEPoll(const int eid);
439 void removeEPoll(const int eid);
440 };
441
442
443 #endif
OLDNEW
« no previous file with comments | « net/third_party/udt/src/common.cpp ('k') | net/third_party/udt/src/core.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698