summaryrefslogtreecommitdiff
path: root/chromium/net/third_party/quiche/src/quic/core/quic_linux_socket_utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/third_party/quiche/src/quic/core/quic_linux_socket_utils.h')
-rw-r--r--chromium/net/third_party/quiche/src/quic/core/quic_linux_socket_utils.h297
1 files changed, 0 insertions, 297 deletions
diff --git a/chromium/net/third_party/quiche/src/quic/core/quic_linux_socket_utils.h b/chromium/net/third_party/quiche/src/quic/core/quic_linux_socket_utils.h
deleted file mode 100644
index 5bbd875180b..00000000000
--- a/chromium/net/third_party/quiche/src/quic/core/quic_linux_socket_utils.h
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright (c) 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_QUIC_PLATFORM_IMPL_QUIC_LINUX_SOCKET_UTILS_H_
-#define QUICHE_QUIC_PLATFORM_IMPL_QUIC_LINUX_SOCKET_UTILS_H_
-
-#include <errno.h>
-#include <stddef.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <sys/uio.h>
-#include <deque>
-#include <functional>
-#include <iterator>
-#include <memory>
-#include <type_traits>
-#include <utility>
-
-#include "quic/core/quic_packet_writer.h"
-#include "quic/core/quic_types.h"
-#include "quic/platform/api/quic_bug_tracker.h"
-#include "quic/platform/api/quic_ip_address.h"
-#include "quic/platform/api/quic_logging.h"
-#include "quic/platform/api/quic_socket_address.h"
-
-#ifndef SOL_UDP
-#define SOL_UDP 17
-#endif
-
-#ifndef UDP_SEGMENT
-#define UDP_SEGMENT 103
-#endif
-
-#ifndef UDP_MAX_SEGMENTS
-#define UDP_MAX_SEGMENTS (1 << 6UL)
-#endif
-
-#ifndef SO_TXTIME
-#define SO_TXTIME 61
-#endif
-
-namespace quic {
-
-const int kCmsgSpaceForIpv4 = CMSG_SPACE(sizeof(in_pktinfo));
-const int kCmsgSpaceForIpv6 = CMSG_SPACE(sizeof(in6_pktinfo));
-// kCmsgSpaceForIp should be big enough to hold both IPv4 and IPv6 packet info.
-const int kCmsgSpaceForIp = (kCmsgSpaceForIpv4 < kCmsgSpaceForIpv6)
- ? kCmsgSpaceForIpv6
- : kCmsgSpaceForIpv4;
-
-const int kCmsgSpaceForSegmentSize = CMSG_SPACE(sizeof(uint16_t));
-
-const int kCmsgSpaceForTxTime = CMSG_SPACE(sizeof(uint64_t));
-
-const int kCmsgSpaceForTTL = CMSG_SPACE(sizeof(int));
-
-// QuicMsgHdr is used to build msghdr objects that can be used send packets via
-// ::sendmsg.
-//
-// Example:
-// // cbuf holds control messages(cmsgs). The size is determined from what
-// // cmsgs will be set for this msghdr.
-// char cbuf[kCmsgSpaceForIp + kCmsgSpaceForSegmentSize];
-// QuicMsgHdr hdr(packet_buf, packet_buf_len, peer_addr, cbuf, sizeof(cbuf));
-//
-// // Set IP in cmsgs.
-// hdr.SetIpInNextCmsg(self_addr);
-//
-// // Set GSO size in cmsgs.
-// *hdr.GetNextCmsgData<uint16_t>(SOL_UDP, UDP_SEGMENT) = 1200;
-//
-// QuicLinuxSocketUtils::WritePacket(fd, hdr);
-class QUIC_EXPORT_PRIVATE QuicMsgHdr {
- public:
- QuicMsgHdr(const char* buffer,
- size_t buf_len,
- const QuicSocketAddress& peer_address,
- char* cbuf,
- size_t cbuf_size);
-
- // Set IP info in the next cmsg. Both IPv4 and IPv6 are supported.
- void SetIpInNextCmsg(const QuicIpAddress& self_address);
-
- template <typename DataType>
- DataType* GetNextCmsgData(int cmsg_level, int cmsg_type) {
- return reinterpret_cast<DataType*>(
- GetNextCmsgDataInternal(cmsg_level, cmsg_type, sizeof(DataType)));
- }
-
- const msghdr* hdr() const { return &hdr_; }
-
- protected:
- void* GetNextCmsgDataInternal(int cmsg_level,
- int cmsg_type,
- size_t data_size);
-
- msghdr hdr_;
- iovec iov_;
- sockaddr_storage raw_peer_address_;
- char* cbuf_;
- const size_t cbuf_size_;
- // The last cmsg populated so far. nullptr means nothing has been populated.
- cmsghdr* cmsg_;
-};
-
-// BufferedWrite holds all information needed to send a packet.
-struct QUIC_EXPORT_PRIVATE BufferedWrite {
- BufferedWrite(const char* buffer,
- size_t buf_len,
- const QuicIpAddress& self_address,
- const QuicSocketAddress& peer_address)
- : BufferedWrite(buffer,
- buf_len,
- self_address,
- peer_address,
- std::unique_ptr<PerPacketOptions>(),
- /*release_time=*/0) {}
-
- BufferedWrite(const char* buffer,
- size_t buf_len,
- const QuicIpAddress& self_address,
- const QuicSocketAddress& peer_address,
- std::unique_ptr<PerPacketOptions> options,
- uint64_t release_time)
- : buffer(buffer),
- buf_len(buf_len),
- self_address(self_address),
- peer_address(peer_address),
- options(std::move(options)),
- release_time(release_time) {}
-
- const char* buffer; // Not owned.
- size_t buf_len;
- QuicIpAddress self_address;
- QuicSocketAddress peer_address;
- std::unique_ptr<PerPacketOptions> options;
-
- // The release time according to the owning packet writer's clock, which is
- // often not a QuicClock. Calculated from packet writer's Now() and the
- // release time delay in |options|.
- // 0 means it can be sent at the same time as the previous packet in a batch,
- // or can be sent Now() if this is the first packet of a batch.
- uint64_t release_time;
-};
-
-// QuicMMsgHdr is used to build mmsghdr objects that can be used to send
-// multiple packets at once via ::sendmmsg.
-//
-// Example:
-// quiche::QuicheCircularDeque<BufferedWrite> buffered_writes;
-// ... (Populate buffered_writes) ...
-//
-// QuicMMsgHdr mhdr(
-// buffered_writes.begin(), buffered_writes.end(), kCmsgSpaceForIp,
-// [](QuicMMsgHdr* mhdr, int i, const BufferedWrite& buffered_write) {
-// mhdr->SetIpInNextCmsg(i, buffered_write.self_address);
-// });
-//
-// int num_packets_sent;
-// QuicSocketUtils::WriteMultiplePackets(fd, &mhdr, &num_packets_sent);
-class QUIC_EXPORT_PRIVATE QuicMMsgHdr {
- public:
- using ControlBufferInitializer = std::function<
- void(QuicMMsgHdr* mhdr, int i, const BufferedWrite& buffered_write)>;
- template <typename IteratorT>
- QuicMMsgHdr(const IteratorT& first,
- const IteratorT& last,
- size_t cbuf_size,
- ControlBufferInitializer cbuf_initializer)
- : num_msgs_(std::distance(first, last)), cbuf_size_(cbuf_size) {
- static_assert(
- std::is_same<typename std::iterator_traits<IteratorT>::value_type,
- BufferedWrite>::value,
- "Must iterate over a collection of BufferedWrite.");
-
- QUICHE_DCHECK_LE(0, num_msgs_);
- if (num_msgs_ == 0) {
- return;
- }
-
- storage_.reset(new char[StorageSize()]);
- memset(&storage_[0], 0, StorageSize());
-
- int i = -1;
- for (auto it = first; it != last; ++it) {
- ++i;
-
- InitOneHeader(i, *it);
- if (cbuf_initializer) {
- cbuf_initializer(this, i, *it);
- }
- }
- }
-
- void SetIpInNextCmsg(int i, const QuicIpAddress& self_address);
-
- template <typename DataType>
- DataType* GetNextCmsgData(int i, int cmsg_level, int cmsg_type) {
- return reinterpret_cast<DataType*>(
- GetNextCmsgDataInternal(i, cmsg_level, cmsg_type, sizeof(DataType)));
- }
-
- mmsghdr* mhdr() { return GetMMsgHdr(0); }
-
- int num_msgs() const { return num_msgs_; }
-
- // Get the total number of bytes in the first |num_packets_sent| packets.
- int num_bytes_sent(int num_packets_sent);
-
- protected:
- void InitOneHeader(int i, const BufferedWrite& buffered_write);
-
- void* GetNextCmsgDataInternal(int i,
- int cmsg_level,
- int cmsg_type,
- size_t data_size);
-
- size_t StorageSize() const {
- return num_msgs_ *
- (sizeof(mmsghdr) + sizeof(iovec) + sizeof(sockaddr_storage) +
- sizeof(cmsghdr*) + cbuf_size_);
- }
-
- mmsghdr* GetMMsgHdr(int i) {
- auto* first = reinterpret_cast<mmsghdr*>(&storage_[0]);
- return &first[i];
- }
-
- iovec* GetIov(int i) {
- auto* first = reinterpret_cast<iovec*>(GetMMsgHdr(num_msgs_));
- return &first[i];
- }
-
- sockaddr_storage* GetPeerAddressStorage(int i) {
- auto* first = reinterpret_cast<sockaddr_storage*>(GetIov(num_msgs_));
- return &first[i];
- }
-
- cmsghdr** GetCmsgHdr(int i) {
- auto* first = reinterpret_cast<cmsghdr**>(GetPeerAddressStorage(num_msgs_));
- return &first[i];
- }
-
- char* GetCbuf(int i) {
- auto* first = reinterpret_cast<char*>(GetCmsgHdr(num_msgs_));
- return &first[i * cbuf_size_];
- }
-
- const int num_msgs_;
- // Size of cmsg buffer for each message.
- const size_t cbuf_size_;
- // storage_ holds the memory of
- // |num_msgs_| mmsghdr
- // |num_msgs_| iovec
- // |num_msgs_| sockaddr_storage, for peer addresses
- // |num_msgs_| cmsghdr*
- // |num_msgs_| cbuf, each of size cbuf_size
- std::unique_ptr<char[]> storage_;
-};
-
-class QUIC_EXPORT_PRIVATE QuicLinuxSocketUtils {
- public:
- // Return the UDP segment size of |fd|, 0 means segment size has not been set
- // on this socket. If GSO is not supported, return -1.
- static int GetUDPSegmentSize(int fd);
-
- // Enable release time on |fd|.
- static bool EnableReleaseTime(int fd, clockid_t clockid);
-
- // If the msghdr contains an IP_TTL entry, this will set ttl to the correct
- // value and return true. Otherwise it will return false.
- static bool GetTtlFromMsghdr(struct msghdr* hdr, int* ttl);
-
- // Set IP(self_address) in |cmsg_data|. Does not touch other fields in the
- // containing cmsghdr.
- static void SetIpInfoInCmsgData(const QuicIpAddress& self_address,
- void* cmsg_data);
-
- // A helper for WritePacket which fills in the cmsg with the supplied self
- // address.
- // Returns the length of the packet info structure used.
- static size_t SetIpInfoInCmsg(const QuicIpAddress& self_address,
- cmsghdr* cmsg);
-
- // Writes the packet in |hdr| to the socket, using ::sendmsg.
- static WriteResult WritePacket(int fd, const QuicMsgHdr& hdr);
-
- // Writes the packets in |mhdr| to the socket, using ::sendmmsg if available.
- static WriteResult WriteMultiplePackets(int fd,
- QuicMMsgHdr* mhdr,
- int* num_packets_sent);
-};
-
-} // namespace quic
-
-#endif // QUICHE_QUIC_PLATFORM_IMPL_QUIC_LINUX_SOCKET_UTILS_H_