Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(251)

Side by Side Diff: webrtc/base/virtualsocketserver.cc

Issue 2261523004: Signal to remove remote candidates if ports are pruned. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc@master
Patch Set: Merge to head and fix a comment Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/base/virtualsocketserver.h ('k') | webrtc/p2p/client/basicportallocator.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 // SignalWriteEvent if successful. 521 // SignalWriteEvent if successful.
522 server_->SendTcp(this); 522 server_->SendTcp(this);
523 } 523 }
524 } 524 }
525 525
526 VirtualSocketServer::VirtualSocketServer(SocketServer* ss) 526 VirtualSocketServer::VirtualSocketServer(SocketServer* ss)
527 : server_(ss), 527 : server_(ss),
528 server_owned_(false), 528 server_owned_(false),
529 msg_queue_(NULL), 529 msg_queue_(NULL),
530 stop_on_idle_(false), 530 stop_on_idle_(false),
531 network_delay_(0),
532 next_ipv4_(kInitialNextIPv4), 531 next_ipv4_(kInitialNextIPv4),
533 next_ipv6_(kInitialNextIPv6), 532 next_ipv6_(kInitialNextIPv6),
534 next_port_(kFirstEphemeralPort), 533 next_port_(kFirstEphemeralPort),
535 bindings_(new AddressMap()), 534 bindings_(new AddressMap()),
536 connections_(new ConnectionMap()), 535 connections_(new ConnectionMap()),
537 bandwidth_(0), 536 bandwidth_(0),
538 network_capacity_(kDefaultNetworkCapacity), 537 network_capacity_(kDefaultNetworkCapacity),
539 send_buffer_capacity_(kDefaultTcpBufferSize), 538 send_buffer_capacity_(kDefaultTcpBufferSize),
540 recv_buffer_capacity_(kDefaultTcpBufferSize), 539 recv_buffer_capacity_(kDefaultTcpBufferSize),
541 delay_mean_(0), 540 delay_mean_(0),
542 delay_stddev_(0), 541 delay_stddev_(0),
543 delay_samples_(NUM_SAMPLES), 542 delay_samples_(NUM_SAMPLES),
544 delay_dist_(NULL),
545 drop_prob_(0.0) { 543 drop_prob_(0.0) {
546 if (!server_) { 544 if (!server_) {
547 server_ = new PhysicalSocketServer(); 545 server_ = new PhysicalSocketServer();
548 server_owned_ = true; 546 server_owned_ = true;
549 } 547 }
550 UpdateDelayDistribution(); 548 UpdateDelayDistribution();
551 } 549 }
552 550
553 VirtualSocketServer::~VirtualSocketServer() { 551 VirtualSocketServer::~VirtualSocketServer() {
554 delete bindings_; 552 delete bindings_;
555 delete connections_; 553 delete connections_;
556 delete delay_dist_;
557 if (server_owned_) { 554 if (server_owned_) {
558 delete server_; 555 delete server_;
559 } 556 }
560 } 557 }
561 558
562 IPAddress VirtualSocketServer::GetNextIP(int family) { 559 IPAddress VirtualSocketServer::GetNextIP(int family) {
563 if (family == AF_INET) { 560 if (family == AF_INET) {
564 IPAddress next_ip(next_ipv4_); 561 IPAddress next_ip(next_ipv4_);
565 next_ipv4_.s_addr = 562 next_ipv4_.s_addr =
566 HostToNetwork32(NetworkToHost32(next_ipv4_.s_addr) + 1); 563 HostToNetwork32(NetworkToHost32(next_ipv4_.s_addr) + 1);
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
774 connections_->erase(address_pair); 771 connections_->erase(address_pair);
775 } 772 }
776 773
777 static double Random() { 774 static double Random() {
778 return static_cast<double>(rand()) / RAND_MAX; 775 return static_cast<double>(rand()) / RAND_MAX;
779 } 776 }
780 777
781 int VirtualSocketServer::Connect(VirtualSocket* socket, 778 int VirtualSocketServer::Connect(VirtualSocket* socket,
782 const SocketAddress& remote_addr, 779 const SocketAddress& remote_addr,
783 bool use_delay) { 780 bool use_delay) {
784 uint32_t delay = use_delay ? GetRandomTransitDelay() : 0; 781 uint32_t delay = use_delay ? GetTransitDelay(socket) : 0;
785 VirtualSocket* remote = LookupBinding(remote_addr); 782 VirtualSocket* remote = LookupBinding(remote_addr);
786 if (!CanInteractWith(socket, remote)) { 783 if (!CanInteractWith(socket, remote)) {
787 LOG(LS_INFO) << "Address family mismatch between " 784 LOG(LS_INFO) << "Address family mismatch between "
788 << socket->GetLocalAddress() << " and " << remote_addr; 785 << socket->GetLocalAddress() << " and " << remote_addr;
789 return -1; 786 return -1;
790 } 787 }
791 if (remote != NULL) { 788 if (remote != NULL) {
792 SocketAddress addr = socket->GetLocalAddress(); 789 SocketAddress addr = socket->GetLocalAddress();
793 msg_queue_->PostDelayed(RTC_FROM_HERE, delay, remote, MSG_ID_CONNECT, 790 msg_queue_->PostDelayed(RTC_FROM_HERE, delay, remote, MSG_ID_CONNECT,
794 new MessageAddress(addr)); 791 new MessageAddress(addr));
795 } else { 792 } else {
796 LOG(LS_INFO) << "No one listening at " << remote_addr; 793 LOG(LS_INFO) << "No one listening at " << remote_addr;
797 msg_queue_->PostDelayed(RTC_FROM_HERE, delay, socket, MSG_ID_DISCONNECT); 794 msg_queue_->PostDelayed(RTC_FROM_HERE, delay, socket, MSG_ID_DISCONNECT);
798 } 795 }
799 return 0; 796 return 0;
800 } 797 }
801 798
802 bool VirtualSocketServer::Disconnect(VirtualSocket* socket) { 799 bool VirtualSocketServer::Disconnect(VirtualSocket* socket) {
803 if (socket) { 800 if (socket) {
804 // If we simulate packets being delayed, we should simulate the 801 // If we simulate packets being delayed, we should simulate the
805 // equivalent of a FIN being delayed as well. 802 // equivalent of a FIN being delayed as well.
806 uint32_t delay = GetRandomTransitDelay(); 803 uint32_t delay = GetTransitDelay(socket);
807 // Remove the mapping. 804 // Remove the mapping.
808 msg_queue_->PostDelayed(RTC_FROM_HERE, delay, socket, MSG_ID_DISCONNECT); 805 msg_queue_->PostDelayed(RTC_FROM_HERE, delay, socket, MSG_ID_DISCONNECT);
809 return true; 806 return true;
810 } 807 }
811 return false; 808 return false;
812 } 809 }
813 810
814 int VirtualSocketServer::SendUdp(VirtualSocket* socket, 811 int VirtualSocketServer::SendUdp(VirtualSocket* socket,
815 const char* data, size_t data_size, 812 const char* data, size_t data_size,
816 const SocketAddress& remote_addr) { 813 const SocketAddress& remote_addr) {
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 bool ordered) { 937 bool ordered) {
941 VirtualSocket::NetworkEntry entry; 938 VirtualSocket::NetworkEntry entry;
942 entry.size = data_size + header_size; 939 entry.size = data_size + header_size;
943 940
944 sender->network_size_ += entry.size; 941 sender->network_size_ += entry.size;
945 uint32_t send_delay = SendDelay(static_cast<uint32_t>(sender->network_size_)); 942 uint32_t send_delay = SendDelay(static_cast<uint32_t>(sender->network_size_));
946 entry.done_time = cur_time + send_delay; 943 entry.done_time = cur_time + send_delay;
947 sender->network_.push_back(entry); 944 sender->network_.push_back(entry);
948 945
949 // Find the delay for crossing the many virtual hops of the network. 946 // Find the delay for crossing the many virtual hops of the network.
950 uint32_t transit_delay = GetRandomTransitDelay(); 947 uint32_t transit_delay = GetTransitDelay(sender);
951 948
952 // When the incoming packet is from a binding of the any address, translate it 949 // When the incoming packet is from a binding of the any address, translate it
953 // to the default route here such that the recipient will see the default 950 // to the default route here such that the recipient will see the default
954 // route. 951 // route.
955 SocketAddress sender_addr = sender->local_addr_; 952 SocketAddress sender_addr = sender->local_addr_;
956 IPAddress default_ip = GetDefaultRoute(sender_addr.ipaddr().family()); 953 IPAddress default_ip = GetDefaultRoute(sender_addr.ipaddr().family());
957 if (sender_addr.IsAnyIP() && !IPIsUnspec(default_ip)) { 954 if (sender_addr.IsAnyIP() && !IPIsUnspec(default_ip)) {
958 sender_addr.SetIP(default_ip); 955 sender_addr.SetIP(default_ip);
959 } 956 }
960 957
961 // Post the packet as a message to be delivered (on our own thread) 958 // Post the packet as a message to be delivered (on our own thread)
962 Packet* p = new Packet(data, data_size, sender_addr); 959 Packet* p = new Packet(data, data_size, sender_addr);
963 960
964 int64_t ts = TimeAfter(send_delay + transit_delay); 961 int64_t ts = TimeAfter(send_delay + transit_delay);
965 if (ordered) { 962 if (ordered) {
966 // Ensure that new packets arrive after previous ones 963 // Ensure that new packets arrive after previous ones
967 // TODO: consider ordering on a per-socket basis, since this 964 ts = std::max(ts, sender->last_delivery_time_);
968 // introduces artificial delay. 965 // A socket should not have both ordered and unordered delivery, so its last
969 ts = std::max(ts, network_delay_); 966 // delivery time only needs to be updated when it has ordered delivery.
967 sender->last_delivery_time_ = ts;
970 } 968 }
971 msg_queue_->PostAt(RTC_FROM_HERE, ts, recipient, MSG_ID_PACKET, p); 969 msg_queue_->PostAt(RTC_FROM_HERE, ts, recipient, MSG_ID_PACKET, p);
972 network_delay_ = std::max(ts, network_delay_);
973 } 970 }
974 971
975 void VirtualSocketServer::PurgeNetworkPackets(VirtualSocket* socket, 972 void VirtualSocketServer::PurgeNetworkPackets(VirtualSocket* socket,
976 int64_t cur_time) { 973 int64_t cur_time) {
977 while (!socket->network_.empty() && 974 while (!socket->network_.empty() &&
978 (socket->network_.front().done_time <= cur_time)) { 975 (socket->network_.front().done_time <= cur_time)) {
979 RTC_DCHECK(socket->network_size_ >= socket->network_.front().size); 976 RTC_DCHECK(socket->network_size_ >= socket->network_.front().size);
980 socket->network_size_ -= socket->network_.front().size; 977 socket->network_size_ -= socket->network_.front().size;
981 socket->network_.pop_front(); 978 socket->network_.pop_front();
982 } 979 }
(...skipping 26 matching lines...) Expand all
1009 } 1006 }
1010 } 1007 }
1011 #endif // <unused> 1008 #endif // <unused>
1012 1009
1013 void VirtualSocketServer::UpdateDelayDistribution() { 1010 void VirtualSocketServer::UpdateDelayDistribution() {
1014 Function* dist = CreateDistribution(delay_mean_, delay_stddev_, 1011 Function* dist = CreateDistribution(delay_mean_, delay_stddev_,
1015 delay_samples_); 1012 delay_samples_);
1016 // We take a lock just to make sure we don't leak memory. 1013 // We take a lock just to make sure we don't leak memory.
1017 { 1014 {
1018 CritScope cs(&delay_crit_); 1015 CritScope cs(&delay_crit_);
1019 delete delay_dist_; 1016 delay_dist_.reset(dist);
1020 delay_dist_ = dist;
1021 } 1017 }
1022 } 1018 }
1023 1019
1024 static double PI = 4 * atan(1.0); 1020 static double PI = 4 * atan(1.0);
1025 1021
1026 static double Normal(double x, double mean, double stddev) { 1022 static double Normal(double x, double mean, double stddev) {
1027 double a = (x - mean) * (x - mean) / (2 * stddev * stddev); 1023 double a = (x - mean) * (x - mean) / (2 * stddev * stddev);
1028 return exp(-a) / (stddev * sqrt(2 * PI)); 1024 return exp(-a) / (stddev * sqrt(2 * PI));
1029 } 1025 }
1030 1026
(...skipping 22 matching lines...) Expand all
1053 1049
1054 for (uint32_t i = 0; i < samples; i++) { 1050 for (uint32_t i = 0; i < samples; i++) {
1055 double x = start + (end - start) * i / (samples - 1); 1051 double x = start + (end - start) * i / (samples - 1);
1056 double y = Normal(x, mean, stddev); 1052 double y = Normal(x, mean, stddev);
1057 f->push_back(Point(x, y)); 1053 f->push_back(Point(x, y));
1058 } 1054 }
1059 } 1055 }
1060 return Resample(Invert(Accumulate(f)), 0, 1, samples); 1056 return Resample(Invert(Accumulate(f)), 0, 1, samples);
1061 } 1057 }
1062 1058
1063 uint32_t VirtualSocketServer::GetRandomTransitDelay() { 1059 uint32_t VirtualSocketServer::GetTransitDelay(Socket* socket) {
1060 // Use the delay based on the address if it is set.
1061 auto iter = delay_by_ip_.find(socket->GetLocalAddress().ipaddr());
1062 if (iter != delay_by_ip_.end()) {
1063 return static_cast<uint32_t>(iter->second);
1064 }
1065 // Otherwise, use the delay from the distribution distribution.
1064 size_t index = rand() % delay_dist_->size(); 1066 size_t index = rand() % delay_dist_->size();
1065 double delay = (*delay_dist_)[index].second; 1067 double delay = (*delay_dist_)[index].second;
1066 //LOG_F(LS_INFO) << "random[" << index << "] = " << delay; 1068 // LOG_F(LS_INFO) << "random[" << index << "] = " << delay;
1067 return static_cast<uint32_t>(delay); 1069 return static_cast<uint32_t>(delay);
1068 } 1070 }
1069 1071
1070 struct FunctionDomainCmp { 1072 struct FunctionDomainCmp {
1071 bool operator()(const VirtualSocketServer::Point& p1, 1073 bool operator()(const VirtualSocketServer::Point& p1,
1072 const VirtualSocketServer::Point& p2) { 1074 const VirtualSocketServer::Point& p2) {
1073 return p1.first < p2.first; 1075 return p1.first < p2.first;
1074 } 1076 }
1075 bool operator()(double v1, const VirtualSocketServer::Point& p2) { 1077 bool operator()(double v1, const VirtualSocketServer::Point& p2) {
1076 return v1 < p2.first; 1078 return v1 < p2.first;
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1189 void VirtualSocketServer::SetDefaultRoute(const IPAddress& from_addr) { 1191 void VirtualSocketServer::SetDefaultRoute(const IPAddress& from_addr) {
1190 RTC_DCHECK(!IPIsAny(from_addr)); 1192 RTC_DCHECK(!IPIsAny(from_addr));
1191 if (from_addr.family() == AF_INET) { 1193 if (from_addr.family() == AF_INET) {
1192 default_route_v4_ = from_addr; 1194 default_route_v4_ = from_addr;
1193 } else if (from_addr.family() == AF_INET6) { 1195 } else if (from_addr.family() == AF_INET6) {
1194 default_route_v6_ = from_addr; 1196 default_route_v6_ = from_addr;
1195 } 1197 }
1196 } 1198 }
1197 1199
1198 } // namespace rtc 1200 } // namespace rtc
OLDNEW
« no previous file with comments | « webrtc/base/virtualsocketserver.h ('k') | webrtc/p2p/client/basicportallocator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698