From 8d1afb4185789cce7a90e7dc365e4a7afda9a8fc Mon Sep 17 00:00:00 2001 From: Tamir Duberstein Date: Thu, 28 Jan 2021 17:57:42 -0800 Subject: Change tcpip.Error to an interface This makes it possible to add data to types that implement tcpip.Error. ErrBadLinkEndpoint is removed as it is unused. PiperOrigin-RevId: 354437314 --- pkg/syserr/netstack.go | 189 +++++++++++++++++++++++++++---------------------- 1 file changed, 104 insertions(+), 85 deletions(-) (limited to 'pkg/syserr') diff --git a/pkg/syserr/netstack.go b/pkg/syserr/netstack.go index cb8981633..a6a91e064 100644 --- a/pkg/syserr/netstack.go +++ b/pkg/syserr/netstack.go @@ -23,95 +23,114 @@ import ( // Mapping for tcpip.Error types. var ( - ErrUnknownProtocol = New(tcpip.ErrUnknownProtocol.String(), linux.EINVAL) - ErrUnknownNICID = New(tcpip.ErrUnknownNICID.String(), linux.ENODEV) - ErrUnknownDevice = New(tcpip.ErrUnknownDevice.String(), linux.ENODEV) - ErrUnknownProtocolOption = New(tcpip.ErrUnknownProtocolOption.String(), linux.ENOPROTOOPT) - ErrDuplicateNICID = New(tcpip.ErrDuplicateNICID.String(), linux.EEXIST) - ErrDuplicateAddress = New(tcpip.ErrDuplicateAddress.String(), linux.EEXIST) - ErrBadLinkEndpoint = New(tcpip.ErrBadLinkEndpoint.String(), linux.EINVAL) - ErrAlreadyBound = New(tcpip.ErrAlreadyBound.String(), linux.EINVAL) - ErrInvalidEndpointState = New(tcpip.ErrInvalidEndpointState.String(), linux.EINVAL) - ErrAlreadyConnecting = New(tcpip.ErrAlreadyConnecting.String(), linux.EALREADY) - ErrNoPortAvailable = New(tcpip.ErrNoPortAvailable.String(), linux.EAGAIN) - ErrPortInUse = New(tcpip.ErrPortInUse.String(), linux.EADDRINUSE) - ErrBadLocalAddress = New(tcpip.ErrBadLocalAddress.String(), linux.EADDRNOTAVAIL) - ErrClosedForSend = New(tcpip.ErrClosedForSend.String(), linux.EPIPE) - ErrClosedForReceive = New(tcpip.ErrClosedForReceive.String(), nil) - ErrTimeout = New(tcpip.ErrTimeout.String(), linux.ETIMEDOUT) - ErrAborted = New(tcpip.ErrAborted.String(), linux.EPIPE) - ErrConnectStarted = New(tcpip.ErrConnectStarted.String(), linux.EINPROGRESS) - ErrDestinationRequired = New(tcpip.ErrDestinationRequired.String(), linux.EDESTADDRREQ) - ErrNotSupported = New(tcpip.ErrNotSupported.String(), linux.EOPNOTSUPP) - ErrQueueSizeNotSupported = New(tcpip.ErrQueueSizeNotSupported.String(), linux.ENOTTY) - ErrNoSuchFile = New(tcpip.ErrNoSuchFile.String(), linux.ENOENT) - ErrInvalidOptionValue = New(tcpip.ErrInvalidOptionValue.String(), linux.EINVAL) - ErrBroadcastDisabled = New(tcpip.ErrBroadcastDisabled.String(), linux.EACCES) - ErrNotPermittedNet = New(tcpip.ErrNotPermitted.String(), linux.EPERM) - ErrBadBuffer = New(tcpip.ErrBadBuffer.String(), linux.EFAULT) + ErrUnknownProtocol = New((&tcpip.ErrUnknownProtocol{}).String(), linux.EINVAL) + ErrUnknownNICID = New((&tcpip.ErrUnknownNICID{}).String(), linux.ENODEV) + ErrUnknownDevice = New((&tcpip.ErrUnknownDevice{}).String(), linux.ENODEV) + ErrUnknownProtocolOption = New((&tcpip.ErrUnknownProtocolOption{}).String(), linux.ENOPROTOOPT) + ErrDuplicateNICID = New((&tcpip.ErrDuplicateNICID{}).String(), linux.EEXIST) + ErrDuplicateAddress = New((&tcpip.ErrDuplicateAddress{}).String(), linux.EEXIST) + ErrAlreadyBound = New((&tcpip.ErrAlreadyBound{}).String(), linux.EINVAL) + ErrInvalidEndpointState = New((&tcpip.ErrInvalidEndpointState{}).String(), linux.EINVAL) + ErrAlreadyConnecting = New((&tcpip.ErrAlreadyConnecting{}).String(), linux.EALREADY) + ErrNoPortAvailable = New((&tcpip.ErrNoPortAvailable{}).String(), linux.EAGAIN) + ErrPortInUse = New((&tcpip.ErrPortInUse{}).String(), linux.EADDRINUSE) + ErrBadLocalAddress = New((&tcpip.ErrBadLocalAddress{}).String(), linux.EADDRNOTAVAIL) + ErrClosedForSend = New((&tcpip.ErrClosedForSend{}).String(), linux.EPIPE) + ErrClosedForReceive = New((&tcpip.ErrClosedForReceive{}).String(), nil) + ErrTimeout = New((&tcpip.ErrTimeout{}).String(), linux.ETIMEDOUT) + ErrAborted = New((&tcpip.ErrAborted{}).String(), linux.EPIPE) + ErrConnectStarted = New((&tcpip.ErrConnectStarted{}).String(), linux.EINPROGRESS) + ErrDestinationRequired = New((&tcpip.ErrDestinationRequired{}).String(), linux.EDESTADDRREQ) + ErrNotSupported = New((&tcpip.ErrNotSupported{}).String(), linux.EOPNOTSUPP) + ErrQueueSizeNotSupported = New((&tcpip.ErrQueueSizeNotSupported{}).String(), linux.ENOTTY) + ErrNoSuchFile = New((&tcpip.ErrNoSuchFile{}).String(), linux.ENOENT) + ErrInvalidOptionValue = New((&tcpip.ErrInvalidOptionValue{}).String(), linux.EINVAL) + ErrBroadcastDisabled = New((&tcpip.ErrBroadcastDisabled{}).String(), linux.EACCES) + ErrNotPermittedNet = New((&tcpip.ErrNotPermitted{}).String(), linux.EPERM) + ErrBadBuffer = New((&tcpip.ErrBadBuffer{}).String(), linux.EFAULT) ) -var netstackErrorTranslations map[string]*Error - -func addErrMapping(tcpipErr *tcpip.Error, netstackErr *Error) { - key := tcpipErr.String() - if _, ok := netstackErrorTranslations[key]; ok { - panic(fmt.Sprintf("duplicate error key: %s", key)) - } - netstackErrorTranslations[key] = netstackErr -} - -func init() { - netstackErrorTranslations = make(map[string]*Error) - addErrMapping(tcpip.ErrUnknownProtocol, ErrUnknownProtocol) - addErrMapping(tcpip.ErrUnknownNICID, ErrUnknownNICID) - addErrMapping(tcpip.ErrUnknownDevice, ErrUnknownDevice) - addErrMapping(tcpip.ErrUnknownProtocolOption, ErrUnknownProtocolOption) - addErrMapping(tcpip.ErrDuplicateNICID, ErrDuplicateNICID) - addErrMapping(tcpip.ErrDuplicateAddress, ErrDuplicateAddress) - addErrMapping(tcpip.ErrNoRoute, ErrNoRoute) - addErrMapping(tcpip.ErrBadLinkEndpoint, ErrBadLinkEndpoint) - addErrMapping(tcpip.ErrAlreadyBound, ErrAlreadyBound) - addErrMapping(tcpip.ErrInvalidEndpointState, ErrInvalidEndpointState) - addErrMapping(tcpip.ErrAlreadyConnecting, ErrAlreadyConnecting) - addErrMapping(tcpip.ErrAlreadyConnected, ErrAlreadyConnected) - addErrMapping(tcpip.ErrNoPortAvailable, ErrNoPortAvailable) - addErrMapping(tcpip.ErrPortInUse, ErrPortInUse) - addErrMapping(tcpip.ErrBadLocalAddress, ErrBadLocalAddress) - addErrMapping(tcpip.ErrClosedForSend, ErrClosedForSend) - addErrMapping(tcpip.ErrClosedForReceive, ErrClosedForReceive) - addErrMapping(tcpip.ErrWouldBlock, ErrWouldBlock) - addErrMapping(tcpip.ErrConnectionRefused, ErrConnectionRefused) - addErrMapping(tcpip.ErrTimeout, ErrTimeout) - addErrMapping(tcpip.ErrAborted, ErrAborted) - addErrMapping(tcpip.ErrConnectStarted, ErrConnectStarted) - addErrMapping(tcpip.ErrDestinationRequired, ErrDestinationRequired) - addErrMapping(tcpip.ErrNotSupported, ErrNotSupported) - addErrMapping(tcpip.ErrQueueSizeNotSupported, ErrQueueSizeNotSupported) - addErrMapping(tcpip.ErrNotConnected, ErrNotConnected) - addErrMapping(tcpip.ErrConnectionReset, ErrConnectionReset) - addErrMapping(tcpip.ErrConnectionAborted, ErrConnectionAborted) - addErrMapping(tcpip.ErrNoSuchFile, ErrNoSuchFile) - addErrMapping(tcpip.ErrInvalidOptionValue, ErrInvalidOptionValue) - addErrMapping(tcpip.ErrBadAddress, ErrBadAddress) - addErrMapping(tcpip.ErrNetworkUnreachable, ErrNetworkUnreachable) - addErrMapping(tcpip.ErrMessageTooLong, ErrMessageTooLong) - addErrMapping(tcpip.ErrNoBufferSpace, ErrNoBufferSpace) - addErrMapping(tcpip.ErrBroadcastDisabled, ErrBroadcastDisabled) - addErrMapping(tcpip.ErrNotPermitted, ErrNotPermittedNet) - addErrMapping(tcpip.ErrAddressFamilyNotSupported, ErrAddressFamilyNotSupported) - addErrMapping(tcpip.ErrBadBuffer, ErrBadBuffer) -} - // TranslateNetstackError converts an error from the tcpip package to a sentry // internal error. -func TranslateNetstackError(err *tcpip.Error) *Error { - if err == nil { +func TranslateNetstackError(err tcpip.Error) *Error { + switch err.(type) { + case nil: return nil + case *tcpip.ErrUnknownProtocol: + return ErrUnknownProtocol + case *tcpip.ErrUnknownNICID: + return ErrUnknownNICID + case *tcpip.ErrUnknownDevice: + return ErrUnknownDevice + case *tcpip.ErrUnknownProtocolOption: + return ErrUnknownProtocolOption + case *tcpip.ErrDuplicateNICID: + return ErrDuplicateNICID + case *tcpip.ErrDuplicateAddress: + return ErrDuplicateAddress + case *tcpip.ErrNoRoute: + return ErrNoRoute + case *tcpip.ErrAlreadyBound: + return ErrAlreadyBound + case *tcpip.ErrInvalidEndpointState: + return ErrInvalidEndpointState + case *tcpip.ErrAlreadyConnecting: + return ErrAlreadyConnecting + case *tcpip.ErrAlreadyConnected: + return ErrAlreadyConnected + case *tcpip.ErrNoPortAvailable: + return ErrNoPortAvailable + case *tcpip.ErrPortInUse: + return ErrPortInUse + case *tcpip.ErrBadLocalAddress: + return ErrBadLocalAddress + case *tcpip.ErrClosedForSend: + return ErrClosedForSend + case *tcpip.ErrClosedForReceive: + return ErrClosedForReceive + case *tcpip.ErrWouldBlock: + return ErrWouldBlock + case *tcpip.ErrConnectionRefused: + return ErrConnectionRefused + case *tcpip.ErrTimeout: + return ErrTimeout + case *tcpip.ErrAborted: + return ErrAborted + case *tcpip.ErrConnectStarted: + return ErrConnectStarted + case *tcpip.ErrDestinationRequired: + return ErrDestinationRequired + case *tcpip.ErrNotSupported: + return ErrNotSupported + case *tcpip.ErrQueueSizeNotSupported: + return ErrQueueSizeNotSupported + case *tcpip.ErrNotConnected: + return ErrNotConnected + case *tcpip.ErrConnectionReset: + return ErrConnectionReset + case *tcpip.ErrConnectionAborted: + return ErrConnectionAborted + case *tcpip.ErrNoSuchFile: + return ErrNoSuchFile + case *tcpip.ErrInvalidOptionValue: + return ErrInvalidOptionValue + case *tcpip.ErrBadAddress: + return ErrBadAddress + case *tcpip.ErrNetworkUnreachable: + return ErrNetworkUnreachable + case *tcpip.ErrMessageTooLong: + return ErrMessageTooLong + case *tcpip.ErrNoBufferSpace: + return ErrNoBufferSpace + case *tcpip.ErrBroadcastDisabled: + return ErrBroadcastDisabled + case *tcpip.ErrNotPermitted: + return ErrNotPermittedNet + case *tcpip.ErrAddressFamilyNotSupported: + return ErrAddressFamilyNotSupported + case *tcpip.ErrBadBuffer: + return ErrBadBuffer + default: + panic(fmt.Sprintf("unknown error %T", err)) } - se, ok := netstackErrorTranslations[err.String()] - if !ok { - panic("Unknown error: " + err.String()) - } - return se } -- cgit v1.2.3