]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: add support for FreeBSD 10
authorMikio Hara <mikioh.mikioh@gmail.com>
Tue, 4 Mar 2014 00:26:56 +0000 (09:26 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Tue, 4 Mar 2014 00:26:56 +0000 (09:26 +0900)
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

src/pkg/syscall/route_freebsd.go
src/pkg/syscall/route_freebsd_32bit.go [new file with mode: 0644]
src/pkg/syscall/route_freebsd_64bit.go [new file with mode: 0644]

index d8f80316b8c2cfd2e49fd6f6e5fdbc90662deae3..eba6752b7b6c3f3b1c03c6521137036c22d7cb0c 100644 (file)
@@ -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}
diff --git a/src/pkg/syscall/route_freebsd_32bit.go b/src/pkg/syscall/route_freebsd_32bit.go
new file mode 100644 (file)
index 0000000..93efddd
--- /dev/null
@@ -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]}
+}
diff --git a/src/pkg/syscall/route_freebsd_64bit.go b/src/pkg/syscall/route_freebsd_64bit.go
new file mode 100644 (file)
index 0000000..9377f2f
--- /dev/null
@@ -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]}
+}