blob: 28d789d5bbecb06c11b67c9cf107ecf3d46a3c95 [file] [log] [blame]
Shubham Sharma1ad16632019-11-26 11:09:21 +00001/*
2 * Copyright 2015-present Open Networking Foundation
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 */
16package org.opencord.aaa.impl;
17
18import com.google.common.base.Charsets;
19import org.junit.After;
20import org.junit.Before;
21import org.junit.Test;
22import org.onlab.junit.TestUtils;
23import org.onlab.packet.BasePacket;
24import org.onlab.packet.DeserializationException;
25import org.onlab.packet.EAP;
26import org.onlab.packet.Ethernet;
27import org.onlab.packet.IpAddress;
28import org.onlab.packet.RADIUS;
29import org.onlab.packet.RADIUSAttribute;
30import org.onosproject.core.ApplicationId;
31import org.onosproject.core.CoreServiceAdapter;
32import org.onosproject.event.DefaultEventSinkRegistry;
33import org.onosproject.event.Event;
34import org.onosproject.event.EventDeliveryService;
35import org.onosproject.event.EventSink;
36import org.onosproject.net.config.Config;
37import org.onosproject.net.config.NetworkConfigRegistryAdapter;
38import org.onosproject.net.packet.DefaultInboundPacket;
39import org.onosproject.net.packet.InboundPacket;
40import org.onosproject.net.packet.PacketContext;
41import org.onosproject.net.packet.PacketService;
42import org.opencord.aaa.AaaConfig;
43import org.slf4j.Logger;
44
45import java.lang.reflect.Field;
46import java.net.InetAddress;
47import java.net.UnknownHostException;
48import java.nio.ByteBuffer;
49
50import static com.google.common.base.Preconditions.checkState;
51import static org.hamcrest.Matchers.is;
52import static org.hamcrest.Matchers.notNullValue;
Shubham Sharmac7aa6202019-12-12 10:19:10 +000053import static org.junit.Assert.assertNotEquals;
Shubham Sharma1ad16632019-11-26 11:09:21 +000054import static org.junit.Assert.assertThat;
55import static org.onosproject.net.NetTestTools.connectPoint;
56import static org.slf4j.LoggerFactory.getLogger;
57
58/**
59 * Set of tests of the ONOS application component for AAA Statistics.
60 */
61public class AaaStatisticsTest extends AaaTestBase {
62
63 static final String BAD_IP_ADDRESS = "198.51.100.0";
Shubham Sharmac7aa6202019-12-12 10:19:10 +000064 static final Long ZERO = (long) 0;
Shubham Sharma1ad16632019-11-26 11:09:21 +000065
66 private final Logger log = getLogger(getClass());
67 private AaaManager aaaManager;
68 private AaaStatisticsManager aaaStatisticsManager;
Kartikey Dubeybe14f472019-10-01 12:18:35 +000069 private AaaSupplicantMachineStatsManager aaaSupplicantStatsManager;
Shubham Sharma1ad16632019-11-26 11:09:21 +000070
71 class AaaManagerWithoutRadiusServer extends AaaManager {
72 protected void sendRadiusPacket(RADIUS radiusPacket, InboundPacket inPkt) {
73 super.sendRadiusPacket(radiusPacket, inPkt);
74 aaaManager.aaaStatisticsManager.putOutgoingIdentifierToMap(radiusPacket.getIdentifier());
75 savePacket(radiusPacket);
76 }
77
78 // changed the configuration of parent method to protected
79 protected void configureRadiusCommunication() {
80 PacketService pktService = new MockPacketService();
81 ApplicationId appId = new CoreServiceAdapter().registerApplication("org.opencord.aaa");
82 aaaManager.impl = new TestSocketBasedRadiusCommunicator(appId, pktService, aaaManager);
83 }
84 }
85
86 /**
87 * Mocks the AAAConfig class to force usage of an unroutable address for the
88 * RADIUS server.
89 */
90 static class MockAaaConfig extends AaaConfig {
91 @Override
92 public InetAddress radiusIp() {
93 try {
94 return InetAddress.getByName(BAD_IP_ADDRESS);
95 } catch (UnknownHostException ex) {
96 throw new IllegalStateException(ex);
97 }
98 }
99 }
100
101 /**
102 * Mocks the network config registry.
103 */
104 @SuppressWarnings("unchecked")
105 private static final class TestNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
106 @Override
107 public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
108 AaaConfig aaaConfig = new MockAaaConfig();
109 return (C) aaaConfig;
110 }
111 }
112
113 public static class TestEventDispatcher extends DefaultEventSinkRegistry implements EventDeliveryService {
114
115 @Override
116 @SuppressWarnings("unchecked")
117 public synchronized void post(Event event) {
118 EventSink sink = getSink(event.getClass());
119 checkState(sink != null, "No sink for event %s", event);
120 sink.process(event);
121 }
122
123 @Override
124 public void setDispatchTimeLimit(long millis) {
125 }
126
127 @Override
128 public long getDispatchTimeLimit() {
129 return 0;
130 }
131 }
132
133 /**
134 * Constructs an Ethernet packet containing a RADIUS challenge packet.
135 *
136 * @param challengeCode
137 * code to use in challenge packet
138 * @param challengeType
139 * type to use in challenge packet
140 * @return Ethernet packet
141 */
142 private RADIUS constructRadiusCodeAccessChallengePacket(byte challengeCode, byte challengeType) {
143
Shubham Sharma048cc262019-06-19 14:18:50 +0000144 String challenge = "12345678901234567";
Shubham Sharma1ad16632019-11-26 11:09:21 +0000145
Shubham Sharma048cc262019-06-19 14:18:50 +0000146 EAP eap = new EAP(challengeType, (byte) 4, challengeType,
147 challenge.getBytes(Charsets.US_ASCII));
148 eap.setIdentifier((byte) 4);
Shubham Sharma1ad16632019-11-26 11:09:21 +0000149
Shubham Sharma048cc262019-06-19 14:18:50 +0000150 RADIUS radius = new RADIUS();
151 radius.setCode(challengeCode);
152 radius.setIdentifier((byte) 4);
153 radius.setAttribute(RADIUSAttribute.RADIUS_ATTR_STATE,
154 challenge.getBytes(Charsets.US_ASCII));
Shubham Sharma1ad16632019-11-26 11:09:21 +0000155
Shubham Sharma048cc262019-06-19 14:18:50 +0000156 radius.setPayload(eap);
157 radius.setAttribute(RADIUSAttribute.RADIUS_ATTR_EAP_MESSAGE,
158 eap.serialize());
159 radius.setAttribute(RADIUSAttribute.RADIUS_ATTR_MESSAGE_AUTH,
160 aaaManager.radiusSecret.getBytes());
161 return radius;
Shubham Sharma1ad16632019-11-26 11:09:21 +0000162 }
163
164 public static void injectEventDispatcher(Object manager, EventDeliveryService svc) {
165 Class mc = manager.getClass();
166 for (Field f : mc.getSuperclass().getDeclaredFields()) {
167 if (f.getType().equals(EventDeliveryService.class)) {
168 try {
169 TestUtils.setField(manager, f.getName(), svc);
170 } catch (TestUtils.TestUtilsException e) {
171 throw new IllegalArgumentException("Unable to inject reference", e);
172 }
173 break;
174 }
175 }
176 }
177
178/**
179 * Set up the services required by the AAA application.
180 */
181 @Before
182 public void setUp() {
183 aaaManager = new AaaManagerWithoutRadiusServer();
Shubham Sharma048cc262019-06-19 14:18:50 +0000184 aaaManager.radiusOperationalStatusService = new RadiusOperationalStatusManager();
Shubham Sharma1ad16632019-11-26 11:09:21 +0000185 aaaManager.netCfgService = new TestNetworkConfigRegistry();
186 aaaManager.coreService = new CoreServiceAdapter();
187 aaaManager.packetService = new MockPacketService();
188 aaaManager.deviceService = new TestDeviceService();
189 aaaManager.sadisService = new MockSadisService();
190 aaaManager.cfgService = new MockCfgService();
191 aaaStatisticsManager = new AaaStatisticsManager();
Kartikey Dubeybe14f472019-10-01 12:18:35 +0000192 aaaSupplicantStatsManager = new AaaSupplicantMachineStatsManager();
Shubham Sharma1ad16632019-11-26 11:09:21 +0000193 TestUtils.setField(aaaStatisticsManager, "eventDispatcher", new TestEventDispatcher());
194 aaaStatisticsManager.activate();
Kartikey Dubeybe14f472019-10-01 12:18:35 +0000195 TestUtils.setField(aaaSupplicantStatsManager, "eventDispatcher", new TestEventDispatcher());
196 aaaSupplicantStatsManager.activate();
Shubham Sharma1ad16632019-11-26 11:09:21 +0000197 aaaManager.aaaStatisticsManager = this.aaaStatisticsManager;
Kartikey Dubeybe14f472019-10-01 12:18:35 +0000198 aaaManager.aaaSupplicantStatsManager = this.aaaSupplicantStatsManager;
Shubham Sharma1ad16632019-11-26 11:09:21 +0000199 TestUtils.setField(aaaManager, "eventDispatcher", new TestEventDispatcher());
200 aaaManager.activate(new AaaTestBase.MockComponentContext());
201 }
202
203/**
204 * Tear down the AAA application.
205 */
206@After
207public void tearDown() {
208 aaaManager.deactivate(new AaaTestBase.MockComponentContext());
209}
210
211/**
212 * Extracts the RADIUS packet from a packet sent by the supplicant.
213 *
214 * @param radius
215 * RADIUS packet sent by the supplicant
216 * @throws DeserializationException
217 * if deserialization of the packet contents fails.
218 */
219private void checkRadiusPacketFromSupplicant(RADIUS radius) throws DeserializationException {
220 assertThat(radius, notNullValue());
221 EAP eap = radius.decapsulateMessage();
222 assertThat(eap, notNullValue());
223}
224
225/**
226 * Fetches the sent packet at the given index. The requested packet must be the
227 * last packet on the list.
228 *
229 * @param index
230 * index into sent packets array
231 * @return packet
232 */
233private BasePacket fetchPacket(int index) {
234 BasePacket packet = savedPackets.get(index);
235 assertThat(packet, notNullValue());
236 return packet;
237}
238
239 /** Tests the authentication path through the AAA application.
240 * And counts the aaa Stats for successful transmission.
241 * @throws DeserializationException
242 * if packed deserialization fails.
243 */
244 @Test
245 public void testAaaStatisticsForAcceptedPackets() throws Exception {
246
247 // (1) Supplicant start up
248 Ethernet startPacket = constructSupplicantStartPacket();
249 sendPacket(startPacket);
250
251 Ethernet responsePacket = (Ethernet) fetchPacket(0);
252 checkRadiusPacket(aaaManager, responsePacket, EAP.ATTR_IDENTITY);
253
254 // (2) Supplicant identify
255
256 Ethernet identifyPacket = constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
257 sendPacket(identifyPacket);
258
259 RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
260 checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
261
262 assertThat(radiusIdentifyPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
263 assertThat(new String(radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME).getValue()),
264 is("testuser"));
265 IpAddress nasIp = IpAddress.valueOf(IpAddress.Version.INET,
266 radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP).getValue());
267 assertThat(nasIp.toString(), is(aaaManager.nasIpAddress.getHostAddress()));
268
269 // State machine should have been created by now
270
271 StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(SESSION_ID);
272 assertThat(stateMachine, notNullValue());
273 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
274
275 // (3) RADIUS MD5 challenge
276
277 RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
278 RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5);
279 aaaManager.handleRadiusPacket(radiusCodeAccessChallengePacket);
280
281 Ethernet radiusChallengeMD5Packet = (Ethernet) fetchPacket(2);
282 checkRadiusPacket(aaaManager, radiusChallengeMD5Packet, EAP.ATTR_MD5);
283
284 // (4) Supplicant MD5 response
285
286 Ethernet md5RadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_MD5,
287 stateMachine.challengeIdentifier(), radiusChallengeMD5Packet);
288 sendPacket(md5RadiusPacket);
289
290 RADIUS responseMd5RadiusPacket = (RADIUS) fetchPacket(3);
291
292 checkRadiusPacketFromSupplicant(responseMd5RadiusPacket);
Shubham Sharma048cc262019-06-19 14:18:50 +0000293 assertThat(responseMd5RadiusPacket.getIdentifier(), is((byte) 9));
Shubham Sharma1ad16632019-11-26 11:09:21 +0000294 assertThat(responseMd5RadiusPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
295
296 // State machine should be in pending state
297
298 assertThat(stateMachine, notNullValue());
299 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
300
301 // (5) RADIUS Success
302
303 RADIUS successPacket =
304 constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_ACCEPT, EAP.SUCCESS);
305 aaaManager.handleRadiusPacket((successPacket));
306 Ethernet supplicantSuccessPacket = (Ethernet) fetchPacket(4);
307
308 checkRadiusPacket(aaaManager, supplicantSuccessPacket, EAP.SUCCESS);
309
310 // State machine should be in authorized state
311
312 assertThat(stateMachine, notNullValue());
313 assertThat(stateMachine.state(), is(StateMachine.STATE_AUTHORIZED));
314
Shubham Sharmac7aa6202019-12-12 10:19:10 +0000315 //Check for increase of Stats
316 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolResIdentityMsgTrans(), ZERO);
317 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolAuthSuccessTrans(), ZERO);
318 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolStartReqTrans(), ZERO);
319 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolTransRespNotNak(), ZERO);
320 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapPktTxauthChooseEap(), ZERO);
321
Shubham Sharma1bd890d2019-12-18 07:09:59 +0000322 assertNotEquals(aaaStatisticsManager.getAaaStats().getAcceptResponsesRx(), ZERO);
323 assertNotEquals(aaaStatisticsManager.getAaaStats().getAccessRequestsTx(), ZERO);
324 assertNotEquals(aaaStatisticsManager.getAaaStats().getChallengeResponsesRx(), ZERO);
325 assertNotEquals(aaaStatisticsManager.getAaaStats().getDroppedResponsesRx(), ZERO);
326 assertNotEquals(aaaStatisticsManager.getAaaStats().getInvalidValidatorsRx(), ZERO);
327 assertNotEquals(aaaStatisticsManager.getAaaStats().getPendingRequests(), ZERO);
Shubham Sharma1ad16632019-11-26 11:09:21 +0000328
Shubham Sharma1bd890d2019-12-18 07:09:59 +0000329 // Counts the aaa Statistics count and displays in the log
330 countAaaStatistics();
Shubham Sharma1ad16632019-11-26 11:09:21 +0000331 }
332
333 /** Tests the count for defected packets.
334 *
335 * @throws DeserializationException
336 * if packed deserialization fails.
337 */
338 @Test
339 public void testAaaStatisticsForDefectivePackets() throws Exception {
340 // (1) Supplicant start up
341 Ethernet startPacket = constructSupplicantStartPacket();
342 sendPacket(startPacket);
343
344 // (2) Supplicant identify
345
346 Ethernet identifyPacket = constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
347 sendPacket(identifyPacket);
348
349 RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
350
351 checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
352
353 // Calling the mock test socket based to handle packet
354 aaaManager.impl.handlePacketFromServer(null);
355 // State machine should have been created by now
356
357 StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(SESSION_ID);
358
359 // (3) RADIUS MD5 challenge
360
361 RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
362 RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5);
363 aaaManager.handleRadiusPacket(radiusCodeAccessChallengePacket);
364
365 Ethernet radiusChallengeMD5Packet = (Ethernet) fetchPacket(2);
366
367 // (4) Supplicant MD5 response
368
369 Ethernet md5RadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_MD5,
370 stateMachine.challengeIdentifier(), radiusChallengeMD5Packet);
371 sendPacket(md5RadiusPacket);
372 aaaManager.aaaStatisticsManager.calculatePacketRoundtripTime();
373 // (5) RADIUS Rejected
374
375 RADIUS rejectedPacket =
376 constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_REJECT, EAP.FAILURE);
377 aaaManager.handleRadiusPacket((rejectedPacket));
378 Ethernet supplicantRejectedPacket = (Ethernet) fetchPacket(4);
379
380 checkRadiusPacket(aaaManager, supplicantRejectedPacket, EAP.FAILURE);
381
382 // State machine should be in unauthorized state
383 assertThat(stateMachine, notNullValue());
384 assertThat(stateMachine.state(), is(StateMachine.STATE_UNAUTHORIZED));
385 // Calculated the total round trip time
386 aaaManager.aaaStatisticsManager.calculatePacketRoundtripTime();
Shubham Sharmac7aa6202019-12-12 10:19:10 +0000387
388 //Check for increase of Stats
389 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolResIdentityMsgTrans(), ZERO);
390 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolAuthFailureTrans(), ZERO);
391 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolStartReqTrans(), ZERO);
392 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapPktTxauthChooseEap(), ZERO);
393 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolTransRespNotNak(), ZERO);
394
Shubham Sharma1bd890d2019-12-18 07:09:59 +0000395 assertNotEquals(aaaStatisticsManager.getAaaStats().getAccessRequestsTx(), ZERO);
396 assertNotEquals(aaaStatisticsManager.getAaaStats().getChallengeResponsesRx(), ZERO);
397 assertNotEquals(aaaStatisticsManager.getAaaStats().getDroppedResponsesRx(), ZERO);
398 assertNotEquals(aaaStatisticsManager.getAaaStats().getInvalidValidatorsRx(), ZERO);
399 assertNotEquals(aaaStatisticsManager.getAaaStats().getPendingRequests(), ZERO);
400 assertNotEquals(aaaStatisticsManager.getAaaStats().getRejectResponsesRx(), ZERO);
401 assertNotEquals(aaaStatisticsManager.getAaaStats().getRequestRttMilis(), ZERO);
402 assertNotEquals(aaaStatisticsManager.getAaaStats().getUnknownTypeRx(), ZERO);
403
Shubham Sharmac7aa6202019-12-12 10:19:10 +0000404 // Counts the aaa Statistics count
Shubham Sharma1ad16632019-11-26 11:09:21 +0000405 countAaaStatistics();
406
407 }
408
409 /*
410 * Tests the retransmitted packet and malformed packet count
411 *
412 * @throws DeserializationException
413 * if packed deserialization fails.
414 */
415 @Test
416 public void testRequestRetransmittedCount() throws Exception {
417
418 // (1) Supplicant start up
419 Ethernet startPacket = constructSupplicantStartPacket();
420 sendPacket(startPacket);
421
422 // (2) Supplicant identify
423
424 Ethernet identifyPacket = constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
425 sendPacket(identifyPacket);
426
427 RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
428 checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
429
430 // again creating pending state for same packet
431 constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
432 sendPacket(identifyPacket);
433 aaaManager.impl.handlePacketFromServer(null);
434 aaaManager.aaaStatisticsManager.calculatePacketRoundtripTime();
435
436 // creating malformed packet
437 final ByteBuffer byteBuffer = ByteBuffer.wrap(startPacket.serialize());
438 InboundPacket inPacket = new DefaultInboundPacket(connectPoint("1", 1),
439 startPacket, byteBuffer);
440
441 PacketContext context = new TestPacketContext(127L, inPacket, null, false);
442 aaaManager.impl.handlePacketFromServer(context);
Shubham Sharmac7aa6202019-12-12 10:19:10 +0000443
444 // Check for increase of Stats
445 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolResIdentityMsgTrans(), ZERO);
446 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolStartReqTrans(), ZERO);
447
Shubham Sharma1bd890d2019-12-18 07:09:59 +0000448 assertNotEquals(aaaStatisticsManager.getAaaStats().getAccessRequestsTx(), ZERO);
449 assertNotEquals(aaaStatisticsManager.getAaaStats().getDroppedResponsesRx(), ZERO);
450 assertNotEquals(aaaStatisticsManager.getAaaStats().getPendingRequests(), ZERO);
451 assertNotEquals(aaaStatisticsManager.getAaaStats().getMalformedResponsesRx(), ZERO);
452 assertNotEquals(aaaStatisticsManager.getAaaStats().getRequestReTx(), ZERO);
453 assertNotEquals(aaaStatisticsManager.getAaaStats().getRequestRttMilis(), ZERO);
454 assertNotEquals(aaaStatisticsManager.getAaaStats().getUnknownTypeRx(), ZERO);
455 assertNotEquals(aaaStatisticsManager.getAaaStats().getUnknownServerRx(), ZERO);
Shubham Sharma1ad16632019-11-26 11:09:21 +0000456
Shubham Sharma1bd890d2019-12-18 07:09:59 +0000457 countAaaStatistics();
458 }
Shubham Sharma1ad16632019-11-26 11:09:21 +0000459
Shubham Sharmac7aa6202019-12-12 10:19:10 +0000460 /** Tests the authentication path through the AAA application.
461 * And counts the aaa Stats for logoff transactionXZ.
462 * @throws DeserializationException
463 * if packed deserialization fails.
464 */
465 @Test
466 public void testAaaStatisticsForLogoffPackets() throws Exception {
467
468 // (1) Supplicant start up
469 Ethernet startPacket = constructSupplicantStartPacket();
470 sendPacket(startPacket);
471
472 Ethernet responsePacket = (Ethernet) fetchPacket(0);
473 checkRadiusPacket(aaaManager, responsePacket, EAP.ATTR_IDENTITY);
474
475 // (2) Supplicant identify
476
477 Ethernet identifyPacket = constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
478 sendPacket(identifyPacket);
479
480 RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
481 checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
482
483 assertThat(radiusIdentifyPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
484 assertThat(new String(radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME).getValue()),
485 is("testuser"));
486 IpAddress nasIp = IpAddress.valueOf(IpAddress.Version.INET,
487 radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP).getValue());
488 assertThat(nasIp.toString(), is(aaaManager.nasIpAddress.getHostAddress()));
489
490 // State machine should have been created by now
491
492 StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(SESSION_ID);
493 assertThat(stateMachine, notNullValue());
494 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
495
496 // (3) RADIUS MD5 challenge
497
498 RADIUS radiusCodeAccessChallengePacket = constructRadiusCodeAccessChallengePacket(
499 RADIUS.RADIUS_CODE_ACCESS_CHALLENGE, EAP.ATTR_MD5);
500 aaaManager.handleRadiusPacket(radiusCodeAccessChallengePacket);
501
502 Ethernet radiusChallengeMD5Packet = (Ethernet) fetchPacket(2);
503 checkRadiusPacket(aaaManager, radiusChallengeMD5Packet, EAP.ATTR_MD5);
504
505 // (4) Supplicant MD5 response
506
507 Ethernet md5RadiusPacket = constructSupplicantIdentifyPacket(stateMachine, EAP.ATTR_MD5,
508 stateMachine.challengeIdentifier(), radiusChallengeMD5Packet);
509 sendPacket(md5RadiusPacket);
510
511 RADIUS responseMd5RadiusPacket = (RADIUS) fetchPacket(3);
512
513 checkRadiusPacketFromSupplicant(responseMd5RadiusPacket);
514 assertThat(responseMd5RadiusPacket.getIdentifier(), is((byte) 9));
515 assertThat(responseMd5RadiusPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
516
517 // State machine should be in pending state
518
519 assertThat(stateMachine, notNullValue());
520 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
521
522 // (5) RADIUS Success
523
524 RADIUS successPacket =
525 constructRadiusCodeAccessChallengePacket(RADIUS.RADIUS_CODE_ACCESS_ACCEPT, EAP.SUCCESS);
526 aaaManager.handleRadiusPacket((successPacket));
527 Ethernet supplicantSuccessPacket = (Ethernet) fetchPacket(4);
528
529 checkRadiusPacket(aaaManager, supplicantSuccessPacket, EAP.SUCCESS);
530
531 // State machine should be in authorized state
532
533 assertThat(stateMachine, notNullValue());
534 assertThat(stateMachine.state(), is(StateMachine.STATE_AUTHORIZED));
535
536 // Supplicant trigger EAP Logoff
537 Ethernet loggoffPacket = constructSupplicantLogoffPacket();
538 sendPacket(loggoffPacket);
539
540 // State machine should be in logoff state
541 assertThat(stateMachine, notNullValue());
542 assertThat(stateMachine.state(), is(StateMachine.STATE_IDLE));
543
544 //Check for increase in stats
545 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolLogoffRx(), ZERO);
546 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolResIdentityMsgTrans(), ZERO);
547 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolAuthSuccessTrans(), ZERO);
548 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolStartReqTrans(), ZERO);
549 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolTransRespNotNak(), ZERO);
550 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapPktTxauthChooseEap(), ZERO);
551 // Counts the aaa Statistics count
552 countAaaStatistics();
553
554 }
555
Arjun E Kac463f62020-02-03 14:05:45 +0000556
557 /** Tests the authentication path through the AAA application.
558 * And counts the aaa Stats for timeout.
559 * @throws DeserializationException
560 * if packed deserialization fails.
561 */
562 @Test
563 public void testAaaStatisticsForTimeoutPackets() throws Exception {
564
565 // (1) Supplicant start up
566 Ethernet startPacket = constructSupplicantStartPacket();
567 sendPacket(startPacket);
568
569 Ethernet responsePacket = (Ethernet) fetchPacket(0);
570 checkRadiusPacket(aaaManager, responsePacket, EAP.ATTR_IDENTITY);
571
572 // (2) Supplicant identify
573
574 Ethernet identifyPacket = constructSupplicantIdentifyPacket(null, EAP.ATTR_IDENTITY, (byte) 1, null);
575 sendPacket(identifyPacket);
576
577 RADIUS radiusIdentifyPacket = (RADIUS) fetchPacket(1);
578 checkRadiusPacketFromSupplicant(radiusIdentifyPacket);
579
580 assertThat(radiusIdentifyPacket.getCode(), is(RADIUS.RADIUS_CODE_ACCESS_REQUEST));
581 assertThat(new String(radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME).getValue()),
582 is("testuser"));
583 IpAddress nasIp = IpAddress.valueOf(IpAddress.Version.INET,
584 radiusIdentifyPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP).getValue());
585 assertThat(nasIp.toString(), is(aaaManager.nasIpAddress.getHostAddress()));
586
587 // State machine should have been created by now
588
589 StateMachine stateMachine = StateMachine.lookupStateMachineBySessionId(SESSION_ID);
590 assertThat(stateMachine, notNullValue());
591 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
592 Thread.sleep((aaaManager.cleanupTimerTimeOutInMins / 2) + 1);
593
594 // State machine should be in timeout state
595 assertThat(stateMachine, notNullValue());
596 assertThat(stateMachine.state(), is(StateMachine.STATE_PENDING));
597
598 //Check for increase in stats
599 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolResIdentityMsgTrans(), ZERO);
600 assertNotEquals(aaaStatisticsManager.getAaaStats().getEapolStartReqTrans(), ZERO);
601 countAaaStatistics();
602
603 }
604
Shubham Sharma1ad16632019-11-26 11:09:21 +0000605 // Calculates the AAA statistics count.
606 public void countAaaStatistics() {
607 assertThat(aaaStatisticsManager.getAaaStats().getAcceptResponsesRx(), notNullValue());
608 assertThat(aaaStatisticsManager.getAaaStats().getAccessRequestsTx(), notNullValue());
609 assertThat(aaaStatisticsManager.getAaaStats().getChallengeResponsesRx(), notNullValue());
610 assertThat(aaaStatisticsManager.getAaaStats().getDroppedResponsesRx(), notNullValue());
611 assertThat(aaaStatisticsManager.getAaaStats().getInvalidValidatorsRx(), notNullValue());
612 assertThat(aaaStatisticsManager.getAaaStats().getMalformedResponsesRx(), notNullValue());
613 assertThat(aaaStatisticsManager.getAaaStats().getPendingRequests(), notNullValue());
614 assertThat(aaaStatisticsManager.getAaaStats().getRejectResponsesRx(), notNullValue());
615 assertThat(aaaStatisticsManager.getAaaStats().getRequestReTx(), notNullValue());
616 assertThat(aaaStatisticsManager.getAaaStats().getRequestRttMilis(), notNullValue());
617 assertThat(aaaStatisticsManager.getAaaStats().getUnknownServerRx(), notNullValue());
618 assertThat(aaaStatisticsManager.getAaaStats().getUnknownTypeRx(), notNullValue());
Shubham Sharmac7aa6202019-12-12 10:19:10 +0000619
Shubham Sharma1ad16632019-11-26 11:09:21 +0000620 }
621
622 /*
623 * Mock implementation of SocketBasedRadiusCommunicator class.
624 *
625 */
626 class TestSocketBasedRadiusCommunicator extends SocketBasedRadiusCommunicator {
627
628 TestSocketBasedRadiusCommunicator(ApplicationId appId, PacketService pktService, AaaManager aaaManager) {
629 super(appId, pktService, aaaManager);
630 }
631
632 // Implementation of socketBasedRadiusCommunicator--> run() method
633 public void handlePacketFromServer(PacketContext context) {
634
635 RADIUS incomingPkt = (RADIUS) fetchPacket(savedPackets.size() - 1);
636 try {
637 if (context == null) {
638 aaaStatisticsManager.handleRoundtripTime(incomingPkt.getIdentifier());
639 aaaManager.handleRadiusPacket(incomingPkt);
640 } else if (null != context) {
641 aaaManager.checkForPacketFromUnknownServer("100.100.100.0");
642 aaaStatisticsManager.handleRoundtripTime(incomingPkt.getIdentifier());
643 aaaManager.handleRadiusPacket(incomingPkt);
644 incomingPkt =
645 RADIUS.deserializer().deserialize(incomingPkt.generateAuthCode(), 0, 1);
646 }
647 } catch (DeserializationException dex) {
648 aaaManager.aaaStatisticsManager.getAaaStats().increaseMalformedResponsesRx();
649 aaaStatisticsManager.getAaaStats().countDroppedResponsesRx();
650 log.error("Cannot deserialize packet", dex);
651 } catch (StateMachineException sme) {
652 log.error("Illegal state machine operation", sme);
653 }
654
655 }
656
657 }
658
Kartikey Dubeybe14f472019-10-01 12:18:35 +0000659}