swift-nio-transport-services/Sources/NIOTransportServices/TCPOptions+SocketChannelOpt...

89 lines
3.4 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2017-2018 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftNIO project authors
// swift-tools-version:4.0
//
// swift-tools-version:4.0
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
#if canImport(Network)
import Foundation
import NIO
import Network
@available(OSX 10.14, iOS 12.0, tvOS 12.0, watchOS 6.0, *)
internal extension NWProtocolTCP.Options {
/// Apply a given channel `SocketOption` to this protocol options state.
func applyChannelOption(option: SocketOption, value: SocketOptionValue) throws {
switch (option.level, option.name) {
case (IPPROTO_TCP, TCP_NODELAY):
self.noDelay = value != 0
case (IPPROTO_TCP, TCP_NOPUSH):
self.noPush = value != 0
case (IPPROTO_TCP, TCP_NOOPT):
self.noOptions = value != 0
case (IPPROTO_TCP, TCP_KEEPCNT):
self.keepaliveCount = Int(value)
case (IPPROTO_TCP, TCP_KEEPALIVE):
self.keepaliveIdle = Int(value)
case (IPPROTO_TCP, TCP_KEEPINTVL):
self.keepaliveInterval = Int(value)
case (IPPROTO_TCP, TCP_MAXSEG):
self.maximumSegmentSize = Int(value)
case (IPPROTO_TCP, TCP_CONNECTIONTIMEOUT):
self.connectionTimeout = Int(value)
case (IPPROTO_TCP, TCP_RXT_CONNDROPTIME):
self.connectionDropTime = Int(value)
case (IPPROTO_TCP, TCP_RXT_FINDROP):
self.retransmitFinDrop = value != 0
case (IPPROTO_TCP, TCP_SENDMOREACKS):
self.disableAckStretching = value != 0
case (SOL_SOCKET, SO_KEEPALIVE):
self.enableKeepalive = value != 0
default:
throw NIOTSErrors.UnsupportedSocketOption(optionValue: option)
}
}
/// Obtain the given `SocketOption` value for this protocol options state.
func valueFor(socketOption option: SocketOption) throws -> SocketOptionValue {
switch (option.level, option.name) {
case (IPPROTO_TCP, TCP_NODELAY):
return self.noDelay ? 1 : 0
case (IPPROTO_TCP, TCP_NOPUSH):
return self.noPush ? 1 : 0
case (IPPROTO_TCP, TCP_NOOPT):
return self.noOptions ? 1 : 0
case (IPPROTO_TCP, TCP_KEEPCNT):
return Int32(self.keepaliveCount)
case (IPPROTO_TCP, TCP_KEEPALIVE):
return Int32(self.keepaliveIdle)
case (IPPROTO_TCP, TCP_KEEPINTVL):
return Int32(self.keepaliveInterval)
case (IPPROTO_TCP, TCP_MAXSEG):
return Int32(self.maximumSegmentSize)
case (IPPROTO_TCP, TCP_CONNECTIONTIMEOUT):
return Int32(self.connectionTimeout)
case (IPPROTO_TCP, TCP_RXT_CONNDROPTIME):
return Int32(self.connectionDropTime)
case (IPPROTO_TCP, TCP_RXT_FINDROP):
return self.retransmitFinDrop ? 1 : 0
case (IPPROTO_TCP, TCP_SENDMOREACKS):
return self.disableAckStretching ? 1 : 0
case (SOL_SOCKET, SO_KEEPALIVE):
return self.enableKeepalive ? 1 : 0
default:
throw NIOTSErrors.UnsupportedSocketOption(optionValue: option)
}
}
}
#endif