blob: db2bd5fecd38ed32cc8f0352d0133e04134b13b0 [file] [log] [blame]
// Copyright (c) 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "net/third_party/quic/platform/impl/quic_socket_address_impl.h"
#include "net/base/sockaddr_storage.h"
#include "net/third_party/quic/platform/api/quic_bug_tracker.h"
using std::string;
namespace quic {
QuicSocketAddressImpl::QuicSocketAddressImpl(const net::IPEndPoint& address)
: socket_address_(address) {}
QuicSocketAddressImpl::QuicSocketAddressImpl(QuicIpAddressImpl address,
uint16_t port)
: socket_address_(address.ip_address(), port) {}
#if !defined(STARBOARD)
QuicSocketAddressImpl::QuicSocketAddressImpl(
const struct sockaddr_storage& saddr) {
if (saddr.ss_family == AF_INET) {
CHECK(socket_address_.FromSockAddr(
reinterpret_cast<const sockaddr*>(&saddr), sizeof(struct sockaddr_in)));
} else if (saddr.ss_family == AF_INET6) {
CHECK(
socket_address_.FromSockAddr(reinterpret_cast<const sockaddr*>(&saddr),
sizeof(struct sockaddr_in6)));
}
}
QuicSocketAddressImpl::QuicSocketAddressImpl(const struct sockaddr& saddr) {
if (saddr.sa_family == AF_INET) {
CHECK(socket_address_.FromSockAddr(&saddr, sizeof(struct sockaddr_in)));
} else if (saddr.sa_family == AF_INET6) {
CHECK(socket_address_.FromSockAddr(&saddr, sizeof(struct sockaddr_in6)));
}
}
#endif
bool operator==(const QuicSocketAddressImpl& lhs,
const QuicSocketAddressImpl& rhs) {
return lhs.socket_address_ == rhs.socket_address_;
}
bool operator!=(const QuicSocketAddressImpl& lhs,
const QuicSocketAddressImpl& rhs) {
return lhs.socket_address_.address() != rhs.socket_address_.address() ||
lhs.socket_address_.port() != rhs.socket_address_.port();
}
bool QuicSocketAddressImpl::IsInitialized() const {
return net::GetAddressFamily(socket_address_.address()) !=
net::ADDRESS_FAMILY_UNSPECIFIED;
;
}
string QuicSocketAddressImpl::ToString() const {
if (!IsInitialized()) {
return "Uninitialized address";
}
return socket_address_.ToString();
}
#if !defined(STARBOARD)
int QuicSocketAddressImpl::FromSocket(int fd) {
net::SockaddrStorage storage;
if (getsockname(fd, storage.addr, &storage.addr_len) != 0 ||
!socket_address_.FromSockAddr(storage.addr, storage.addr_len)) {
return 1;
}
return 0;
}
#endif
QuicSocketAddressImpl QuicSocketAddressImpl::Normalized() const {
QUIC_BUG << "QuicSocketAddressImpl::Normalized() is not implemented.";
return QuicSocketAddressImpl();
}
QuicIpAddressImpl QuicSocketAddressImpl::host() const {
return QuicIpAddressImpl(socket_address_.address());
}
uint16_t QuicSocketAddressImpl::port() const {
return socket_address_.port();
}
#if !defined(STARBOARD)
sockaddr_storage QuicSocketAddressImpl::generic_address() const {
sockaddr_storage raw_address = {};
socklen_t address_len = sizeof(raw_address);
CHECK(socket_address_.ToSockAddr(
reinterpret_cast<struct sockaddr*>(&raw_address), &address_len));
return raw_address;
}
#endif
} // namespace quic