route_darwin.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // Copyright 2011 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. // Routing sockets and messages for Darwin
  5. package unix
  6. import "unsafe"
  7. func (any *anyMessage) toRoutingMessage(b []byte) RoutingMessage {
  8. switch any.Type {
  9. case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE:
  10. p := (*RouteMessage)(unsafe.Pointer(any))
  11. return &RouteMessage{Header: p.Header, Data: b[SizeofRtMsghdr:any.Msglen]}
  12. case RTM_IFINFO:
  13. p := (*InterfaceMessage)(unsafe.Pointer(any))
  14. return &InterfaceMessage{Header: p.Header, Data: b[SizeofIfMsghdr:any.Msglen]}
  15. case RTM_NEWADDR, RTM_DELADDR:
  16. p := (*InterfaceAddrMessage)(unsafe.Pointer(any))
  17. return &InterfaceAddrMessage{Header: p.Header, Data: b[SizeofIfaMsghdr:any.Msglen]}
  18. case RTM_NEWMADDR2, RTM_DELMADDR:
  19. p := (*InterfaceMulticastAddrMessage)(unsafe.Pointer(any))
  20. return &InterfaceMulticastAddrMessage{Header: p.Header, Data: b[SizeofIfmaMsghdr2:any.Msglen]}
  21. }
  22. return nil
  23. }
  24. // InterfaceMulticastAddrMessage represents a routing message
  25. // containing network interface address entries.
  26. type InterfaceMulticastAddrMessage struct {
  27. Header IfmaMsghdr2
  28. Data []byte
  29. }
  30. const rtaIfmaMask = RTA_GATEWAY | RTA_IFP | RTA_IFA
  31. func (m *InterfaceMulticastAddrMessage) sockaddr() (sas []Sockaddr) {
  32. if m.Header.Addrs&rtaIfmaMask == 0 {
  33. return nil
  34. }
  35. b := m.Data[:]
  36. for i := uint(0); i < RTAX_MAX; i++ {
  37. if m.Header.Addrs&rtaIfmaMask&(1<<i) == 0 {
  38. continue
  39. }
  40. rsa := (*RawSockaddr)(unsafe.Pointer(&b[0]))
  41. switch i {
  42. case RTAX_IFA:
  43. sa, e := anyToSockaddr((*RawSockaddrAny)(unsafe.Pointer(rsa)))
  44. if e != nil {
  45. return nil
  46. }
  47. sas = append(sas, sa)
  48. case RTAX_GATEWAY, RTAX_IFP:
  49. // nothing to do
  50. }
  51. b = b[rsaAlignOf(int(rsa.Len)):]
  52. }
  53. return sas
  54. }