1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
|
-define(TABLE, 1).
%% sys/types.h
-define(U_CHAR, 8/little-unsigned-integer).
-define(U_SHORT, 16/little-unsigned-integer).
-define(U_LONG, 64/little-unsigned-integer).
-define(INT, 32/little-signed-integer).
-define(PID_T, ?INT).
-define(UINT8, 8/little-unsigned-integer).
-define(UINT16, 16/little-unsigned-integer).
-define(UINT32, 32/little-unsigned-integer).
-define(UINT64, 64/little-unsigned-integer).
%% usr/include/sys/socket.h
-define(AF_UNSPEC, 0).
-define(AF_INET, 2).
-define(AF_LINK, 18).
-define(AF_INET6, 30).
-define(SOCK_RAW, 3).
-define(PF_ROUTE, 17).
%% Constants and structs are mostly defined in `net/route.h`.
%% /Library/Developer/CommandLineTools/SDKs/MacOSX12.0.sdk/usr/include/net/route.h
-define(RTM_VERSION, 5).
%% PF_ROUTE messages types
-define(RTM_ADD, 1).
-define(RTM_DELETE, 2).
-define(RTM_CHANGE, 3).
-define(RTM_GET, 4).
-define(RTM_REDIRECT, 6).
-define(RTM_MISS, 7).
-define(RTM_RESOLVE, 16#b).
-define(RTM_NEWADDR, 16#c).
-define(RTM_DELADDR, 16#d).
-define(RTM_IFINFO, 16#e).
-define(RTM_NEWMADDR, 16#f).
-define(RTM_DELMADDR, 16#10).
-define(RTM_IFINFO2, 16#12).
-define(RTM_NEWMADDR2, 16#13).
-define(RTM_GET2, 16#14).
-define(RTM, #{
?RTM_ADD => add,
?RTM_DELETE => delete,
?RTM_CHANGE => change,
?RTM_GET => get,
?RTM_REDIRECT => redirect,
?RTM_MISS => miss,
?RTM_RESOLVE => resolve,
?RTM_NEWADDR => newaddr,
?RTM_DELADDR => deladdr,
?RTM_IFINFO => ifinfo,
?RTM_NEWMADDR => newmaddr,
?RTM_DELMADDR => delmaddr,
?RTM_IFINFO2 => ifinfo2,
?RTM_NEWMADDR2 => newmaddr2,
?RTM_GET2 => get2
}).
%% Bitmask values for flags
-define(RTF_UP, 1).
-define(RTF_GATEWAY, 2).
-define(RTF_HOST, 4).
-define(RTF_REJECT, 8).
-define(RTF_DYNAMIC, 16#10).
-define(RTF_MODIFIED, 16#20).
-define(RTF_DONE, 16#40).
-define(RTF_DELCLONE, 16#80).
-define(RTF_CLONING, 16#100).
-define(RTF_XRESOLVE, 16#200).
-define(RTF_LLDATA, 16#400).
-define(RTF_STATIC, 16#800).
-define(RTF_BLACKHOLE, 16#1000).
-define(RTF_NOIFREF, 16#2000).
-define(RTF_PROTO2, 16#4000).
-define(RTF_PROTO1, 16#8000).
-define(RTF_PRCLONING, 16#10000).
-define(RTF_WASCLONED, 16#20000).
-define(RTF_PROTO3, 16#40000).
-define(RTF_PINNED, 16#100000).
-define(RTF_LOCAL, 16#200000).
-define(RTF_BROADCAST, 16#400000).
-define(RTF_MULTICAST, 16#800000).
-define(RTF_IFSCOPE, 16#1000000).
-define(RTF_CONDEMNED, 16#2000000).
-define(RTF_IFREF, 16#4000000).
-define(RTF_PROXY, 16#8000000).
-define(RTF_ROUTER, 16#10000000).
-define(RTF_DEAD, 16#20000000).
-define(RTF_GLOBAL, 16#40000000).
-define(RTF, [{?RTF_UP, up}, {?RTF_GATEWAY, gateway}, {?RTF_HOST, host}, {?RTF_REJECT, reject},
{?RTF_DYNAMIC, dynamic}, {?RTF_MODIFIED, modified}, {?RTF_DONE, done}, {?RTF_DELCLONE, delclone},
{?RTF_CLONING, cloning}, {?RTF_XRESOLVE, xresolve}, {?RTF_LLDATA, lldata}, {?RTF_STATIC, static},
{?RTF_BLACKHOLE, blackhole}, {?RTF_NOIFREF, noifref}, {?RTF_PROTO2, proto2}, {?RTF_PROTO1, proto1},
{?RTF_PRCLONING, prcloning}, {?RTF_WASCLONED, wascloned}, {?RTF_PROTO3, proto3}, {?RTF_PINNED, pinned},
{?RTF_LOCAL, local}, {?RTF_BROADCAST, broadcast}, {?RTF_MULTICAST, multicast}, {?RTF_IFSCOPE, ifscope},
{?RTF_CONDEMNED, condemned}, {?RTF_IFREF, ifref}, {?RTF_PROXY, proxy}, {?RTF_ROUTER, router},
{?RTF_DEAD, dead}, {?RTF_GLOBAL, global}]).
%% Bitmask values, rtm_inits and rtm_locks
-define(RTV_MTU, 1).
-define(RTV_HOPCOUNT, 2).
-define(RTV_EXPIRE, 4).
-define(RTV_RPIPE, 8).
-define(RTV_SPIPE, 16#10).
-define(RTV_SSTHRESH, 16#20).
-define(RTV_RTT, 16#40).
-define(RTV_RTTVAR, 16#80).
-define(RTV, [{?RTV_MTU, mtu}, {?RTV_HOPCOUNT, hopcount}, {?RTV_EXPIRE, expire}, {?RTV_RPIPE, recvpipe}, {?RTV_SPIPE, sendpipe},
{?RTV_SSTHRESH, ssthresh}, {?RTV_RTT, rtt}, {?RTV_RTTVAR, rttvar}]).
%% Bitmask values for rtm_addrs
-define(RTA_DST, 1). % destination sockaddr present
-define(RTA_GATEWAY, 2). % gateway sockaddr present
-define(RTA_NETMASK, 4). % netmask sockaddr present
-define(RTA_GENMASK, 8). % cloning mask sockaddr present
-define(RTA_IFP, 16#10). % interface name sockaddr present
-define(RTA_IFA, 16#20). % interface addr sockaddr present
-define(RTA_AUTHOR, 16#40). % sockaddr for addr of redirect
-define(RTA_BRD, 16#80). % for NEWADDR, broadcast or p-p dest addr
-define(RTA, [{?RTA_DST, destination}, {?RTA_GATEWAY, gateway}, {?RTA_NETMASK, netmask},
{?RTA_GENMASK, genmask}, {?RTA_IFP, ifp}, {?RTA_IFA, ifa},
{?RTA_AUTHOR, author}, {?RTA_BRD, brd}]).
-record(macos_rt, {type, % Message type, atom
flags, % Route flags
addrs, % Addresses list
pid, % Originating pid
seq, % user data
errno, % error number
refcount, % reference count (msghdr2)
parent_flags, % flags of the parent route (msghdr2)
use, % documented as: "from rentry"
% Metrics
metrics_init, % metrics that are initializing
metrics_lock, % metrics that are locked
mtu, % mtu
hopcount, % max hops expected
expire, % lifetime for route
recvpipe, % inbound delay-bandwith product
sendpipe, % outbound delay-bandwith product
ssthresh, % outbound gateway buffer limit
rtt, % estimated round trip time
rttvar, % estimated rtt variance
pksent, % packets sent using this route
state, % route state
filler, % "will be used for TCP's peer-MSS cache"
% Addresses
destination, % Destination
gateway, % Gateway
netmask, % netmask
clonemask, % (C: genmask) cloning mask
ifp, % interface name
ifp_index, % (C: index) Scope for associated ifp, if present
ifa, % interface address
author, % author of redirect
brd % (only for type=newaddr) broadcast or p-p destination address
}).
-record(macos_link, {index, % system index for interface
type, % interface type
name, % interface name
address, % link level address
selector % link layer selector,
}).
%% net/if.h
-define(IFF_UP, 16#1).
-define(IFF_BROADCAST, 16#2).
-define(IFF_DEBUG, 16#4).
-define(IFF_LOOPBACK, 16#8).
-define(IFF_POINTOPOINT, 16#10).
-define(IFF_NOTRAILERS, 16#20).
-define(IFF_RUNNING, 16#40).
-define(IFF_NOARP, 16#80).
-define(IFF_PROMISC, 16#100).
-define(IFF_ALLMULTI, 16#200).
-define(IFF_OACTIVE, 16#400).
-define(IFF_SIMPLEX, 16#800).
-define(IFF_LINK0, 16#1000).
-define(IFF_LINK1, 16#2000).
-define(IFF_LINK2, 16#4000).
-define(IFF_MULTICAST, 16#8000).
-define(IFF, [{?IFF_UP, up}, {?IFF_BROADCAST, broadcast}, {?IFF_DEBUG, debug}, {?IFF_LOOPBACK, loopback}, {?IFF_POINTOPOINT, pointopoint},
{?IFF_NOTRAILERS, notrailers}, {?IFF_RUNNING, running}, {?IFF_NOARP, noarp}, {?IFF_PROMISC, promisc}, {?IFF_ALLMULTI, allmulti},
{?IFF_OACTIVE, oactive}, {?IFF_SIMPLEX, simplex}, {?IFF_LINK0, link0}, {?IFF_LINK1, link1}, {?IFF_LINK2, link2}, {?IFF_MULTICAST, multicast}]).
-record(macos_if, {type, flags, addrs, index, typelen, physical, addrlen, hdrlen, recvquota, xmitquota, mtu, metric, baudrate,
ipackets, ierrors, opackets, oerrors, ibytes, obytes, imcasts, omcasts, iqdrops, noproto, recvtiming, xmittiming}).
-record(macos_ifa, {type, flags, addrs, index, metric, netmask, ifp, ifa}).
-record(macos_ifma, {type, flags, addrs, index, refcount, netmask, ifp, ifa}).
|