OLD | NEW |
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ | 1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
2 /* | 2 /* |
3 * Copyright (c) 2007 Georgia Tech Research Corporation | 3 * Copyright (c) 2007 Georgia Tech Research Corporation |
4 * Copyright (c) 2010 Adrian Sai-wah Tam | 4 * Copyright (c) 2010 Adrian Sai-wah Tam |
5 * | 5 * |
6 * This program is free software; you can redistribute it and/or modify | 6 * This program is free software; you can redistribute it and/or modify |
7 * it under the terms of the GNU General Public License version 2 as | 7 * it under the terms of the GNU General Public License version 2 as |
8 * published by the Free Software Foundation; | 8 * published by the Free Software Foundation; |
9 * | 9 * |
10 * This program is distributed in the hope that it will be useful, | 10 * This program is distributed in the hope that it will be useful, |
(...skipping 19 matching lines...) Expand all Loading... |
30 #include "ns3/ipv4-address.h" | 30 #include "ns3/ipv4-address.h" |
31 #include "ns3/ipv4-header.h" | 31 #include "ns3/ipv4-header.h" |
32 #include "ns3/ipv4-interface.h" | 32 #include "ns3/ipv4-interface.h" |
33 #include "ns3/ipv6-header.h" | 33 #include "ns3/ipv6-header.h" |
34 #include "ns3/ipv6-interface.h" | 34 #include "ns3/ipv6-interface.h" |
35 #include "ns3/event-id.h" | 35 #include "ns3/event-id.h" |
36 #include "tcp-tx-buffer.h" | 36 #include "tcp-tx-buffer.h" |
37 #include "tcp-rx-buffer.h" | 37 #include "tcp-rx-buffer.h" |
38 #include "rtt-estimator.h" | 38 #include "rtt-estimator.h" |
39 #include "tcp-congestion-ops.h" | 39 #include "tcp-congestion-ops.h" |
| 40 #include "tcp-scoreboard.h" |
40 | 41 |
41 namespace ns3 { | 42 namespace ns3 { |
42 | 43 |
43 class Ipv4EndPoint; | 44 class Ipv4EndPoint; |
44 class Ipv6EndPoint; | 45 class Ipv6EndPoint; |
45 class Node; | 46 class Node; |
46 class Packet; | 47 class Packet; |
47 class TcpL4Protocol; | 48 class TcpL4Protocol; |
48 class TcpHeader; | 49 class TcpHeader; |
49 | 50 |
| 51 typedef std::pair<SequenceNumber32, SequenceNumber32> SackBlock; |
| 52 typedef std::list<SackBlock> SackList; |
| 53 |
50 /** | 54 /** |
51 * \ingroup tcp | 55 * \ingroup tcp |
52 * | 56 * |
53 * \brief Helper class to store RTT measurements | 57 * \brief Helper class to store RTT measurements |
54 */ | 58 */ |
55 class RttHistory { | 59 class RttHistory |
| 60 { |
56 public: | 61 public: |
57 /** | 62 /** |
58 * \brief Constructor - builds an RttHistory with the given parameters | 63 * \brief Constructor - builds an RttHistory with the given parameters |
59 * \param s First sequence number in packet sent | 64 * \param s First sequence number in packet sent |
60 * \param c Number of bytes sent | 65 * \param c Number of bytes sent |
61 * \param t Time this one was sent | 66 * \param t Time this one was sent |
62 */ | 67 */ |
63 RttHistory (SequenceNumber32 s, uint32_t c, Time t); | 68 RttHistory (SequenceNumber32 s, uint32_t c, Time t); |
64 /** | 69 /** |
65 * \brief Copy constructor | 70 * \brief Copy constructor |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 CA_LAST_STATE /**< Used only in debug messages */ | 134 CA_LAST_STATE /**< Used only in debug messages */ |
130 } TcpCongState_t; | 135 } TcpCongState_t; |
131 | 136 |
132 /** | 137 /** |
133 * \ingroup tcp | 138 * \ingroup tcp |
134 * TracedValue Callback signature for TcpCongState_t | 139 * TracedValue Callback signature for TcpCongState_t |
135 * | 140 * |
136 * \param [in] oldValue original value of the traced variable | 141 * \param [in] oldValue original value of the traced variable |
137 * \param [in] newValue new value of the traced variable | 142 * \param [in] newValue new value of the traced variable |
138 */ | 143 */ |
139 typedef void (* TcpCongStatesTracedValueCallback)(const TcpCongState_t oldValu
e, | 144 typedef void (*TcpCongStatesTracedValueCallback)(const TcpCongState_t oldValue
, |
140 const TcpCongState_t newValu
e); | 145 const TcpCongState_t newValue
); |
141 | 146 |
142 /** | 147 /** |
143 * \brief Literal names of TCP states for use in log messages | 148 * \brief Literal names of TCP states for use in log messages |
144 */ | 149 */ |
145 static const char* const TcpCongStateName[TcpSocketState::CA_LAST_STATE]; | 150 static const char* const TcpCongStateName[TcpSocketState::CA_LAST_STATE]; |
146 | 151 |
147 // Congestion control | 152 // Congestion control |
148 TracedValue<uint32_t> m_cWnd; //!< Congestion window | 153 TracedValue<uint32_t> m_cWnd; //!< Congestion window |
149 TracedValue<uint32_t> m_ssThresh; //!< Slow start threshold | 154 TracedValue<uint32_t> m_ssThresh; //!< Slow start threshold |
150 uint32_t m_initialCWnd; //!< Initial cWnd value | 155 uint32_t m_initialCWnd; //!< Initial cWnd value |
151 uint32_t m_initialSsThresh; //!< Initial Slow Start Threshold va
lue | 156 uint32_t m_initialSsThresh; //!< Initial Slow Start Threshold va
lue |
152 | 157 |
153 // Segment | 158 // Segment |
154 uint32_t m_segmentSize; //!< Segment size | 159 uint32_t m_segmentSize; //!< Segment size |
155 | 160 |
156 TracedValue<TcpCongState_t> m_congState; //!< State in the Congestion state
machine | 161 TracedValue<TcpCongState_t> m_congState; //!< State in the Congestion state
machine |
157 | 162 |
158 /** | 163 /** |
159 * \brief Get cwnd in segments rather than bytes | 164 * \brief Get cwnd in segments rather than bytes |
160 * | 165 * |
161 * \return Congestion window in segments | 166 * \return Congestion window in segments |
162 */ | 167 */ |
163 uint32_t GetCwndInSegments () const { return m_cWnd / m_segmentSize; } | 168 uint32_t GetCwndInSegments () const |
| 169 { |
| 170 return m_cWnd / m_segmentSize; |
| 171 } |
164 }; | 172 }; |
165 | 173 |
166 /** | 174 /** |
167 * \ingroup socket | 175 * \ingroup socket |
168 * \ingroup tcp | 176 * \ingroup tcp |
169 * | 177 * |
170 * \brief A base class for implementation of a stream socket using TCP. | 178 * \brief A base class for implementation of a stream socket using TCP. |
171 * | 179 * |
172 * This class contains the essential components of TCP, as well as a sockets | 180 * This class contains the essential components of TCP, as well as a sockets |
173 * interface for upper layers to call. This serves as a base for other TCP | 181 * interface for upper layers to call. This serves as a base for other TCP |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 * \param newValue new ssTh value | 352 * \param newValue new ssTh value |
345 */ | 353 */ |
346 void UpdateSsThresh (uint32_t oldValue, uint32_t newValue); | 354 void UpdateSsThresh (uint32_t oldValue, uint32_t newValue); |
347 | 355 |
348 /** | 356 /** |
349 * \brief Callback function to hook to TcpSocketState congestion state | 357 * \brief Callback function to hook to TcpSocketState congestion state |
350 * \param oldValue old congestion state value | 358 * \param oldValue old congestion state value |
351 * \param newValue new congestion state value | 359 * \param newValue new congestion state value |
352 */ | 360 */ |
353 void UpdateCongState (TcpSocketState::TcpCongState_t oldValue, | 361 void UpdateCongState (TcpSocketState::TcpCongState_t oldValue, |
354 TcpSocketState::TcpCongState_t newValue); | 362 TcpSocketState::TcpCongState_t newValue); |
355 | 363 |
356 /** | 364 /** |
357 * \brief Install a congestion control algorithm on this socket | 365 * \brief Install a congestion control algorithm on this socket |
358 * | 366 * |
359 * \param algo Algorithm to be installed | 367 * \param algo Algorithm to be installed |
360 */ | 368 */ |
361 void SetCongestionControlAlgorithm (Ptr<TcpCongestionOps> algo); | 369 void SetCongestionControlAlgorithm (Ptr<TcpCongestionOps> algo); |
362 | 370 |
363 // Necessary implementations of null functions from ns3::Socket | 371 // Necessary implementations of null functions from ns3::Socket |
364 virtual enum SocketErrno GetErrno (void) const; // returns m_errno | 372 virtual enum SocketErrno GetErrno (void) const; // returns m_errno |
(...skipping 16 matching lines...) Expand all Loading... |
381 virtual int GetSockName (Address &address) const; // Return local addr:port in
address | 389 virtual int GetSockName (Address &address) const; // Return local addr:port in
address |
382 virtual void BindToNetDevice (Ptr<NetDevice> netdevice); // NetDevice with my
m_endPoint | 390 virtual void BindToNetDevice (Ptr<NetDevice> netdevice); // NetDevice with my
m_endPoint |
383 | 391 |
384 /** | 392 /** |
385 * TracedCallback signature for tcp packet transmission or reception events. | 393 * TracedCallback signature for tcp packet transmission or reception events. |
386 * | 394 * |
387 * \param [in] packet The packet. | 395 * \param [in] packet The packet. |
388 * \param [in] ipv4 | 396 * \param [in] ipv4 |
389 * \param [in] interface | 397 * \param [in] interface |
390 */ | 398 */ |
391 typedef void (* TcpTxRxTracedCallback) | 399 typedef void (*TcpTxRxTracedCallback) |
392 (const Ptr<const Packet> packet, const TcpHeader& header, | 400 (const Ptr<const Packet> packet, const TcpHeader& header, |
393 const Ptr<const TcpSocketBase> socket); | 401 const Ptr<const TcpSocketBase> socket); |
394 | 402 |
395 protected: | 403 protected: |
396 // Implementing ns3::TcpSocket -- Attribute get/set | 404 // Implementing ns3::TcpSocket -- Attribute get/set |
397 // inherited, no need to doc | 405 // inherited, no need to doc |
398 | 406 |
399 virtual void SetSndBufSize (uint32_t size); | 407 virtual void SetSndBufSize (uint32_t size); |
400 virtual uint32_t GetSndBufSize (void) const; | 408 virtual uint32_t GetSndBufSize (void) const; |
401 virtual void SetRcvBufSize (uint32_t size); | 409 virtual void SetRcvBufSize (uint32_t size); |
402 virtual uint32_t GetRcvBufSize (void) const; | 410 virtual uint32_t GetRcvBufSize (void) const; |
403 virtual void SetSegSize (uint32_t size); | 411 virtual void SetSegSize (uint32_t size); |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
729 */ | 737 */ |
730 virtual uint32_t AvailableWindow (void) const; | 738 virtual uint32_t AvailableWindow (void) const; |
731 | 739 |
732 /** | 740 /** |
733 * \brief The amount of Rx window announced to the peer | 741 * \brief The amount of Rx window announced to the peer |
734 * \returns size of Rx window announced to the peer | 742 * \returns size of Rx window announced to the peer |
735 */ | 743 */ |
736 virtual uint16_t AdvertisedWindowSize (void) const; | 744 virtual uint16_t AdvertisedWindowSize (void) const; |
737 | 745 |
738 /** | 746 /** |
739 * \brief Update the receiver window (RWND) based on the value of the | 747 * \brief Update the receiver window (RWND) based on the value of the |
740 * window field in the header. | 748 * window field in the header. |
741 * | 749 * |
742 * This method suppresses updates unless one of the following three | 750 * This method suppresses updates unless one of the following three |
743 * conditions holds: 1) segment contains new data (advancing the right | 751 * conditions holds: 1) segment contains new data (advancing the right |
744 * edge of the receive buffer), 2) segment does not contain new data | 752 * edge of the receive buffer), 2) segment does not contain new data |
745 * but the segment acks new data (highest sequence number acked advances), | 753 * but the segment acks new data (highest sequence number acked advances), |
746 * or 3) the advertised window is larger than the current send window | 754 * or 3) the advertised window is larger than the current send window |
747 * | 755 * |
748 * \param header TcpHeader from which to extract the new window value | 756 * \param header TcpHeader from which to extract the new window value |
749 */ | 757 */ |
750 void UpdateWindowSize (const TcpHeader& header); | 758 void UpdateWindowSize (const TcpHeader& header); |
751 | 759 |
752 | 760 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 */ | 818 */ |
811 virtual void PersistTimeout (void); | 819 virtual void PersistTimeout (void); |
812 | 820 |
813 /** | 821 /** |
814 * \brief Retransmit the oldest packet | 822 * \brief Retransmit the oldest packet |
815 */ | 823 */ |
816 virtual void DoRetransmit (void); | 824 virtual void DoRetransmit (void); |
817 | 825 |
818 /** | 826 /** |
819 * \brief Read TCP options from incoming packets | 827 * \brief Read TCP options from incoming packets |
820 * | 828 * |
821 * This method sequentially checks each kind of option, and if it | 829 * This method sequentially checks each kind of option, and if it |
822 * is present in the header, starts its processing. | 830 * is present in the header, starts its processing. |
823 * | 831 * |
824 * To deal with hosts which don't have the option enabled (or | 832 * To deal with hosts which don't have the option enabled (or |
825 * implemented) we disable all options, and then re-enable them | 833 * implemented) we disable all options, and then re-enable them |
826 * if in the packet there is the option itself. | 834 * if in the packet there is the option itself. |
827 * | 835 * |
828 * \param tcpHeader the packet's TCP header | 836 * \param tcpHeader the packet's TCP header |
829 */ | 837 */ |
830 virtual void ReadOptions (const TcpHeader& tcpHeader); | 838 virtual void ReadOptions (const TcpHeader& tcpHeader); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
890 * \brief Scale the initial SsThresh value to the correct one | 898 * \brief Scale the initial SsThresh value to the correct one |
891 * | 899 * |
892 * Set the initial SsThresh to the largest possible advertised window | 900 * Set the initial SsThresh to the largest possible advertised window |
893 * according to the sender scale factor. | 901 * according to the sender scale factor. |
894 * | 902 * |
895 * \param scaleFactor the sender scale factor | 903 * \param scaleFactor the sender scale factor |
896 */ | 904 */ |
897 virtual void ScaleSsThresh (uint8_t scaleFactor); | 905 virtual void ScaleSsThresh (uint8_t scaleFactor); |
898 | 906 |
899 /** | 907 /** |
| 908 * \brief Process the Sack-Permitted option from other side |
| 909 * |
| 910 * \param option Sack-Permitted option from the packet |
| 911 */ |
| 912 void ProcessOptionSackPermitted (const Ptr<const TcpOption> option); |
| 913 /** |
| 914 * \brief Add the Sack-Permitted option to the header |
| 915 * |
| 916 * \param header TcpHeader to which the option is appended |
| 917 */ |
| 918 void AddOptionSackPermitted (TcpHeader& header); |
| 919 |
| 920 /** |
| 921 * \brief Re-arrange SACK blocks |
| 922 * |
| 923 * Make sure the block containing the triggering segment is the first |
| 924 * block to be sent, and the remaining blocks repeat the most recently |
| 925 * reported ones. |
| 926 * |
| 927 * \param seq Sequence number of the recently received packet |
| 928 */ |
| 929 void ArrangeSackBlocks (SequenceNumber32 seq); |
| 930 /** |
| 931 * \brief Process the SACK option from other side |
| 932 * |
| 933 * \param option SACK option from the packet |
| 934 */ |
| 935 void ProcessOptionSack (const Ptr<const TcpOption> option); |
| 936 /** |
| 937 * \brief Add the SACK option to the header |
| 938 * |
| 939 * \param header TcpHeader to which the SACK option is added |
| 940 */ |
| 941 void AddOptionSack (TcpHeader& header); |
| 942 |
| 943 /** |
900 * \brief Initialize congestion window | 944 * \brief Initialize congestion window |
901 * | 945 * |
902 * Default cWnd to 1 MSS (RFC2001, sec.1) and must | 946 * Default cWnd to 1 MSS (RFC2001, sec.1) and must |
903 * not be larger than 2 MSS (RFC2581, sec.3.1). Both m_initiaCWnd and | 947 * not be larger than 2 MSS (RFC2581, sec.3.1). Both m_initiaCWnd and |
904 * m_segmentSize are set by the attribute system in ns3::TcpSocket. | 948 * m_segmentSize are set by the attribute system in ns3::TcpSocket. |
905 */ | 949 */ |
906 virtual void InitializeCwnd (); | 950 virtual void InitializeCwnd (); |
907 | 951 |
908 protected: | 952 protected: |
909 // Counters and events | 953 // Counters and events |
(...skipping 11 matching lines...) Expand all Loading... |
921 uint32_t m_dataRetrCount; //!< Count of remaining data retransmissi
on attempts | 965 uint32_t m_dataRetrCount; //!< Count of remaining data retransmissi
on attempts |
922 uint32_t m_dataRetries; //!< Number of data retransmission attemp
ts | 966 uint32_t m_dataRetries; //!< Number of data retransmission attemp
ts |
923 TracedValue<Time> m_rto; //!< Retransmit timeout | 967 TracedValue<Time> m_rto; //!< Retransmit timeout |
924 Time m_minRto; //!< minimum value of the Retransmit time
out | 968 Time m_minRto; //!< minimum value of the Retransmit time
out |
925 Time m_clockGranularity; //!< Clock Granularity used in RTO calcs | 969 Time m_clockGranularity; //!< Clock Granularity used in RTO calcs |
926 TracedValue<Time> m_lastRtt; //!< Last RTT sample collected | 970 TracedValue<Time> m_lastRtt; //!< Last RTT sample collected |
927 Time m_delAckTimeout; //!< Time to delay an ACK | 971 Time m_delAckTimeout; //!< Time to delay an ACK |
928 Time m_persistTimeout; //!< Time between sending 1-byte probes | 972 Time m_persistTimeout; //!< Time between sending 1-byte probes |
929 Time m_cnTimeout; //!< Timeout for connection retry | 973 Time m_cnTimeout; //!< Timeout for connection retry |
930 RttHistory_t m_history; //!< List of sent packet | 974 RttHistory_t m_history; //!< List of sent packet |
| 975 bool m_afterRTO; //!< True if an RTO has just happened |
931 | 976 |
932 // Connections to other layers of TCP/IP | 977 // Connections to other layers of TCP/IP |
933 Ipv4EndPoint* m_endPoint; //!< the IPv4 endpoint | 978 Ipv4EndPoint* m_endPoint; //!< the IPv4 endpoint |
934 Ipv6EndPoint* m_endPoint6; //!< the IPv6 endpoint | 979 Ipv6EndPoint* m_endPoint6; //!< the IPv6 endpoint |
935 Ptr<Node> m_node; //!< the associated node | 980 Ptr<Node> m_node; //!< the associated node |
936 Ptr<TcpL4Protocol> m_tcp; //!< the associated TCP L4 protocol | 981 Ptr<TcpL4Protocol> m_tcp; //!< the associated TCP L4 protocol |
937 Callback<void, Ipv4Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback;
//!< ICMP callback | 982 Callback<void, Ipv4Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback;
//!< ICMP callback |
938 Callback<void, Ipv6Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback6;
//!< ICMPv6 callback | 983 Callback<void, Ipv6Address,uint8_t,uint8_t,uint8_t,uint32_t> m_icmpCallback6;
//!< ICMPv6 callback |
939 | 984 |
940 Ptr<RttEstimator> m_rtt; //!< Round trip time estimator | 985 Ptr<RttEstimator> m_rtt; //!< Round trip time estimator |
(...skipping 22 matching lines...) Expand all Loading... |
963 uint32_t m_bytesAckedNotProcessed; //!< Bytes acked, but
not processed | 1008 uint32_t m_bytesAckedNotProcessed; //!< Bytes acked, but
not processed |
964 | 1009 |
965 // Options | 1010 // Options |
966 bool m_winScalingEnabled; //!< Window Scale option enabled | 1011 bool m_winScalingEnabled; //!< Window Scale option enabled |
967 uint8_t m_sndScaleFactor; //!< Sent Window Scale (i.e., the one of the n
ode) | 1012 uint8_t m_sndScaleFactor; //!< Sent Window Scale (i.e., the one of the n
ode) |
968 uint8_t m_rcvScaleFactor; //!< Received Window Scale (i.e., the one of t
he peer) | 1013 uint8_t m_rcvScaleFactor; //!< Received Window Scale (i.e., the one of t
he peer) |
969 | 1014 |
970 bool m_timestampEnabled; //!< Timestamp option enabled | 1015 bool m_timestampEnabled; //!< Timestamp option enabled |
971 uint32_t m_timestampToEcho; //!< Timestamp to echo | 1016 uint32_t m_timestampToEcho; //!< Timestamp to echo |
972 | 1017 |
| 1018 bool m_sackEnabled; //!< SACK option enabled |
| 1019 bool m_sackAllowed; //!< Receiver is allowed to send SACK after rece
iving Sack-Permitted |
| 1020 SackList m_txSackList; //!< List of SACK blocks to be transmitted |
| 1021 bool m_sackOptionAdded; //!< Header needs to append SACK option |
| 1022 SackList m_rxSackList; //!< List of SACK blocks received from other sid
e |
| 1023 TcpScoreboard m_scoreBoard; //!< The sender's SACK information buffer |
| 1024 |
973 EventId m_sendPendingDataEvent; //!< micro-delay event to send pending data | 1025 EventId m_sendPendingDataEvent; //!< micro-delay event to send pending data |
974 | 1026 |
975 // Fast Retransmit and Recovery | 1027 // Fast Retransmit and Recovery |
976 SequenceNumber32 m_recover; //!< Previous highest Tx seqnum for fas
t recovery | 1028 SequenceNumber32 m_recover; //!< Previous highest Tx seqnum for fas
t recovery |
977 uint32_t m_retxThresh; //!< Fast Retransmit threshold | 1029 uint32_t m_retxThresh; //!< Fast Retransmit threshold |
978 bool m_limitedTx; //!< perform limited transmit | 1030 bool m_limitedTx; //!< perform limited transmit |
979 | 1031 |
980 // Transmission Control Block | 1032 // Transmission Control Block |
981 Ptr<TcpSocketState> m_tcb ; //!< Congestion control informatio
ns | 1033 Ptr<TcpSocketState> m_tcb; //!< Congestion control informatio
ns |
982 Ptr<TcpCongestionOps> m_congestionControl; //!< Congestion control | 1034 Ptr<TcpCongestionOps> m_congestionControl; //!< Congestion control |
983 | 1035 |
984 // Guesses over the other connection end | 1036 // Guesses over the other connection end |
985 bool m_isFirstPartialAck;//!< First partial ACK during RECOVERY | 1037 bool m_isFirstPartialAck; //!< First partial ACK during RECOVERY |
986 | 1038 |
987 // The following two traces pass a packet with a TCP header | 1039 // The following two traces pass a packet with a TCP header |
988 TracedCallback<Ptr<const Packet>, const TcpHeader&, | 1040 TracedCallback<Ptr<const Packet>, const TcpHeader&, |
989 Ptr<const TcpSocketBase> > m_txTrace; //!< Trace of transmitted
packets | 1041 Ptr<const TcpSocketBase> > m_txTrace; //!< Trace of transmitted
packets |
990 | 1042 |
991 TracedCallback<Ptr<const Packet>, const TcpHeader&, | 1043 TracedCallback<Ptr<const Packet>, const TcpHeader&, |
992 Ptr<const TcpSocketBase> > m_rxTrace; //!< Trace of received pa
ckets | 1044 Ptr<const TcpSocketBase> > m_rxTrace; //!< Trace of received pa
ckets |
993 }; | 1045 }; |
994 | 1046 |
995 /** | 1047 /** |
996 * \ingroup tcp | 1048 * \ingroup tcp |
997 * TracedValue Callback signature for TcpCongState_t | 1049 * TracedValue Callback signature for TcpCongState_t |
998 * | 1050 * |
999 * \param [in] oldValue original value of the traced variable | 1051 * \param [in] oldValue original value of the traced variable |
1000 * \param [in] newValue new value of the traced variable | 1052 * \param [in] newValue new value of the traced variable |
1001 */ | 1053 */ |
1002 typedef void (* TcpCongStatesTracedValueCallback)(const TcpSocketState::TcpCongS
tate_t oldValue, | 1054 typedef void (*TcpCongStatesTracedValueCallback)(const TcpSocketState::TcpCongSt
ate_t oldValue, |
1003 const TcpSocketState::TcpCongS
tate_t newValue); | 1055 const TcpSocketState::TcpCongSt
ate_t newValue); |
1004 | 1056 |
1005 } // namespace ns3 | 1057 } // namespace ns3 |
1006 | 1058 |
1007 #endif /* TCP_SOCKET_BASE_H */ | 1059 #endif /* TCP_SOCKET_BASE_H */ |
OLD | NEW |