Add controls for MTU size of virtual socket server
This will allow us to write tests for what happens when large datagrams
are discarded.
Bug: webrtc:12495
Change-Id: I5c8e9fe55917967ea4604e1b3abe3c590c330ffa
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/211044
Reviewed-by: Taylor <deadbeef@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33425}
diff --git a/rtc_base/virtual_socket_server.cc b/rtc_base/virtual_socket_server.cc
index 043d15a..80d7f3c 100644
--- a/rtc_base/virtual_socket_server.cc
+++ b/rtc_base/virtual_socket_server.cc
@@ -900,7 +900,22 @@
return -1;
}
+ if (data_size > largest_seen_udp_payload_) {
+ if (data_size > 1000) {
+ RTC_LOG(LS_VERBOSE) << "Largest UDP seen is " << data_size;
+ }
+ largest_seen_udp_payload_ = data_size;
+ }
+
// See if we want to drop this packet.
+ if (data_size > max_udp_payload_) {
+ RTC_LOG(LS_VERBOSE) << "Dropping too large UDP payload of size "
+ << data_size << ", UDP payload limit is "
+ << max_udp_payload_;
+ // Return as if send was successful; packet disappears.
+ return data_size;
+ }
+
if (Random() < drop_prob_) {
RTC_LOG(LS_VERBOSE) << "Dropping packet: bad luck";
return static_cast<int>(data_size);
diff --git a/rtc_base/virtual_socket_server.h b/rtc_base/virtual_socket_server.h
index a6e1f64..54de578 100644
--- a/rtc_base/virtual_socket_server.h
+++ b/rtc_base/virtual_socket_server.h
@@ -94,6 +94,16 @@
drop_prob_ = drop_prob;
}
+ // Controls the maximum UDP payload for the networks simulated
+ // by this server. Any UDP payload sent that is larger than this will
+ // be dropped.
+ size_t max_udp_payload() { return max_udp_payload_; }
+ void set_max_udp_payload(size_t payload_size) {
+ max_udp_payload_ = payload_size;
+ }
+
+ size_t largest_seen_udp_payload() { return largest_seen_udp_payload_; }
+
// If |blocked| is true, subsequent attempts to send will result in -1 being
// returned, with the socket error set to EWOULDBLOCK.
//
@@ -308,6 +318,13 @@
std::unique_ptr<Function> delay_dist_;
double drop_prob_;
+ // The largest UDP payload permitted on this virtual socket server.
+ // The default is the max size of IPv4 fragmented UDP packet payload:
+ // 65535 bytes - 8 bytes UDP header - 20 bytes IP header.
+ size_t max_udp_payload_ = 65507;
+ // The largest UDP payload seen so far.
+ size_t largest_seen_udp_payload_ = 0;
+
bool sending_blocked_ = false;
RTC_DISALLOW_COPY_AND_ASSIGN(VirtualSocketServer);
};