89 lines
3.5 KiB
Swift
89 lines
3.5 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: ChannelOptions.Types.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: ChannelOptions.Types.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
|