| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
| 3  * | 3  * | 
| 4  *  Use of this source code is governed by a BSD-style license | 4  *  Use of this source code is governed by a BSD-style license | 
| 5  *  that can be found in the LICENSE file in the root of the source | 5  *  that can be found in the LICENSE file in the root of the source | 
| 6  *  tree. An additional intellectual property rights grant can be found | 6  *  tree. An additional intellectual property rights grant can be found | 
| 7  *  in the file PATENTS.  All contributing project authors may | 7  *  in the file PATENTS.  All contributing project authors may | 
| 8  *  be found in the AUTHORS file in the root of the source tree. | 8  *  be found in the AUTHORS file in the root of the source tree. | 
| 9  */ | 9  */ | 
| 10 | 10 | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 23 ////////////////////////////////////////////////////////////////////// | 23 ////////////////////////////////////////////////////////////////////// | 
| 24 | 24 | 
| 25 class PseudoTcp; | 25 class PseudoTcp; | 
| 26 | 26 | 
| 27 class IPseudoTcpNotify { | 27 class IPseudoTcpNotify { | 
| 28  public: | 28  public: | 
| 29   // Notification of tcp events | 29   // Notification of tcp events | 
| 30   virtual void OnTcpOpen(PseudoTcp* tcp) = 0; | 30   virtual void OnTcpOpen(PseudoTcp* tcp) = 0; | 
| 31   virtual void OnTcpReadable(PseudoTcp* tcp) = 0; | 31   virtual void OnTcpReadable(PseudoTcp* tcp) = 0; | 
| 32   virtual void OnTcpWriteable(PseudoTcp* tcp) = 0; | 32   virtual void OnTcpWriteable(PseudoTcp* tcp) = 0; | 
| 33   virtual void OnTcpClosed(PseudoTcp* tcp, uint32 error) = 0; | 33   virtual void OnTcpClosed(PseudoTcp* tcp, uint32_t error) = 0; | 
| 34 | 34 | 
| 35   // Write the packet onto the network | 35   // Write the packet onto the network | 
| 36   enum WriteResult { WR_SUCCESS, WR_TOO_LARGE, WR_FAIL }; | 36   enum WriteResult { WR_SUCCESS, WR_TOO_LARGE, WR_FAIL }; | 
| 37   virtual WriteResult TcpWritePacket(PseudoTcp* tcp, | 37   virtual WriteResult TcpWritePacket(PseudoTcp* tcp, | 
| 38                                      const char* buffer, size_t len) = 0; | 38                                      const char* buffer, size_t len) = 0; | 
| 39 | 39 | 
| 40  protected: | 40  protected: | 
| 41   virtual ~IPseudoTcpNotify() {} | 41   virtual ~IPseudoTcpNotify() {} | 
| 42 }; | 42 }; | 
| 43 | 43 | 
| 44 ////////////////////////////////////////////////////////////////////// | 44 ////////////////////////////////////////////////////////////////////// | 
| 45 // PseudoTcp | 45 // PseudoTcp | 
| 46 ////////////////////////////////////////////////////////////////////// | 46 ////////////////////////////////////////////////////////////////////// | 
| 47 | 47 | 
| 48 class PseudoTcp { | 48 class PseudoTcp { | 
| 49  public: | 49  public: | 
| 50   static uint32 Now(); | 50   static uint32_t Now(); | 
| 51 | 51 | 
| 52   PseudoTcp(IPseudoTcpNotify* notify, uint32 conv); | 52   PseudoTcp(IPseudoTcpNotify* notify, uint32_t conv); | 
| 53   virtual ~PseudoTcp(); | 53   virtual ~PseudoTcp(); | 
| 54 | 54 | 
| 55   int Connect(); | 55   int Connect(); | 
| 56   int Recv(char* buffer, size_t len); | 56   int Recv(char* buffer, size_t len); | 
| 57   int Send(const char* buffer, size_t len); | 57   int Send(const char* buffer, size_t len); | 
| 58   void Close(bool force); | 58   void Close(bool force); | 
| 59   int GetError(); | 59   int GetError(); | 
| 60 | 60 | 
| 61   enum TcpState { | 61   enum TcpState { | 
| 62     TCP_LISTEN, TCP_SYN_SENT, TCP_SYN_RECEIVED, TCP_ESTABLISHED, TCP_CLOSED | 62     TCP_LISTEN, TCP_SYN_SENT, TCP_SYN_RECEIVED, TCP_ESTABLISHED, TCP_CLOSED | 
| 63   }; | 63   }; | 
| 64   TcpState State() const { return m_state; } | 64   TcpState State() const { return m_state; } | 
| 65 | 65 | 
| 66   // Call this when the PMTU changes. | 66   // Call this when the PMTU changes. | 
| 67   void NotifyMTU(uint16 mtu); | 67   void NotifyMTU(uint16_t mtu); | 
| 68 | 68 | 
| 69   // Call this based on timeout value returned from GetNextClock. | 69   // Call this based on timeout value returned from GetNextClock. | 
| 70   // It's ok to call this too frequently. | 70   // It's ok to call this too frequently. | 
| 71   void NotifyClock(uint32 now); | 71   void NotifyClock(uint32_t now); | 
| 72 | 72 | 
| 73   // Call this whenever a packet arrives. | 73   // Call this whenever a packet arrives. | 
| 74   // Returns true if the packet was processed successfully. | 74   // Returns true if the packet was processed successfully. | 
| 75   bool NotifyPacket(const char * buffer, size_t len); | 75   bool NotifyPacket(const char * buffer, size_t len); | 
| 76 | 76 | 
| 77   // Call this to determine the next time NotifyClock should be called. | 77   // Call this to determine the next time NotifyClock should be called. | 
| 78   // Returns false if the socket is ready to be destroyed. | 78   // Returns false if the socket is ready to be destroyed. | 
| 79   bool GetNextClock(uint32 now, long& timeout); | 79   bool GetNextClock(uint32_t now, long& timeout); | 
| 80 | 80 | 
| 81   // Call these to get/set option values to tailor this PseudoTcp | 81   // Call these to get/set option values to tailor this PseudoTcp | 
| 82   // instance's behaviour for the kind of data it will carry. | 82   // instance's behaviour for the kind of data it will carry. | 
| 83   // If an unrecognized option is set or got, an assertion will fire. | 83   // If an unrecognized option is set or got, an assertion will fire. | 
| 84   // | 84   // | 
| 85   // Setting options for OPT_RCVBUF or OPT_SNDBUF after Connect() is called | 85   // Setting options for OPT_RCVBUF or OPT_SNDBUF after Connect() is called | 
| 86   // will result in an assertion. | 86   // will result in an assertion. | 
| 87   enum Option { | 87   enum Option { | 
| 88     OPT_NODELAY,      // Whether to enable Nagle's algorithm (0 == off) | 88     OPT_NODELAY,      // Whether to enable Nagle's algorithm (0 == off) | 
| 89     OPT_ACKDELAY,     // The Delayed ACK timeout (0 == off). | 89     OPT_ACKDELAY,     // The Delayed ACK timeout (0 == off). | 
| 90     OPT_RCVBUF,       // Set the receive buffer size, in bytes. | 90     OPT_RCVBUF,       // Set the receive buffer size, in bytes. | 
| 91     OPT_SNDBUF,       // Set the send buffer size, in bytes. | 91     OPT_SNDBUF,       // Set the send buffer size, in bytes. | 
| 92   }; | 92   }; | 
| 93   void GetOption(Option opt, int* value); | 93   void GetOption(Option opt, int* value); | 
| 94   void SetOption(Option opt, int value); | 94   void SetOption(Option opt, int value); | 
| 95 | 95 | 
| 96   // Returns current congestion window in bytes. | 96   // Returns current congestion window in bytes. | 
| 97   uint32 GetCongestionWindow() const; | 97   uint32_t GetCongestionWindow() const; | 
| 98 | 98 | 
| 99   // Returns amount of data in bytes that has been sent, but haven't | 99   // Returns amount of data in bytes that has been sent, but haven't | 
| 100   // been acknowledged. | 100   // been acknowledged. | 
| 101   uint32 GetBytesInFlight() const; | 101   uint32_t GetBytesInFlight() const; | 
| 102 | 102 | 
| 103   // Returns number of bytes that were written in buffer and haven't | 103   // Returns number of bytes that were written in buffer and haven't | 
| 104   // been sent. | 104   // been sent. | 
| 105   uint32 GetBytesBufferedNotSent() const; | 105   uint32_t GetBytesBufferedNotSent() const; | 
| 106 | 106 | 
| 107   // Returns current round-trip time estimate in milliseconds. | 107   // Returns current round-trip time estimate in milliseconds. | 
| 108   uint32 GetRoundTripTimeEstimateMs() const; | 108   uint32_t GetRoundTripTimeEstimateMs() const; | 
| 109 | 109 | 
| 110  protected: | 110  protected: | 
| 111   enum SendFlags { sfNone, sfDelayedAck, sfImmediateAck }; | 111   enum SendFlags { sfNone, sfDelayedAck, sfImmediateAck }; | 
| 112 | 112 | 
| 113   struct Segment { | 113   struct Segment { | 
| 114     uint32 conv, seq, ack; | 114     uint32_t conv, seq, ack; | 
| 115     uint8 flags; | 115     uint8_t flags; | 
| 116     uint16 wnd; | 116     uint16_t wnd; | 
| 117     const char * data; | 117     const char * data; | 
| 118     uint32 len; | 118     uint32_t len; | 
| 119     uint32 tsval, tsecr; | 119     uint32_t tsval, tsecr; | 
| 120   }; | 120   }; | 
| 121 | 121 | 
| 122   struct SSegment { | 122   struct SSegment { | 
| 123     SSegment(uint32 s, uint32 l, bool c) | 123     SSegment(uint32_t s, uint32_t l, bool c) | 
| 124         : seq(s), len(l), /*tstamp(0),*/ xmit(0), bCtrl(c) { | 124         : seq(s), len(l), /*tstamp(0),*/ xmit(0), bCtrl(c) {} | 
| 125     } | 125     uint32_t seq, len; | 
| 126     uint32 seq, len; | 126     // uint32_t tstamp; | 
| 127     //uint32 tstamp; | 127     uint8_t xmit; | 
| 128     uint8 xmit; |  | 
| 129     bool bCtrl; | 128     bool bCtrl; | 
| 130   }; | 129   }; | 
| 131   typedef std::list<SSegment> SList; | 130   typedef std::list<SSegment> SList; | 
| 132 | 131 | 
| 133   struct RSegment { | 132   struct RSegment { | 
| 134     uint32 seq, len; | 133     uint32_t seq, len; | 
| 135   }; | 134   }; | 
| 136 | 135 | 
| 137   uint32 queue(const char* data, uint32 len, bool bCtrl); | 136   uint32_t queue(const char* data, uint32_t len, bool bCtrl); | 
| 138 | 137 | 
| 139   // Creates a packet and submits it to the network. This method can either | 138   // Creates a packet and submits it to the network. This method can either | 
| 140   // send payload or just an ACK packet. | 139   // send payload or just an ACK packet. | 
| 141   // | 140   // | 
| 142   // |seq| is the sequence number of this packet. | 141   // |seq| is the sequence number of this packet. | 
| 143   // |flags| is the flags for sending this packet. | 142   // |flags| is the flags for sending this packet. | 
| 144   // |offset| is the offset to read from |m_sbuf|. | 143   // |offset| is the offset to read from |m_sbuf|. | 
| 145   // |len| is the number of bytes to read from |m_sbuf| as payload. If this | 144   // |len| is the number of bytes to read from |m_sbuf| as payload. If this | 
| 146   // value is 0 then this is an ACK packet, otherwise this packet has payload. | 145   // value is 0 then this is an ACK packet, otherwise this packet has payload. | 
| 147   IPseudoTcpNotify::WriteResult packet(uint32 seq, uint8 flags, | 146   IPseudoTcpNotify::WriteResult packet(uint32_t seq, | 
| 148                                        uint32 offset, uint32 len); | 147                                        uint8_t flags, | 
| 149   bool parse(const uint8* buffer, uint32 size); | 148                                        uint32_t offset, | 
|  | 149                                        uint32_t len); | 
|  | 150   bool parse(const uint8_t* buffer, uint32_t size); | 
| 150 | 151 | 
| 151   void attemptSend(SendFlags sflags = sfNone); | 152   void attemptSend(SendFlags sflags = sfNone); | 
| 152 | 153 | 
| 153   void closedown(uint32 err = 0); | 154   void closedown(uint32_t err = 0); | 
| 154 | 155 | 
| 155   bool clock_check(uint32 now, long& nTimeout); | 156   bool clock_check(uint32_t now, long& nTimeout); | 
| 156 | 157 | 
| 157   bool process(Segment& seg); | 158   bool process(Segment& seg); | 
| 158   bool transmit(const SList::iterator& seg, uint32 now); | 159   bool transmit(const SList::iterator& seg, uint32_t now); | 
| 159 | 160 | 
| 160   void adjustMTU(); | 161   void adjustMTU(); | 
| 161 | 162 | 
| 162  protected: | 163  protected: | 
| 163   // This method is used in test only to query receive buffer state. | 164   // This method is used in test only to query receive buffer state. | 
| 164   bool isReceiveBufferFull() const; | 165   bool isReceiveBufferFull() const; | 
| 165 | 166 | 
| 166   // This method is only used in tests, to disable window scaling | 167   // This method is only used in tests, to disable window scaling | 
| 167   // support for testing backward compatibility. | 168   // support for testing backward compatibility. | 
| 168   void disableWindowScale(); | 169   void disableWindowScale(); | 
| 169 | 170 | 
| 170  private: | 171  private: | 
| 171   // Queue the connect message with TCP options. | 172   // Queue the connect message with TCP options. | 
| 172   void queueConnectMessage(); | 173   void queueConnectMessage(); | 
| 173 | 174 | 
| 174   // Parse TCP options in the header. | 175   // Parse TCP options in the header. | 
| 175   void parseOptions(const char* data, uint32 len); | 176   void parseOptions(const char* data, uint32_t len); | 
| 176 | 177 | 
| 177   // Apply a TCP option that has been read from the header. | 178   // Apply a TCP option that has been read from the header. | 
| 178   void applyOption(char kind, const char* data, uint32 len); | 179   void applyOption(char kind, const char* data, uint32_t len); | 
| 179 | 180 | 
| 180   // Apply window scale option. | 181   // Apply window scale option. | 
| 181   void applyWindowScaleOption(uint8 scale_factor); | 182   void applyWindowScaleOption(uint8_t scale_factor); | 
| 182 | 183 | 
| 183   // Resize the send buffer with |new_size| in bytes. | 184   // Resize the send buffer with |new_size| in bytes. | 
| 184   void resizeSendBuffer(uint32 new_size); | 185   void resizeSendBuffer(uint32_t new_size); | 
| 185 | 186 | 
| 186   // Resize the receive buffer with |new_size| in bytes. This call adjusts | 187   // Resize the receive buffer with |new_size| in bytes. This call adjusts | 
| 187   // window scale factor |m_swnd_scale| accordingly. | 188   // window scale factor |m_swnd_scale| accordingly. | 
| 188   void resizeReceiveBuffer(uint32 new_size); | 189   void resizeReceiveBuffer(uint32_t new_size); | 
| 189 | 190 | 
| 190   IPseudoTcpNotify* m_notify; | 191   IPseudoTcpNotify* m_notify; | 
| 191   enum Shutdown { SD_NONE, SD_GRACEFUL, SD_FORCEFUL } m_shutdown; | 192   enum Shutdown { SD_NONE, SD_GRACEFUL, SD_FORCEFUL } m_shutdown; | 
| 192   int m_error; | 193   int m_error; | 
| 193 | 194 | 
| 194   // TCB data | 195   // TCB data | 
| 195   TcpState m_state; | 196   TcpState m_state; | 
| 196   uint32 m_conv; | 197   uint32_t m_conv; | 
| 197   bool m_bReadEnable, m_bWriteEnable, m_bOutgoing; | 198   bool m_bReadEnable, m_bWriteEnable, m_bOutgoing; | 
| 198   uint32 m_lasttraffic; | 199   uint32_t m_lasttraffic; | 
| 199 | 200 | 
| 200   // Incoming data | 201   // Incoming data | 
| 201   typedef std::list<RSegment> RList; | 202   typedef std::list<RSegment> RList; | 
| 202   RList m_rlist; | 203   RList m_rlist; | 
| 203   uint32 m_rbuf_len, m_rcv_nxt, m_rcv_wnd, m_lastrecv; | 204   uint32_t m_rbuf_len, m_rcv_nxt, m_rcv_wnd, m_lastrecv; | 
| 204   uint8 m_rwnd_scale;  // Window scale factor. | 205   uint8_t m_rwnd_scale;  // Window scale factor. | 
| 205   rtc::FifoBuffer m_rbuf; | 206   rtc::FifoBuffer m_rbuf; | 
| 206 | 207 | 
| 207   // Outgoing data | 208   // Outgoing data | 
| 208   SList m_slist; | 209   SList m_slist; | 
| 209   uint32 m_sbuf_len, m_snd_nxt, m_snd_wnd, m_lastsend, m_snd_una; | 210   uint32_t m_sbuf_len, m_snd_nxt, m_snd_wnd, m_lastsend, m_snd_una; | 
| 210   uint8 m_swnd_scale;  // Window scale factor. | 211   uint8_t m_swnd_scale;  // Window scale factor. | 
| 211   rtc::FifoBuffer m_sbuf; | 212   rtc::FifoBuffer m_sbuf; | 
| 212 | 213 | 
| 213   // Maximum segment size, estimated protocol level, largest segment sent | 214   // Maximum segment size, estimated protocol level, largest segment sent | 
| 214   uint32 m_mss, m_msslevel, m_largest, m_mtu_advise; | 215   uint32_t m_mss, m_msslevel, m_largest, m_mtu_advise; | 
| 215   // Retransmit timer | 216   // Retransmit timer | 
| 216   uint32 m_rto_base; | 217   uint32_t m_rto_base; | 
| 217 | 218 | 
| 218   // Timestamp tracking | 219   // Timestamp tracking | 
| 219   uint32 m_ts_recent, m_ts_lastack; | 220   uint32_t m_ts_recent, m_ts_lastack; | 
| 220 | 221 | 
| 221   // Round-trip calculation | 222   // Round-trip calculation | 
| 222   uint32 m_rx_rttvar, m_rx_srtt, m_rx_rto; | 223   uint32_t m_rx_rttvar, m_rx_srtt, m_rx_rto; | 
| 223 | 224 | 
| 224   // Congestion avoidance, Fast retransmit/recovery, Delayed ACKs | 225   // Congestion avoidance, Fast retransmit/recovery, Delayed ACKs | 
| 225   uint32 m_ssthresh, m_cwnd; | 226   uint32_t m_ssthresh, m_cwnd; | 
| 226   uint8 m_dup_acks; | 227   uint8_t m_dup_acks; | 
| 227   uint32 m_recover; | 228   uint32_t m_recover; | 
| 228   uint32 m_t_ack; | 229   uint32_t m_t_ack; | 
| 229 | 230 | 
| 230   // Configuration options | 231   // Configuration options | 
| 231   bool m_use_nagling; | 232   bool m_use_nagling; | 
| 232   uint32 m_ack_delay; | 233   uint32_t m_ack_delay; | 
| 233 | 234 | 
| 234   // This is used by unit tests to test backward compatibility of | 235   // This is used by unit tests to test backward compatibility of | 
| 235   // PseudoTcp implementations that don't support window scaling. | 236   // PseudoTcp implementations that don't support window scaling. | 
| 236   bool m_support_wnd_scale; | 237   bool m_support_wnd_scale; | 
| 237 }; | 238 }; | 
| 238 | 239 | 
| 239 }  // namespace cricket | 240 }  // namespace cricket | 
| 240 | 241 | 
| 241 #endif  // WEBRTC_P2P_BASE_PSEUDOTCP_H_ | 242 #endif  // WEBRTC_P2P_BASE_PSEUDOTCP_H_ | 
| OLD | NEW | 
|---|