1
2
3
4
5 package route
6
7 import (
8 "syscall"
9 "unsafe"
10 )
11
12 func (typ RIBType) parseable() bool {
13 switch typ {
14 case syscall.NET_RT_STATS, syscall.NET_RT_TABLE:
15 return false
16 default:
17 return true
18 }
19 }
20
21
22 type RouteMetrics struct {
23 PathMTU int
24 }
25
26
27 func (rmx *RouteMetrics) SysType() SysType { return SysMetrics }
28
29
30 func (m *RouteMessage) Sys() []Sys {
31 return []Sys{
32 &RouteMetrics{
33 PathMTU: int(nativeEndian.Uint32(m.raw[60:64])),
34 },
35 }
36 }
37
38
39 type InterfaceMetrics struct {
40 Type int
41 MTU int
42 }
43
44
45 func (imx *InterfaceMetrics) SysType() SysType { return SysMetrics }
46
47
48 func (m *InterfaceMessage) Sys() []Sys {
49 return []Sys{
50 &InterfaceMetrics{
51 Type: int(m.raw[24]),
52 MTU: int(nativeEndian.Uint32(m.raw[28:32])),
53 },
54 }
55 }
56
57 func probeRoutingStack() (int, map[int]*wireFormat) {
58 var p uintptr
59 rtm := &wireFormat{extOff: -1, bodyOff: -1}
60 rtm.parse = rtm.parseRouteMessage
61 ifm := &wireFormat{extOff: -1, bodyOff: -1}
62 ifm.parse = ifm.parseInterfaceMessage
63 ifam := &wireFormat{extOff: -1, bodyOff: -1}
64 ifam.parse = ifam.parseInterfaceAddrMessage
65 ifanm := &wireFormat{extOff: -1, bodyOff: -1}
66 ifanm.parse = ifanm.parseInterfaceAnnounceMessage
67 return int(unsafe.Sizeof(p)), map[int]*wireFormat{
68 syscall.RTM_ADD: rtm,
69 syscall.RTM_DELETE: rtm,
70 syscall.RTM_CHANGE: rtm,
71 syscall.RTM_GET: rtm,
72 syscall.RTM_LOSING: rtm,
73 syscall.RTM_REDIRECT: rtm,
74 syscall.RTM_MISS: rtm,
75 syscall.RTM_RESOLVE: rtm,
76 syscall.RTM_NEWADDR: ifam,
77 syscall.RTM_DELADDR: ifam,
78 syscall.RTM_IFINFO: ifm,
79 syscall.RTM_IFANNOUNCE: ifanm,
80 syscall.RTM_DESYNC: rtm,
81 }
82 }
83
View as plain text