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

Side by Side Diff: webrtc/p2p/stunprober/stunprober.cc

Issue 1821083002: Split ByteBuffer into writer/reader objects. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 9 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/p2p/base/turnserver.cc ('k') | no next file » | 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 2015 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2015 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 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 private: 86 private:
87 Request* GetRequestByAddress(const rtc::IPAddress& ip); 87 Request* GetRequestByAddress(const rtc::IPAddress& ip);
88 88
89 StunProber* prober_; 89 StunProber* prober_;
90 90
91 // The socket for this session. 91 // The socket for this session.
92 rtc::scoped_ptr<rtc::AsyncPacketSocket> socket_; 92 rtc::scoped_ptr<rtc::AsyncPacketSocket> socket_;
93 93
94 // Temporary SocketAddress and buffer for RecvFrom. 94 // Temporary SocketAddress and buffer for RecvFrom.
95 rtc::SocketAddress addr_; 95 rtc::SocketAddress addr_;
96 rtc::scoped_ptr<rtc::ByteBuffer> response_packet_; 96 rtc::scoped_ptr<rtc::ByteBufferWriter> response_packet_;
97 97
98 std::vector<Request*> requests_; 98 std::vector<Request*> requests_;
99 std::vector<rtc::SocketAddress> server_ips_; 99 std::vector<rtc::SocketAddress> server_ips_;
100 int16_t num_request_sent_ = 0; 100 int16_t num_request_sent_ = 0;
101 int16_t num_response_received_ = 0; 101 int16_t num_response_received_ = 0;
102 102
103 rtc::ThreadChecker& thread_checker_; 103 rtc::ThreadChecker& thread_checker_;
104 104
105 RTC_DISALLOW_COPY_AND_ASSIGN(Requester); 105 RTC_DISALLOW_COPY_AND_ASSIGN(Requester);
106 }; 106 };
107 107
108 StunProber::Requester::Requester( 108 StunProber::Requester::Requester(
109 StunProber* prober, 109 StunProber* prober,
110 rtc::AsyncPacketSocket* socket, 110 rtc::AsyncPacketSocket* socket,
111 const std::vector<rtc::SocketAddress>& server_ips) 111 const std::vector<rtc::SocketAddress>& server_ips)
112 : prober_(prober), 112 : prober_(prober),
113 socket_(socket), 113 socket_(socket),
114 response_packet_(new rtc::ByteBuffer(nullptr, kMaxUdpBufferSize)), 114 response_packet_(new rtc::ByteBufferWriter(nullptr, kMaxUdpBufferSize)),
115 server_ips_(server_ips), 115 server_ips_(server_ips),
116 thread_checker_(prober->thread_checker_) { 116 thread_checker_(prober->thread_checker_) {
117 socket_->SignalReadPacket.connect( 117 socket_->SignalReadPacket.connect(
118 this, &StunProber::Requester::OnStunResponseReceived); 118 this, &StunProber::Requester::OnStunResponseReceived);
119 } 119 }
120 120
121 StunProber::Requester::~Requester() { 121 StunProber::Requester::~Requester() {
122 if (socket_) { 122 if (socket_) {
123 socket_->Close(); 123 socket_->Close();
124 } 124 }
125 for (auto req : requests_) { 125 for (auto req : requests_) {
126 if (req) { 126 if (req) {
127 delete req; 127 delete req;
128 } 128 }
129 } 129 }
130 } 130 }
131 131
132 void StunProber::Requester::SendStunRequest() { 132 void StunProber::Requester::SendStunRequest() {
133 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 133 RTC_DCHECK(thread_checker_.CalledOnValidThread());
134 requests_.push_back(new Request()); 134 requests_.push_back(new Request());
135 Request& request = *(requests_.back()); 135 Request& request = *(requests_.back());
136 cricket::StunMessage message; 136 cricket::StunMessage message;
137 137
138 // Random transaction ID, STUN_BINDING_REQUEST 138 // Random transaction ID, STUN_BINDING_REQUEST
139 message.SetTransactionID( 139 message.SetTransactionID(
140 rtc::CreateRandomString(cricket::kStunTransactionIdLength)); 140 rtc::CreateRandomString(cricket::kStunTransactionIdLength));
141 message.SetType(cricket::STUN_BINDING_REQUEST); 141 message.SetType(cricket::STUN_BINDING_REQUEST);
142 142
143 rtc::scoped_ptr<rtc::ByteBuffer> request_packet( 143 rtc::scoped_ptr<rtc::ByteBufferWriter> request_packet(
144 new rtc::ByteBuffer(nullptr, kMaxUdpBufferSize)); 144 new rtc::ByteBufferWriter(nullptr, kMaxUdpBufferSize));
145 if (!message.Write(request_packet.get())) { 145 if (!message.Write(request_packet.get())) {
146 prober_->ReportOnFinished(WRITE_FAILED); 146 prober_->ReportOnFinished(WRITE_FAILED);
147 return; 147 return;
148 } 148 }
149 149
150 auto addr = server_ips_[num_request_sent_]; 150 auto addr = server_ips_[num_request_sent_];
151 request.server_addr = addr.ipaddr(); 151 request.server_addr = addr.ipaddr();
152 152
153 // The write must succeed immediately. Otherwise, the calculating of the STUN 153 // The write must succeed immediately. Otherwise, the calculating of the STUN
154 // request timing could become too complicated. Callback is ignored by passing 154 // request timing could become too complicated. Callback is ignored by passing
155 // empty AsyncCallback. 155 // empty AsyncCallback.
156 rtc::PacketOptions options; 156 rtc::PacketOptions options;
157 int rv = socket_->SendTo(const_cast<char*>(request_packet->Data()), 157 int rv = socket_->SendTo(const_cast<char*>(request_packet->Data()),
158 request_packet->Length(), addr, options); 158 request_packet->Length(), addr, options);
159 if (rv < 0) { 159 if (rv < 0) {
160 prober_->ReportOnFinished(WRITE_FAILED); 160 prober_->ReportOnFinished(WRITE_FAILED);
161 return; 161 return;
162 } 162 }
163 163
164 request.sent_time_ms = rtc::Time64(); 164 request.sent_time_ms = rtc::Time64();
165 165
166 num_request_sent_++; 166 num_request_sent_++;
167 RTC_DCHECK(static_cast<size_t>(num_request_sent_) <= server_ips_.size()); 167 RTC_DCHECK(static_cast<size_t>(num_request_sent_) <= server_ips_.size());
168 } 168 }
169 169
170 void StunProber::Requester::Request::ProcessResponse(const char* buf, 170 void StunProber::Requester::Request::ProcessResponse(const char* buf,
171 size_t buf_len) { 171 size_t buf_len) {
172 int64_t now = rtc::Time64(); 172 int64_t now = rtc::Time64();
173 rtc::ByteBuffer message(buf, buf_len); 173 rtc::ByteBufferReader message(buf, buf_len);
174 cricket::StunMessage stun_response; 174 cricket::StunMessage stun_response;
175 if (!stun_response.Read(&message)) { 175 if (!stun_response.Read(&message)) {
176 // Invalid or incomplete STUN packet. 176 // Invalid or incomplete STUN packet.
177 received_time_ms = 0; 177 received_time_ms = 0;
178 return; 178 return;
179 } 179 }
180 180
181 // Get external address of the socket. 181 // Get external address of the socket.
182 const cricket::StunAddressAttribute* addr_attr = 182 const cricket::StunAddressAttribute* addr_attr =
183 stun_response.GetAddress(cricket::STUN_ATTR_MAPPED_ADDRESS); 183 stun_response.GetAddress(cricket::STUN_ATTR_MAPPED_ADDRESS);
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 } 561 }
562 } 562 }
563 563
564 void StunProber::ReportOnFinished(StunProber::Status status) { 564 void StunProber::ReportOnFinished(StunProber::Status status) {
565 if (observer_) { 565 if (observer_) {
566 observer_->OnFinished(this, status); 566 observer_->OnFinished(this, status);
567 } 567 }
568 } 568 }
569 569
570 } // namespace stunprober 570 } // namespace stunprober
OLDNEW
« no previous file with comments | « webrtc/p2p/base/turnserver.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698