| 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 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 // If the user has enabled port packets, just hand this over. | 281 // If the user has enabled port packets, just hand this over. |
| 282 if (enable_port_packets_) { | 282 if (enable_port_packets_) { |
| 283 SignalReadPacket(this, data, size, addr); | 283 SignalReadPacket(this, data, size, addr); |
| 284 return; | 284 return; |
| 285 } | 285 } |
| 286 | 286 |
| 287 // If this is an authenticated STUN request, then signal unknown address and | 287 // If this is an authenticated STUN request, then signal unknown address and |
| 288 // send back a proper binding response. | 288 // send back a proper binding response. |
| 289 rtc::scoped_ptr<IceMessage> msg; | 289 rtc::scoped_ptr<IceMessage> msg; |
| 290 std::string remote_username; | 290 std::string remote_username; |
| 291 if (!GetStunMessage(data, size, addr, msg.accept(), &remote_username)) { | 291 if (!GetStunMessage(data, size, addr, &msg, &remote_username)) { |
| 292 LOG_J(LS_ERROR, this) << "Received non-STUN packet from unknown address (" | 292 LOG_J(LS_ERROR, this) << "Received non-STUN packet from unknown address (" |
| 293 << addr.ToSensitiveString() << ")"; | 293 << addr.ToSensitiveString() << ")"; |
| 294 } else if (!msg) { | 294 } else if (!msg) { |
| 295 // STUN message handled already | 295 // STUN message handled already |
| 296 } else if (msg->type() == STUN_BINDING_REQUEST) { | 296 } else if (msg->type() == STUN_BINDING_REQUEST) { |
| 297 LOG(LS_INFO) << "Received STUN ping " | 297 LOG(LS_INFO) << "Received STUN ping " |
| 298 << " id=" << rtc::hex_encode(msg->transaction_id()) | 298 << " id=" << rtc::hex_encode(msg->transaction_id()) |
| 299 << " from unknown address " << addr.ToSensitiveString(); | 299 << " from unknown address " << addr.ToSensitiveString(); |
| 300 | 300 |
| 301 // Check for role conflicts. | 301 // Check for role conflicts. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 323 for (; iter != connections_.end(); ++iter) { | 323 for (; iter != connections_.end(); ++iter) { |
| 324 iter->second->OnReadyToSend(); | 324 iter->second->OnReadyToSend(); |
| 325 } | 325 } |
| 326 } | 326 } |
| 327 | 327 |
| 328 size_t Port::AddPrflxCandidate(const Candidate& local) { | 328 size_t Port::AddPrflxCandidate(const Candidate& local) { |
| 329 candidates_.push_back(local); | 329 candidates_.push_back(local); |
| 330 return (candidates_.size() - 1); | 330 return (candidates_.size() - 1); |
| 331 } | 331 } |
| 332 | 332 |
| 333 bool Port::GetStunMessage(const char* data, size_t size, | 333 bool Port::GetStunMessage(const char* data, |
| 334 size_t size, |
| 334 const rtc::SocketAddress& addr, | 335 const rtc::SocketAddress& addr, |
| 335 IceMessage** out_msg, std::string* out_username) { | 336 rtc::scoped_ptr<IceMessage>* out_msg, |
| 337 std::string* out_username) { |
| 336 // NOTE: This could clearly be optimized to avoid allocating any memory. | 338 // NOTE: This could clearly be optimized to avoid allocating any memory. |
| 337 // However, at the data rates we'll be looking at on the client side, | 339 // However, at the data rates we'll be looking at on the client side, |
| 338 // this probably isn't worth worrying about. | 340 // this probably isn't worth worrying about. |
| 339 ASSERT(out_msg != NULL); | 341 ASSERT(out_msg != NULL); |
| 340 ASSERT(out_username != NULL); | 342 ASSERT(out_username != NULL); |
| 341 *out_msg = NULL; | |
| 342 out_username->clear(); | 343 out_username->clear(); |
| 343 | 344 |
| 344 // Don't bother parsing the packet if we can tell it's not STUN. | 345 // Don't bother parsing the packet if we can tell it's not STUN. |
| 345 // In ICE mode, all STUN packets will have a valid fingerprint. | 346 // In ICE mode, all STUN packets will have a valid fingerprint. |
| 346 if (!StunMessage::ValidateFingerprint(data, size)) { | 347 if (!StunMessage::ValidateFingerprint(data, size)) { |
| 347 return false; | 348 return false; |
| 348 } | 349 } |
| 349 | 350 |
| 350 // Parse the request message. If the packet is not a complete and correct | 351 // Parse the request message. If the packet is not a complete and correct |
| 351 // STUN message, then ignore it. | 352 // STUN message, then ignore it. |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 415 // No stun attributes will be verified, if it's stun indication message. | 416 // No stun attributes will be verified, if it's stun indication message. |
| 416 // Returning from end of the this method. | 417 // Returning from end of the this method. |
| 417 } else { | 418 } else { |
| 418 LOG_J(LS_ERROR, this) << "Received STUN packet with invalid type (" | 419 LOG_J(LS_ERROR, this) << "Received STUN packet with invalid type (" |
| 419 << stun_msg->type() << ") from " | 420 << stun_msg->type() << ") from " |
| 420 << addr.ToSensitiveString(); | 421 << addr.ToSensitiveString(); |
| 421 return true; | 422 return true; |
| 422 } | 423 } |
| 423 | 424 |
| 424 // Return the STUN message found. | 425 // Return the STUN message found. |
| 425 *out_msg = stun_msg.release(); | 426 *out_msg = std::move(stun_msg); |
| 426 return true; | 427 return true; |
| 427 } | 428 } |
| 428 | 429 |
| 429 bool Port::IsCompatibleAddress(const rtc::SocketAddress& addr) { | 430 bool Port::IsCompatibleAddress(const rtc::SocketAddress& addr) { |
| 430 int family = ip().family(); | 431 int family = ip().family(); |
| 431 // We use single-stack sockets, so families must match. | 432 // We use single-stack sockets, so families must match. |
| 432 if (addr.family() != family) { | 433 if (addr.family() != family) { |
| 433 return false; | 434 return false; |
| 434 } | 435 } |
| 435 // Link-local IPv6 ports can only connect to other link-local IPv6 ports. | 436 // Link-local IPv6 ports can only connect to other link-local IPv6 ports. |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 895 << " err=" << err | 896 << " err=" << err |
| 896 << " id=" << rtc::hex_encode(req->id()); | 897 << " id=" << rtc::hex_encode(req->id()); |
| 897 } | 898 } |
| 898 } | 899 } |
| 899 | 900 |
| 900 void Connection::OnReadPacket( | 901 void Connection::OnReadPacket( |
| 901 const char* data, size_t size, const rtc::PacketTime& packet_time) { | 902 const char* data, size_t size, const rtc::PacketTime& packet_time) { |
| 902 rtc::scoped_ptr<IceMessage> msg; | 903 rtc::scoped_ptr<IceMessage> msg; |
| 903 std::string remote_ufrag; | 904 std::string remote_ufrag; |
| 904 const rtc::SocketAddress& addr(remote_candidate_.address()); | 905 const rtc::SocketAddress& addr(remote_candidate_.address()); |
| 905 if (!port_->GetStunMessage(data, size, addr, msg.accept(), &remote_ufrag)) { | 906 if (!port_->GetStunMessage(data, size, addr, &msg, &remote_ufrag)) { |
| 906 // The packet did not parse as a valid STUN message | 907 // The packet did not parse as a valid STUN message |
| 907 // This is a data packet, pass it along. | 908 // This is a data packet, pass it along. |
| 908 set_receiving(true); | 909 set_receiving(true); |
| 909 last_data_received_ = rtc::Time(); | 910 last_data_received_ = rtc::Time(); |
| 910 recv_rate_tracker_.AddSamples(size); | 911 recv_rate_tracker_.AddSamples(size); |
| 911 SignalReadPacket(this, data, size, packet_time); | 912 SignalReadPacket(this, data, size, packet_time); |
| 912 | 913 |
| 913 // If timed out sending writability checks, start up again | 914 // If timed out sending writability checks, start up again |
| 914 if (!pruned_ && (write_state_ == STATE_WRITE_TIMEOUT)) { | 915 if (!pruned_ && (write_state_ == STATE_WRITE_TIMEOUT)) { |
| 915 LOG(LS_WARNING) << "Received a data packet on a timed-out Connection. " | 916 LOG(LS_WARNING) << "Received a data packet on a timed-out Connection. " |
| (...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1443 ASSERT(sent < 0); | 1444 ASSERT(sent < 0); |
| 1444 error_ = port_->GetError(); | 1445 error_ = port_->GetError(); |
| 1445 sent_packets_discarded_++; | 1446 sent_packets_discarded_++; |
| 1446 } else { | 1447 } else { |
| 1447 send_rate_tracker_.AddSamples(sent); | 1448 send_rate_tracker_.AddSamples(sent); |
| 1448 } | 1449 } |
| 1449 return sent; | 1450 return sent; |
| 1450 } | 1451 } |
| 1451 | 1452 |
| 1452 } // namespace cricket | 1453 } // namespace cricket |
| OLD | NEW |