route_freebsd_32bit.go 1.3 KB

123456789101112131415161718192021222324252627282930313233
  1. // Copyright 2014 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. //go:build (freebsd && 386) || (freebsd && arm)
  5. package syscall
  6. import "unsafe"
  7. func (any *anyMessage) parseRouteMessage(b []byte) *RouteMessage {
  8. p := (*RouteMessage)(unsafe.Pointer(any))
  9. off := int(unsafe.Offsetof(p.Header.Rmx)) + SizeofRtMetrics
  10. if freebsdConfArch == "amd64" {
  11. off += SizeofRtMetrics // rt_metrics on amd64 is simply doubled
  12. }
  13. return &RouteMessage{Header: p.Header, Data: b[rsaAlignOf(off):any.Msglen]}
  14. }
  15. func (any *anyMessage) parseInterfaceMessage(b []byte) *InterfaceMessage {
  16. p := (*InterfaceMessage)(unsafe.Pointer(any))
  17. // FreeBSD 10 and beyond have a restructured mbuf
  18. // packet header view.
  19. // See https://svnweb.freebsd.org/base?view=revision&revision=254804.
  20. if supportsABI(1000000) {
  21. m := (*ifMsghdr)(unsafe.Pointer(any))
  22. p.Header.Data.Hwassist = uint32(m.Data.Hwassist)
  23. p.Header.Data.Epoch = m.Data.Epoch
  24. p.Header.Data.Lastchange = m.Data.Lastchange
  25. return &InterfaceMessage{Header: p.Header, Data: b[int(unsafe.Offsetof(p.Header.Data))+int(p.Header.Data.Datalen) : any.Msglen]}
  26. }
  27. return &InterfaceMessage{Header: p.Header, Data: b[int(unsafe.Offsetof(p.Header.Data))+int(p.Header.Data.Datalen) : any.Msglen]}
  28. }