aboutsummaryrefslogtreecommitdiff
path: root/net
AgeCommit message (Collapse)Author
2021-06-09dcsctp: Prevent overflow of missing parametersVictor Boivie
This was found when fuzzing. If the specified number of parameter count was larger than std::numeric_limits<size_t>::max()/2, the comparison would overflow and read out-of-bounds. This would only apply to 32-bit platforms and it would lead to a crash as it would access all of the virtual memory range, and more. Fixed: chromium:1216758 Change-Id: I2193d3ed078120b6c3e4645c0b16b9f230055e8d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/221742 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Florent Castelli <orphis@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34256}
2021-06-02dcsctp: Stay in stream if not producing fragmentVictor Boivie
If there is only little space left in a packet, and the remaining data for a partially sent message is much larger, it will not generate a small fragment for this message. This is to avoid fragmenting a message into too many packets, as that increases the risk of losing messages when partial reliability is enabled. And when a stream doesn't want to generate a too small fragment, the scheduler should _not_ switch streams. It should only switch streams when a message has been fully sent. Previously, it would switch stream when a stream doesn't want to produce a message, but as noted above, that could happen for other reasons. This required some refactoring, which also increased its robustness by now only doing explicit stream switching on fully produced messages. Bug: webrtc:12832 Change-Id: Icb213774fd0d26fba5640b00aac0407d393e4bfc Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/220937 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34197}
2021-06-01dcsctp: Stay within stream while producing from itVictor Boivie
The way that the "next stream" was picked when round-robin cycling was flawed. When a message was produced in its entirety, the "next stream" would be put at a stream identifier value that was just larger than what was previously used. And then, for each fragment that was to be created, it would try to resolve the nearest stream (above or equal to that number) that had messages to send - always starting from that stream id that didn't necessarily point to the stream for which fragments were actually produced. For example, if the previous stream ID for which a message was fully produced on was 5, then the next_stream_id would be set to 6, and then when producing next fragment, it might have produced something from stream_id=1, because that was the only stream with messages in it. It wouldn't update next_stream_id at this time; it would still be 6. After a single fragment had been produced from that stream, a message was queued on stream_id=6. The next time a fragment was to be produced, it would not continue one stream_id=1, but instead pick the new stream, which would suddenly produce a new fragment (with B flag set) while the previous message (from stream_id=1) wasn't finished yet. The fix is simple; Just ensure that we continue iterating from where we ever produce a fragment from. Bug: webrtc:12832 Change-Id: Icc761c572ed200db607a7609dab1ac6a8aeb2f04 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/220938 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34190}
2021-05-31dcsctp: Determine chunks to be retransmitted fastVictor Boivie
Before this CL, before sending out any chunk, all inflight data chunks were inspected to find out if they were supposed to be retransmitted. When the congestion window is large, this is a lot of data chunks to inspect, which takes time. By having a separate collection for chunks to be retransmitted, this becomes a much faster operation. In most cases, constant in time. Bug: webrtc:12799 Change-Id: I0d43ba7a88656eead26d5e0b9c4735622a8d080e Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219626 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34178}
2021-05-31dcsctp: Find out quickly if to send FORWARD-TSNVictor Boivie
There is no need to iterate through all outstanding data chunks to know if a FORWARD-TSN can be sent. As the FORWARD-TSN will just move the cumulative TSN ack, if a chunk is found that is not to be expired, there is no need to continue any further. This makes it much faster to know if to send a FORWARD-TSN when the congestion window is large. Bug: webrtc:12799 Change-Id: I58bce408ae9814c8d3d7bbb480b0037a2cf88dd7 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219625 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34176}
2021-05-31dcsctp: Optimize SACK generationVictor Boivie
Before this CL, a SACK was generated from scratch based on information about each received fragment, to generate correct gap-ack-blocks. When there was a lot of data in the data tracker (due to packet loss), this took considerate time, as generating a SACK was O(N), where N is the amount of fragments in the data tracker. By instead having precomputed gap-ack-blocks that are continuously updated, generating a SACK is much faster and the memory usage goes down a bit as well. Bug: webrtc:12799 Change-Id: I924752c1d6d31f06d27246e10b595e9ccb19320f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/220763 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34171}
2021-05-31dcsctp: Allow more outstanding fragmentsVictor Boivie
There limit that decides if an incoming TSN should be accepted or not was decided based on very small transfers with no packet loss. But in simulations where a socket tries to send a lot of data and when there is moderate packet loss, the number of tracker data chunks on the receive side will be considerably higher than what the limit was. Set the limit to allow high data rate also on moderate packet loss. Bug: webrtc:12799 Change-Id: I6ca237e5609d8b511e9b10c919da33dca7420c01 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/220761 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34169}
2021-05-31dcsctp: Announce send buffer watermark as a_rwndVictor Boivie
The receive buffer mustn't be full; If it's full, and a message can't be assembled, the socket can't accept more data. To avoid this, there is a high watermark limit that, when reached, will make the socket only accept chunks that advance the cumulative ack TSN. Before this CL, the announced receiver window size in every sent SACK was based on what the receive buffer could maximally be, which means that in really high data rate applications, the amount of outstanding data could actually fill the receive buffer (due to packet loss, that prevents messages from being reassembled). As the socket started behaving more conservatively when the high watermark limit was reached, this resulted in unnecessary T3-RTXes. But by announcing the high watermark limit instead, the sender will stay within it, and will have a peer socket that behaves as expected. Bug: webrtc:12799 Change-Id: Ife2f409914a230640217553c54f60d05843efc70 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/220762 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34168}
2021-05-31dcsctp: Add more unit tests for DataTrackerVictor Boivie
There were some missing unit tests that are now written. When doing this, it was found that SACKs weren't sent for duplicate received chunks, which they should be according to the spec. Bug: webrtc:12614 Change-Id: I8296473c0c8cbaf0329785de95e9b9945f254339 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/220607 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34165}
2021-05-31dcsctp: Allow heartbeats to be disabledVictor Boivie
This is useful in tests and in scenarios where the connection is monitored externally and the heartbeat monitoring would be of no use. Bug: webrtc:12614 Change-Id: Ida4f4e2e40fc4d2aa0c27ae9431f434da4cc8313 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/220766 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34164}
2021-05-27dcsctp: Add public API for BufferedAmountLowVictor Boivie
This adds native support for the RTCDataChannel properties: https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel/bufferedAmount https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel/bufferedAmountLowThreshold And the RTCDataChannel event: https://developer.mozilla.org/en-US/docs/Web/API/RTCDataChannel/onbufferedamountlow The old callback, NotifyOutgoingMessageBufferEmpty, is deprecated as it didn't work very well. It will not be triggered and will be removed as soon as all users of it are gone. There is a new callback, OnTotalBufferedAmountLow, that serves the same purpose but also allows setting an arbitrary limit when it should be triggered (See DcSctpOptions::total_buffered_amount_low_threshold). Bug: webrtc:12794 Change-Id: Ic1c92f174eff8a1acda0b5fd3dcc45bd1cfa2704 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219691 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34144}
2021-05-27dcsctp: Add OnTotalBufferedAmountLow in Send QueueVictor Boivie
This is similar to Change-Id: I12a16f44f775da3711f3aa52a68a0bf24f70d2f8 but with the entire send buffer as scope, not a single stream. This can be used by clients to take alternate action (such as delaying transmission or using other buffering) if the send buffer ever becomes full, as they can now be notified when the send buffer is no longer full. Bug: webrtc:12794 Change-Id: Icf3be3b118888ffb5ced955fd7ba4826a37140f9 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/220360 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34143}
2021-05-27dcsctp: Add OnBufferedAmountLow in Send QueueVictor Boivie
This adds the necessary properties and callback to the Send Queue to support the bufferedAmount & bufferedAmountLowThreshold properties and the bufferedamountlow event in RTCDataChannel. The public API changes and socket support comes in a follow-up CL. Bug: webrtc:12794 Change-Id: I12a16f44f775da3711f3aa52a68a0bf24f70d2f8 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219690 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34142}
2021-05-27dcsctp: Allocate TSN for end of abandoned messageVictor Boivie
If a not fully sent message is abandoned, there must be a TSN representing the end of that message (even if that fragment is never sent), as the receiver can otherwise reject the next sent message as it hasn't seen any end of the previous one. A long explanation can be found at https://github.com/sctplab/usrsctp/issues/592#issuecomment-849047689 Bug: webrtc:12812 Change-Id: I09c571bd6dd2774b0c147d4e5ddac67d2aa64fea Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/220361 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34140}
2021-05-27dcsctp: Avoid recalculation of outstanding bytesVictor Boivie
Recalculating outstanding bytes is expensive when the congestion window is large, as it iterates over all inflight data chunks. By doing it incrementally, it will be a constant operation in most cases, and in the remaining cases, a function of the number of chunks acked in a single SACK, which is typically just a few chunks. Implementing this fix required some refactoring to calculate it correctly (and to be honest, it was likely done incorrectly previously). Previously, the state of an item in the retransmission queue was simplified as "in flight", "acked", "nacked", "abandoned", but these were not completely orthogonal. A chunk could be abandoned while it was in-flight or it could be abandoned because it was lost. The difference between these if that chunk should be accounted for in outstanding_bytes() or not. Unit tests have been added to verify this. Bug: webrtc:12799 Change-Id: I72341538bb0c4f8f89555b08f0c8a28815f0f828 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219623 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34139}
2021-05-25dcsctp: Limit the size of generated SACK chunksVictor Boivie
Today, there is no actual limit on how large a SACK chunk can be. And having limits is good to be able to stay within the MTU. This commit adds a limit to the number of reported duplicate TSNs as well as the number of reported gap-ack-blocks in a SACK chunk. These limits are never expected to be reached in a real-life situation. Bug: webrtc:12614 Change-Id: Ib2c143714a214cd3d961e8a52dac26a04b909b80 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219464 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34108}
2021-05-23dcsctp: Implement Round Robin schedulerVictor Boivie
Bug: webrtc:12793 Change-Id: I19adb292443def42ee54df67c4869b980db7b7c0 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219682 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34093}
2021-05-22dcsctp: Rename FCFSSendQueue to RRSendQueueVictor Boivie
The current send queue implements SCTP_SS_FCFS as defined in https://datatracker.ietf.org/doc/html/rfc8260#section-3.1, but that has always been known to be a temporary solution. The end goal is to implement a Weighted Fair Queueing Scheduler (SCTP_SS_WFQ), but that's likely to take some time. Meanwhile, a round robin scheduler (SCTP_SS_RR) will be used to avoid some issues with the current scheduler, such as a single data channel completely blocking all others if it sends a lot of messages. In this first commit, the code has simply been renamed and is still implementing first-come-first-served. That will be fixed in follow-up CLS. Bug: webrtc:12793 Change-Id: Idc03b1594551bfe1ddbe1710872814b9fdf60cc9 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219684 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34090}
2021-05-21dcsctp: Ensure RTO is always greater than RTTVictor Boivie
The retransmission timeout (RTO) value is updated on every measured RTT and is a function of the RTT value and its stability. In reality, the RTT is never constant - it fluctuates, which makes the RTO become much larger than the RTT. But for extremely stable RTTs, which we get in simulations, the RTO value can become the same as the RTT, and that makes expiration timers be scheduled to the RTT value, and will race with packets that are expected to stop the expiration timer. And that race should be avoided in simulations. So ensuring that the RTO value is always greater, if only be a single millisecond, will work fine in these simulations. Bug: webrtc:12614 Change-Id: I30cf9c97e50449849ab35de52696c618d8498128 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219680 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Florent Castelli <orphis@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34084}
2021-05-19dcsctp: Report duplicate TSNsVictor Boivie
Reporting the duplicate TSNs is a SHOULD in the RFC, and using the duplicate TNSs is a MAY, and in reality I haven't seen an implementation use it yet. However, it's good for debugging and for stats generation. Bug: webrtc:12614 Change-Id: I1cc3f86961a8d289708cbf50d98dedfd25077955 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219462 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34053}
2021-05-18dcsctp: Restrict fuzzing input lengthVictor Boivie
Restricting the fizzing input length according to the instructions at https://chromium.googlesource.com/chromium/src/testing/libfuzzer/+/HEAD/getting_started.md#common-tricks Without this limit, it finds inputs that are unreasonably large (160kB+) that just make the ASAN built fuzzer hit the default timeout of 60s. Bug: webrtc:12614 Change-Id: I1417f22698fba8d9bd2c56f8c3d51850b8f00f54 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219161 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34034}
2021-05-17dcsctp: Bump rto_min to 220 msVictor Boivie
The minimum RTO time shouldn't be lower than the delayed ack timeout of the peer to avoid sending retransmissions before the peer has actually intended to reply. In usrsctp, the default delayed ack timeout is 200ms and configurable using the `sctp_delayed_sack_time_default` option. In dcsctp, it's min(RTO/2, 200ms), to avoid this issue. Bug: webrtc:12614 Change-Id: Ie84c331334af660d66b1a7d90d20f5cf7e2a5103 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219100 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34026}
2021-05-12dcsctp: Add socket fuzzer helperVictor Boivie
The socket fuzzer is build as a structure-aware fuzzer where the full public API is exercised as well as receival of SCTP packets with random sequences of valid chunks. It begins by putting the socket in a defined starting state and then, based on the fuzzing data, performs a sequence of operations on the socket such as receiving packets, sending data, resetting streams or expiring timers. This is the first iteration, and when running it a while and analyzing code coverage, it will be modified to perform better. It could probably be a little more random. Bug: webrtc:12614 Change-Id: I50d6ffaecef5722be5cf666fee2f0de7d15cc2e8 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/218500 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Florent Castelli <orphis@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33998}
2021-05-11dcsctp: Avoid transition back to ShutdownPendingVictor Boivie
When a socket is shutting down, either explicitly by the ULP calling Shutdown(), or when the socket receives a SHUTDOWN chunk, the socket should send all outstanding data and when all is sent and acked, _then_ it should continue the shutdown protocol. As it currently doesn't calculate correctly when all data has been sent, as NACKED chunks are not included in what it believes is remaining in the retransmission queue, it will shut down prematurely and may go back to a previous state (ShutdownPending) from ShutdownSent or ShutdownAckSent. This is a workaround that just avoids the illegal state transition as that puts the socket in an inconsistent state. The bug is merely theoretical as WebRTC doesn't currently gracefully shut down a SCTP socket, but just terminates the DTLS transport. As TODOs mention, this will be fixed correctly a bit later. Bug: webrtc:12739 Change-Id: Ibde2acc3a6aca701ac178d6181028404d470a5d5 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/218340 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33982}
2021-05-11dcsctp: Support message with low lifetimeVictor Boivie
While it's not strictly defined, the expectation is that sending a message with a lifetime parameter set to zero (0) ms should allow it to be sent if it can be sent without being buffered. If it can't be directly sent, it should be discarded. This is initial support for it. Small messages can now be delivered fine if they are not to be buffered, but fragmented messages could be partly sent (if this fills up the congestion window), which means that the message will then fail to be sent whenever the congestion window frees up again. It would be better to - at a higher level - realize early that the message can't be sent in full, and discard it without sending anything. But that's an optimization that can be done later. A few off-by-one errors were found when strictly defining that the message is alive during its entire lifetime. It will expire just _after_ its lifetime. Sending messages with a lifetime of zero may not supported in all libraries, so a workaround would be to set a very small timeout instead, which is tested as well. Bug: webrtc:12614 Change-Id: I9a00bedb639ad7b3b565b750ef2a49c9020745f1 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/217562 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33977}
2021-05-10dcsctp: Disable TCP style slow startVictor Boivie
Due to a limit socket send buffer, it's quite easy to fill it up when using exponential slow start, which results in dropping a lot of packets and having to retransmit those. Disabling this, to align it to how SCTP normally behaves, and then try to stabilize it later. With SCTP slow start, it will increase with one MTU for each RTT when there is no packet loss. Even this mode will experience packet loss, but not as much will be lost, and it will stabilize quicker. Bug: webrtc:12614 Change-Id: Ibc484b19b7e708fe5bd837bbef178a2f69b7211f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/218203 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33969}
2021-05-07dcsctp: Don't access TCB when the socket is closedVictor Boivie
When the shutdown timer has expired, the socket will abort/close and the TCB is not valid after InternalClose. Bug: webrtc:12614 Change-Id: I09a94a049f0cda4577225dd9c80a92a8ec7e0423 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/217767 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Florent Castelli <orphis@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33956}
2021-05-07dcsctp: Stop connection timers during shutdownVictor Boivie
If Shutdown is called when the socket is being established and while the connection timers are running, it will put the socket in an inconsistent state, which is verified in debug builds. Bug: webrtc:12614 Change-Id: I66f07d1170ac8f0ad9fd485d77d6aef4c365f150 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/217765 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Florent Castelli <orphis@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33949}
2021-05-07dcsctp: Log socket name also in callbacksVictor Boivie
This makes it easier to understand which socket that experience an error or abort. Aborts are now also logged, which was missed previously. Bug: webrtc:12614 Change-Id: Ie5e4357b3e5450106cc6cc28c1e9578ad53d073a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/217764 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Florent Castelli <orphis@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33947}
2021-05-07dcsctp: Refactor unit testsVictor Boivie
Bug: webrtc:12614 Change-Id: I9592f1ec8bec2a045c9d32fda3a723877ae38e58 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/217763 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Florent Castelli <orphis@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33943}
2021-05-05dcsctp: Handle starting timer from timer callbackVictor Boivie
This was caught in an integration test which had stricter assertions than the FakeTimeout which is used in unit tests, so the first thing was to add the same assertions to the FakeTimeout. The issue is that when a Timer triggers, and if it's set to automatically restart (possibly with an exponential backoff), the `is_running_` field was set to true while the timer callback was called to allow the client to know that the timer is in fact running, but the timer was actually not started until the callback returned. Which made sense, as the callback can with its return value override the duration, which should affect the backoff algorithm. The problem was when a timer was manually started within the callback. As the Timer itself thought that it was already running, it first would Stop() the underlying Timeout, then Start(). But calling Stop() on a timeout that is not running is illegal, which set of assertions. So the solution is to don't lie; Don't say that a timer is running when it's not. Make sure that the timer is running when the timer callback is triggered, which makes it consistent at all times. That may result in unnecessary timeout invocations (stopping and starting), but that's not too expensive. Bug: webrtc:12614 Change-Id: I7b4447ccd88bd43d181e158f0d29b0770c8a3fd6 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/217522 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33926}
2021-05-05dcsctp: Expire timers just before triggering themVictor Boivie
In real life, when a Timeout expires, the caller is supposed to call DcSctpSocket::HandleTimeout directly, as the Timeout that just expired is stopped (it just expired), but the Timer still believes it's running. The system is not in a consistent state. In tests, all timeouts were evaluated at the same time, which, if two timeouts expired at the same time, would put them both as "not running", and with their timers believing they were running. So if you would do any operation on a timer whose timeout had just expired, the timeout would assert saying that "you can't stop a stopped timeout" or similar. This isn't relevant in non-test scenarios. Solved by expiring timeouts one by one. Bug: webrtc:12614 Change-Id: I79d006f4d3e96854d77cec3eb0080aa23b8569cb Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/217560 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33925}
2021-05-04dcsctp: Add SetMaxMessageSize() to socketFlorent Castelli
An SCTP transport for Data Channels allows changing the maximum message size through SDP. See https://w3c.github.io/webrtc-pc/#sctp-transport-update-mms Bug: webrtc:12614 Change-Id: I8cff33c5f9c1d60934a726c546bc9cbdcd9e22d9 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/217387 Reviewed-by: Victor Boivie <boivie@webrtc.org> Commit-Queue: Florent Castelli <orphis@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33920}
2021-05-04dcsctp: Use correct log severityVictor Boivie
As INFO is aliased to LS_INFO, this didn't trigger any warnings or compilation errors. Bug: None Change-Id: I1ed30c435d9ee6ea1b51d85a375d70135d3475e6 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/216689 Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33912}
2021-05-04dcsctp: Fix iOS build errorsFlorent Castelli
Bug: webrtc:12614 Change-Id: Ib221688007892ab0b87ef768d20f7d779b3bfd55 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/217381 Reviewed-by: Victor Boivie <boivie@webrtc.org> Commit-Queue: Florent Castelli <orphis@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33911}
2021-05-03dcsctp: Add TaskQueue based timeout implementationVictor Boivie
This is about doing the best with what we have. As delayed tasks can't be cancelled, and dcSCTP timers will almost always be stopped or restarted, and will generally only expire on packet loss. This implementation will post a delayed task whenever a Timeout is started. Whenever it's stopped or restarted, it will keep the scheduled delay task running (there's no alternative), but it will also not start a new delayed task on subsequent starts/restarts. Instead, it will wait until the original delayed task has triggered, and will then - if the timer is still running, which it probably isn't - post a new delayed task with the remainder of the the duration. There is special handling for when a shorter duration is requested, as that can't re-use the scheduled task, but that shouldn't be very common. Bug: webrtc:12614 Change-Id: I7f3269cabf84f80dae3b8a528243414a93d50fc4 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/217223 Reviewed-by: Tommi <tommi@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33904}
2021-05-03Enable GN check on //net.Mirko Bonadei
This should avoid the situation where WebRTC's GN check is green and Chromium (which turns it ON for //third_party/webrtc) fails. Bug: webrtc:12614 Change-Id: Id4c06ac57e9faa07c5e43491a61fbc093c68a40d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/217221 Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Florent Castelli <orphis@webrtc.org> Reviewed-by: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33900}
2021-05-03dcsctp: Add missing target dependenciesFlorent Castelli
Those were found when trying to build within Chromium's codebase. Bug: webrtc:12614 Change-Id: Ic3f7a266ad4b5d816a693645e1e909fc39d513c3 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/217220 Reviewed-by: Victor Boivie <boivie@webrtc.org> Commit-Queue: Florent Castelli <orphis@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33896}
2021-05-01dcsctp: Add SocketVictor Boivie
This completes the basic implementation of the dcSCTP library. There are a few remaining commits to e.g. add compatibility tests and benchmarks, as well as more support for e.g. RFC8260, but those are not strictly vital for evaluation of the library. The Socket contains the connection establishment and teardown sequences as well as the general chunk dispatcher. Bug: webrtc:12614 Change-Id: I313b6c8f4accc144e3bb88ddba22269ebb8eb3cd Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/214342 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Tommi <tommi@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33890}
2021-04-28dcsctp: Add Transmission Control BlockVictor Boivie
This is merely a container of components that have their lifetime bound to when the socket is connected. If the socket gets disconnected or restarted, this object (and everything it holds) will be released. Bug: webrtc:12614 Change-Id: Ibd75760b7bf7efe9c26c4eb7cee62de8bba5410c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/214340 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33869}
2021-04-28dcsctp: Add timer safeguards and sanity checksVictor Boivie
Ensuring that timer durations never go beyond a safe maximum duration and that timer IDs are not re-used. Bug: webrtc:12614 Change-Id: I227a2e9933da16669dc6ea0a39c570892010ba2c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/215063 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Tommi <tommi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33860}
2021-04-27dcsctp: Add Stream Reset HandlerVictor Boivie
The Stream Reset handler handles a limited subset of RFC6525, but all the parts necessary to implement "Closing a Data Channel", which is done by sending an Outgoing SSN Reset Request. There can only be a single "Stream Reconfiguration Request" on the wire at any time, so requests are queued and sent when a previous request - if any - finishes. Resetting a stream is an asynchronous operation and the receiver will not perform the stream resetting until it can be done, which is when the currently partly received message has been fully received. And the sender will not send a request until the currently fragmented message (on that stream) is still sent. There are numerous callbacks to make the client know what's really happening as these callbacks will result in Data Channel events. Bug: webrtc:12614 Change-Id: I9fd0a94713f0c1fc384d1189f3894e87687408b7 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/214131 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Tommi <tommi@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33856}
2021-04-27dcsctp: Use third_party/crc32c for integrity checkVictor Boivie
CRC32c is used in SCTP for integrity checking, and the third_party/crc32c library (https://github.com/google/crc32c) which has been optimized for SSE42 and arm64 and has a much faster fallback implementation for other architectures. Running ./out/Release/dcsctp_benchmark Run on (12 X 4500 MHz CPU s) CPU Caches: L1 Data 32 KiB (x6) L1 Instruction 32 KiB (x6) L2 Unified 1024 KiB (x6) L3 Unified 8448 KiB (x1) Load Average: 11.01, 17.53, 17.11 ------------------------------------------------------------------------------ Benchmark Time CPU Iterations UserCounters... ------------------------------------------------------------------------------ BM_PumpData/1 676 ns 676 ns 1034087 bytes_per_second=1.41063M/s items_per_second=1.47916M/s BM_PumpData/8 671 ns 671 ns 1041809 bytes_per_second=11.3643M/s items_per_second=1.48955M/s BM_PumpData/128 725 ns 725 ns 967170 bytes_per_second=168.398M/s items_per_second=1.37952M/s BM_PumpData/512 800 ns 800 ns 873854 bytes_per_second=610.125M/s items_per_second=1.24954M/s BM_PumpData/1024 911 ns 911 ns 775785 bytes_per_second=1072.2M/s items_per_second=1097.93k/s BM_PumpData/2048 1988 ns 1988 ns 352444 bytes_per_second=982.409M/s items_per_second=502.993k/s BM_PumpData/4096 3893 ns 3893 ns 179999 bytes_per_second=1003.31M/s items_per_second=256.848k/s BM_PumpData/8192 7477 ns 7477 ns 92790 bytes_per_second=1044.88M/s items_per_second=133.745k/s BM_PumpData/65536 97156 ns 97153 ns 7089 bytes_per_second=643.318M/s items_per_second=10.2931k/s BM_EchoServer/1 634 ns 634 ns 1130860 bytes_per_second=1.50512M/s items_per_second=1.57823M/s BM_EchoServer/8 614 ns 614 ns 1136372 bytes_per_second=12.4286M/s items_per_second=1.62904M/s BM_EchoServer/128 644 ns 644 ns 1073464 bytes_per_second=189.618M/s items_per_second=1.55335M/s BM_EchoServer/512 734 ns 734 ns 949487 bytes_per_second=665.181M/s items_per_second=1.36229M/s BM_EchoServer/1024 836 ns 836 ns 838010 bytes_per_second=1.14046G/s items_per_second=1.19586M/s BM_EchoServer/2048 1939 ns 1939 ns 345067 bytes_per_second=1007.27M/s items_per_second=515.724k/s BM_EchoServer/4096 3984 ns 3983 ns 176047 bytes_per_second=980.737M/s items_per_second=251.069k/s BM_EchoServer/8192 7486 ns 7484 ns 95780 bytes_per_second=1043.85M/s items_per_second=133.613k/s BM_EchoServer/65536 92360 ns 92346 ns 7821 bytes_per_second=676.805M/s items_per_second=10.8289k/s No-Presubmit: True Bug: webrtc:12614 Change-Id: Iff21035ee78b263ee0e4b0fe3d07eea24064b921 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/215002 Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Victor Costan <pwnall@chromium.org> Reviewed-by: Florent Castelli <orphis@webrtc.org> Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33842}
2021-04-26dcsctp: Add Retransmission QueueVictor Boivie
The Retransmission Queue contain all message fragments (DATA chunks) that have once been sent, but not yet ACKed by the receiver. It will process incoming SACK chunks, which informs it which chunks that the receiver has seen (ACKed) and which that are lost (NACKed), and will retransmit chunks when it's time. If a message has been sent with partial reliability, e.g. to have a limited number of retransmissions or a limited lifetime, the Retransmission Queue may discard a partially sent and expired message and will instruct the receiver that "don't expect this message - it's expired" by sending a FORWARD-TSN chunk. This currently also includes the congestion control algorithm as it's tightly coupled with the state of the retransmission queue. This is a fairly complicated piece of logic which decides how much data that can be in-flight, depending on the available bandwidth. This is not done by any bandwidth estimation, but similar to TCP, where data is sent until it's lost, and then "we dial down a knob" and take it more carefully from here on. Future refactoring will try to separate the logic regarding fragment retransmission and the congestion control algorithm. Bug: webrtc:12614 Change-Id: I8678250abb766e567c3450634686919936ea077b Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/214046 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33833}
2021-04-26dcsctp: Add Retransmission TimeoutVictor Boivie
The socket can measure the round-trip-time (RTT) by two different scenarios: * When a sent data is ACKed * When a HEARTBEAT has been sent, which as been ACKed. The RTT will be used to calculate which timeout value that should be used for e.g. the retransmission timer (T3-RTX). On connections with a low RTT, the RTO value will be low, and on a connection with high RTT, the RTO value will be high. And on a connection with a generally low RTT value, but where it varies a lot, the RTO value will be calculated to be fairly high, to not fire unnecessarily. So jitter is bad, and is part of the calculation. Bug: webrtc:12614 Change-Id: I64905ad566d5032d0428cd84143a9397355bbe9f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/214045 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33832}
2021-04-25dcsctp: Add Heartbeat HandlerVictor Boivie
It's responsible for answering incoming Heartbeat Requests, and to send requests itself when a connection is idle. When it receives a response, it will measure the RTT and if it doesn't receive a response in time, that will result in a TX error, which will eventually close the connection. Bug: webrtc:12614 Change-Id: I08371d9072ff0461f60e0a2f7696c0fd7ccb57c5 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/214129 Reviewed-by: Tommi <tommi@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33828}
2021-04-25dcsctp: Add Retransmission Error CounterVictor Boivie
This is just a simple SCTP variable, but wrapped in its own object for convenience. Bug: webrtc:12614 Change-Id: I0c45c356488d21b71c72a936e4ceeee5ed0ec96d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/214047 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Reviewed-by: Tommi <tommi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33827}
2021-04-25dcsctp: Add ContextVictor Boivie
In the Socket module, there are a few (two, to be exact right now, but the goal is to have even more) separate "handlers" that are responsible for a feature set. These handlers must have an API to interact with the rest of the socket - and this is the API. Mocks are also added. Bug: webrtc:12614 Change-Id: If19b43bf99a784bba3a42467d0ed3abdd8b4c62c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/214128 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Tommi <tommi@webrtc.org> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33826}
2021-04-25dcsctp: Add missing testVictor Boivie
This was missing in the build file, and caught in post-review at: https://webrtc-review.googlesource.com/c/src/+/213347 Bug: webrtc:12614 Change-Id: I1870c1e305913b2195df801487b99549b02b2558 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/215065 Commit-Queue: Victor Boivie <boivie@webrtc.org> Reviewed-by: Tommi <tommi@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33824}
2021-04-21dcsctp: Add Send QueueVictor Boivie
When the client asks for a message to be sent, it's put in the SendQueue, which is available even when the socket is not yet connected. When the socket is connected, those messages will be sent on the wire, possibly fragmented if the message is large enough to not fit inside a single packet. When the message has been fully sent, it's removed from the send queue (but it will be in the RetransmissionQueue - which is added in a follow-up change, until the message has been ACKed). The Send Queue is a FIFO queue in this iteration, and in SCTP, that's called a "First Come, First Served" queue, or FCFS. In follow-up work, the queue and the actual scheduling algorithm which decides which message that is sent, when there are messages in multiple streams, will likely be decoupled. But in this iteration, they're in the same class. Bug: webrtc:12614 Change-Id: Iec1183e625499a21e402e4f2a5ebcf989bc5c3ec Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/214044 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Victor Boivie <boivie@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33798}