From e5842be694edee2e9daa54c2beb87d509820295f Mon Sep 17 00:00:00 2001 From: Alessandro Boch Date: Thu, 18 Jun 2015 19:14:03 -0700 Subject: [PATCH] network byte order to bitseq serializer Signed-off-by: Alessandro Boch --- libnetwork/bitseq/sequence.go | 24 +++++++------- libnetwork/bitseq/sequence_test.go | 2 ++ libnetwork/idm/idm_test.go | 2 ++ libnetwork/ipam/allocator_test.go | 1 + libnetwork/netutils/utils.go | 50 ------------------------------ 5 files changed, 17 insertions(+), 62 deletions(-) diff --git a/libnetwork/bitseq/sequence.go b/libnetwork/bitseq/sequence.go index d9c9ad5272..4670d48dd8 100644 --- a/libnetwork/bitseq/sequence.go +++ b/libnetwork/bitseq/sequence.go @@ -4,11 +4,11 @@ package bitseq import ( + "encoding/binary" "fmt" "sync" "github.com/docker/libnetwork/datastore" - "github.com/docker/libnetwork/netutils" ) // Block Sequence constants @@ -134,14 +134,15 @@ func (s *Sequence) Equal(o *Sequence) bool { } // ToByteArray converts the sequence into a byte array -// TODO (aboch): manage network/host order stuff func (s *Sequence) ToByteArray() ([]byte, error) { var bb []byte p := s for p != nil { - bb = append(bb, netutils.U32ToA(p.Block)...) - bb = append(bb, netutils.U32ToA(p.Count)...) + b := make([]byte, 8) + binary.BigEndian.PutUint32(b[0:], p.Block) + binary.BigEndian.PutUint32(b[4:], p.Count) + bb = append(bb, b...) p = p.Next } @@ -149,7 +150,6 @@ func (s *Sequence) ToByteArray() ([]byte, error) { } // FromByteArray construct the sequence from the byte array -// TODO (aboch): manage network/host order stuff func (s *Sequence) FromByteArray(data []byte) error { l := len(data) if l%8 != 0 { @@ -159,8 +159,8 @@ func (s *Sequence) FromByteArray(data []byte) error { p := s i := 0 for { - p.Block = netutils.ATo32(data[i : i+4]) - p.Count = netutils.ATo32(data[i+4 : i+8]) + p.Block = binary.BigEndian.Uint32(data[i : i+4]) + p.Count = binary.BigEndian.Uint32(data[i+4 : i+8]) i += 8 if i == l { break @@ -229,12 +229,12 @@ func (h *Handle) Destroy() { // ToByteArray converts this handle's data into a byte array func (h *Handle) ToByteArray() ([]byte, error) { - ba := make([]byte, 8) h.Lock() defer h.Unlock() - copy(ba[0:4], netutils.U32ToA(h.bits)) - copy(ba[4:8], netutils.U32ToA(h.unselected)) + ba := make([]byte, 8) + binary.BigEndian.PutUint32(ba[0:], h.bits) + binary.BigEndian.PutUint32(ba[4:], h.unselected) bm, err := h.head.ToByteArray() if err != nil { return nil, fmt.Errorf("failed to serialize head: %s", err.Error()) @@ -258,8 +258,8 @@ func (h *Handle) FromByteArray(ba []byte) error { h.Lock() h.head = nh - h.bits = netutils.ATo32(ba[0:4]) - h.unselected = netutils.ATo32(ba[4:8]) + h.bits = binary.BigEndian.Uint32(ba[0:4]) + h.unselected = binary.BigEndian.Uint32(ba[4:8]) h.Unlock() return nil diff --git a/libnetwork/bitseq/sequence_test.go b/libnetwork/bitseq/sequence_test.go index 54e505f77b..22978430c5 100644 --- a/libnetwork/bitseq/sequence_test.go +++ b/libnetwork/bitseq/sequence_test.go @@ -2,6 +2,8 @@ package bitseq import ( "testing" + + _ "github.com/docker/libnetwork/netutils" ) func TestSequenceGetAvailableBit(t *testing.T) { diff --git a/libnetwork/idm/idm_test.go b/libnetwork/idm/idm_test.go index 1004cb8bb5..155f3fdfd0 100644 --- a/libnetwork/idm/idm_test.go +++ b/libnetwork/idm/idm_test.go @@ -2,6 +2,8 @@ package idm import ( "testing" + + _ "github.com/docker/libnetwork/netutils" ) func TestNew(t *testing.T) { diff --git a/libnetwork/ipam/allocator_test.go b/libnetwork/ipam/allocator_test.go index cf67a75375..8e063d7af7 100644 --- a/libnetwork/ipam/allocator_test.go +++ b/libnetwork/ipam/allocator_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/docker/libnetwork/bitseq" + _ "github.com/docker/libnetwork/netutils" ) func getAllocator(t *testing.T, subnet *net.IPNet) *Allocator { diff --git a/libnetwork/netutils/utils.go b/libnetwork/netutils/utils.go index 6ade406db4..315ca19a9d 100644 --- a/libnetwork/netutils/utils.go +++ b/libnetwork/netutils/utils.go @@ -180,53 +180,3 @@ func GenerateIfaceName(prefix string, len int) (string, error) { } return "", types.InternalErrorf("could not generate interface name") } - -func byteArrayToInt(array []byte, numBytes int) uint64 { - if numBytes <= 0 || numBytes > 8 { - panic("Invalid argument") - } - num := 0 - for i := 0; i <= len(array)-1; i++ { - num += int(array[len(array)-1-i]) << uint(i*8) - } - return uint64(num) -} - -// ATo64 converts a byte array into a uint32 -func ATo64(array []byte) uint64 { - return byteArrayToInt(array, 8) -} - -// ATo32 converts a byte array into a uint32 -func ATo32(array []byte) uint32 { - return uint32(byteArrayToInt(array, 4)) -} - -// ATo16 converts a byte array into a uint16 -func ATo16(array []byte) uint16 { - return uint16(byteArrayToInt(array, 2)) -} - -func intToByteArray(val uint64, numBytes int) []byte { - array := make([]byte, numBytes) - for i := numBytes - 1; i >= 0; i-- { - array[i] = byte(val & 0xff) - val = val >> 8 - } - return array -} - -// U64ToA converts a uint64 to a byte array -func U64ToA(val uint64) []byte { - return intToByteArray(uint64(val), 8) -} - -// U32ToA converts a uint64 to a byte array -func U32ToA(val uint32) []byte { - return intToByteArray(uint64(val), 4) -} - -// U16ToA converts a uint64 to a byte array -func U16ToA(val uint16) []byte { - return intToByteArray(uint64(val), 2) -}