OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/renderer_host/p2p/socket_host_tcp.h" | 5 #include "content/browser/renderer_host/p2p/socket_host_tcp.h" |
6 | 6 |
7 #include "base/sys_byteorder.h" | 7 #include "base/sys_byteorder.h" |
8 #include "content/common/p2p_messages.h" | 8 #include "content/common/p2p_messages.h" |
9 #include "net/base/io_buffer.h" | 9 #include "net/base/io_buffer.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 if (result == net::ERR_IO_PENDING) { | 161 if (result == net::ERR_IO_PENDING) { |
162 return; | 162 return; |
163 } else if (result < 0){ | 163 } else if (result < 0){ |
164 LOG(ERROR) << "Error when reading from TCP socket: " << result; | 164 LOG(ERROR) << "Error when reading from TCP socket: " << result; |
165 OnError(); | 165 OnError(); |
166 return; | 166 return; |
167 } | 167 } |
168 | 168 |
169 read_buffer_->set_offset(read_buffer_->offset() + result); | 169 read_buffer_->set_offset(read_buffer_->offset() + result); |
170 if (read_buffer_->offset() > kPacketHeaderSize) { | 170 if (read_buffer_->offset() > kPacketHeaderSize) { |
171 int packet_size = | 171 int packet_size = base::NetToHost16( |
172 ntohs(*reinterpret_cast<uint16*>(read_buffer_->StartOfBuffer())); | 172 *reinterpret_cast<uint16*>(read_buffer_->StartOfBuffer())); |
173 if (packet_size + kPacketHeaderSize <= read_buffer_->offset()) { | 173 if (packet_size + kPacketHeaderSize <= read_buffer_->offset()) { |
174 // We've got a full packet! | 174 // We've got a full packet! |
175 char* start = read_buffer_->StartOfBuffer() + kPacketHeaderSize; | 175 char* start = read_buffer_->StartOfBuffer() + kPacketHeaderSize; |
176 std::vector<char> data(start, start + packet_size); | 176 std::vector<char> data(start, start + packet_size); |
177 OnPacket(data); | 177 OnPacket(data); |
178 | 178 |
179 // Move remaining data to the start of the buffer. | 179 // Move remaining data to the start of the buffer. |
180 memmove(read_buffer_->StartOfBuffer(), start + packet_size, | 180 memmove(read_buffer_->StartOfBuffer(), start + packet_size, |
181 read_buffer_->offset() - packet_size - kPacketHeaderSize); | 181 read_buffer_->offset() - packet_size - kPacketHeaderSize); |
182 read_buffer_->set_offset(read_buffer_->offset() - packet_size - | 182 read_buffer_->set_offset(read_buffer_->offset() - packet_size - |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 if (!stun || type == STUN_DATA_INDICATION) { | 214 if (!stun || type == STUN_DATA_INDICATION) { |
215 LOG(ERROR) << "Page tried to send a data packet to " << to.ToString() | 215 LOG(ERROR) << "Page tried to send a data packet to " << to.ToString() |
216 << " before STUN binding is finished."; | 216 << " before STUN binding is finished."; |
217 OnError(); | 217 OnError(); |
218 return; | 218 return; |
219 } | 219 } |
220 } | 220 } |
221 | 221 |
222 int size = kPacketHeaderSize + data.size(); | 222 int size = kPacketHeaderSize + data.size(); |
223 write_buffer_ = new net::DrainableIOBuffer(new net::IOBuffer(size), size); | 223 write_buffer_ = new net::DrainableIOBuffer(new net::IOBuffer(size), size); |
224 *reinterpret_cast<uint16*>(write_buffer_->data()) = htons(data.size()); | 224 *reinterpret_cast<uint16*>(write_buffer_->data()) = |
| 225 base::HostToNet16(data.size()); |
225 memcpy(write_buffer_->data() + kPacketHeaderSize, &data[0], data.size()); | 226 memcpy(write_buffer_->data() + kPacketHeaderSize, &data[0], data.size()); |
226 | 227 |
227 DoWrite(); | 228 DoWrite(); |
228 } | 229 } |
229 | 230 |
230 void P2PSocketHostTcp::DoWrite() { | 231 void P2PSocketHostTcp::DoWrite() { |
231 while (true) { | 232 while (true) { |
232 int result = socket_->Write(write_buffer_, write_buffer_->BytesRemaining(), | 233 int result = socket_->Write(write_buffer_, write_buffer_->BytesRemaining(), |
233 base::Bind(&P2PSocketHostTcp::OnWritten, | 234 base::Bind(&P2PSocketHostTcp::OnWritten, |
234 base::Unretained(this))); | 235 base::Unretained(this))); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 } | 269 } |
269 | 270 |
270 P2PSocketHost* P2PSocketHostTcp::AcceptIncomingTcpConnection( | 271 P2PSocketHost* P2PSocketHostTcp::AcceptIncomingTcpConnection( |
271 const net::IPEndPoint& remote_address, int id) { | 272 const net::IPEndPoint& remote_address, int id) { |
272 NOTREACHED(); | 273 NOTREACHED(); |
273 OnError(); | 274 OnError(); |
274 return NULL; | 275 return NULL; |
275 } | 276 } |
276 | 277 |
277 } // namespace content | 278 } // namespace content |
OLD | NEW |