diff options
author | Ian Gudger <igudger@google.com> | 2018-10-31 18:21:11 -0700 |
---|---|---|
committer | Shentubot <shentubot@google.com> | 2018-10-31 18:22:05 -0700 |
commit | eeddae1199d9b84ee84011be0019328724ebdcf3 (patch) | |
tree | 8f81f4f92fe0cb7bbb187e15f07a664bb0789e78 /pkg/tcpip/link/rawfile/errors.go | |
parent | fb613020c7db323c705adf6ae0f954bee4ab5fec (diff) |
Use syserr style error translation in netstack's rawfile
Replacing map lookups with slice indexing is higher performance.
PiperOrigin-RevId: 219569901
Change-Id: I9b7cd22abd4b95383025edbd5a80d1c1a4496936
Diffstat (limited to 'pkg/tcpip/link/rawfile/errors.go')
-rw-r--r-- | pkg/tcpip/link/rawfile/errors.go | 62 |
1 files changed, 37 insertions, 25 deletions
diff --git a/pkg/tcpip/link/rawfile/errors.go b/pkg/tcpip/link/rawfile/errors.go index f42ff98db..7359849b1 100644 --- a/pkg/tcpip/link/rawfile/errors.go +++ b/pkg/tcpip/link/rawfile/errors.go @@ -17,42 +17,54 @@ package rawfile import ( + "fmt" "syscall" "gvisor.googlesource.com/gvisor/pkg/tcpip" ) -var translations = map[syscall.Errno]*tcpip.Error{ - syscall.EEXIST: tcpip.ErrDuplicateAddress, - syscall.ENETUNREACH: tcpip.ErrNoRoute, - syscall.EINVAL: tcpip.ErrInvalidEndpointState, - syscall.EALREADY: tcpip.ErrAlreadyConnecting, - syscall.EISCONN: tcpip.ErrAlreadyConnected, - syscall.EADDRINUSE: tcpip.ErrPortInUse, - syscall.EADDRNOTAVAIL: tcpip.ErrBadLocalAddress, - syscall.EPIPE: tcpip.ErrClosedForSend, - syscall.EWOULDBLOCK: tcpip.ErrWouldBlock, - syscall.ECONNREFUSED: tcpip.ErrConnectionRefused, - syscall.ETIMEDOUT: tcpip.ErrTimeout, - syscall.EINPROGRESS: tcpip.ErrConnectStarted, - syscall.EDESTADDRREQ: tcpip.ErrDestinationRequired, - syscall.ENOTSUP: tcpip.ErrNotSupported, - syscall.ENOTTY: tcpip.ErrQueueSizeNotSupported, - syscall.ENOTCONN: tcpip.ErrNotConnected, - syscall.ECONNRESET: tcpip.ErrConnectionReset, - syscall.ECONNABORTED: tcpip.ErrConnectionAborted, - syscall.EMSGSIZE: tcpip.ErrMessageTooLong, - syscall.ENOBUFS: tcpip.ErrNoBufferSpace, -} +const maxErrno = 134 + +var translations [maxErrno]*tcpip.Error // TranslateErrno translate an errno from the syscall package into a // *tcpip.Error. // -// Not all errnos are supported and this function will panic on unreconized -// errnos. +// Valid, but unreconigized errnos will be translated to +// tcpip.ErrInvalidEndpointState (EINVAL). Panics on invalid errnos. func TranslateErrno(e syscall.Errno) *tcpip.Error { - if err, ok := translations[e]; ok { + if err := translations[e]; err != nil { return err } return tcpip.ErrInvalidEndpointState } + +func addTranslation(host syscall.Errno, trans *tcpip.Error) { + if translations[host] != nil { + panic(fmt.Sprintf("duplicate translation for host errno %q (%d)", host.Error(), host)) + } + translations[host] = trans +} + +func init() { + addTranslation(syscall.EEXIST, tcpip.ErrDuplicateAddress) + addTranslation(syscall.ENETUNREACH, tcpip.ErrNoRoute) + addTranslation(syscall.EINVAL, tcpip.ErrInvalidEndpointState) + addTranslation(syscall.EALREADY, tcpip.ErrAlreadyConnecting) + addTranslation(syscall.EISCONN, tcpip.ErrAlreadyConnected) + addTranslation(syscall.EADDRINUSE, tcpip.ErrPortInUse) + addTranslation(syscall.EADDRNOTAVAIL, tcpip.ErrBadLocalAddress) + addTranslation(syscall.EPIPE, tcpip.ErrClosedForSend) + addTranslation(syscall.EWOULDBLOCK, tcpip.ErrWouldBlock) + addTranslation(syscall.ECONNREFUSED, tcpip.ErrConnectionRefused) + addTranslation(syscall.ETIMEDOUT, tcpip.ErrTimeout) + addTranslation(syscall.EINPROGRESS, tcpip.ErrConnectStarted) + addTranslation(syscall.EDESTADDRREQ, tcpip.ErrDestinationRequired) + addTranslation(syscall.ENOTSUP, tcpip.ErrNotSupported) + addTranslation(syscall.ENOTTY, tcpip.ErrQueueSizeNotSupported) + addTranslation(syscall.ENOTCONN, tcpip.ErrNotConnected) + addTranslation(syscall.ECONNRESET, tcpip.ErrConnectionReset) + addTranslation(syscall.ECONNABORTED, tcpip.ErrConnectionAborted) + addTranslation(syscall.EMSGSIZE, tcpip.ErrMessageTooLong) + addTranslation(syscall.ENOBUFS, tcpip.ErrNoBufferSpace) +} |