Files
swift-mirror/stdlib/public/Darwin/Network/NWProtocolTCP.swift
Mike Ash fa5888fb3f [Stdlib][Overlays] Rename various classes to avoid conflicting ObjC names.
Old Swift and new Swift runtimes and overlays need to coexist in the same process. This means there must not be any classes which have the same ObjC runtime name in old and new, because the ObjC runtime doesn't like name collisions.

When possible without breaking source compatibility, classes were renamed in Swift, which results in a different ObjC name.

Public classes were renamed only on the ObjC side using the @_objcRuntimeName attribute.

This is similar to the work done in pull request #19295. That only renamed @objc classes. This renames all of the others, since even pure Swift classes still get an ObjC name.

rdar://problem/46646438
2019-01-15 12:21:20 -05:00

278 lines
7.5 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2018 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
// NOTE: older overlays had Network.NWProtocolTCP as the ObjC name.
// The two must coexist, so it was renamed. The old name must not be
// used in the new runtime. _TtC7Network14_NWProtocolTCP is the
// mangled name for Network._NWProtocolTCP.
@_objcRuntimeName(_TtC7Network14_NWProtocolTCP)
@available(macOS 10.14, iOS 12.0, watchOS 5.0, tvOS 12.0, *)
public class NWProtocolTCP : NWProtocol {
public static let definition: NWProtocolDefinition = {
NWProtocolDefinition(nw_protocol_copy_tcp_definition(), "tcp")
}()
// Set the ObjC name of this class to be nested in the customized ObjC
// name of NWProtocolTCP.
@_objcRuntimeName(_TtCC7Network14_NWProtocolTCP7Options)
public class Options : NWProtocolOptions {
private var _noDelay: Bool = false
/// A boolean indicating that TCP should disable
/// Nagle's algorithm (TCP_NODELAY).
public var noDelay: Bool {
set {
self._noDelay = newValue
nw_tcp_options_set_no_delay(self.nw, newValue)
}
get {
return self._noDelay
}
}
private var _noPush: Bool = false
/// A boolean indicating that TCP should be set into
/// no-push mode (TCP_NOPUSH).
public var noPush: Bool {
set {
self._noPush = newValue
nw_tcp_options_set_no_push(self.nw, newValue)
}
get {
return self._noPush
}
}
private var _noOptions: Bool = false
/// A boolean indicating that TCP should be set into
/// no-options mode (TCP_NOOPT).
public var noOptions: Bool {
set {
self._noOptions = newValue
nw_tcp_options_set_no_options(self.nw, newValue)
}
get {
return self._noOptions
}
}
private var _enableKeepalive: Bool = false
/// A boolean indicating that TCP should send keepalives
/// (SO_KEEPALIVE).
public var enableKeepalive: Bool {
set {
self._enableKeepalive = newValue
nw_tcp_options_set_enable_keepalive(self.nw, newValue)
}
get {
return self._enableKeepalive
}
}
private var _keepaliveCount: Int = 0
/// The number of keepalive probes to send before terminating
/// the connection (TCP_KEEPCNT).
public var keepaliveCount : Int {
set {
self._keepaliveCount = newValue
nw_tcp_options_set_keepalive_count(self.nw, UInt32(newValue))
}
get {
return self._keepaliveCount
}
}
private var _keepaliveIdle: Int = 0
/// The number of seconds of idleness to wait before keepalive
/// probes are sent by TCP (TCP_KEEPALIVE).
public var keepaliveIdle : Int {
set {
self._keepaliveIdle = newValue
nw_tcp_options_set_keepalive_idle_time(self.nw, UInt32(newValue))
}
get {
return self._keepaliveIdle
}
}
private var _keepaliveInterval: Int = 0
/// The number of seconds of to wait before resending TCP
/// keepalive probes (TCP_KEEPINTVL).
public var keepaliveInterval : Int {
set {
self._keepaliveInterval = newValue
nw_tcp_options_set_keepalive_interval(self.nw, UInt32(newValue))
}
get {
return self._keepaliveInterval
}
}
private var _maximumSegmentSize: Int = 0
/// The maximum segment size in bytes (TCP_MAXSEG).
public var maximumSegmentSize : Int {
set {
self._maximumSegmentSize = newValue
nw_tcp_options_set_maximum_segment_size(self.nw, UInt32(newValue))
}
get {
return self._maximumSegmentSize
}
}
private var _connectionTimeout: Int = 0
/// A timeout for TCP connection establishment, in seconds
/// (TCP_CONNECTIONTIMEOUT).
public var connectionTimeout : Int {
set {
self._connectionTimeout = newValue
nw_tcp_options_set_connection_timeout(self.nw, UInt32(newValue))
}
get {
return self._connectionTimeout
}
}
private var _persistTimeout: Int = 0
/// The TCP persist timeout, in seconds (PERSIST_TIMEOUT).
/// See RFC 6429.
public var persistTimeout : Int {
set {
self._persistTimeout = newValue
nw_tcp_options_set_persist_timeout(self.nw, UInt32(newValue))
}
get {
return self._persistTimeout
}
}
private var _connectionDropTime: Int = 0
/// A timeout for TCP retransmission attempts, in seconds
/// (TCP_RXT_CONNDROPTIME).
public var connectionDropTime : Int {
set {
self._connectionDropTime = newValue
nw_tcp_options_set_retransmit_connection_drop_time(self.nw, UInt32(newValue))
}
get {
return self._connectionDropTime
}
}
private var _retransmitFinDrop: Bool = false
/// A boolean to cause TCP to drop its connection after
/// not receiving an ACK after a FIN (TCP_RXT_FINDROP).
public var retransmitFinDrop: Bool {
set {
self._retransmitFinDrop = newValue
nw_tcp_options_set_retransmit_fin_drop(self.nw, newValue)
}
get {
return self._retransmitFinDrop
}
}
private var _disableAckStretching: Bool = false
/// A boolean to cause TCP to disable ACK stretching (TCP_SENDMOREACKS).
public var disableAckStretching: Bool {
set {
self._disableAckStretching = newValue
nw_tcp_options_set_disable_ack_stretching(self.nw, newValue)
}
get {
return self._disableAckStretching
}
}
private var _enableFastOpen: Bool = false
/// Configure TCP to enable TCP Fast Open (TFO). This may take effect
/// even when TCP is not the top-level protocol in the protocol stack.
/// For example, if TLS is running over TCP, the Client Hello message
/// may be sent as fast open data.
///
/// If TCP is the top-level protocol in the stack (the one the application
/// directly interacts with), TFO will be disabled unless the application
/// indicated that it will provide its own fast open data by calling
/// NWParameters.allowFastOpen.
public var enableFastOpen: Bool {
set {
self._enableFastOpen = newValue
nw_tcp_options_set_enable_fast_open(self.nw, newValue)
}
get {
return self._enableFastOpen
}
}
private var _disableECN: Bool = false
/// A boolean to disable ECN negotiation in TCP.
public var disableECN: Bool {
set {
self._disableECN = newValue
nw_tcp_options_set_disable_ecn(self.nw, newValue)
}
get {
return self._disableECN
}
}
/// Create TCP options to set in an NWParameters.ProtocolStack
public init() {
super.init(nw_tcp_create_options())
}
override internal init(_ nw: nw_protocol_options_t) {
super.init(nw)
}
}
/// Access TCP metadata using NWConnection.metadata(protocolDefinition: NWProtocolTCP.definition)
/// or in received ContentContext
// Set the ObjC name of this class to be nested in the customized ObjC
// name of NWProtocolTCP.
@_objcRuntimeName(_TtCC7Network14_NWProtocolTCP8Metadata)
public class Metadata: NWProtocolMetadata {
override internal init(_ nw: nw_protocol_metadata_t) {
super.init(nw)
}
/// Access the current number of bytes in TCP's receive buffer (SO_NREAD).
public var availableReceiveBuffer: UInt32 {
get {
return nw_tcp_get_available_receive_buffer(self.nw)
}
}
/// Access the current number of bytes in TCP's send buffer (SO_NWRITE).
public var availableSendBuffer: UInt32 {
get {
return nw_tcp_get_available_send_buffer(self.nw)
}
}
}
}