mirror of
https://github.com/golang/net.git
synced 2026-04-01 02:47:08 +09:00
This change introduces a package that provides the basic manipulation of routing facilities on BSD variants. Unlike the existing APIs in syscall package of standard library, the package tries to provide operating system and its architecture agnostic APIs. At present, the package supports any version of Darwin, any version of DragonFly BSD, FreeBSD 7 through 11, NetBSD 6 and above, and OpenBSD 5.6 and above. Updates golang/go#14724. Change-Id: Id964ea22dec491ddac3776e3a8c8c10f140f96ac Reviewed-on: https://go-review.googlesource.com/22446 Run-TryBot: Mikio Hara <mikioh.mikioh@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
91 lines
2.7 KiB
Go
91 lines
2.7 KiB
Go
// Copyright 2016 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build darwin dragonfly freebsd netbsd openbsd
|
|
|
|
package route
|
|
|
|
// This file contains duplicates of encoding/binary package.
|
|
//
|
|
// This package is supposed to be used by the net package of standard
|
|
// library. Therefore a package set used in the package must be the
|
|
// same as net package.
|
|
|
|
var (
|
|
littleEndian binaryLittleEndian
|
|
bigEndian binaryBigEndian
|
|
)
|
|
|
|
type binaryByteOrder interface {
|
|
Uint16([]byte) uint16
|
|
Uint32([]byte) uint32
|
|
PutUint16([]byte, uint16)
|
|
PutUint32([]byte, uint32)
|
|
Uint64([]byte) uint64
|
|
}
|
|
|
|
type binaryLittleEndian struct{}
|
|
|
|
func (binaryLittleEndian) Uint16(b []byte) uint16 {
|
|
_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
|
|
return uint16(b[0]) | uint16(b[1])<<8
|
|
}
|
|
|
|
func (binaryLittleEndian) PutUint16(b []byte, v uint16) {
|
|
_ = b[1] // early bounds check to guarantee safety of writes below
|
|
b[0] = byte(v)
|
|
b[1] = byte(v >> 8)
|
|
}
|
|
|
|
func (binaryLittleEndian) Uint32(b []byte) uint32 {
|
|
_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
|
|
return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
|
|
}
|
|
|
|
func (binaryLittleEndian) PutUint32(b []byte, v uint32) {
|
|
_ = b[3] // early bounds check to guarantee safety of writes below
|
|
b[0] = byte(v)
|
|
b[1] = byte(v >> 8)
|
|
b[2] = byte(v >> 16)
|
|
b[3] = byte(v >> 24)
|
|
}
|
|
|
|
func (binaryLittleEndian) Uint64(b []byte) uint64 {
|
|
_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
|
|
return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
|
|
uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
|
|
}
|
|
|
|
type binaryBigEndian struct{}
|
|
|
|
func (binaryBigEndian) Uint16(b []byte) uint16 {
|
|
_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
|
|
return uint16(b[1]) | uint16(b[0])<<8
|
|
}
|
|
|
|
func (binaryBigEndian) PutUint16(b []byte, v uint16) {
|
|
_ = b[1] // early bounds check to guarantee safety of writes below
|
|
b[0] = byte(v >> 8)
|
|
b[1] = byte(v)
|
|
}
|
|
|
|
func (binaryBigEndian) Uint32(b []byte) uint32 {
|
|
_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
|
|
return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
|
|
}
|
|
|
|
func (binaryBigEndian) PutUint32(b []byte, v uint32) {
|
|
_ = b[3] // early bounds check to guarantee safety of writes below
|
|
b[0] = byte(v >> 24)
|
|
b[1] = byte(v >> 16)
|
|
b[2] = byte(v >> 8)
|
|
b[3] = byte(v)
|
|
}
|
|
|
|
func (binaryBigEndian) Uint64(b []byte) uint64 {
|
|
_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
|
|
return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
|
|
uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
|
|
}
|