1 //
2 // Copyright (C) 2012 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 #include "shill/net/rtnl_message.h"
18
19 #include <sys/socket.h>
20 #include <linux/if.h> // NOLINT(build/include_alpha) - needs sockaddr.
21 #include <linux/netlink.h>
22 #include <linux/rtnetlink.h>
23
24 #include <string>
25
26 #include <gtest/gtest.h>
27
28 #include "shill/net/byte_string.h"
29 #include "shill/net/ip_address.h"
30
31 using std::string;
32 using testing::Test;
33
34 namespace shill {
35
36 namespace {
37
38 // These test strings were generated by cutting up the output of the
39 // "rtmon" utility into individual strings. This tool outputs the raw
40 // RTNL packet contents sent by the kernel. The comments above each
41 // of these strings is the markup that the "ip monitor" command
42 // outputs for each of these RTNL packets.
43
44
45 // 2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP
46 // link/ether c0:f8:da:05:03:0b brd ff:ff:ff:ff:ff:ff
47
48 const int kNewLinkMessageWlan0InterfaceIndex = 2;
49 const unsigned int kNewLinkMessageWlan0InterfaceFlags =
50 IFF_BROADCAST | IFF_MULTICAST | IFF_UP | IFF_LOWER_UP | IFF_RUNNING;
51 const unsigned int kNewLinkMessageWlan0InterfaceFlagsChange = 0;
52 const uint32_t kNewLinkMessageWlan0MTU = 1500;
53 const char kNewLinkMessageWlan0MACAddress[] = "\xc0\xf8\xda\x05\x03\x0b";
54 const char kNewLinkMessageWlan0InterfaceName[] = "wlan0";
55 const char kNewLinkMessageWlan0Qdisc[] = "mq";
56 const int kNewLinkMessageWlan0OperState = IF_OPER_UP;
57
58 const unsigned char kNewLinkMessageWlan0[] = {
59 0xe0, 0x03, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00,
60 0x53, 0x18, 0x1f, 0x4e, 0xac, 0x77, 0x00, 0x00,
61 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,
62 0x43, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
63 0x0a, 0x00, 0x03, 0x00, 0x77, 0x6c, 0x61, 0x6e,
64 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00,
65 0xe8, 0x03, 0x00, 0x00, 0x05, 0x00, 0x10, 0x00,
66 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x11, 0x00,
67 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
68 0xdc, 0x05, 0x00, 0x00, 0x07, 0x00, 0x06, 0x00,
69 0x6d, 0x71, 0x00, 0x00, 0x20, 0x00, 0x0e, 0x00,
70 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x01, 0x00,
74 0xc0, 0xf8, 0xda, 0x05, 0x03, 0x0b, 0x00, 0x00,
75 0x0a, 0x00, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff,
76 0xff, 0xff, 0x00, 0x00, 0x60, 0x00, 0x07, 0x00,
77 0xa6, 0x65, 0x0f, 0x00, 0xa6, 0x0b, 0x00, 0x00,
78 0xd2, 0x29, 0x61, 0x06, 0xd7, 0x25, 0x07, 0x00,
79 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
80 0x84, 0x53, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
81 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
82 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
83 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
84 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88 0x00, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x17, 0x00,
89 0xa6, 0x65, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
90 0xa6, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 0xd2, 0x29, 0x61, 0x06, 0x00, 0x00, 0x00, 0x00,
92 0xd7, 0x25, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
93 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
94 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95 0x84, 0x53, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
96 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
97 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112 0x08, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00,
113 0x30, 0x02, 0x1a, 0x00, 0x6c, 0x00, 0x02, 0x00,
114 0x68, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
117 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
118 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
127 0xc0, 0x01, 0x0a, 0x00, 0x08, 0x00, 0x01, 0x00,
128 0x10, 0x00, 0x00, 0x80, 0x14, 0x00, 0x05, 0x00,
129 0xff, 0xff, 0x00, 0x00, 0x22, 0x05, 0x00, 0x00,
130 0x4f, 0x53, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00,
131 0x78, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
132 0x40, 0x00, 0x00, 0x00, 0xdc, 0x05, 0x00, 0x00,
133 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
134 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
135 0x03, 0x00, 0x00, 0x00, 0xa0, 0x0f, 0x00, 0x00,
136 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
137 0x80, 0x3a, 0x09, 0x00, 0x80, 0x51, 0x01, 0x00,
138 0x05, 0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00,
139 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
145 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
146 0xfc, 0x00, 0x03, 0x00, 0x1f, 0x00, 0x00, 0x00,
147 0x00, 0x00, 0x00, 0x00, 0x15, 0xe6, 0x04, 0x00,
148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
157 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
167 0x00, 0x00, 0x00, 0x00, 0x15, 0xe6, 0x04, 0x00,
168 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
171 0x00, 0x00, 0x00, 0x00, 0x9b, 0x95, 0xb9, 0x01,
172 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00,
173 0x00, 0x00, 0x00, 0x00, 0x9b, 0x95, 0xb9, 0x01,
174 0x00, 0x00, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00,
175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
177 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x06, 0x00,
178 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
179 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
181 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183 };
184
185
186 // Deleted 8: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
187 // link/ether 68:7f:74:ba:ef:c7 brd ff:ff:ff:ff:ff:ff
188
189 const int kDelLinkMessageEth0InterfaceIndex = 8;
190 const unsigned int kDelLinkMessageEth0InterfaceFlags =
191 IFF_BROADCAST | IFF_MULTICAST;
192 const unsigned int kDelLinkMessageEth0InterfaceFlagsChange = 0xffffffff;
193 const uint32_t kDelLinkMessageEth0MTU = 1500;
194 const char kDelLinkMessageEth0MACAddress[] = "\x68\x7f\x74\xba\xef\xc7";
195 const char kDelLinkMessageEth0InterfacName[] = "eth0";
196 const char kDelLinkMessageEth0Qdisc[] = "noop";
197 const int kDelLinkMessageEth0OperState = IF_OPER_DOWN;
198
199 const unsigned char kDelLinkMessageEth0[] = {
200 0xb8, 0x01, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
202 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00,
203 0x02, 0x10, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
204 0x09, 0x00, 0x03, 0x00, 0x65, 0x74, 0x68, 0x30,
205 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0d, 0x00,
206 0xe8, 0x03, 0x00, 0x00, 0x05, 0x00, 0x10, 0x00,
207 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x11, 0x00,
208 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,
209 0xdc, 0x05, 0x00, 0x00, 0x09, 0x00, 0x06, 0x00,
210 0x6e, 0x6f, 0x6f, 0x70, 0x00, 0x00, 0x00, 0x00,
211 0x20, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00,
212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
215 0x0a, 0x00, 0x01, 0x00, 0x68, 0x7f, 0x74, 0xba,
216 0xef, 0xc7, 0x00, 0x00, 0x0a, 0x00, 0x02, 0x00,
217 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
218 0x60, 0x00, 0x07, 0x00, 0x09, 0x00, 0x00, 0x00,
219 0x0e, 0x00, 0x00, 0x00, 0xfa, 0x05, 0x00, 0x00,
220 0x34, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0xbc, 0x00, 0x17, 0x00, 0x09, 0x00, 0x00, 0x00,
231 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
232 0x00, 0x00, 0x00, 0x00, 0xfa, 0x05, 0x00, 0x00,
233 0x00, 0x00, 0x00, 0x00, 0x34, 0x06, 0x00, 0x00,
234 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x15, 0x00,
254 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x1a, 0x00,
255 };
256
257 // 8: if8 inet 192.168.10.100/24 brd 192.168.10.255 scope global eth0
258
259 const int kNewAddrIPV4InterfaceIndex = 8;
260 const char kNewAddrIPV4Address[] = "192.168.10.100";
261 const int kNewAddrIPV4AddressPrefix = 24;
262 const unsigned char kNewAddrIPV4Scope = RT_SCOPE_UNIVERSE;
263
264 const unsigned char kNewAddrIPV4[] = {
265 0x3c, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 0x02, 0x18, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,
268 0x08, 0x00, 0x01, 0x00, 0xc0, 0xa8, 0x0a, 0x64,
269 0x08, 0x00, 0x02, 0x00, 0xc0, 0xa8, 0x0a, 0x64,
270 0x08, 0x00, 0x04, 0x00, 0xc0, 0xa8, 0x0a, 0xff,
271 0x09, 0x00, 0x03, 0x00, 0x65, 0x74, 0x68, 0x30,
272 0x00, 0x00, 0x00, 0x00,
273 };
274
275 // Deleted 15: if15 inet6 fe80::6a7f:74ff:feba:efc7/64 scope link
276 // valid_lft forever preferred_lft forever
277
278 const int kDelAddrIPV6InterfaceIndex = 15;
279 const char kDelAddrIPV6Address[] = "fe80::6a7f:74ff:feba:efc7";
280 const int kDelAddrIPV6AddressPrefix = 64;
281 const unsigned char kDelAddrIPV6Scope = RT_SCOPE_LINK;
282
283 const unsigned char kDelAddrIPV6[] = {
284 0x40, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00,
285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286 0x0a, 0x40, 0x80, 0xfd, 0x0f, 0x00, 0x00, 0x00,
287 0x14, 0x00, 0x01, 0x00, 0xfe, 0x80, 0x00, 0x00,
288 0x00, 0x00, 0x00, 0x00, 0x6a, 0x7f, 0x74, 0xff,
289 0xfe, 0xba, 0xef, 0xc7, 0x14, 0x00, 0x06, 0x00,
290 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
291 0xbf, 0xdb, 0x02, 0x00, 0xbf, 0xdb, 0x02, 0x00,
292 };
293
294 // Deleted ff02::1:ffa0:688 via ff02::1:ffa0:688 dev if2 metric 0
295
296 const int kDelRouteIPV6InterfaceIndex = 2;
297 const char kDelRouteIPV6Address[] = "ff02::1:ffa0:688";
298 const int kDelRouteIPV6Prefix = 128;
299 const int kDelRouteIPV6Metric = 0;
300
301 const unsigned char kDelRouteIPV6[] = {
302 0x80, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
304 0x0a, 0x80, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x01,
305 0x00, 0x02, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00,
306 0xfe, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00,
307 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308 0x00, 0x00, 0x00, 0x01, 0xff, 0xa0, 0x06, 0x88,
309 0x14, 0x00, 0x05, 0x00, 0xff, 0x02, 0x00, 0x00,
310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
311 0xff, 0xa0, 0x06, 0x88, 0x08, 0x00, 0x04, 0x00,
312 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
313 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x0c, 0x00,
314 0x00, 0x00, 0x00, 0x00, 0x5f, 0x0c, 0x00, 0x00,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
316 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
318 };
319
320 // default via 192.168.17.254 dev if12 metric 9
321
322 const int kAddRouteIPV4InterfaceIndex = 12;
323 const char kAddRouteIPV4Address[] = "192.168.17.254";
324 const int kAddRouteIPV4Metric = 9;
325
326 const unsigned char kAddRouteIPV4[] = {
327 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
329 0x02, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x01,
330 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00,
331 0xfe, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
332 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x05, 0x00,
333 0xc0, 0xa8, 0x11, 0xfe, 0x08, 0x00, 0x04, 0x00,
334 0x0c, 0x00, 0x00, 0x00,
335 };
336
337
338 // This is the same as kAddRouteIPV4 above, except manually corrupted
339 // the second to last parameter
340 const unsigned char kAddRouteBusted[] = {
341 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
343 0x02, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x01,
344 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0f, 0x00,
345 0xfe, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00,
346 0x09, 0x00, 0x00, 0x00, 0x28, 0x00, 0x05, 0x00,
347 0xc0, 0xa8, 0x11, 0xfe, 0x08, 0x00, 0x04, 0x00,
348 0x0c, 0x00, 0x00, 0x00,
349 };
350
351 // 192.168.10.1 dev if8 lladdr 00:14:d1:cd:d5:2c REACHABLE
352 const unsigned char kAddNeighborMessage[] = {
353 0x4c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00,
354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
355 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
356 0x02, 0x00, 0x00, 0x01, 0x08, 0x00, 0x01, 0x00,
357 0xc0, 0xa8, 0x0a, 0x01, 0x0a, 0x00, 0x02, 0x00,
358 0x00, 0x14, 0xd1, 0xcd, 0xd5, 0x2c, 0x00, 0x00,
359 0x08, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00,
360 0x14, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
362 0x04, 0x00, 0x00, 0x00,
363 };
364
365 // RDNSS notification
366 // Lifetime: infinity (0xffffffff)
367 // Server addresses: 2001:db8:100:f101::1, 2001:db8:100:f101::2
368 const unsigned char kNdRdnssMessage[] = {
369 0x5c, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00,
370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
371 0x0a, 0x00, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00,
372 0x86, 0x00, 0x03, 0x00, 0x14, 0x00, 0x01, 0x00,
373 0x19, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
374 0x20, 0x01, 0x0d, 0xb8, 0x01, 0x00, 0xf1, 0x01,
375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
376 0x20, 0x01, 0x0d, 0xb8, 0x01, 0x00, 0xf1, 0x01,
377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
378 0x14, 0x00, 0x01, 0x00, 0xfe, 0x80, 0x00, 0x00,
379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
380 0x50, 0xf8, 0x86, 0xff,
381 };
382
383 } // namespace
384
385 class RTNLMessageTest : public Test {
386 protected:
TestParseLink(const ByteString & packet,RTNLMessage::Mode mode,int interface_index,unsigned int flags,unsigned int change,ByteString address,ByteString name,uint32_t mtu,ByteString qdisc,int oper_state)387 void TestParseLink(const ByteString& packet,
388 RTNLMessage::Mode mode,
389 int interface_index,
390 unsigned int flags,
391 unsigned int change,
392 ByteString address,
393 ByteString name,
394 uint32_t mtu,
395 ByteString qdisc,
396 int oper_state) {
397 RTNLMessage msg;
398 EXPECT_TRUE(msg.Decode(packet));
399
400 EXPECT_EQ(RTNLMessage::kTypeLink, msg.type());
401 EXPECT_EQ(mode, msg.mode());
402 EXPECT_EQ(interface_index, msg.interface_index());
403
404 RTNLMessage::LinkStatus status = msg.link_status();
405 EXPECT_EQ(flags, status.flags);
406 EXPECT_EQ(change, status.change);
407
408 EXPECT_TRUE(msg.HasAttribute(IFLA_ADDRESS));
409 EXPECT_EQ(address.GetLength(), msg.GetAttribute(IFLA_ADDRESS).GetLength());
410 EXPECT_TRUE(msg.GetAttribute(IFLA_ADDRESS).Equals(address));
411
412 EXPECT_TRUE(msg.HasAttribute(IFLA_IFNAME));
413 EXPECT_EQ(name.GetLength(), msg.GetAttribute(IFLA_IFNAME).GetLength());
414 EXPECT_TRUE(msg.GetAttribute(IFLA_IFNAME).Equals(name));
415
416 EXPECT_TRUE(msg.HasAttribute(IFLA_MTU));
417 uint32_t mtu_val;
418 EXPECT_TRUE(msg.GetAttribute(IFLA_MTU).ConvertToCPUUInt32(&mtu_val));
419 EXPECT_EQ(mtu, mtu_val);
420
421 EXPECT_TRUE(msg.HasAttribute(IFLA_QDISC));
422 EXPECT_EQ(qdisc.GetLength(), msg.GetAttribute(IFLA_QDISC).GetLength());
423 EXPECT_TRUE(msg.GetAttribute(IFLA_QDISC).Equals(qdisc));
424
425 EXPECT_TRUE(msg.HasAttribute(IFLA_OPERSTATE));
426 EXPECT_EQ(oper_state, msg.GetAttribute(IFLA_OPERSTATE).GetConstData()[0]);
427 }
428
TestParseAddress(const ByteString & packet,RTNLMessage::Mode mode,int interface_index,const IPAddress & address,unsigned char scope)429 void TestParseAddress(const ByteString& packet,
430 RTNLMessage::Mode mode,
431 int interface_index,
432 const IPAddress& address,
433 unsigned char scope) {
434 RTNLMessage msg;
435
436 EXPECT_TRUE(msg.Decode(packet));
437 EXPECT_EQ(RTNLMessage::kTypeAddress, msg.type());
438 EXPECT_EQ(mode, msg.mode());
439 EXPECT_EQ(interface_index, msg.interface_index());
440 EXPECT_EQ(address.family(), msg.family());
441
442 RTNLMessage::AddressStatus status = msg.address_status();
443 EXPECT_EQ(scope, status.scope);
444
445 EXPECT_TRUE(msg.HasAttribute(IFA_ADDRESS));
446 EXPECT_EQ(address.GetLength(), msg.GetAttribute(IFA_ADDRESS).GetLength());
447 EXPECT_TRUE(
448 IPAddress(address.family(),
449 msg.GetAttribute(IFA_ADDRESS),
450 status.prefix_len).Equals(address));
451 }
452
TestParseRoute(const ByteString & packet,RTNLMessage::Mode,IPAddress::Family family,int interface_index,const IPAddress & dst,const IPAddress & src,const IPAddress & gateway,unsigned char table,int protocol,unsigned char scope,unsigned char type,int metric)453 void TestParseRoute(const ByteString& packet,
454 RTNLMessage::Mode /*mode*/,
455 IPAddress::Family family,
456 int interface_index,
457 const IPAddress& dst,
458 const IPAddress& src,
459 const IPAddress& gateway,
460 unsigned char table,
461 int protocol,
462 unsigned char scope,
463 unsigned char type,
464 int metric) {
465 RTNLMessage msg;
466
467 EXPECT_TRUE(msg.Decode(packet));
468 EXPECT_EQ(RTNLMessage::kTypeRoute, msg.type());
469 EXPECT_EQ(0, msg.interface_index());
470 EXPECT_EQ(family, msg.family());
471
472 RTNLMessage::RouteStatus status = msg.route_status();
473 EXPECT_EQ(table, status.table);
474 EXPECT_EQ(protocol, status.protocol);
475 EXPECT_EQ(scope, status.scope);
476 EXPECT_EQ(type, status.type);
477
478 if (!dst.IsDefault()) {
479 EXPECT_TRUE(msg.HasAttribute(RTA_DST));
480 EXPECT_TRUE(IPAddress(family,
481 msg.GetAttribute(RTA_DST),
482 status.dst_prefix).Equals(dst));
483 }
484
485 if (!src.IsDefault()) {
486 EXPECT_TRUE(msg.HasAttribute(RTA_SRC));
487 EXPECT_TRUE(IPAddress(family,
488 msg.GetAttribute(RTA_SRC),
489 status.src_prefix).Equals(src));
490 }
491
492 if (!gateway.IsDefault()) {
493 EXPECT_TRUE(msg.HasAttribute(RTA_GATEWAY));
494 EXPECT_TRUE(IPAddress(family,
495 msg.GetAttribute(RTA_GATEWAY)).Equals(gateway));
496 }
497
498 if (interface_index >= 0) {
499 EXPECT_TRUE(msg.HasAttribute(RTA_OIF));
500 uint32_t int_val;
501 EXPECT_TRUE(msg.GetAttribute(RTA_OIF).ConvertToCPUUInt32(&int_val));
502 EXPECT_EQ(interface_index, int_val);
503 } else {
504 EXPECT_FALSE(msg.HasAttribute(RTA_OIF));
505 }
506 if (metric >= 0) {
507 EXPECT_TRUE(msg.HasAttribute(RTA_PRIORITY));
508 uint32_t metric_val;
509 EXPECT_TRUE(
510 msg.GetAttribute(RTA_PRIORITY).ConvertToCPUUInt32(&metric_val));
511 EXPECT_EQ(metric, metric_val);
512 } else {
513 EXPECT_FALSE(msg.HasAttribute(RTA_PRIORITY));
514 }
515 }
516
TestParseRdnss(const ByteString & packet,RTNLMessage::Mode mode,int interface_index,uint32_t lifetime,const std::string & dns_server_addresses)517 void TestParseRdnss(const ByteString& packet,
518 RTNLMessage::Mode mode,
519 int interface_index,
520 uint32_t lifetime,
521 const std::string& dns_server_addresses) {
522 RTNLMessage msg;
523
524 EXPECT_TRUE(msg.Decode(packet));
525 EXPECT_EQ(RTNLMessage::kTypeRdnss, msg.type());
526 EXPECT_EQ(mode, msg.mode());
527 EXPECT_EQ(interface_index, msg.interface_index());
528
529 RTNLMessage::RdnssOption rdnss = msg.rdnss_option();
530
531 // Format addresses string for verification.
532 std::string addresses;
533 bool first = true;
534 for (auto& ip : rdnss.addresses) {
535 if (!first) {
536 addresses += ", ";
537 } else {
538 first = false;
539 }
540 addresses += ip.ToString();
541 }
542
543 // Verify life time and addresses.
544 EXPECT_EQ(lifetime, rdnss.lifetime);
545 EXPECT_EQ(dns_server_addresses, addresses);
546 }
547
TestParseNeighbor(const ByteString & packet,RTNLMessage::Mode mode,IPAddress::Family family,int interface_index,uint16_t state,uint8_t flags,uint8_t type)548 void TestParseNeighbor(const ByteString& packet,
549 RTNLMessage::Mode mode,
550 IPAddress::Family family,
551 int interface_index,
552 uint16_t state,
553 uint8_t flags,
554 uint8_t type) {
555 RTNLMessage msg;
556
557 EXPECT_TRUE(msg.Decode(packet));
558 EXPECT_EQ(RTNLMessage::kTypeNeighbor, msg.type());
559 EXPECT_EQ(mode, msg.mode());
560 EXPECT_EQ(family, msg.family());
561 EXPECT_EQ(interface_index, msg.interface_index());
562
563 RTNLMessage::NeighborStatus neighbor = msg.neighbor_status();
564
565 EXPECT_EQ(neighbor.state, state);
566 EXPECT_EQ(neighbor.flags, flags);
567 EXPECT_EQ(neighbor.type, type);
568 }
569 };
570
TEST_F(RTNLMessageTest,NewLinkWlan0)571 TEST_F(RTNLMessageTest, NewLinkWlan0) {
572 TestParseLink(ByteString(kNewLinkMessageWlan0, sizeof(kNewLinkMessageWlan0)),
573 RTNLMessage::kModeAdd,
574 kNewLinkMessageWlan0InterfaceIndex,
575 kNewLinkMessageWlan0InterfaceFlags,
576 kNewLinkMessageWlan0InterfaceFlagsChange,
577 ByteString(string(kNewLinkMessageWlan0MACAddress), false),
578 ByteString(string(kNewLinkMessageWlan0InterfaceName), true),
579 kNewLinkMessageWlan0MTU,
580 ByteString(string(kNewLinkMessageWlan0Qdisc), true),
581 kNewLinkMessageWlan0OperState);
582 }
583
TEST_F(RTNLMessageTest,DelLinkEth0)584 TEST_F(RTNLMessageTest, DelLinkEth0) {
585 TestParseLink(ByteString(kDelLinkMessageEth0, sizeof(kDelLinkMessageEth0)),
586 RTNLMessage::kModeDelete,
587 kDelLinkMessageEth0InterfaceIndex,
588 kDelLinkMessageEth0InterfaceFlags,
589 kDelLinkMessageEth0InterfaceFlagsChange,
590 ByteString(string(kDelLinkMessageEth0MACAddress), false),
591 ByteString(string(kDelLinkMessageEth0InterfacName), true),
592 kDelLinkMessageEth0MTU,
593 ByteString(string(kDelLinkMessageEth0Qdisc), true),
594 kDelLinkMessageEth0OperState);
595 }
596
TEST_F(RTNLMessageTest,NewAddrIPv4)597 TEST_F(RTNLMessageTest, NewAddrIPv4) {
598 IPAddress addr(IPAddress::kFamilyIPv4);
599
600 EXPECT_TRUE(addr.SetAddressFromString(kNewAddrIPV4Address));
601 addr.set_prefix(kNewAddrIPV4AddressPrefix);
602 TestParseAddress(ByteString(kNewAddrIPV4, sizeof(kNewAddrIPV4)),
603 RTNLMessage::kModeAdd,
604 kNewAddrIPV4InterfaceIndex,
605 addr,
606 kNewAddrIPV4Scope);
607 }
608
TEST_F(RTNLMessageTest,DelAddrIPv6)609 TEST_F(RTNLMessageTest, DelAddrIPv6) {
610 IPAddress addr(IPAddress::kFamilyIPv6);
611
612 EXPECT_TRUE(addr.SetAddressFromString(kDelAddrIPV6Address));
613 addr.set_prefix(kDelAddrIPV6AddressPrefix);
614 TestParseAddress(ByteString(kDelAddrIPV6, sizeof(kDelAddrIPV6)),
615 RTNLMessage::kModeDelete,
616 kDelAddrIPV6InterfaceIndex,
617 addr,
618 kDelAddrIPV6Scope);
619 }
620
TEST_F(RTNLMessageTest,DelRouteIPv6)621 TEST_F(RTNLMessageTest, DelRouteIPv6) {
622 IPAddress dst(IPAddress::kFamilyIPv6);
623 IPAddress src(IPAddress::kFamilyIPv6);
624 IPAddress gateway(IPAddress::kFamilyIPv6);
625
626 EXPECT_TRUE(dst.SetAddressFromString(kDelRouteIPV6Address));
627 dst.set_prefix(kDelRouteIPV6Prefix);
628 src.SetAddressToDefault();
629 EXPECT_TRUE(gateway.SetAddressFromString(kDelRouteIPV6Address));
630
631 TestParseRoute(ByteString(kDelRouteIPV6, sizeof(kDelRouteIPV6)),
632 RTNLMessage::kModeDelete,
633 IPAddress::kFamilyIPv6,
634 kDelRouteIPV6InterfaceIndex,
635 dst,
636 src,
637 gateway,
638 RT_TABLE_MAIN,
639 RTPROT_UNSPEC,
640 RT_SCOPE_UNIVERSE,
641 RTN_UNICAST,
642 kDelRouteIPV6Metric);
643 }
644
TEST_F(RTNLMessageTest,AddRouteIPv4)645 TEST_F(RTNLMessageTest, AddRouteIPv4) {
646 IPAddress dst(IPAddress::kFamilyIPv4);
647 IPAddress src(IPAddress::kFamilyIPv4);
648 IPAddress gateway(IPAddress::kFamilyIPv4);
649
650 dst.SetAddressToDefault();
651 src.SetAddressToDefault();
652 EXPECT_TRUE(gateway.SetAddressFromString(kAddRouteIPV4Address));
653
654 TestParseRoute(ByteString(kAddRouteIPV4, sizeof(kAddRouteIPV4)),
655 RTNLMessage::kModeAdd,
656 IPAddress::kFamilyIPv4,
657 kAddRouteIPV4InterfaceIndex,
658 dst,
659 src,
660 gateway,
661 RT_TABLE_MAIN,
662 RTPROT_BOOT,
663 RT_SCOPE_UNIVERSE,
664 RTN_UNICAST,
665 kAddRouteIPV4Metric);
666 }
667
TEST_F(RTNLMessageTest,NewRdnssOption)668 TEST_F(RTNLMessageTest, NewRdnssOption) {
669 int interface_index = 1;
670 uint32_t lifetime = 0xffffffff;
671 std::string dns_server_addresses =
672 "2001:db8:100:f101::1, 2001:db8:100:f101::2";
673
674 TestParseRdnss(ByteString(kNdRdnssMessage, sizeof(kNdRdnssMessage)),
675 RTNLMessage::kModeAdd,
676 interface_index,
677 lifetime,
678 dns_server_addresses);
679 }
680
TEST_F(RTNLMessageTest,AddRouteBusted)681 TEST_F(RTNLMessageTest, AddRouteBusted) {
682 // RTNLMessage should list parse errors as kMessageUnknown
683 RTNLMessage msg;
684 EXPECT_FALSE(msg.Decode(
685 ByteString(kAddRouteBusted, sizeof(kAddRouteBusted))));
686 }
687
TEST_F(RTNLMessageTest,AddNeighbor)688 TEST_F(RTNLMessageTest, AddNeighbor) {
689 TestParseNeighbor(
690 ByteString(kAddNeighborMessage, sizeof(kAddNeighborMessage)),
691 RTNLMessage::kModeAdd,
692 IPAddress::kFamilyIPv4,
693 8,
694 NUD_REACHABLE,
695 0,
696 NDA_DST);
697 }
698
TEST_F(RTNLMessageTest,EncodeDelNeighbor)699 TEST_F(RTNLMessageTest, EncodeDelNeighbor) {
700 RTNLMessage msg(RTNLMessage::kTypeNeighbor,
701 RTNLMessage::kModeDelete,
702 0, 1, 2, 0,
703 IPAddress::kFamilyIPv4);
704 msg.set_neighbor_status(RTNLMessage::NeighborStatus(
705 0, NTF_ROUTER, NDA_LLADDR));
706
707 TestParseNeighbor(msg.Encode(),
708 RTNLMessage::kModeDelete,
709 IPAddress::kFamilyIPv4,
710 0,
711 0,
712 NTF_ROUTER,
713 NDA_LLADDR);
714 }
715
TEST_F(RTNLMessageTest,EncodeRouteAdd)716 TEST_F(RTNLMessageTest, EncodeRouteAdd) {
717 RTNLMessage msg(RTNLMessage::kTypeRoute,
718 RTNLMessage::kModeAdd,
719 0, 1, 2, 0,
720 IPAddress::kFamilyIPv4);
721 IPAddress dst(IPAddress::kFamilyIPv4);
722 IPAddress src(IPAddress::kFamilyIPv4);
723 IPAddress gateway(IPAddress::kFamilyIPv4);
724
725 dst.SetAddressToDefault();
726 src.SetAddressToDefault();
727 EXPECT_TRUE(gateway.SetAddressFromString("192.168.0.1"));
728
729 msg.set_route_status(RTNLMessage::RouteStatus(
730 0, 0, RT_TABLE_MAIN, RTPROT_BOOT, RT_SCOPE_UNIVERSE, RTN_UNICAST, 0));
731 msg.SetAttribute(RTA_DST, dst.address());
732 msg.SetAttribute(RTA_SRC, src.address());
733 msg.SetAttribute(RTA_GATEWAY, gateway.address());
734 msg.SetAttribute(RTA_OIF, ByteString::CreateFromCPUUInt32(12));
735 msg.SetAttribute(RTA_PRIORITY, ByteString::CreateFromCPUUInt32(13));
736
737 TestParseRoute(msg.Encode(),
738 RTNLMessage::kModeAdd,
739 IPAddress::kFamilyIPv4,
740 12,
741 dst,
742 src,
743 gateway,
744 RT_TABLE_MAIN,
745 RTPROT_BOOT,
746 RT_SCOPE_UNIVERSE,
747 RTN_UNICAST,
748 13);
749 }
750
TEST_F(RTNLMessageTest,EncodeLinkDel)751 TEST_F(RTNLMessageTest, EncodeLinkDel) {
752 const int kInterfaceIndex = 0x1234;
753 RTNLMessage pmsg(RTNLMessage::kTypeLink,
754 RTNLMessage::kModeDelete,
755 NLM_F_REQUEST,
756 0,
757 0,
758 kInterfaceIndex,
759 IPAddress::kFamilyUnknown);
760
761 RTNLMessage msg;
762 EXPECT_TRUE(msg.Decode(pmsg.Encode()));
763
764 EXPECT_EQ(RTNLMessage::kTypeLink, msg.type());
765 EXPECT_EQ(RTNLMessage::kModeDelete, msg.mode());
766 EXPECT_EQ(kInterfaceIndex, msg.interface_index());
767
768 RTNLMessage::LinkStatus status = msg.link_status();
769 EXPECT_EQ(0, status.flags);
770 EXPECT_EQ(0, status.change);
771
772 EXPECT_FALSE(msg.HasAttribute(IFLA_ADDRESS));
773 EXPECT_FALSE(msg.HasAttribute(IFLA_IFNAME));
774 EXPECT_FALSE(msg.HasAttribute(IFLA_MTU));
775 EXPECT_FALSE(msg.HasAttribute(IFLA_QDISC));
776 EXPECT_FALSE(msg.HasAttribute(IFLA_OPERSTATE));
777 }
778
779 } // namespace shill
780