mirror of
https://github.com/golang/go
synced 2024-11-12 04:40:22 -07:00
syscall: add support for FreeBSD 10
This CL tweaks syscall.InterfaceMessage to support FreeBSD 10 and prior to 10. See http://svnweb.freebsd.org/base?view=revision&revision=254804. Fixes #7193. LGTM=iant R=golang-codereviews, rsc, minux.ma, gobot, iant CC=golang-codereviews https://golang.org/cl/56980043
This commit is contained in:
parent
d30d42915a
commit
25668b9b34
@ -8,14 +8,20 @@ package syscall
|
||||
|
||||
import "unsafe"
|
||||
|
||||
// See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html.
|
||||
var freebsdVersion uint32
|
||||
|
||||
func init() {
|
||||
freebsdVersion, _ = SysctlUint32("kern.osreldate")
|
||||
}
|
||||
|
||||
func (any *anyMessage) toRoutingMessage(b []byte) RoutingMessage {
|
||||
switch any.Type {
|
||||
case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE:
|
||||
p := (*RouteMessage)(unsafe.Pointer(any))
|
||||
return &RouteMessage{Header: p.Header, Data: b[SizeofRtMsghdr:any.Msglen]}
|
||||
case RTM_IFINFO:
|
||||
p := (*InterfaceMessage)(unsafe.Pointer(any))
|
||||
return &InterfaceMessage{Header: p.Header, Data: b[SizeofIfMsghdr:any.Msglen]}
|
||||
return any.parseInterfaceMessage(b)
|
||||
case RTM_IFANNOUNCE:
|
||||
p := (*InterfaceAnnounceMessage)(unsafe.Pointer(any))
|
||||
return &InterfaceAnnounceMessage{Header: p.Header}
|
||||
|
24
src/pkg/syscall/route_freebsd_32bit.go
Normal file
24
src/pkg/syscall/route_freebsd_32bit.go
Normal file
@ -0,0 +1,24 @@
|
||||
// Copyright 2014 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 freebsd,386 freebsd,arm
|
||||
|
||||
package syscall
|
||||
|
||||
import "unsafe"
|
||||
|
||||
func (any *anyMessage) parseInterfaceMessage(b []byte) *InterfaceMessage {
|
||||
p := (*InterfaceMessage)(unsafe.Pointer(any))
|
||||
// FreeBSD 10 and beyond have a restructured mbuf
|
||||
// packet header view.
|
||||
// See http://svnweb.freebsd.org/base?view=revision&revision=254804.
|
||||
if freebsdVersion >= 1000000 {
|
||||
m := (*ifMsghdr)(unsafe.Pointer(any))
|
||||
p.Header.Data.Hwassist = uint32(m.Data.Hwassist)
|
||||
p.Header.Data.Epoch = m.Data.Epoch
|
||||
p.Header.Data.Lastchange = m.Data.Lastchange
|
||||
return &InterfaceMessage{Header: p.Header, Data: b[sizeofIfMsghdr:any.Msglen]}
|
||||
}
|
||||
return &InterfaceMessage{Header: p.Header, Data: b[SizeofIfMsghdr:any.Msglen]}
|
||||
}
|
14
src/pkg/syscall/route_freebsd_64bit.go
Normal file
14
src/pkg/syscall/route_freebsd_64bit.go
Normal file
@ -0,0 +1,14 @@
|
||||
// Copyright 2014 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 freebsd,amd64
|
||||
|
||||
package syscall
|
||||
|
||||
import "unsafe"
|
||||
|
||||
func (any *anyMessage) parseInterfaceMessage(b []byte) *InterfaceMessage {
|
||||
p := (*InterfaceMessage)(unsafe.Pointer(any))
|
||||
return &InterfaceMessage{Header: p.Header, Data: b[SizeofIfMsghdr:any.Msglen]}
|
||||
}
|
Loading…
Reference in New Issue
Block a user