Mikio Hara | dc7f825 | 2011-08-04 00:22:48 -0400 | [diff] [blame] | 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 | |
Mikio Hara | dc7f825 | 2011-08-04 00:22:48 -0400 | [diff] [blame] | 5 | package syscall |
| 6 | |
Mikio Hara | c5f5df4 | 2013-02-24 12:36:44 +0900 | [diff] [blame] | 7 | import "unsafe" |
Mikio Hara | dc7f825 | 2011-08-04 00:22:48 -0400 | [diff] [blame] | 8 | |
Mikio Hara | 25668b9 | 2014-03-04 09:26:56 +0900 | [diff] [blame] | 9 | // See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html. |
| 10 | var freebsdVersion uint32 |
| 11 | |
| 12 | func init() { |
| 13 | freebsdVersion, _ = SysctlUint32("kern.osreldate") |
Mikio Hara | 69275ee | 2015-02-10 12:24:11 +0900 | [diff] [blame] | 14 | conf, _ := Sysctl("kern.conftxt") |
| 15 | for i, j := 0, 0; j < len(conf); j++ { |
| 16 | if conf[j] != '\n' { |
| 17 | continue |
| 18 | } |
| 19 | s := conf[i:j] |
| 20 | i = j + 1 |
| 21 | if len(s) > len("machine") && s[:len("machine")] == "machine" { |
| 22 | s = s[len("machine"):] |
| 23 | for k := 0; k < len(s); k++ { |
| 24 | if s[k] == ' ' || s[k] == '\t' { |
| 25 | s = s[1:] |
| 26 | } |
| 27 | break |
| 28 | } |
| 29 | freebsdConfArch = s |
| 30 | break |
| 31 | } |
| 32 | } |
Mikio Hara | 25668b9 | 2014-03-04 09:26:56 +0900 | [diff] [blame] | 33 | } |
| 34 | |
Mikio Hara | c5f5df4 | 2013-02-24 12:36:44 +0900 | [diff] [blame] | 35 | func (any *anyMessage) toRoutingMessage(b []byte) RoutingMessage { |
Mikio Hara | dc7f825 | 2011-08-04 00:22:48 -0400 | [diff] [blame] | 36 | switch any.Type { |
| 37 | case RTM_ADD, RTM_DELETE, RTM_CHANGE, RTM_GET, RTM_LOSING, RTM_REDIRECT, RTM_MISS, RTM_LOCK, RTM_RESOLVE: |
Mikio Hara | 69275ee | 2015-02-10 12:24:11 +0900 | [diff] [blame] | 38 | return any.parseRouteMessage(b) |
Mikio Hara | dc7f825 | 2011-08-04 00:22:48 -0400 | [diff] [blame] | 39 | case RTM_IFINFO: |
Mikio Hara | 25668b9 | 2014-03-04 09:26:56 +0900 | [diff] [blame] | 40 | return any.parseInterfaceMessage(b) |
Mikio Hara | c5f5df4 | 2013-02-24 12:36:44 +0900 | [diff] [blame] | 41 | case RTM_IFANNOUNCE: |
| 42 | p := (*InterfaceAnnounceMessage)(unsafe.Pointer(any)) |
| 43 | return &InterfaceAnnounceMessage{Header: p.Header} |
Mikio Hara | dc7f825 | 2011-08-04 00:22:48 -0400 | [diff] [blame] | 44 | case RTM_NEWADDR, RTM_DELADDR: |
| 45 | p := (*InterfaceAddrMessage)(unsafe.Pointer(any)) |
Mikio Hara | c5f5df4 | 2013-02-24 12:36:44 +0900 | [diff] [blame] | 46 | return &InterfaceAddrMessage{Header: p.Header, Data: b[SizeofIfaMsghdr:any.Msglen]} |
Mikio Hara | dc7f825 | 2011-08-04 00:22:48 -0400 | [diff] [blame] | 47 | case RTM_NEWMADDR, RTM_DELMADDR: |
| 48 | p := (*InterfaceMulticastAddrMessage)(unsafe.Pointer(any)) |
Mikio Hara | c5f5df4 | 2013-02-24 12:36:44 +0900 | [diff] [blame] | 49 | return &InterfaceMulticastAddrMessage{Header: p.Header, Data: b[SizeofIfmaMsghdr:any.Msglen]} |
Mikio Hara | dc7f825 | 2011-08-04 00:22:48 -0400 | [diff] [blame] | 50 | } |
| 51 | return nil |
| 52 | } |
| 53 | |
Mikio Hara | c5f5df4 | 2013-02-24 12:36:44 +0900 | [diff] [blame] | 54 | // InterfaceAnnounceMessage represents a routing message containing |
Robert Griesemer | f391362 | 2014-05-02 13:17:55 -0700 | [diff] [blame] | 55 | // network interface arrival and departure information. |
Mikio Hara | c5f5df4 | 2013-02-24 12:36:44 +0900 | [diff] [blame] | 56 | type InterfaceAnnounceMessage struct { |
| 57 | Header IfAnnounceMsghdr |
| 58 | } |
| 59 | |
Mikio Hara | 69275ee | 2015-02-10 12:24:11 +0900 | [diff] [blame] | 60 | func (m *InterfaceAnnounceMessage) sockaddr() ([]Sockaddr, error) { return nil, nil } |
Mikio Hara | c5f5df4 | 2013-02-24 12:36:44 +0900 | [diff] [blame] | 61 | |
Mikio Hara | dc7f825 | 2011-08-04 00:22:48 -0400 | [diff] [blame] | 62 | // InterfaceMulticastAddrMessage represents a routing message |
| 63 | // containing network interface address entries. |
| 64 | type InterfaceMulticastAddrMessage struct { |
| 65 | Header IfmaMsghdr |
| 66 | Data []byte |
| 67 | } |
Joel Sing | 1bc2451 | 2011-08-16 17:26:51 -0400 | [diff] [blame] | 68 | |
Mikio Hara | 69275ee | 2015-02-10 12:24:11 +0900 | [diff] [blame] | 69 | func (m *InterfaceMulticastAddrMessage) sockaddr() ([]Sockaddr, error) { |
| 70 | var sas [RTAX_MAX]Sockaddr |
Mikio Hara | c5f5df4 | 2013-02-24 12:36:44 +0900 | [diff] [blame] | 71 | b := m.Data[:] |
Mikio Hara | 69275ee | 2015-02-10 12:24:11 +0900 | [diff] [blame] | 72 | for i := uint(0); i < RTAX_MAX && len(b) >= minRoutingSockaddrLen; i++ { |
| 73 | if m.Header.Addrs&(1<<i) == 0 { |
Joel Sing | 1bc2451 | 2011-08-16 17:26:51 -0400 | [diff] [blame] | 74 | continue |
| 75 | } |
Mikio Hara | c5f5df4 | 2013-02-24 12:36:44 +0900 | [diff] [blame] | 76 | rsa := (*RawSockaddr)(unsafe.Pointer(&b[0])) |
Mikio Hara | 69275ee | 2015-02-10 12:24:11 +0900 | [diff] [blame] | 77 | switch rsa.Family { |
| 78 | case AF_LINK: |
| 79 | sa, err := parseSockaddrLink(b) |
| 80 | if err != nil { |
| 81 | return nil, err |
Joel Sing | 1bc2451 | 2011-08-16 17:26:51 -0400 | [diff] [blame] | 82 | } |
Mikio Hara | 69275ee | 2015-02-10 12:24:11 +0900 | [diff] [blame] | 83 | sas[i] = sa |
| 84 | b = b[rsaAlignOf(int(rsa.Len)):] |
| 85 | case AF_INET, AF_INET6: |
| 86 | sa, err := parseSockaddrInet(b, rsa.Family) |
| 87 | if err != nil { |
| 88 | return nil, err |
| 89 | } |
| 90 | sas[i] = sa |
| 91 | b = b[rsaAlignOf(int(rsa.Len)):] |
| 92 | default: |
| 93 | sa, l, err := parseLinkLayerAddr(b) |
| 94 | if err != nil { |
| 95 | return nil, err |
| 96 | } |
| 97 | sas[i] = sa |
| 98 | b = b[l:] |
Joel Sing | 1bc2451 | 2011-08-16 17:26:51 -0400 | [diff] [blame] | 99 | } |
Joel Sing | 1bc2451 | 2011-08-16 17:26:51 -0400 | [diff] [blame] | 100 | } |
Mikio Hara | 69275ee | 2015-02-10 12:24:11 +0900 | [diff] [blame] | 101 | return sas[:], nil |
Joel Sing | 1bc2451 | 2011-08-16 17:26:51 -0400 | [diff] [blame] | 102 | } |