Hi Natale, Follow are a few comments/questions I have on your code. Best, Anh https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-header.cc ...
10 years, 8 months ago
(2014-08-07 10:35:15 UTC)
#3
When I reboot on a MPTCP kernel I will try to send a capture of ...
10 years, 8 months ago
(2014-08-14 12:37:03 UTC)
#5
When I reboot on a MPTCP kernel I will try to send a capture of this example if
you want.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
File src/internet/model/tcp-header.h (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
src/internet/model/tcp-header.h:162: Ptr<TcpOption> GetOption (uint8_t kind)
const;
I believe you may have several options of a same kind. For instance MPTCP may
send several MPTCP options in a same packet since MPTCP relies on different
options identified by different subtypes but that all share the same TCP option
id : the one of MPTCP.
So there should be a way to retrieve all Options in this case like:
GetOptions(std::list<>& list);
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-header.cc File src/internet/model/tcp-header.cc (right): https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-header.cc#newcode371 src/internet/model/tcp-header.cc:371: Ptr<TcpOption> op = TcpOption::CreateOption (kind); On 2014/08/17 10:38:12, Tommaso ...
10 years, 8 months ago
(2014-08-23 10:30:37 UTC)
#7
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
File src/internet/model/tcp-header.cc (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
src/internet/model/tcp-header.cc:371: Ptr<TcpOption> op =
TcpOption::CreateOption (kind);
On 2014/08/17 10:38:12, Tommaso Pecorella wrote:
> This could return null, a check is mandatory.
>
> Alternatively (and better) we should have a "Unknown" option type.
> I am not totally sure about the intended behaviour in case of unknown options
> (trash the packet or ignore the option ?), but we should be able to keep on
with
> reading the packet.
All things done in Deserialize are assumed to be "ok".. but malformed packet can
crash the simulator. So, what about a isValid API? If packet has something
malformed, just stop and make the entire header invalid, thrashing the packet.
Anyway, for now I'll insert an assert, just waiting more comments.
Thank you
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
src/internet/model/tcp-header.cc:386: }
On 2014/08/17 10:38:12, Tommaso Pecorella wrote:
> I think we're going to far ahead with the buffer, we're advancing twice.
Where?
> In any case, I would have done it in a different way.
>
> while (optionLen)
> {
> uint8_t kind = i.PeekU8 ();
> if (EndOfOptioList) optionLen = 0;
> else if (No-Operation) i.ReadU8 ();
> else
> {
> Ptr<TcpOption> op = TcpOption::CreateOption (kind);
> if (op)
> {
> optionLen -= op->Deserialize (i);
> m_options.push_back (op);
> i.Next (op->GetSerializedSize ()); // <- because we used peek
> }
> else
> {
> NS_LOG_WARN ("Unknown option");
> i.ReadU8 ();
> uint8_t blobLen = i.ReadU8 ();
> optionLen -= blobLen;
> i.Next (blobLen-2);
> }
> }
> }
>
Using peek is possible, but in every TcpOption* Deserialize method, an initial
read (to see what option is) is assumed.. I dont' know what is the better
approach here: use peek everywhere, modifying each Deserialize method, or not?
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
File src/internet/model/tcp-header.h (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
src/internet/model/tcp-header.h:162: Ptr<TcpOption> GetOption (uint8_t kind)
const;
On 2014/08/17 10:38:12, Tommaso Pecorella wrote:
> I agree with the suggestion, but I'd rather pass a list in the return value.
Actually I don't know any of MPTCP (as the code isn't public). Anyway, this call
will remain: in some cases, the overhead of using lists in API isn't matched by
any improvement (for example, in the actual tcpSocketBase code).
So, I suggest to include in the MPTCP patch a new method for this class, which
works with list, as it will be the right place.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
File src/internet/model/tcp-option-end.h (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
src/internet/model/tcp-option-end.h:32: class TcpOptionEnd : public TcpOption
On 2014/08/17 10:38:13, Tommaso Pecorella wrote:
> I'd avoid the file explosion. No-op, EoL and MSS can safely be in the "main"
> TcpOption file.
>
> Rationale: I would rather split the options according to their "belonging".
> Original RFC, MP-TCP, etc.
>
> Still, it's a matter of personal tastes.
IMHO, the result is the same, but we will end in:
#include "tcp-options-rfc2018"
vs.
#include "tcp-options-sack"
I think the 2nd is more KISS than the first. About the file explosion, is
because the entire model is painful.. ip things should go in the ip
subdirectory, tcp in their, and so on..
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
src/internet/model/tcp-option-end.h:35: TcpOptionEnd ();
On 2014/08/07 10:35:14, trucanh524 wrote:
> Documentation for each method is recommended. Same for other classes.
Only the virtual method is documented, not each instantiation, as what methods
do is pretty clear
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
File src/internet/model/tcp-option-snack.h (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
src/internet/model/tcp-option-snack.h:32:
On 2014/08/07 10:35:14, trucanh524 wrote:
> Is this the SNACK option developed in the context of SCPS-TP? If so, I don't
> think this actually implements the SNACK option structure as described in the
> paper, which contains a 16-bit hole 1 offset, a 16-bit hole 1 size, and an
> optional bit vector field in addition to the kind and length fields. Its
> structure is different from SACK, so I don't think it can be implemented in
the
> exact same way as SACK.
Class removed as it isn't ready for publishing.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
File src/internet/model/tcp-option-ts.h (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
src/internet/model/tcp-option-ts.h:79: static Time EstimateRttFromTs (uint32_t
echoTime);
On 2014/08/17 10:38:13, Tommaso Pecorella wrote:
> This function can be safely moved to the RTT estimator using this option.
> I'd rather do this, because the real estimation is also dependent on a number
of
> other conditions, like duplicate ACK, ACK bit present, etc.
As the Time to uint32_t conversion is dependent on what NowToTsValue does, I
think is better to maintain the uint32_t to Time conversion in the same file.
Ok, maybe the name could be changed.. because maybe can be another value (and
not an RTT).
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
File src/internet/model/tcp-socket-base.cc (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
src/internet/model/tcp-socket-base.cc:51: #include "tcp-option-ts.h"
On 2014/08/17 10:38:13, Tommaso Pecorella wrote:
> I'd rather use all the options, and add attributes for all of them. Unless
there
> is a good reason to not to.
Use.. in what sense?
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
src/internet/model/tcp-socket-base.cc:2534: * to the header
On 2014/08/17 10:38:13, Tommaso Pecorella wrote:
> The logic of this function should be triple checked.
> If I do remember right, options should be negotiated during the 3-way
handshake.
Some option can be inserted only in SYN packet (like WinScaling). Other should
be enabled/disabled in 3-way-handshake, but if enabled, inserted in all packets.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-header.cc File src/internet/model/tcp-header.cc (right): https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-header.cc#newcode371 src/internet/model/tcp-header.cc:371: Ptr<TcpOption> op = TcpOption::CreateOption (kind); On 2014/08/23 10:30:36, n.p ...
10 years, 8 months ago
(2014-08-25 14:40:15 UTC)
#8
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
File src/internet/model/tcp-header.cc (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
src/internet/model/tcp-header.cc:371: Ptr<TcpOption> op =
TcpOption::CreateOption (kind);
On 2014/08/23 10:30:36, n.p wrote:
> On 2014/08/17 10:38:12, Tommaso Pecorella wrote:
> > This could return null, a check is mandatory.
> >
> > Alternatively (and better) we should have a "Unknown" option type.
> > I am not totally sure about the intended behaviour in case of unknown
options
> > (trash the packet or ignore the option ?), but we should be able to keep on
> with
> > reading the packet.
>
> All things done in Deserialize are assumed to be "ok".. but malformed packet
can
> crash the simulator. So, what about a isValid API? If packet has something
> malformed, just stop and make the entire header invalid, thrashing the packet.
>
> Anyway, for now I'll insert an assert, just waiting more comments.
Thanks to the TCP Options structure (i.e., 2 options are 1-byte, the others are
Type-Length), an Unknown TCP option is possible. I'd go for that one, but the
code just a few lines below works without an Unknown optino type ... :)
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
src/internet/model/tcp-header.cc:386: }
On 2014/08/23 10:30:36, n.p wrote:
> On 2014/08/17 10:38:12, Tommaso Pecorella wrote:
> > I think we're going to far ahead with the buffer, we're advancing twice.
>
> Where?
Maybe not, but I feel the code counterintuitive.
> > In any case, I would have done it in a different way.
> >
> > while (optionLen)
> > {
> > uint8_t kind = i.PeekU8 ();
> > if (EndOfOptioList) optionLen = 0;
> > else if (No-Operation) i.ReadU8 ();
> > else
> > {
> > Ptr<TcpOption> op = TcpOption::CreateOption (kind);
> > if (op)
> > {
> > optionLen -= op->Deserialize (i);
> > m_options.push_back (op);
> > i.Next (op->GetSerializedSize ()); // <- because we used peek
> > }
> > else
> > {
> > NS_LOG_WARN ("Unknown option");
> > i.ReadU8 ();
> > uint8_t blobLen = i.ReadU8 ();
> > optionLen -= blobLen;
> > i.Next (blobLen-2);
> > }
> > }
> > }
> >
>
> Using peek is possible, but in every TcpOption* Deserialize method, an initial
> read (to see what option is) is assumed.. I dont' know what is the better
> approach here: use peek everywhere, modifying each Deserialize method, or not?
Peek everywhere, of course.
The point is: Serializing and Deserializing should read/write the same number of
bytes. Otherwise Deserialize would rely on the behaviour of external code (not
wise).
A Peek / Read redundancy is ok, those operations are not dramatically slow.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
File src/internet/model/tcp-option-ts.h (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
src/internet/model/tcp-option-ts.h:79: static Time EstimateRttFromTs (uint32_t
echoTime);
On 2014/08/23 10:30:37, n.p wrote:
> On 2014/08/17 10:38:13, Tommaso Pecorella wrote:
> > This function can be safely moved to the RTT estimator using this option.
> > I'd rather do this, because the real estimation is also dependent on a
number
> of
> > other conditions, like duplicate ACK, ACK bit present, etc.
>
> As the Time to uint32_t conversion is dependent on what NowToTsValue does, I
> think is better to maintain the uint32_t to Time conversion in the same file.
> Ok, maybe the name could be changed.. because maybe can be another value (and
> not an RTT).
I guess it's a matter of taste. I like to have in the headers just the functions
related to the header read and write, not the ones processing the data carried
by the headers.
Still, I agree that the RTT estimation calc is in the same RFC, so the function
may "belong" to the same code piece.
However, leaving it here is "dangerous". The function uses a Simulator::Now()
internally, so two calls (by a dumb user) could generate two different results.
I'd rather have a EstimateRttFromTs (Time now, uint32_t echoTime). By the way,
this would also remove the need to make it static. It could be a member function
EstimateTimeDifference (Time now).
All, basically, are equivalent. They only differ in the eye of the coder.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
File src/internet/model/tcp-socket-base.cc (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
src/internet/model/tcp-socket-base.cc:51: #include "tcp-option-ts.h"
On 2014/08/23 10:30:37, n.p wrote:
> On 2014/08/17 10:38:13, Tommaso Pecorella wrote:
> > I'd rather use all the options, and add attributes for all of them. Unless
> there
> > is a good reason to not to.
>
> Use.. in what sense?
tcp-option-mss.h, nop, etc... missing headers include. Why ?
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
src/internet/model/tcp-socket-base.cc:2534: * to the header
On 2014/08/23 10:30:37, n.p wrote:
> On 2014/08/17 10:38:13, Tommaso Pecorella wrote:
> > The logic of this function should be triple checked.
> > If I do remember right, options should be negotiated during the 3-way
> handshake.
>
> Some option can be inserted only in SYN packet (like WinScaling). Other should
> be enabled/disabled in 3-way-handshake, but if enabled, inserted in all
packets.
That's my point. As I wrote in the (separate) mail, I think that we should
triple check how the TCP connection is started. Offer the options we handle,
check the reply, etc. At the end, we should have the list of supported option
for the current connection (and use them).
Anyway, maybe I'm missing something (or I'm a bit tired). However I'm pretty
sure that (for example) WindowScale is also "replied" in the SYN-ACK :P
As a side note... do we use the SACK option ? I fear not...
some additional comments, focusing on the base TCP options (kinds 0,1,2) and window scale, ignoring ...
10 years, 8 months ago
(2014-08-26 16:52:30 UTC)
#9
some additional comments, focusing on the base TCP options (kinds 0,1,2) and
window scale, ignoring for now timestamps.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
File src/internet/model/tcp-header.cc (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
src/internet/model/tcp-header.cc:80: TcpHeader::SetLength (uint8_t length)
On 2014/08/17 10:38:12, Tommaso Pecorella wrote:
> 1) Declare it obsolete.
> 2) Make it a no-op
> 3) Throw a warning if used.
>
> Rationale: the TCP header length should be fixed, and dependent only on the
TCP
> header properties.
>
> Note: this function is used (it's a bug). In the two cases where it is used,
> remove the call.
I agree to remove this.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
src/internet/model/tcp-header.cc:282: if ((m_flags & CWR) != 0)
whitespace changes should be outside of the options patch
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
src/internet/model/tcp-header.cc:330:
On 2014/08/07 10:35:14, trucanh524 wrote:
> A think a 1-line comment here (for example, // Padding) would be helpful.
Some implementations pad options to word boundaries, some do not. It may be
useful to put a boolean attribute such as PadOptions (default false, for Linux
behavior) and make this padding depend on it.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
src/internet/model/tcp-header.cc:371: Ptr<TcpOption> op =
TcpOption::CreateOption (kind);
On 2014/08/25 14:40:15, Tommaso Pecorella wrote:
> On 2014/08/23 10:30:36, n.p wrote:
> > On 2014/08/17 10:38:12, Tommaso Pecorella wrote:
> > > This could return null, a check is mandatory.
> > >
> > > Alternatively (and better) we should have a "Unknown" option type.
> > > I am not totally sure about the intended behaviour in case of unknown
> options
> > > (trash the packet or ignore the option ?), but we should be able to keep
on
> > with
> > > reading the packet.
> >
> > All things done in Deserialize are assumed to be "ok".. but malformed packet
> can
> > crash the simulator. So, what about a isValid API? If packet has something
> > malformed, just stop and make the entire header invalid, thrashing the
packet.
> >
> > Anyway, for now I'll insert an assert, just waiting more comments.
>
> Thanks to the TCP Options structure (i.e., 2 options are 1-byte, the others
are
> Type-Length), an Unknown TCP option is possible. I'd go for that one, but the
> code just a few lines below works without an Unknown optino type ... :)
If kind is unknown, need to peek the length and deserialize the correct number
of bytes (handling the case of an unknown option preceding a known option) and
move to the next option. I would also log this occurrence using NS_LOG
statement. Check also that length of unknown option does not exceed the
remaining space of the options field; if it does, put in an assert until if/when
someone wants to suggest different behavior.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
File src/internet/model/tcp-header.h (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
src/internet/model/tcp-header.h:162: Ptr<TcpOption> GetOption (uint8_t kind)
const;
On 2014/08/23 10:30:36, n.p wrote:
> On 2014/08/17 10:38:12, Tommaso Pecorella wrote:
> > I agree with the suggestion, but I'd rather pass a list in the return value.
>
> Actually I don't know any of MPTCP (as the code isn't public). Anyway, this
call
> will remain: in some cases, the overhead of using lists in API isn't matched
by
> any improvement (for example, in the actual tcpSocketBase code).
>
> So, I suggest to include in the MPTCP patch a new method for this class, which
> works with list, as it will be the right place.
MPTCP has one instance of a TCP option 30, but within this option there are
subtypes.
http://tools.ietf.org/html/rfc6824#section-8
I think that we are OK with the proposed GetOption () that returns a single
instance.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-he...
src/internet/model/tcp-header.h:175: void AppendOption (Ptr<TcpOption> option);
what happens if this fails? Is there a way to check if enough space exists to
add the option before calling this method?
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
File src/internet/model/tcp-option-end.h (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
src/internet/model/tcp-option-end.h:32: class TcpOptionEnd : public TcpOption
On 2014/08/23 10:30:36, n.p wrote:
> On 2014/08/17 10:38:13, Tommaso Pecorella wrote:
> > I'd avoid the file explosion. No-op, EoL and MSS can safely be in the "main"
> > TcpOption file.
> >
> > Rationale: I would rather split the options according to their "belonging".
> > Original RFC, MP-TCP, etc.
> >
> > Still, it's a matter of personal tastes.
>
> IMHO, the result is the same, but we will end in:
>
> #include "tcp-options-rfc2018"
>
> vs.
>
> #include "tcp-options-sack"
>
> I think the 2nd is more KISS than the first. About the file explosion, is
> because the entire model is painful.. ip things should go in the ip
> subdirectory, tcp in their, and so on..
I would lean towards providing multiple classes (NOOP, End, MSS, SACK,
Timestamps) in a single option file. These are typically used together, so they
can be included together.
if we provide the single option file, it could be instead named "tcp-options.h"
instead of "tcp-option.h"
Perhaps MPTCP is split out from the rest if it is quite lengthy.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
File src/internet/model/tcp-option-mss.h (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
src/internet/model/tcp-option-mss.h:30: */
It doesn't seem to me that this option is actually plumbed into the TCP logic.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
File src/internet/model/tcp-option-winscale.h (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
src/internet/model/tcp-option-winscale.h:62: * \brief Deconstructor
Destructor
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
src/internet/model/tcp-option-winscale.h:99: virtual uint8_t GetKind (void)
const;
why virtual?
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
File src/internet/model/tcp-option.h (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-op...
src/internet/model/tcp-option.h:65: };
On 2014/08/17 10:38:13, Tommaso Pecorella wrote:
> "OptionKind" and "Kind" seems to be the same stuff... kill one ?
I agree to remove one of these enums.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
File src/internet/model/tcp-socket-base.cc (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
src/internet/model/tcp-socket-base.cc:93: MakeBooleanChecker ())
is this supposed to be SACK?
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
src/internet/model/tcp-socket-base.cc:2498: */
general comment: Doxygen should be moved from implementation file to header
file
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
src/internet/model/tcp-socket-base.cc:2518: ProcessOptionWScale
(header.GetOption (TcpOption::WINSCALE));
I might rewrite this as:
if (m_winScalingEnabled && header.HasOption (TcpOption::WINSCALE))
{
NS_LOG_LOGIC ("Peer supports window scaling... keeping it enabled");
ProcessOptionWScale (header.GetOption (TcpOption::WINSCALE));
}
else
{
NS_LOG_LOGIC ("Peer doesn't offer window scaling... disabling");
m_winScalingEnabled = false;
}
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
src/internet/model/tcp-socket-base.cc:2534: * to the header
On 2014/08/25 14:40:15, Tommaso Pecorella wrote:
> On 2014/08/23 10:30:37, n.p wrote:
> > On 2014/08/17 10:38:13, Tommaso Pecorella wrote:
> > > The logic of this function should be triple checked.
> > > If I do remember right, options should be negotiated during the 3-way
> > handshake.
> >
> > Some option can be inserted only in SYN packet (like WinScaling). Other
should
> > be enabled/disabled in 3-way-handshake, but if enabled, inserted in all
> packets.
>
> That's my point. As I wrote in the (separate) mail, I think that we should
> triple check how the TCP connection is started. Offer the options we handle,
> check the reply, etc. At the end, we should have the list of supported option
> for the current connection (and use them).
>
> Anyway, maybe I'm missing something (or I'm a bit tired). However I'm pretty
> sure that (for example) WindowScale is also "replied" in the SYN-ACK :P
>
> As a side note... do we use the SACK option ? I fear not...
Does there need to be any provision for extensibility? If a new TCP variant
(subclass) adds its own option, does tcp-socket-base need to be edited?
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
src/internet/model/tcp-socket-base.cc:2600: m_rcvScaleFactor = 14;
isn't this a symptom of a protocol error? I would possibly assert in this case.
https://codereview.appspot.com/110860043/diff/20001/src/internet/model/tcp-so...
src/internet/model/tcp-socket-base.cc:2603: m_sndScaleFactor = CalculateWScale
();
why is this being performed on the receive-side processing? Can it be safely
deleted?
https://codereview.appspot.com/110860043/diff/20001/src/internet/test/tcp-opt...
File src/internet/test/tcp-option-test.cc (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/test/tcp-opt...
src/internet/test/tcp-option-test.cc:163: static class TcpOptionTestSuite :
public TestSuite
in general, missing from this test suite is handling of unknown options,
possibly different sizes, possibly in the "reserved" range of kind values.
https://codereview.appspot.com/110860043/diff/20001/src/internet/test/tcp-opt...
src/internet/test/tcp-option-test.cc:180: "values for timestamp",
what if we just test a few boundary conditions and a fixed pseudo-random (e.g.
0xdeadbeef) without randomization-- what does the random variable offer us?
https://codereview.appspot.com/110860043/diff/20001/src/internet/test/tcp-wsc...
File src/internet/test/tcp-wscaling-test.cc (right):
https://codereview.appspot.com/110860043/diff/20001/src/internet/test/tcp-wsc...
src/internet/test/tcp-wscaling-test.cc:23: #define protected public
making the test a friend class is possibly a better option than the above
Issue 110860043: SOCIS2014 - Tcp Options Review
(Closed)
Created 10 years, 10 months ago by n.p
Modified 9 years, 5 months ago
Reviewers: Tom Henderson, trucanh524, mattator, Tommaso Pecorella
Base URL:
Comments: 68