blob: fd93e0d4a0273c83f058b922d00251b64bfa9910 [file] [log] [blame] [edit]
// Copyright 2019 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.
#ifndef QUICHE_COMMON_PLATFORM_API_QUICHE_UDP_SOCKET_PLATFORM_API_H_
#define QUICHE_COMMON_PLATFORM_API_QUICHE_UDP_SOCKET_PLATFORM_API_H_
#include "quiche_platform_impl/quiche_udp_socket_platform_impl.h"
#include "quiche/quic/core/quic_types.h"
#include "quiche/common/quiche_ip_address_family.h"
namespace quiche {
const size_t kCmsgSpaceForGooglePacketHeader =
kCmsgSpaceForGooglePacketHeaderImpl;
inline bool GetGooglePacketHeadersFromControlMessage(
struct ::cmsghdr* cmsg, char** packet_headers, size_t* packet_headers_len) {
return GetGooglePacketHeadersFromControlMessageImpl(cmsg, packet_headers,
packet_headers_len);
}
inline void SetGoogleSocketOptions(int fd) { SetGoogleSocketOptionsImpl(fd); }
// Retrieves the IP TOS byte for |fd| and |address_family|, based on the correct
// sockopt for the platform, replaces the two ECN bits of that byte with the
// value in |ecn_codepoint|.
// The result is stored in |value| in the proper format to set the TOS byte
// using a cmsg. |value| must point to memory of size |value_len|. Stores the
// correct cmsg type to use in |type|.
// Returns 0 on success. Returns EINVAL if |address_family| is neither IP_V4 nor
// IP_V6, or if |value_len| is not large enough to store the appropriately
// formatted argument. If getting the socket option fails, returns the
// associated error code.
inline int GetEcnCmsgArgsPreserveDscp(
const int fd, const quiche::IpAddressFamily address_family,
quic::QuicEcnCodepoint ecn_codepoint, int& type, void* value,
socklen_t& value_len) {
return GetEcnCmsgArgsPreserveDscpImpl(
fd, ToPlatformAddressFamily(address_family),
static_cast<uint8_t>(ecn_codepoint), type, value, value_len);
}
} // namespace quiche
#endif // QUICHE_COMMON_PLATFORM_API_QUICHE_UDP_SOCKET_PLATFORM_API_H_