interface_openbsd.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. package route
  5. func (*wireFormat) parseInterfaceMessage(_ RIBType, b []byte) (Message, error) {
  6. if len(b) < 32 {
  7. return nil, errMessageTooShort
  8. }
  9. l := int(nativeEndian.Uint16(b[:2]))
  10. if len(b) < l {
  11. return nil, errInvalidMessage
  12. }
  13. attrs := uint(nativeEndian.Uint32(b[12:16]))
  14. if attrs&sysRTA_IFP == 0 {
  15. return nil, nil
  16. }
  17. m := &InterfaceMessage{
  18. Version: int(b[2]),
  19. Type: int(b[3]),
  20. Flags: int(nativeEndian.Uint32(b[16:20])),
  21. Index: int(nativeEndian.Uint16(b[6:8])),
  22. Addrs: make([]Addr, sysRTAX_MAX),
  23. raw: b[:l],
  24. }
  25. a, err := parseLinkAddr(b[int(nativeEndian.Uint16(b[4:6])):])
  26. if err != nil {
  27. return nil, err
  28. }
  29. m.Addrs[sysRTAX_IFP] = a
  30. m.Name = a.(*LinkAddr).Name
  31. return m, nil
  32. }
  33. func (*wireFormat) parseInterfaceAddrMessage(_ RIBType, b []byte) (Message, error) {
  34. if len(b) < 24 {
  35. return nil, errMessageTooShort
  36. }
  37. l := int(nativeEndian.Uint16(b[:2]))
  38. if len(b) < l {
  39. return nil, errInvalidMessage
  40. }
  41. bodyOff := int(nativeEndian.Uint16(b[4:6]))
  42. m := &InterfaceAddrMessage{
  43. Version: int(b[2]),
  44. Type: int(b[3]),
  45. Flags: int(nativeEndian.Uint32(b[12:16])),
  46. Index: int(nativeEndian.Uint16(b[6:8])),
  47. raw: b[:l],
  48. }
  49. var err error
  50. m.Addrs, err = parseAddrs(uint(nativeEndian.Uint32(b[12:16])), parseKernelInetAddr, b[bodyOff:])
  51. if err != nil {
  52. return nil, err
  53. }
  54. return m, nil
  55. }
  56. func (*wireFormat) parseInterfaceAnnounceMessage(_ RIBType, b []byte) (Message, error) {
  57. if len(b) < 26 {
  58. return nil, errMessageTooShort
  59. }
  60. l := int(nativeEndian.Uint16(b[:2]))
  61. if len(b) < l {
  62. return nil, errInvalidMessage
  63. }
  64. m := &InterfaceAnnounceMessage{
  65. Version: int(b[2]),
  66. Type: int(b[3]),
  67. Index: int(nativeEndian.Uint16(b[6:8])),
  68. What: int(nativeEndian.Uint16(b[8:10])),
  69. raw: b[:l],
  70. }
  71. for i := 0; i < 16; i++ {
  72. if b[10+i] != 0 {
  73. continue
  74. }
  75. m.Name = string(b[10 : 10+i])
  76. break
  77. }
  78. return m, nil
  79. }