blob: ff7425abc4205ba569a97ffbc28a1ef6ccf9e7ee [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// +build !build_with_native_toolchain
package netstack
import (
"syscall/zx"
"fidl/fuchsia/net/stack"
"gvisor.dev/gvisor/pkg/tcpip"
)
// TcpIpError wraps a tcpip.Error.
//
// TcpIpError provides an Error implementation over tcpip.Error so that error
// wrapping and unwrapping can be used. It also provides utility methods to
// convert it to Netstack FIDL API returns.
type TcpIpError struct {
Err *tcpip.Error
}
func (e TcpIpError) Error() string {
return e.Err.String()
}
// WrapTcpIpError wraps a stack error into a type that implements the error
// interface.
func WrapTcpIpError(e *tcpip.Error) TcpIpError {
return TcpIpError{Err: e}
}
// ToStackError transforms the internal tcpip.Error into a FIDL
// fuchsia.net.stack/Error.
// Panics if the internal error is nil.
func (e TcpIpError) ToStackError() stack.Error {
switch e.Err {
case nil:
panic("Attempted to convert nil tcpip.Error to stack.Error")
case tcpip.ErrUnknownProtocol:
return stack.ErrorNotSupported
case tcpip.ErrUnknownNICID:
return stack.ErrorNotFound
case tcpip.ErrUnknownDevice:
return stack.ErrorNotFound
case tcpip.ErrUnknownProtocolOption:
return stack.ErrorInvalidArgs
case tcpip.ErrDuplicateNICID:
return stack.ErrorAlreadyExists
case tcpip.ErrDuplicateAddress:
return stack.ErrorAlreadyExists
case tcpip.ErrNoRoute:
return stack.ErrorInternal
case tcpip.ErrBadLinkEndpoint:
return stack.ErrorInternal
case tcpip.ErrAlreadyBound:
return stack.ErrorAlreadyExists
case tcpip.ErrInvalidEndpointState:
return stack.ErrorBadState
case tcpip.ErrAlreadyConnecting:
return stack.ErrorAlreadyExists
case tcpip.ErrAlreadyConnected:
return stack.ErrorAlreadyExists
case tcpip.ErrNoPortAvailable:
return stack.ErrorInternal
case tcpip.ErrPortInUse:
return stack.ErrorInternal
case tcpip.ErrBadLocalAddress:
return stack.ErrorInvalidArgs
case tcpip.ErrClosedForSend:
return stack.ErrorBadState
case tcpip.ErrClosedForReceive:
return stack.ErrorBadState
case tcpip.ErrWouldBlock:
return stack.ErrorInternal
case tcpip.ErrConnectionRefused:
return stack.ErrorInternal
case tcpip.ErrTimeout:
return stack.ErrorTimeOut
case tcpip.ErrAborted:
return stack.ErrorInternal
case tcpip.ErrConnectStarted:
return stack.ErrorInternal
case tcpip.ErrDestinationRequired:
return stack.ErrorInvalidArgs
case tcpip.ErrNotSupported:
return stack.ErrorNotSupported
case tcpip.ErrQueueSizeNotSupported:
return stack.ErrorNotSupported
case tcpip.ErrNotConnected:
return stack.ErrorInternal
case tcpip.ErrConnectionReset:
return stack.ErrorInternal
case tcpip.ErrConnectionAborted:
return stack.ErrorInternal
case tcpip.ErrNoSuchFile:
return stack.ErrorNotFound
case tcpip.ErrInvalidOptionValue:
return stack.ErrorInvalidArgs
case tcpip.ErrBadAddress:
return stack.ErrorInvalidArgs
case tcpip.ErrNetworkUnreachable:
return stack.ErrorInternal
case tcpip.ErrMessageTooLong:
return stack.ErrorInvalidArgs
case tcpip.ErrNoBufferSpace:
return stack.ErrorInternal
case tcpip.ErrBroadcastDisabled:
return stack.ErrorInternal
case tcpip.ErrNotPermitted:
return stack.ErrorInternal
case tcpip.ErrAddressFamilyNotSupported:
return stack.ErrorNotSupported
default:
return stack.ErrorInternal
}
}
// ToZxStatus transforms the internal tcpip.Error into a zx.Status.
func (e TcpIpError) ToZxStatus() zx.Status {
switch e.Err {
case nil:
return zx.ErrOk
case tcpip.ErrUnknownProtocol:
return zx.ErrInvalidArgs
case tcpip.ErrUnknownNICID:
return zx.ErrNotFound
case tcpip.ErrUnknownDevice:
return zx.ErrNotFound
case tcpip.ErrUnknownProtocolOption:
return zx.ErrInvalidArgs
case tcpip.ErrDuplicateNICID:
return zx.ErrAlreadyExists
case tcpip.ErrDuplicateAddress:
return zx.ErrAlreadyExists
case tcpip.ErrNoRoute:
return zx.ErrAddressUnreachable
case tcpip.ErrBadLinkEndpoint:
return zx.ErrInternal
case tcpip.ErrAlreadyBound:
return zx.ErrAlreadyBound
case tcpip.ErrInvalidEndpointState:
return zx.ErrBadState
case tcpip.ErrAlreadyConnecting:
return zx.ErrAlreadyBound
case tcpip.ErrAlreadyConnected:
return zx.ErrAlreadyBound
case tcpip.ErrNoPortAvailable:
return zx.ErrNoResources
case tcpip.ErrPortInUse:
return zx.ErrAddressInUse
case tcpip.ErrBadLocalAddress:
return zx.ErrInvalidArgs
case tcpip.ErrClosedForSend:
return zx.ErrBadState
case tcpip.ErrClosedForReceive:
return zx.ErrBadState
case tcpip.ErrWouldBlock:
return zx.ErrShouldWait
case tcpip.ErrConnectionRefused:
return zx.ErrConnectionRefused
case tcpip.ErrTimeout:
return zx.ErrTimedOut
case tcpip.ErrAborted:
return zx.ErrConnectionAborted
case tcpip.ErrConnectStarted:
return zx.ErrInternal
case tcpip.ErrDestinationRequired:
return zx.ErrInvalidArgs
case tcpip.ErrNotSupported:
return zx.ErrNotSupported
case tcpip.ErrQueueSizeNotSupported:
return zx.ErrNotSupported
case tcpip.ErrNotConnected:
return zx.ErrNotConnected
case tcpip.ErrConnectionReset:
return zx.ErrConnectionReset
case tcpip.ErrConnectionAborted:
return zx.ErrConnectionReset
case tcpip.ErrNoSuchFile:
return zx.ErrNotFound
case tcpip.ErrInvalidOptionValue:
return zx.ErrInvalidArgs
case tcpip.ErrBadAddress:
return zx.ErrInvalidArgs
case tcpip.ErrNetworkUnreachable:
return zx.ErrAddressUnreachable
case tcpip.ErrMessageTooLong:
return zx.ErrInvalidArgs
case tcpip.ErrNoBufferSpace:
return zx.ErrNoMemory
case tcpip.ErrBroadcastDisabled:
return zx.ErrInternal
case tcpip.ErrNotPermitted:
return zx.ErrAccessDenied
case tcpip.ErrAddressFamilyNotSupported:
return zx.ErrNotSupported
default:
return zx.ErrInternal
}
}