interface_classic.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // Copyright 2016 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 darwin || dragonfly || netbsd
  5. // +build darwin dragonfly netbsd
  6. package route
  7. import "runtime"
  8. func (w *wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) {
  9. if len(b) < w.bodyOff {
  10. return nil, errMessageTooShort
  11. }
  12. l := int(nativeEndian.Uint16(b[:2]))
  13. if len(b) < l {
  14. return nil, errInvalidMessage
  15. }
  16. attrs := uint(nativeEndian.Uint32(b[4:8]))
  17. if attrs&sysRTA_IFP == 0 {
  18. return nil, nil
  19. }
  20. m := &InterfaceMessage{
  21. Version: int(b[2]),
  22. Type: int(b[3]),
  23. Addrs: make([]Addr, sysRTAX_MAX),
  24. Flags: int(nativeEndian.Uint32(b[8:12])),
  25. Index: int(nativeEndian.Uint16(b[12:14])),
  26. extOff: w.extOff,
  27. raw: b[:l],
  28. }
  29. a, err := parseLinkAddr(b[w.bodyOff:])
  30. if err != nil {
  31. return nil, err
  32. }
  33. m.Addrs[sysRTAX_IFP] = a
  34. m.Name = a.(*LinkAddr).Name
  35. return m, nil
  36. }
  37. func (w *wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) {
  38. if len(b) < w.bodyOff {
  39. return nil, errMessageTooShort
  40. }
  41. l := int(nativeEndian.Uint16(b[:2]))
  42. if len(b) < l {
  43. return nil, errInvalidMessage
  44. }
  45. m := &InterfaceAddrMessage{
  46. Version: int(b[2]),
  47. Type: int(b[3]),
  48. Flags: int(nativeEndian.Uint32(b[8:12])),
  49. raw: b[:l],
  50. }
  51. if runtime.GOOS == "netbsd" {
  52. m.Index = int(nativeEndian.Uint16(b[16:18]))
  53. } else {
  54. m.Index = int(nativeEndian.Uint16(b[12:14]))
  55. }
  56. var err error
  57. m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[4:8])), parseKernelInetAddr, b[w.bodyOff:])
  58. if err != nil {
  59. return nil, err
  60. }
  61. return m, nil
  62. }