address.go 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  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 || freebsd || netbsd || openbsd
  5. // +build darwin dragonfly freebsd netbsd openbsd
  6. package route
  7. import "runtime"
  8. // An Addr represents an address associated with packet routing.
  9. type Addr interface {
  10. // Family returns an address family.
  11. Family() int
  12. }
  13. // A LinkAddr represents a link-layer address.
  14. type LinkAddr struct {
  15. Index int // interface index when attached
  16. Name string // interface name when attached
  17. Addr []byte // link-layer address when attached
  18. }
  19. // Family implements the Family method of Addr interface.
  20. func (a *LinkAddr) Family() int { return sysAF_LINK }
  21. func (a *LinkAddr) lenAndSpace() (int, int) {
  22. l := 8 + len(a.Name) + len(a.Addr)
  23. return l, roundup(l)
  24. }
  25. func (a *LinkAddr) marshal(b []byte) (int, error) {
  26. l, ll := a.lenAndSpace()
  27. if len(b) < ll {
  28. return 0, errShortBuffer
  29. }
  30. nlen, alen := len(a.Name), len(a.Addr)
  31. if nlen > 255 || alen > 255 {
  32. return 0, errInvalidAddr
  33. }
  34. b[0] = byte(l)
  35. b[1] = sysAF_LINK
  36. if a.Index > 0 {
  37. nativeEndian.PutUint16(b[2:4], uint16(a.Index))
  38. }
  39. data := b[8:]
  40. if nlen > 0 {
  41. b[5] = byte(nlen)
  42. copy(data[:nlen], a.Name)
  43. data = data[nlen:]
  44. }
  45. if alen > 0 {
  46. b[6] = byte(alen)
  47. copy(data[:alen], a.Addr)
  48. data = data[alen:]
  49. }
  50. return ll, nil
  51. }
  52. func parseLinkAddr(b []byte) (Addr, error) {
  53. if len(b) < 8 {
  54. return nil, errInvalidAddr
  55. }
  56. _, a, err := parseKernelLinkAddr(sysAF_LINK, b[4:])
  57. if err != nil {
  58. return nil, err
  59. }
  60. a.(*LinkAddr).Index = int(nativeEndian.Uint16(b[2:4]))
  61. return a, nil
  62. }
  63. // parseKernelLinkAddr parses b as a link-layer address in
  64. // conventional BSD kernel form.
  65. func parseKernelLinkAddr(_ int, b []byte) (int, Addr, error) {
  66. // The encoding looks like the following:
  67. // +----------------------------+
  68. // | Type (1 octet) |
  69. // +----------------------------+
  70. // | Name length (1 octet) |
  71. // +----------------------------+
  72. // | Address length (1 octet) |
  73. // +----------------------------+
  74. // | Selector length (1 octet) |
  75. // +----------------------------+
  76. // | Data (variable) |
  77. // +----------------------------+
  78. //
  79. // On some platforms, all-bit-one of length field means "don't
  80. // care".
  81. nlen, alen, slen := int(b[1]), int(b[2]), int(b[3])
  82. if nlen == 0xff {
  83. nlen = 0
  84. }
  85. if alen == 0xff {
  86. alen = 0
  87. }
  88. if slen == 0xff {
  89. slen = 0
  90. }
  91. l := 4 + nlen + alen + slen
  92. if len(b) < l {
  93. return 0, nil, errInvalidAddr
  94. }
  95. data := b[4:]
  96. var name string
  97. var addr []byte
  98. if nlen > 0 {
  99. name = string(data[:nlen])
  100. data = data[nlen:]
  101. }
  102. if alen > 0 {
  103. addr = data[:alen]
  104. data = data[alen:]
  105. }
  106. return l, &LinkAddr{Name: name, Addr: addr}, nil
  107. }
  108. // An Inet4Addr represents an internet address for IPv4.
  109. type Inet4Addr struct {
  110. IP [4]byte // IP address
  111. }
  112. // Family implements the Family method of Addr interface.
  113. func (a *Inet4Addr) Family() int { return sysAF_INET }
  114. func (a *Inet4Addr) lenAndSpace() (int, int) {
  115. return sizeofSockaddrInet, roundup(sizeofSockaddrInet)
  116. }
  117. func (a *Inet4Addr) marshal(b []byte) (int, error) {
  118. l, ll := a.lenAndSpace()
  119. if len(b) < ll {
  120. return 0, errShortBuffer
  121. }
  122. b[0] = byte(l)
  123. b[1] = sysAF_INET
  124. copy(b[4:8], a.IP[:])
  125. return ll, nil
  126. }
  127. // An Inet6Addr represents an internet address for IPv6.
  128. type Inet6Addr struct {
  129. IP [16]byte // IP address
  130. ZoneID int // zone identifier
  131. }
  132. // Family implements the Family method of Addr interface.
  133. func (a *Inet6Addr) Family() int { return sysAF_INET6 }
  134. func (a *Inet6Addr) lenAndSpace() (int, int) {
  135. return sizeofSockaddrInet6, roundup(sizeofSockaddrInet6)
  136. }
  137. func (a *Inet6Addr) marshal(b []byte) (int, error) {
  138. l, ll := a.lenAndSpace()
  139. if len(b) < ll {
  140. return 0, errShortBuffer
  141. }
  142. b[0] = byte(l)
  143. b[1] = sysAF_INET6
  144. copy(b[8:24], a.IP[:])
  145. if a.ZoneID > 0 {
  146. nativeEndian.PutUint32(b[24:28], uint32(a.ZoneID))
  147. }
  148. return ll, nil
  149. }
  150. // parseInetAddr parses b as an internet address for IPv4 or IPv6.
  151. func parseInetAddr(af int, b []byte) (Addr, error) {
  152. switch af {
  153. case sysAF_INET:
  154. if len(b) < sizeofSockaddrInet {
  155. return nil, errInvalidAddr
  156. }
  157. a := &Inet4Addr{}
  158. copy(a.IP[:], b[4:8])
  159. return a, nil
  160. case sysAF_INET6:
  161. if len(b) < sizeofSockaddrInet6 {
  162. return nil, errInvalidAddr
  163. }
  164. a := &Inet6Addr{ZoneID: int(nativeEndian.Uint32(b[24:28]))}
  165. copy(a.IP[:], b[8:24])
  166. if a.IP[0] == 0xfe && a.IP[1]&0xc0 == 0x80 || a.IP[0] == 0xff && (a.IP[1]&0x0f == 0x01 || a.IP[1]&0x0f == 0x02) {
  167. // KAME based IPv6 protocol stack usually
  168. // embeds the interface index in the
  169. // interface-local or link-local address as
  170. // the kernel-internal form.
  171. id := int(bigEndian.Uint16(a.IP[2:4]))
  172. if id != 0 {
  173. a.ZoneID = id
  174. a.IP[2], a.IP[3] = 0, 0
  175. }
  176. }
  177. return a, nil
  178. default:
  179. return nil, errInvalidAddr
  180. }
  181. }
  182. // parseKernelInetAddr parses b as an internet address in conventional
  183. // BSD kernel form.
  184. func parseKernelInetAddr(af int, b []byte) (int, Addr, error) {
  185. // The encoding looks similar to the NLRI encoding.
  186. // +----------------------------+
  187. // | Length (1 octet) |
  188. // +----------------------------+
  189. // | Address prefix (variable) |
  190. // +----------------------------+
  191. //
  192. // The differences between the kernel form and the NLRI
  193. // encoding are:
  194. //
  195. // - The length field of the kernel form indicates the prefix
  196. // length in bytes, not in bits
  197. //
  198. // - In the kernel form, zero value of the length field
  199. // doesn't mean 0.0.0.0/0 or ::/0
  200. //
  201. // - The kernel form appends leading bytes to the prefix field
  202. // to make the <length, prefix> tuple to be conformed with
  203. // the routing message boundary
  204. l := int(b[0])
  205. if runtime.GOOS == "darwin" || runtime.GOOS == "ios" {
  206. // On Darwin, an address in the kernel form is also
  207. // used as a message filler.
  208. if l == 0 || len(b) > roundup(l) {
  209. l = roundup(l)
  210. }
  211. } else {
  212. l = roundup(l)
  213. }
  214. if len(b) < l {
  215. return 0, nil, errInvalidAddr
  216. }
  217. // Don't reorder case expressions.
  218. // The case expressions for IPv6 must come first.
  219. const (
  220. off4 = 4 // offset of in_addr
  221. off6 = 8 // offset of in6_addr
  222. )
  223. switch {
  224. case b[0] == sizeofSockaddrInet6:
  225. a := &Inet6Addr{}
  226. copy(a.IP[:], b[off6:off6+16])
  227. return int(b[0]), a, nil
  228. case af == sysAF_INET6:
  229. a := &Inet6Addr{}
  230. if l-1 < off6 {
  231. copy(a.IP[:], b[1:l])
  232. } else {
  233. copy(a.IP[:], b[l-off6:l])
  234. }
  235. return int(b[0]), a, nil
  236. case b[0] == sizeofSockaddrInet:
  237. a := &Inet4Addr{}
  238. copy(a.IP[:], b[off4:off4+4])
  239. return int(b[0]), a, nil
  240. default: // an old fashion, AF_UNSPEC or unknown means AF_INET
  241. a := &Inet4Addr{}
  242. if l-1 < off4 {
  243. copy(a.IP[:], b[1:l])
  244. } else {
  245. copy(a.IP[:], b[l-off4:l])
  246. }
  247. return int(b[0]), a, nil
  248. }
  249. }
  250. // A DefaultAddr represents an address of various operating
  251. // system-specific features.
  252. type DefaultAddr struct {
  253. af int
  254. Raw []byte // raw format of address
  255. }
  256. // Family implements the Family method of Addr interface.
  257. func (a *DefaultAddr) Family() int { return a.af }
  258. func (a *DefaultAddr) lenAndSpace() (int, int) {
  259. l := len(a.Raw)
  260. return l, roundup(l)
  261. }
  262. func (a *DefaultAddr) marshal(b []byte) (int, error) {
  263. l, ll := a.lenAndSpace()
  264. if len(b) < ll {
  265. return 0, errShortBuffer
  266. }
  267. if l > 255 {
  268. return 0, errInvalidAddr
  269. }
  270. b[1] = byte(l)
  271. copy(b[:l], a.Raw)
  272. return ll, nil
  273. }
  274. func parseDefaultAddr(b []byte) (Addr, error) {
  275. if len(b) < 2 || len(b) < int(b[0]) {
  276. return nil, errInvalidAddr
  277. }
  278. a := &DefaultAddr{af: int(b[1]), Raw: b[:b[0]]}
  279. return a, nil
  280. }
  281. func addrsSpace(as []Addr) int {
  282. var l int
  283. for _, a := range as {
  284. switch a := a.(type) {
  285. case *LinkAddr:
  286. _, ll := a.lenAndSpace()
  287. l += ll
  288. case *Inet4Addr:
  289. _, ll := a.lenAndSpace()
  290. l += ll
  291. case *Inet6Addr:
  292. _, ll := a.lenAndSpace()
  293. l += ll
  294. case *DefaultAddr:
  295. _, ll := a.lenAndSpace()
  296. l += ll
  297. }
  298. }
  299. return l
  300. }
  301. // marshalAddrs marshals as and returns a bitmap indicating which
  302. // address is stored in b.
  303. func marshalAddrs(b []byte, as []Addr) (uint, error) {
  304. var attrs uint
  305. for i, a := range as {
  306. switch a := a.(type) {
  307. case *LinkAddr:
  308. l, err := a.marshal(b)
  309. if err != nil {
  310. return 0, err
  311. }
  312. b = b[l:]
  313. attrs |= 1 << uint(i)
  314. case *Inet4Addr:
  315. l, err := a.marshal(b)
  316. if err != nil {
  317. return 0, err
  318. }
  319. b = b[l:]
  320. attrs |= 1 << uint(i)
  321. case *Inet6Addr:
  322. l, err := a.marshal(b)
  323. if err != nil {
  324. return 0, err
  325. }
  326. b = b[l:]
  327. attrs |= 1 << uint(i)
  328. case *DefaultAddr:
  329. l, err := a.marshal(b)
  330. if err != nil {
  331. return 0, err
  332. }
  333. b = b[l:]
  334. attrs |= 1 << uint(i)
  335. }
  336. }
  337. return attrs, nil
  338. }
  339. func parseAddrs(attrs uint, fn func(int, []byte) (int, Addr, error), b []byte) ([]Addr, error) {
  340. var as [sysRTAX_MAX]Addr
  341. af := int(sysAF_UNSPEC)
  342. for i := uint(0); i < sysRTAX_MAX && len(b) >= roundup(0); i++ {
  343. if attrs&(1<<i) == 0 {
  344. continue
  345. }
  346. if i <= sysRTAX_BRD {
  347. switch b[1] {
  348. case sysAF_LINK:
  349. a, err := parseLinkAddr(b)
  350. if err != nil {
  351. return nil, err
  352. }
  353. as[i] = a
  354. l := roundup(int(b[0]))
  355. if len(b) < l {
  356. return nil, errMessageTooShort
  357. }
  358. b = b[l:]
  359. case sysAF_INET, sysAF_INET6:
  360. af = int(b[1])
  361. a, err := parseInetAddr(af, b)
  362. if err != nil {
  363. return nil, err
  364. }
  365. as[i] = a
  366. l := roundup(int(b[0]))
  367. if len(b) < l {
  368. return nil, errMessageTooShort
  369. }
  370. b = b[l:]
  371. default:
  372. l, a, err := fn(af, b)
  373. if err != nil {
  374. return nil, err
  375. }
  376. as[i] = a
  377. ll := roundup(l)
  378. if len(b) < ll {
  379. b = b[l:]
  380. } else {
  381. b = b[ll:]
  382. }
  383. }
  384. } else {
  385. a, err := parseDefaultAddr(b)
  386. if err != nil {
  387. return nil, err
  388. }
  389. as[i] = a
  390. l := roundup(int(b[0]))
  391. if len(b) < l {
  392. return nil, errMessageTooShort
  393. }
  394. b = b[l:]
  395. }
  396. }
  397. // The only remaining bytes in b should be alignment.
  398. // However, under some circumstances DragonFly BSD appears to put
  399. // more addresses in the message than are indicated in the address
  400. // bitmask, so don't check for this.
  401. return as[:], nil
  402. }