From eeddae1199d9b84ee84011be0019328724ebdcf3 Mon Sep 17 00:00:00 2001 From: Ian Gudger Date: Wed, 31 Oct 2018 18:21:11 -0700 Subject: Use syserr style error translation in netstack's rawfile Replacing map lookups with slice indexing is higher performance. PiperOrigin-RevId: 219569901 Change-Id: I9b7cd22abd4b95383025edbd5a80d1c1a4496936 --- pkg/tcpip/link/rawfile/errors.go | 62 ++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 25 deletions(-) (limited to 'pkg/tcpip') 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) +} -- cgit v1.2.3