| OLD | NEW |
| 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 19 matching lines...) Expand all Loading... |
| 30 const in_addr kInitialNextIPv4 = { {0x01, 0, 0, 0} }; | 30 const in_addr kInitialNextIPv4 = { {0x01, 0, 0, 0} }; |
| 31 #else | 31 #else |
| 32 // This value is entirely arbitrary, hence the lack of concern about endianness. | 32 // This value is entirely arbitrary, hence the lack of concern about endianness. |
| 33 const in_addr kInitialNextIPv4 = { 0x01000000 }; | 33 const in_addr kInitialNextIPv4 = { 0x01000000 }; |
| 34 #endif | 34 #endif |
| 35 // Starts at ::2 so as to not cause confusion with ::1. | 35 // Starts at ::2 so as to not cause confusion with ::1. |
| 36 const in6_addr kInitialNextIPv6 = { { { | 36 const in6_addr kInitialNextIPv6 = { { { |
| 37 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 | 37 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 |
| 38 } } }; | 38 } } }; |
| 39 | 39 |
| 40 const uint16 kFirstEphemeralPort = 49152; | 40 const uint16_t kFirstEphemeralPort = 49152; |
| 41 const uint16 kLastEphemeralPort = 65535; | 41 const uint16_t kLastEphemeralPort = 65535; |
| 42 const uint16 kEphemeralPortCount = kLastEphemeralPort - kFirstEphemeralPort + 1; | 42 const uint16_t kEphemeralPortCount = |
| 43 const uint32 kDefaultNetworkCapacity = 64 * 1024; | 43 kLastEphemeralPort - kFirstEphemeralPort + 1; |
| 44 const uint32 kDefaultTcpBufferSize = 32 * 1024; | 44 const uint32_t kDefaultNetworkCapacity = 64 * 1024; |
| 45 const uint32_t kDefaultTcpBufferSize = 32 * 1024; |
| 45 | 46 |
| 46 const uint32 UDP_HEADER_SIZE = 28; // IP + UDP headers | 47 const uint32_t UDP_HEADER_SIZE = 28; // IP + UDP headers |
| 47 const uint32 TCP_HEADER_SIZE = 40; // IP + TCP headers | 48 const uint32_t TCP_HEADER_SIZE = 40; // IP + TCP headers |
| 48 const uint32 TCP_MSS = 1400; // Maximum segment size | 49 const uint32_t TCP_MSS = 1400; // Maximum segment size |
| 49 | 50 |
| 50 // Note: The current algorithm doesn't work for sample sizes smaller than this. | 51 // Note: The current algorithm doesn't work for sample sizes smaller than this. |
| 51 const int NUM_SAMPLES = 1000; | 52 const int NUM_SAMPLES = 1000; |
| 52 | 53 |
| 53 enum { | 54 enum { |
| 54 MSG_ID_PACKET, | 55 MSG_ID_PACKET, |
| 55 MSG_ID_ADDRESS_BOUND, | 56 MSG_ID_ADDRESS_BOUND, |
| 56 MSG_ID_CONNECT, | 57 MSG_ID_CONNECT, |
| 57 MSG_ID_DISCONNECT, | 58 MSG_ID_DISCONNECT, |
| 58 }; | 59 }; |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 } | 369 } |
| 369 *value = it->second; | 370 *value = it->second; |
| 370 return 0; // 0 is success to emulate getsockopt() | 371 return 0; // 0 is success to emulate getsockopt() |
| 371 } | 372 } |
| 372 | 373 |
| 373 int VirtualSocket::SetOption(Option opt, int value) { | 374 int VirtualSocket::SetOption(Option opt, int value) { |
| 374 options_map_[opt] = value; | 375 options_map_[opt] = value; |
| 375 return 0; // 0 is success to emulate setsockopt() | 376 return 0; // 0 is success to emulate setsockopt() |
| 376 } | 377 } |
| 377 | 378 |
| 378 int VirtualSocket::EstimateMTU(uint16* mtu) { | 379 int VirtualSocket::EstimateMTU(uint16_t* mtu) { |
| 379 if (CS_CONNECTED != state_) | 380 if (CS_CONNECTED != state_) |
| 380 return ENOTCONN; | 381 return ENOTCONN; |
| 381 else | 382 else |
| 382 return 65536; | 383 return 65536; |
| 383 } | 384 } |
| 384 | 385 |
| 385 void VirtualSocket::OnMessage(Message* pmsg) { | 386 void VirtualSocket::OnMessage(Message* pmsg) { |
| 386 if (pmsg->message_id == MSG_ID_PACKET) { | 387 if (pmsg->message_id == MSG_ID_PACKET) { |
| 387 // ASSERT(!local_addr_.IsAny()); | 388 // ASSERT(!local_addr_.IsAny()); |
| 388 ASSERT(NULL != pmsg->pdata); | 389 ASSERT(NULL != pmsg->pdata); |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 } | 526 } |
| 526 | 527 |
| 527 IPAddress VirtualSocketServer::GetNextIP(int family) { | 528 IPAddress VirtualSocketServer::GetNextIP(int family) { |
| 528 if (family == AF_INET) { | 529 if (family == AF_INET) { |
| 529 IPAddress next_ip(next_ipv4_); | 530 IPAddress next_ip(next_ipv4_); |
| 530 next_ipv4_.s_addr = | 531 next_ipv4_.s_addr = |
| 531 HostToNetwork32(NetworkToHost32(next_ipv4_.s_addr) + 1); | 532 HostToNetwork32(NetworkToHost32(next_ipv4_.s_addr) + 1); |
| 532 return next_ip; | 533 return next_ip; |
| 533 } else if (family == AF_INET6) { | 534 } else if (family == AF_INET6) { |
| 534 IPAddress next_ip(next_ipv6_); | 535 IPAddress next_ip(next_ipv6_); |
| 535 uint32* as_ints = reinterpret_cast<uint32*>(&next_ipv6_.s6_addr); | 536 uint32_t* as_ints = reinterpret_cast<uint32_t*>(&next_ipv6_.s6_addr); |
| 536 as_ints[3] += 1; | 537 as_ints[3] += 1; |
| 537 return next_ip; | 538 return next_ip; |
| 538 } | 539 } |
| 539 return IPAddress(); | 540 return IPAddress(); |
| 540 } | 541 } |
| 541 | 542 |
| 542 uint16 VirtualSocketServer::GetNextPort() { | 543 uint16_t VirtualSocketServer::GetNextPort() { |
| 543 uint16 port = next_port_; | 544 uint16_t port = next_port_; |
| 544 if (next_port_ < kLastEphemeralPort) { | 545 if (next_port_ < kLastEphemeralPort) { |
| 545 ++next_port_; | 546 ++next_port_; |
| 546 } else { | 547 } else { |
| 547 next_port_ = kFirstEphemeralPort; | 548 next_port_ = kFirstEphemeralPort; |
| 548 } | 549 } |
| 549 return port; | 550 return port; |
| 550 } | 551 } |
| 551 | 552 |
| 552 Socket* VirtualSocketServer::CreateSocket(int type) { | 553 Socket* VirtualSocketServer::CreateSocket(int type) { |
| 553 return CreateSocket(AF_INET, type); | 554 return CreateSocket(AF_INET, type); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 while (!msg_queue_->empty()) { | 596 while (!msg_queue_->empty()) { |
| 596 Message msg; | 597 Message msg; |
| 597 if (msg_queue_->Get(&msg, Thread::kForever)) { | 598 if (msg_queue_->Get(&msg, Thread::kForever)) { |
| 598 msg_queue_->Dispatch(&msg); | 599 msg_queue_->Dispatch(&msg); |
| 599 } | 600 } |
| 600 } | 601 } |
| 601 stop_on_idle_ = false; | 602 stop_on_idle_ = false; |
| 602 return !msg_queue_->IsQuitting(); | 603 return !msg_queue_->IsQuitting(); |
| 603 } | 604 } |
| 604 | 605 |
| 605 void VirtualSocketServer::SetNextPortForTesting(uint16 port) { | 606 void VirtualSocketServer::SetNextPortForTesting(uint16_t port) { |
| 606 next_port_ = port; | 607 next_port_ = port; |
| 607 } | 608 } |
| 608 | 609 |
| 609 bool VirtualSocketServer::CloseTcpConnections( | 610 bool VirtualSocketServer::CloseTcpConnections( |
| 610 const SocketAddress& addr_local, | 611 const SocketAddress& addr_local, |
| 611 const SocketAddress& addr_remote) { | 612 const SocketAddress& addr_remote) { |
| 612 VirtualSocket* socket = LookupConnection(addr_local, addr_remote); | 613 VirtualSocket* socket = LookupConnection(addr_local, addr_remote); |
| 613 if (!socket) { | 614 if (!socket) { |
| 614 return false; | 615 return false; |
| 615 } | 616 } |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 724 connections_->erase(address_pair); | 725 connections_->erase(address_pair); |
| 725 } | 726 } |
| 726 | 727 |
| 727 static double Random() { | 728 static double Random() { |
| 728 return static_cast<double>(rand()) / RAND_MAX; | 729 return static_cast<double>(rand()) / RAND_MAX; |
| 729 } | 730 } |
| 730 | 731 |
| 731 int VirtualSocketServer::Connect(VirtualSocket* socket, | 732 int VirtualSocketServer::Connect(VirtualSocket* socket, |
| 732 const SocketAddress& remote_addr, | 733 const SocketAddress& remote_addr, |
| 733 bool use_delay) { | 734 bool use_delay) { |
| 734 uint32 delay = use_delay ? GetRandomTransitDelay() : 0; | 735 uint32_t delay = use_delay ? GetRandomTransitDelay() : 0; |
| 735 VirtualSocket* remote = LookupBinding(remote_addr); | 736 VirtualSocket* remote = LookupBinding(remote_addr); |
| 736 if (!CanInteractWith(socket, remote)) { | 737 if (!CanInteractWith(socket, remote)) { |
| 737 LOG(LS_INFO) << "Address family mismatch between " | 738 LOG(LS_INFO) << "Address family mismatch between " |
| 738 << socket->GetLocalAddress() << " and " << remote_addr; | 739 << socket->GetLocalAddress() << " and " << remote_addr; |
| 739 return -1; | 740 return -1; |
| 740 } | 741 } |
| 741 if (remote != NULL) { | 742 if (remote != NULL) { |
| 742 SocketAddress addr = socket->GetLocalAddress(); | 743 SocketAddress addr = socket->GetLocalAddress(); |
| 743 msg_queue_->PostDelayed(delay, remote, MSG_ID_CONNECT, | 744 msg_queue_->PostDelayed(delay, remote, MSG_ID_CONNECT, |
| 744 new MessageAddress(addr)); | 745 new MessageAddress(addr)); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 783 } | 784 } |
| 784 | 785 |
| 785 if (!CanInteractWith(socket, recipient)) { | 786 if (!CanInteractWith(socket, recipient)) { |
| 786 LOG(LS_VERBOSE) << "Incompatible address families: " | 787 LOG(LS_VERBOSE) << "Incompatible address families: " |
| 787 << socket->GetLocalAddress() << " and " << remote_addr; | 788 << socket->GetLocalAddress() << " and " << remote_addr; |
| 788 return -1; | 789 return -1; |
| 789 } | 790 } |
| 790 | 791 |
| 791 CritScope cs(&socket->crit_); | 792 CritScope cs(&socket->crit_); |
| 792 | 793 |
| 793 uint32 cur_time = Time(); | 794 uint32_t cur_time = Time(); |
| 794 PurgeNetworkPackets(socket, cur_time); | 795 PurgeNetworkPackets(socket, cur_time); |
| 795 | 796 |
| 796 // Determine whether we have enough bandwidth to accept this packet. To do | 797 // Determine whether we have enough bandwidth to accept this packet. To do |
| 797 // this, we need to update the send queue. Once we know it's current size, | 798 // this, we need to update the send queue. Once we know it's current size, |
| 798 // we know whether we can fit this packet. | 799 // we know whether we can fit this packet. |
| 799 // | 800 // |
| 800 // NOTE: There are better algorithms for maintaining such a queue (such as | 801 // NOTE: There are better algorithms for maintaining such a queue (such as |
| 801 // "Derivative Random Drop"); however, this algorithm is a more accurate | 802 // "Derivative Random Drop"); however, this algorithm is a more accurate |
| 802 // simulation of what a normal network would do. | 803 // simulation of what a normal network would do. |
| 803 | 804 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 823 // Lookup the local/remote pair in the connections table. | 824 // Lookup the local/remote pair in the connections table. |
| 824 VirtualSocket* recipient = LookupConnection(socket->local_addr_, | 825 VirtualSocket* recipient = LookupConnection(socket->local_addr_, |
| 825 socket->remote_addr_); | 826 socket->remote_addr_); |
| 826 if (!recipient) { | 827 if (!recipient) { |
| 827 LOG(LS_VERBOSE) << "Sending data to no one."; | 828 LOG(LS_VERBOSE) << "Sending data to no one."; |
| 828 return; | 829 return; |
| 829 } | 830 } |
| 830 | 831 |
| 831 CritScope cs(&socket->crit_); | 832 CritScope cs(&socket->crit_); |
| 832 | 833 |
| 833 uint32 cur_time = Time(); | 834 uint32_t cur_time = Time(); |
| 834 PurgeNetworkPackets(socket, cur_time); | 835 PurgeNetworkPackets(socket, cur_time); |
| 835 | 836 |
| 836 while (true) { | 837 while (true) { |
| 837 size_t available = recv_buffer_capacity_ - recipient->recv_buffer_size_; | 838 size_t available = recv_buffer_capacity_ - recipient->recv_buffer_size_; |
| 838 size_t max_data_size = | 839 size_t max_data_size = |
| 839 std::min<size_t>(available, TCP_MSS - TCP_HEADER_SIZE); | 840 std::min<size_t>(available, TCP_MSS - TCP_HEADER_SIZE); |
| 840 size_t data_size = std::min(socket->send_buffer_.size(), max_data_size); | 841 size_t data_size = std::min(socket->send_buffer_.size(), max_data_size); |
| 841 if (0 == data_size) | 842 if (0 == data_size) |
| 842 break; | 843 break; |
| 843 | 844 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 858 | 859 |
| 859 if (socket->write_enabled_ | 860 if (socket->write_enabled_ |
| 860 && (socket->send_buffer_.size() < send_buffer_capacity_)) { | 861 && (socket->send_buffer_.size() < send_buffer_capacity_)) { |
| 861 socket->write_enabled_ = false; | 862 socket->write_enabled_ = false; |
| 862 socket->SignalWriteEvent(socket); | 863 socket->SignalWriteEvent(socket); |
| 863 } | 864 } |
| 864 } | 865 } |
| 865 | 866 |
| 866 void VirtualSocketServer::AddPacketToNetwork(VirtualSocket* sender, | 867 void VirtualSocketServer::AddPacketToNetwork(VirtualSocket* sender, |
| 867 VirtualSocket* recipient, | 868 VirtualSocket* recipient, |
| 868 uint32 cur_time, | 869 uint32_t cur_time, |
| 869 const char* data, | 870 const char* data, |
| 870 size_t data_size, | 871 size_t data_size, |
| 871 size_t header_size, | 872 size_t header_size, |
| 872 bool ordered) { | 873 bool ordered) { |
| 873 VirtualSocket::NetworkEntry entry; | 874 VirtualSocket::NetworkEntry entry; |
| 874 entry.size = data_size + header_size; | 875 entry.size = data_size + header_size; |
| 875 | 876 |
| 876 sender->network_size_ += entry.size; | 877 sender->network_size_ += entry.size; |
| 877 uint32 send_delay = SendDelay(static_cast<uint32>(sender->network_size_)); | 878 uint32_t send_delay = SendDelay(static_cast<uint32_t>(sender->network_size_)); |
| 878 entry.done_time = cur_time + send_delay; | 879 entry.done_time = cur_time + send_delay; |
| 879 sender->network_.push_back(entry); | 880 sender->network_.push_back(entry); |
| 880 | 881 |
| 881 // Find the delay for crossing the many virtual hops of the network. | 882 // Find the delay for crossing the many virtual hops of the network. |
| 882 uint32 transit_delay = GetRandomTransitDelay(); | 883 uint32_t transit_delay = GetRandomTransitDelay(); |
| 883 | 884 |
| 884 // When the incoming packet is from a binding of the any address, translate it | 885 // When the incoming packet is from a binding of the any address, translate it |
| 885 // to the default route here such that the recipient will see the default | 886 // to the default route here such that the recipient will see the default |
| 886 // route. | 887 // route. |
| 887 SocketAddress sender_addr = sender->local_addr_; | 888 SocketAddress sender_addr = sender->local_addr_; |
| 888 IPAddress default_ip = GetDefaultRoute(sender_addr.ipaddr().family()); | 889 IPAddress default_ip = GetDefaultRoute(sender_addr.ipaddr().family()); |
| 889 if (sender_addr.IsAnyIP() && !IPIsUnspec(default_ip)) { | 890 if (sender_addr.IsAnyIP() && !IPIsUnspec(default_ip)) { |
| 890 sender_addr.SetIP(default_ip); | 891 sender_addr.SetIP(default_ip); |
| 891 } | 892 } |
| 892 | 893 |
| 893 // Post the packet as a message to be delivered (on our own thread) | 894 // Post the packet as a message to be delivered (on our own thread) |
| 894 Packet* p = new Packet(data, data_size, sender_addr); | 895 Packet* p = new Packet(data, data_size, sender_addr); |
| 895 | 896 |
| 896 uint32 ts = TimeAfter(send_delay + transit_delay); | 897 uint32_t ts = TimeAfter(send_delay + transit_delay); |
| 897 if (ordered) { | 898 if (ordered) { |
| 898 // Ensure that new packets arrive after previous ones | 899 // Ensure that new packets arrive after previous ones |
| 899 // TODO: consider ordering on a per-socket basis, since this | 900 // TODO: consider ordering on a per-socket basis, since this |
| 900 // introduces artifical delay. | 901 // introduces artifical delay. |
| 901 ts = TimeMax(ts, network_delay_); | 902 ts = TimeMax(ts, network_delay_); |
| 902 } | 903 } |
| 903 msg_queue_->PostAt(ts, recipient, MSG_ID_PACKET, p); | 904 msg_queue_->PostAt(ts, recipient, MSG_ID_PACKET, p); |
| 904 network_delay_ = TimeMax(ts, network_delay_); | 905 network_delay_ = TimeMax(ts, network_delay_); |
| 905 } | 906 } |
| 906 | 907 |
| 907 void VirtualSocketServer::PurgeNetworkPackets(VirtualSocket* socket, | 908 void VirtualSocketServer::PurgeNetworkPackets(VirtualSocket* socket, |
| 908 uint32 cur_time) { | 909 uint32_t cur_time) { |
| 909 while (!socket->network_.empty() && | 910 while (!socket->network_.empty() && |
| 910 (socket->network_.front().done_time <= cur_time)) { | 911 (socket->network_.front().done_time <= cur_time)) { |
| 911 ASSERT(socket->network_size_ >= socket->network_.front().size); | 912 ASSERT(socket->network_size_ >= socket->network_.front().size); |
| 912 socket->network_size_ -= socket->network_.front().size; | 913 socket->network_size_ -= socket->network_.front().size; |
| 913 socket->network_.pop_front(); | 914 socket->network_.pop_front(); |
| 914 } | 915 } |
| 915 } | 916 } |
| 916 | 917 |
| 917 uint32 VirtualSocketServer::SendDelay(uint32 size) { | 918 uint32_t VirtualSocketServer::SendDelay(uint32_t size) { |
| 918 if (bandwidth_ == 0) | 919 if (bandwidth_ == 0) |
| 919 return 0; | 920 return 0; |
| 920 else | 921 else |
| 921 return 1000 * size / bandwidth_; | 922 return 1000 * size / bandwidth_; |
| 922 } | 923 } |
| 923 | 924 |
| 924 #if 0 | 925 #if 0 |
| 925 void PrintFunction(std::vector<std::pair<double, double> >* f) { | 926 void PrintFunction(std::vector<std::pair<double, double> >* f) { |
| 926 return; | 927 return; |
| 927 double sum = 0; | 928 double sum = 0; |
| 928 for (uint32 i = 0; i < f->size(); ++i) { | 929 for (uint32_t i = 0; i < f->size(); ++i) { |
| 929 std::cout << (*f)[i].first << '\t' << (*f)[i].second << std::endl; | 930 std::cout << (*f)[i].first << '\t' << (*f)[i].second << std::endl; |
| 930 sum += (*f)[i].second; | 931 sum += (*f)[i].second; |
| 931 } | 932 } |
| 932 if (!f->empty()) { | 933 if (!f->empty()) { |
| 933 const double mean = sum / f->size(); | 934 const double mean = sum / f->size(); |
| 934 double sum_sq_dev = 0; | 935 double sum_sq_dev = 0; |
| 935 for (uint32 i = 0; i < f->size(); ++i) { | 936 for (uint32_t i = 0; i < f->size(); ++i) { |
| 936 double dev = (*f)[i].second - mean; | 937 double dev = (*f)[i].second - mean; |
| 937 sum_sq_dev += dev * dev; | 938 sum_sq_dev += dev * dev; |
| 938 } | 939 } |
| 939 std::cout << "Mean = " << mean << " StdDev = " | 940 std::cout << "Mean = " << mean << " StdDev = " |
| 940 << sqrt(sum_sq_dev / f->size()) << std::endl; | 941 << sqrt(sum_sq_dev / f->size()) << std::endl; |
| 941 } | 942 } |
| 942 } | 943 } |
| 943 #endif // <unused> | 944 #endif // <unused> |
| 944 | 945 |
| 945 void VirtualSocketServer::UpdateDelayDistribution() { | 946 void VirtualSocketServer::UpdateDelayDistribution() { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 963 #if 0 // static unused gives a warning | 964 #if 0 // static unused gives a warning |
| 964 static double Pareto(double x, double min, double k) { | 965 static double Pareto(double x, double min, double k) { |
| 965 if (x < min) | 966 if (x < min) |
| 966 return 0; | 967 return 0; |
| 967 else | 968 else |
| 968 return k * std::pow(min, k) / std::pow(x, k+1); | 969 return k * std::pow(min, k) / std::pow(x, k+1); |
| 969 } | 970 } |
| 970 #endif | 971 #endif |
| 971 | 972 |
| 972 VirtualSocketServer::Function* VirtualSocketServer::CreateDistribution( | 973 VirtualSocketServer::Function* VirtualSocketServer::CreateDistribution( |
| 973 uint32 mean, uint32 stddev, uint32 samples) { | 974 uint32_t mean, |
| 975 uint32_t stddev, |
| 976 uint32_t samples) { |
| 974 Function* f = new Function(); | 977 Function* f = new Function(); |
| 975 | 978 |
| 976 if (0 == stddev) { | 979 if (0 == stddev) { |
| 977 f->push_back(Point(mean, 1.0)); | 980 f->push_back(Point(mean, 1.0)); |
| 978 } else { | 981 } else { |
| 979 double start = 0; | 982 double start = 0; |
| 980 if (mean >= 4 * static_cast<double>(stddev)) | 983 if (mean >= 4 * static_cast<double>(stddev)) |
| 981 start = mean - 4 * static_cast<double>(stddev); | 984 start = mean - 4 * static_cast<double>(stddev); |
| 982 double end = mean + 4 * static_cast<double>(stddev); | 985 double end = mean + 4 * static_cast<double>(stddev); |
| 983 | 986 |
| 984 for (uint32 i = 0; i < samples; i++) { | 987 for (uint32_t i = 0; i < samples; i++) { |
| 985 double x = start + (end - start) * i / (samples - 1); | 988 double x = start + (end - start) * i / (samples - 1); |
| 986 double y = Normal(x, mean, stddev); | 989 double y = Normal(x, mean, stddev); |
| 987 f->push_back(Point(x, y)); | 990 f->push_back(Point(x, y)); |
| 988 } | 991 } |
| 989 } | 992 } |
| 990 return Resample(Invert(Accumulate(f)), 0, 1, samples); | 993 return Resample(Invert(Accumulate(f)), 0, 1, samples); |
| 991 } | 994 } |
| 992 | 995 |
| 993 uint32 VirtualSocketServer::GetRandomTransitDelay() { | 996 uint32_t VirtualSocketServer::GetRandomTransitDelay() { |
| 994 size_t index = rand() % delay_dist_->size(); | 997 size_t index = rand() % delay_dist_->size(); |
| 995 double delay = (*delay_dist_)[index].second; | 998 double delay = (*delay_dist_)[index].second; |
| 996 //LOG_F(LS_INFO) << "random[" << index << "] = " << delay; | 999 //LOG_F(LS_INFO) << "random[" << index << "] = " << delay; |
| 997 return static_cast<uint32>(delay); | 1000 return static_cast<uint32_t>(delay); |
| 998 } | 1001 } |
| 999 | 1002 |
| 1000 struct FunctionDomainCmp { | 1003 struct FunctionDomainCmp { |
| 1001 bool operator()(const VirtualSocketServer::Point& p1, | 1004 bool operator()(const VirtualSocketServer::Point& p1, |
| 1002 const VirtualSocketServer::Point& p2) { | 1005 const VirtualSocketServer::Point& p2) { |
| 1003 return p1.first < p2.first; | 1006 return p1.first < p2.first; |
| 1004 } | 1007 } |
| 1005 bool operator()(double v1, const VirtualSocketServer::Point& p2) { | 1008 bool operator()(double v1, const VirtualSocketServer::Point& p2) { |
| 1006 return v1 < p2.first; | 1009 return v1 < p2.first; |
| 1007 } | 1010 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1024 } | 1027 } |
| 1025 | 1028 |
| 1026 VirtualSocketServer::Function* VirtualSocketServer::Invert(Function* f) { | 1029 VirtualSocketServer::Function* VirtualSocketServer::Invert(Function* f) { |
| 1027 for (Function::size_type i = 0; i < f->size(); ++i) | 1030 for (Function::size_type i = 0; i < f->size(); ++i) |
| 1028 std::swap((*f)[i].first, (*f)[i].second); | 1031 std::swap((*f)[i].first, (*f)[i].second); |
| 1029 | 1032 |
| 1030 std::sort(f->begin(), f->end(), FunctionDomainCmp()); | 1033 std::sort(f->begin(), f->end(), FunctionDomainCmp()); |
| 1031 return f; | 1034 return f; |
| 1032 } | 1035 } |
| 1033 | 1036 |
| 1034 VirtualSocketServer::Function* VirtualSocketServer::Resample( | 1037 VirtualSocketServer::Function* VirtualSocketServer::Resample(Function* f, |
| 1035 Function* f, double x1, double x2, uint32 samples) { | 1038 double x1, |
| 1039 double x2, |
| 1040 uint32_t samples) { |
| 1036 Function* g = new Function(); | 1041 Function* g = new Function(); |
| 1037 | 1042 |
| 1038 for (size_t i = 0; i < samples; i++) { | 1043 for (size_t i = 0; i < samples; i++) { |
| 1039 double x = x1 + (x2 - x1) * i / (samples - 1); | 1044 double x = x1 + (x2 - x1) * i / (samples - 1); |
| 1040 double y = Evaluate(f, x); | 1045 double y = Evaluate(f, x); |
| 1041 g->push_back(Point(x, y)); | 1046 g->push_back(Point(x, y)); |
| 1042 } | 1047 } |
| 1043 | 1048 |
| 1044 delete f; | 1049 delete f; |
| 1045 return g; | 1050 return g; |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1117 void VirtualSocketServer::SetDefaultRoute(const IPAddress& from_addr) { | 1122 void VirtualSocketServer::SetDefaultRoute(const IPAddress& from_addr) { |
| 1118 RTC_DCHECK(!IPIsAny(from_addr)); | 1123 RTC_DCHECK(!IPIsAny(from_addr)); |
| 1119 if (from_addr.family() == AF_INET) { | 1124 if (from_addr.family() == AF_INET) { |
| 1120 default_route_v4_ = from_addr; | 1125 default_route_v4_ = from_addr; |
| 1121 } else if (from_addr.family() == AF_INET6) { | 1126 } else if (from_addr.family() == AF_INET6) { |
| 1122 default_route_v6_ = from_addr; | 1127 default_route_v6_ = from_addr; |
| 1123 } | 1128 } |
| 1124 } | 1129 } |
| 1125 | 1130 |
| 1126 } // namespace rtc | 1131 } // namespace rtc |
| OLD | NEW |