From 116d8f6e86ccb86051e8189add10db96ecb7bbb3 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Mon, 22 Sep 2014 08:38:23 -0700 Subject: [PATCH] Optimize byte order handling --- nl/nl_linux.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/nl/nl_linux.go b/nl/nl_linux.go index b933906..58a72e7 100644 --- a/nl/nl_linux.go +++ b/nl/nl_linux.go @@ -30,22 +30,34 @@ func GetIPFamily(ip net.IP) int { } return FAMILY_V6 } + +var nativeEndian binary.ByteOrder + // Get native endianness for the system func NativeEndian() binary.ByteOrder { - var x uint32 = 0x01020304 - if *(*byte)(unsafe.Pointer(&x)) == 0x01 { - return binary.BigEndian + if nativeEndian == nil { + var x uint32 = 0x01020304 + if *(*byte)(unsafe.Pointer(&x)) == 0x01 { + nativeEndian = binary.BigEndian + } + nativeEndian = binary.LittleEndian } - return binary.LittleEndian + return nativeEndian } -// Byte swap a 16 bit value in place +// Byte swap a 16 bit value if we aren't big endian func Swap16(i uint16) uint16 { + if NativeEndian() == binary.BigEndian { + return i + } return (i&0xff00)>>8 | (i&0xff)<<8 } -// Byte swap a 32 bit value in place +// Byte swap a 32 bit value if aren't big endian func Swap32(i uint32) uint32 { + if NativeEndian() == binary.BigEndian { + return i + } return (i&0xff000000)>>24 | (i&0xff0000)>>8 | (i&0xff00)<<8 | (i&0xff)<<24 }