blob: b709af1a02f1cbb40d4599ff1452f76027695546 [file] [log] [blame]
Hugo Benichief502882017-09-01 01:23:32 +00001/*
2 * Copyright (C) 2017 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
17package com.android.server.connectivity;
18
Lorenzo Colitti6998fa82019-01-08 10:04:25 +090019import static org.junit.Assert.assertEquals;
Hugo Benichief502882017-09-01 01:23:32 +000020import static org.junit.Assert.assertFalse;
Hugo Benichief502882017-09-01 01:23:32 +000021import static org.junit.Assert.assertTrue;
Hugo Benichief502882017-09-01 01:23:32 +000022import static org.mockito.Mockito.eq;
Lorenzo Colittidf595632019-01-08 14:43:37 +090023import static org.mockito.Mockito.inOrder;
Hugo Benichief502882017-09-01 01:23:32 +000024import static org.mockito.Mockito.times;
25import static org.mockito.Mockito.verify;
26import static org.mockito.Mockito.verifyNoMoreInteractions;
27import static org.mockito.Mockito.when;
28
29import android.net.ConnectivityManager;
Luke Huang65914772019-03-16 00:31:46 +080030import android.net.IDnsResolver;
Lorenzo Colitti9307ca22019-01-12 01:54:23 +090031import android.net.INetd;
Hugo Benichief502882017-09-01 01:23:32 +000032import android.net.InterfaceConfiguration;
Lorenzo Colitti6998fa82019-01-08 10:04:25 +090033import android.net.IpPrefix;
Hugo Benichief502882017-09-01 01:23:32 +000034import android.net.LinkAddress;
35import android.net.LinkProperties;
36import android.net.NetworkInfo;
soma, kawata88b8f632018-10-23 21:10:02 +090037import android.net.NetworkMisc;
Hugo Benichief502882017-09-01 01:23:32 +000038import android.os.Handler;
39import android.os.INetworkManagementService;
40import android.os.test.TestLooper;
Brett Chabot1ae2aa62019-03-04 14:14:56 -080041
42import androidx.test.filters.SmallTest;
43import androidx.test.runner.AndroidJUnit4;
Hugo Benichief502882017-09-01 01:23:32 +000044
45import com.android.server.ConnectivityService;
46
47import org.junit.Before;
48import org.junit.Test;
49import org.junit.runner.RunWith;
50import org.mockito.ArgumentCaptor;
Lorenzo Colittidf595632019-01-08 14:43:37 +090051import org.mockito.InOrder;
Hugo Benichief502882017-09-01 01:23:32 +000052import org.mockito.Mock;
53import org.mockito.MockitoAnnotations;
54
55@RunWith(AndroidJUnit4.class)
56@SmallTest
57public class Nat464XlatTest {
58
59 static final String BASE_IFACE = "test0";
60 static final String STACKED_IFACE = "v4-test0";
61 static final LinkAddress ADDR = new LinkAddress("192.0.2.5/29");
Lorenzo Colitti6998fa82019-01-08 10:04:25 +090062 static final String NAT64_PREFIX = "64:ff9b::/96";
Lorenzo Colittid593e292019-02-19 13:21:56 +090063 static final int NETID = 42;
Hugo Benichief502882017-09-01 01:23:32 +000064
65 @Mock ConnectivityService mConnectivity;
soma, kawata88b8f632018-10-23 21:10:02 +090066 @Mock NetworkMisc mMisc;
Luke Huang65914772019-03-16 00:31:46 +080067 @Mock IDnsResolver mDnsResolver;
Lorenzo Colitti9307ca22019-01-12 01:54:23 +090068 @Mock INetd mNetd;
Hugo Benichief502882017-09-01 01:23:32 +000069 @Mock INetworkManagementService mNms;
70 @Mock InterfaceConfiguration mConfig;
71 @Mock NetworkAgentInfo mNai;
72
73 TestLooper mLooper;
74 Handler mHandler;
75
76 Nat464Xlat makeNat464Xlat() {
Luke Huang65914772019-03-16 00:31:46 +080077 return new Nat464Xlat(mNai, mNetd, mDnsResolver, mNms) {
Lorenzo Colittid593e292019-02-19 13:21:56 +090078 @Override protected int getNetId() {
79 return NETID;
80 }
81 };
Hugo Benichief502882017-09-01 01:23:32 +000082 }
83
84 @Before
85 public void setUp() throws Exception {
86 mLooper = new TestLooper();
87 mHandler = new Handler(mLooper.getLooper());
88
89 MockitoAnnotations.initMocks(this);
90
91 mNai.linkProperties = new LinkProperties();
92 mNai.linkProperties.setInterfaceName(BASE_IFACE);
93 mNai.networkInfo = new NetworkInfo(null);
94 mNai.networkInfo.setType(ConnectivityManager.TYPE_WIFI);
95 when(mNai.connService()).thenReturn(mConnectivity);
soma, kawata88b8f632018-10-23 21:10:02 +090096 when(mNai.netMisc()).thenReturn(mMisc);
Hugo Benichief502882017-09-01 01:23:32 +000097 when(mNai.handler()).thenReturn(mHandler);
98
99 when(mNms.getInterfaceConfig(eq(STACKED_IFACE))).thenReturn(mConfig);
100 when(mConfig.getLinkAddress()).thenReturn(ADDR);
101 }
102
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900103 private void assertRequiresClat(boolean expected, NetworkAgentInfo nai) {
Lorenzo Colittid593e292019-02-19 13:21:56 +0900104 String msg = String.format("requiresClat expected %b for type=%d state=%s skip=%b "
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900105 + "nat64Prefix=%s addresses=%s", expected, nai.networkInfo.getType(),
106 nai.networkInfo.getDetailedState(),
107 mMisc.skip464xlat, nai.linkProperties.getNat64Prefix(),
108 nai.linkProperties.getLinkAddresses());
109 assertEquals(msg, expected, Nat464Xlat.requiresClat(nai));
110 }
111
Lorenzo Colittid593e292019-02-19 13:21:56 +0900112 private void assertShouldStartClat(boolean expected, NetworkAgentInfo nai) {
113 String msg = String.format("shouldStartClat expected %b for type=%d state=%s skip=%b "
114 + "nat64Prefix=%s addresses=%s", expected, nai.networkInfo.getType(),
115 nai.networkInfo.getDetailedState(),
116 mMisc.skip464xlat, nai.linkProperties.getNat64Prefix(),
117 nai.linkProperties.getLinkAddresses());
118 assertEquals(msg, expected, Nat464Xlat.shouldStartClat(nai));
119 }
120
Hugo Benichief502882017-09-01 01:23:32 +0000121 @Test
Erik Kline3c182162017-09-21 17:28:10 +0900122 public void testRequiresClat() throws Exception {
123 final int[] supportedTypes = {
124 ConnectivityManager.TYPE_MOBILE,
125 ConnectivityManager.TYPE_WIFI,
126 ConnectivityManager.TYPE_ETHERNET,
127 };
128
129 // NetworkInfo doesn't allow setting the State directly, but rather
130 // requires setting DetailedState in order set State as a side-effect.
131 final NetworkInfo.DetailedState[] supportedDetailedStates = {
132 NetworkInfo.DetailedState.CONNECTED,
133 NetworkInfo.DetailedState.SUSPENDED,
134 };
135
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900136 LinkProperties oldLp = new LinkProperties(mNai.linkProperties);
Erik Kline3c182162017-09-21 17:28:10 +0900137 for (int type : supportedTypes) {
138 mNai.networkInfo.setType(type);
139 for (NetworkInfo.DetailedState state : supportedDetailedStates) {
140 mNai.networkInfo.setDetailedState(state, "reason", "extraInfo");
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900141
142 mNai.linkProperties.setNat64Prefix(new IpPrefix("2001:db8:0:64::/96"));
143 assertRequiresClat(false, mNai);
Lorenzo Colittid593e292019-02-19 13:21:56 +0900144 assertShouldStartClat(false, mNai);
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900145
146 mNai.linkProperties.addLinkAddress(new LinkAddress("fc00::1/64"));
147 assertRequiresClat(false, mNai);
Lorenzo Colittid593e292019-02-19 13:21:56 +0900148 assertShouldStartClat(false, mNai);
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900149
150 mNai.linkProperties.addLinkAddress(new LinkAddress("2001:db8::1/64"));
151 assertRequiresClat(true, mNai);
Lorenzo Colittid593e292019-02-19 13:21:56 +0900152 assertShouldStartClat(true, mNai);
soma, kawata88b8f632018-10-23 21:10:02 +0900153
154 mMisc.skip464xlat = true;
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900155 assertRequiresClat(false, mNai);
Lorenzo Colittid593e292019-02-19 13:21:56 +0900156 assertShouldStartClat(false, mNai);
soma, kawata88b8f632018-10-23 21:10:02 +0900157
158 mMisc.skip464xlat = false;
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900159 assertRequiresClat(true, mNai);
Lorenzo Colittid593e292019-02-19 13:21:56 +0900160 assertShouldStartClat(true, mNai);
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900161
162 mNai.linkProperties.addLinkAddress(new LinkAddress("192.0.2.2/24"));
163 assertRequiresClat(false, mNai);
Lorenzo Colittid593e292019-02-19 13:21:56 +0900164 assertShouldStartClat(false, mNai);
165
166 mNai.linkProperties.removeLinkAddress(new LinkAddress("192.0.2.2/24"));
167 assertRequiresClat(true, mNai);
168 assertShouldStartClat(true, mNai);
169
170 mNai.linkProperties.setNat64Prefix(null);
171 assertRequiresClat(true, mNai);
172 assertShouldStartClat(false, mNai);
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900173
174 mNai.linkProperties = new LinkProperties(oldLp);
Erik Kline3c182162017-09-21 17:28:10 +0900175 }
176 }
177 }
178
179 @Test
Hugo Benichief502882017-09-01 01:23:32 +0000180 public void testNormalStartAndStop() throws Exception {
181 Nat464Xlat nat = makeNat464Xlat();
182 ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
183
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900184 nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
185
Lorenzo Colittid593e292019-02-19 13:21:56 +0900186 // Start clat.
Hugo Benichief502882017-09-01 01:23:32 +0000187 nat.start();
188
189 verify(mNms).registerObserver(eq(nat));
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900190 verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
Hugo Benichief502882017-09-01 01:23:32 +0000191
192 // Stacked interface up notification arrives.
193 nat.interfaceLinkStateChanged(STACKED_IFACE, true);
194 mLooper.dispatchNext();
195
196 verify(mNms).getInterfaceConfig(eq(STACKED_IFACE));
Hugo Benichief502882017-09-01 01:23:32 +0000197 verify(mConnectivity).handleUpdateLinkProperties(eq(mNai), c.capture());
198 assertFalse(c.getValue().getStackedLinks().isEmpty());
199 assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
200 assertRunning(nat);
201
Lorenzo Colittid593e292019-02-19 13:21:56 +0900202 // Stop clat (Network disconnects, IPv4 addr appears, ...).
Hugo Benichief502882017-09-01 01:23:32 +0000203 nat.stop();
204
Lorenzo Colitti9307ca22019-01-12 01:54:23 +0900205 verify(mNetd).clatdStop(eq(BASE_IFACE));
Hugo Benichief502882017-09-01 01:23:32 +0000206 verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture());
Lorenzo Colittidf595632019-01-08 14:43:37 +0900207 verify(mNms).unregisterObserver(eq(nat));
Hugo Benichief502882017-09-01 01:23:32 +0000208 assertTrue(c.getValue().getStackedLinks().isEmpty());
209 assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
Luke Huang65914772019-03-16 00:31:46 +0800210 verify(mDnsResolver).stopPrefix64Discovery(eq(NETID));
Hugo Benichief502882017-09-01 01:23:32 +0000211 assertIdle(nat);
212
Lorenzo Colittidf595632019-01-08 14:43:37 +0900213 // Stacked interface removed notification arrives and is ignored.
214 nat.interfaceRemoved(STACKED_IFACE);
215 mLooper.dispatchNext();
216
Lorenzo Colitti9307ca22019-01-12 01:54:23 +0900217 verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
Hugo Benichief502882017-09-01 01:23:32 +0000218 }
219
Lorenzo Colittidf595632019-01-08 14:43:37 +0900220 private void checkStartStopStart(boolean interfaceRemovedFirst) throws Exception {
221 Nat464Xlat nat = makeNat464Xlat();
222 ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
223 InOrder inOrder = inOrder(mNetd, mConnectivity);
224
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900225 nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
226
Lorenzo Colittidf595632019-01-08 14:43:37 +0900227 nat.start();
228
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900229 inOrder.verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
Lorenzo Colittidf595632019-01-08 14:43:37 +0900230
231 // Stacked interface up notification arrives.
232 nat.interfaceLinkStateChanged(STACKED_IFACE, true);
233 mLooper.dispatchNext();
234
235 inOrder.verify(mConnectivity).handleUpdateLinkProperties(eq(mNai), c.capture());
236 assertFalse(c.getValue().getStackedLinks().isEmpty());
237 assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
238 assertRunning(nat);
239
240 // ConnectivityService stops clat (Network disconnects, IPv4 addr appears, ...).
241 nat.stop();
242
243 inOrder.verify(mNetd).clatdStop(eq(BASE_IFACE));
244
245 inOrder.verify(mConnectivity, times(1)).handleUpdateLinkProperties(eq(mNai), c.capture());
246 assertTrue(c.getValue().getStackedLinks().isEmpty());
247 assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
248 assertIdle(nat);
249
250 if (interfaceRemovedFirst) {
251 // Stacked interface removed notification arrives and is ignored.
252 nat.interfaceRemoved(STACKED_IFACE);
253 mLooper.dispatchNext();
254 nat.interfaceLinkStateChanged(STACKED_IFACE, false);
255 mLooper.dispatchNext();
256 }
257
258 assertTrue(c.getValue().getStackedLinks().isEmpty());
259 assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
260 assertIdle(nat);
261 inOrder.verifyNoMoreInteractions();
262
Lorenzo Colittidf595632019-01-08 14:43:37 +0900263 nat.start();
264
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900265 inOrder.verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
Lorenzo Colittidf595632019-01-08 14:43:37 +0900266
267 if (!interfaceRemovedFirst) {
268 // Stacked interface removed notification arrives and is ignored.
269 nat.interfaceRemoved(STACKED_IFACE);
270 mLooper.dispatchNext();
271 nat.interfaceLinkStateChanged(STACKED_IFACE, false);
272 mLooper.dispatchNext();
273 }
274
275 // Stacked interface up notification arrives.
276 nat.interfaceLinkStateChanged(STACKED_IFACE, true);
277 mLooper.dispatchNext();
278
279 inOrder.verify(mConnectivity).handleUpdateLinkProperties(eq(mNai), c.capture());
280 assertFalse(c.getValue().getStackedLinks().isEmpty());
281 assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
282 assertRunning(nat);
283
284 // ConnectivityService stops clat again.
285 nat.stop();
286
287 inOrder.verify(mNetd).clatdStop(eq(BASE_IFACE));
288
289 inOrder.verify(mConnectivity, times(1)).handleUpdateLinkProperties(eq(mNai), c.capture());
290 assertTrue(c.getValue().getStackedLinks().isEmpty());
291 assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
292 assertIdle(nat);
293
294 inOrder.verifyNoMoreInteractions();
295 }
296
297 @Test
298 public void testStartStopStart() throws Exception {
299 checkStartStopStart(true);
300 }
301
302 @Test
303 public void testStartStopStartBeforeInterfaceRemoved() throws Exception {
304 checkStartStopStart(false);
305 }
306
Hugo Benichief502882017-09-01 01:23:32 +0000307 @Test
308 public void testClatdCrashWhileRunning() throws Exception {
309 Nat464Xlat nat = makeNat464Xlat();
310 ArgumentCaptor<LinkProperties> c = ArgumentCaptor.forClass(LinkProperties.class);
311
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900312 nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
313
Hugo Benichief502882017-09-01 01:23:32 +0000314 nat.start();
315
316 verify(mNms).registerObserver(eq(nat));
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900317 verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
Hugo Benichief502882017-09-01 01:23:32 +0000318
319 // Stacked interface up notification arrives.
320 nat.interfaceLinkStateChanged(STACKED_IFACE, true);
321 mLooper.dispatchNext();
322
323 verify(mNms).getInterfaceConfig(eq(STACKED_IFACE));
Hugo Benichief502882017-09-01 01:23:32 +0000324 verify(mConnectivity, times(1)).handleUpdateLinkProperties(eq(mNai), c.capture());
325 assertFalse(c.getValue().getStackedLinks().isEmpty());
326 assertTrue(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
327 assertRunning(nat);
328
329 // Stacked interface removed notification arrives (clatd crashed, ...).
330 nat.interfaceRemoved(STACKED_IFACE);
331 mLooper.dispatchNext();
332
Lorenzo Colitti9307ca22019-01-12 01:54:23 +0900333 verify(mNetd).clatdStop(eq(BASE_IFACE));
Hugo Benichief502882017-09-01 01:23:32 +0000334 verify(mConnectivity, times(2)).handleUpdateLinkProperties(eq(mNai), c.capture());
Lorenzo Colittidf595632019-01-08 14:43:37 +0900335 verify(mNms).unregisterObserver(eq(nat));
Luke Huang65914772019-03-16 00:31:46 +0800336 verify(mDnsResolver).stopPrefix64Discovery(eq(NETID));
Hugo Benichief502882017-09-01 01:23:32 +0000337 assertTrue(c.getValue().getStackedLinks().isEmpty());
338 assertFalse(c.getValue().getAllInterfaceNames().contains(STACKED_IFACE));
339 assertIdle(nat);
340
341 // ConnectivityService stops clat: no-op.
342 nat.stop();
343
Lorenzo Colitti9307ca22019-01-12 01:54:23 +0900344 verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
Hugo Benichief502882017-09-01 01:23:32 +0000345 }
346
347 @Test
348 public void testStopBeforeClatdStarts() throws Exception {
349 Nat464Xlat nat = makeNat464Xlat();
350
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900351 nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
352
Hugo Benichief502882017-09-01 01:23:32 +0000353 nat.start();
354
355 verify(mNms).registerObserver(eq(nat));
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900356 verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
Hugo Benichief502882017-09-01 01:23:32 +0000357
358 // ConnectivityService immediately stops clat (Network disconnects, IPv4 addr appears, ...)
359 nat.stop();
360
Lorenzo Colitti9307ca22019-01-12 01:54:23 +0900361 verify(mNetd).clatdStop(eq(BASE_IFACE));
Lorenzo Colittidf595632019-01-08 14:43:37 +0900362 verify(mNms).unregisterObserver(eq(nat));
Luke Huang65914772019-03-16 00:31:46 +0800363 verify(mDnsResolver).stopPrefix64Discovery(eq(NETID));
Hugo Benichief502882017-09-01 01:23:32 +0000364 assertIdle(nat);
365
366 // In-flight interface up notification arrives: no-op
367 nat.interfaceLinkStateChanged(STACKED_IFACE, true);
368 mLooper.dispatchNext();
369
Hugo Benichief502882017-09-01 01:23:32 +0000370 // Interface removed notification arrives after stopClatd() takes effect: no-op.
371 nat.interfaceRemoved(STACKED_IFACE);
372 mLooper.dispatchNext();
373
374 assertIdle(nat);
375
Lorenzo Colitti9307ca22019-01-12 01:54:23 +0900376 verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
Hugo Benichief502882017-09-01 01:23:32 +0000377 }
378
379 @Test
380 public void testStopAndClatdNeverStarts() throws Exception {
381 Nat464Xlat nat = makeNat464Xlat();
382
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900383 nat.setNat64Prefix(new IpPrefix(NAT64_PREFIX));
384
Hugo Benichief502882017-09-01 01:23:32 +0000385 nat.start();
386
387 verify(mNms).registerObserver(eq(nat));
Lorenzo Colitti6998fa82019-01-08 10:04:25 +0900388 verify(mNetd).clatdStart(eq(BASE_IFACE), eq(NAT64_PREFIX));
Hugo Benichief502882017-09-01 01:23:32 +0000389
390 // ConnectivityService immediately stops clat (Network disconnects, IPv4 addr appears, ...)
391 nat.stop();
392
Lorenzo Colitti9307ca22019-01-12 01:54:23 +0900393 verify(mNetd).clatdStop(eq(BASE_IFACE));
Lorenzo Colittidf595632019-01-08 14:43:37 +0900394 verify(mNms).unregisterObserver(eq(nat));
Luke Huang65914772019-03-16 00:31:46 +0800395 verify(mDnsResolver).stopPrefix64Discovery(eq(NETID));
Hugo Benichief502882017-09-01 01:23:32 +0000396 assertIdle(nat);
397
Lorenzo Colitti9307ca22019-01-12 01:54:23 +0900398 verifyNoMoreInteractions(mNetd, mNms, mConnectivity);
Hugo Benichief502882017-09-01 01:23:32 +0000399 }
400
401 static void assertIdle(Nat464Xlat nat) {
402 assertTrue("Nat464Xlat was not IDLE", !nat.isStarted());
403 }
404
405 static void assertRunning(Nat464Xlat nat) {
406 assertTrue("Nat464Xlat was not RUNNING", nat.isRunning());
407 }
408}