Ray Milkey
Committed by Gerrit Code Review

More AAA app refactoring

- cleaned up exception handling a little
- reformatting of the code to be easier to read and group similar code together
- fixed some style problems found by IntelliJ

Change-Id: I932ac48d82b598b1f59c906477fb5e4deded413f
...@@ -79,62 +79,85 @@ import static org.slf4j.LoggerFactory.getLogger; ...@@ -79,62 +79,85 @@ import static org.slf4j.LoggerFactory.getLogger;
79 public class AAA { 79 public class AAA {
80 // RADIUS server IP address 80 // RADIUS server IP address
81 private static final String DEFAULT_RADIUS_IP = "192.168.1.10"; 81 private static final String DEFAULT_RADIUS_IP = "192.168.1.10";
82 +
82 // NAS IP address 83 // NAS IP address
83 private static final String DEFAULT_NAS_IP = "192.168.1.11"; 84 private static final String DEFAULT_NAS_IP = "192.168.1.11";
85 +
84 // RADIUS uplink port 86 // RADIUS uplink port
85 private static final int DEFAULT_RADIUS_UPLINK = 2; 87 private static final int DEFAULT_RADIUS_UPLINK = 2;
88 +
86 // RADIUS server shared secret 89 // RADIUS server shared secret
87 private static final String DEFAULT_RADIUS_SECRET = "ONOSecret"; 90 private static final String DEFAULT_RADIUS_SECRET = "ONOSecret";
91 +
88 // RADIUS MAC address 92 // RADIUS MAC address
89 private static final String RADIUS_MAC_ADDRESS = "00:00:00:00:01:10"; 93 private static final String RADIUS_MAC_ADDRESS = "00:00:00:00:01:10";
94 +
90 // NAS MAC address 95 // NAS MAC address
91 private static final String NAS_MAC_ADDRESS = "00:00:00:00:10:01"; 96 private static final String NAS_MAC_ADDRESS = "00:00:00:00:10:01";
97 +
92 // Radius Switch Id 98 // Radius Switch Id
93 private static final String DEFAULT_RADIUS_SWITCH = "of:90e2ba82f97791e9"; 99 private static final String DEFAULT_RADIUS_SWITCH = "of:90e2ba82f97791e9";
100 +
94 // Radius Port Number 101 // Radius Port Number
95 private static final String DEFAULT_RADIUS_PORT = "129"; 102 private static final String DEFAULT_RADIUS_PORT = "129";
103 +
96 // for verbose output 104 // for verbose output
97 private final Logger log = getLogger(getClass()); 105 private final Logger log = getLogger(getClass());
106 +
98 // a list of our dependencies : 107 // a list of our dependencies :
99 // to register with ONOS as an application - described next 108 // to register with ONOS as an application - described next
100 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 109 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
101 protected CoreService coreService; 110 protected CoreService coreService;
111 +
102 // to receive Packet-in events that we'll respond to 112 // to receive Packet-in events that we'll respond to
103 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 113 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
104 protected PacketService packetService; 114 protected PacketService packetService;
115 +
105 // end host information 116 // end host information
106 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 117 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
107 protected HostService hostService; 118 protected HostService hostService;
119 +
108 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 120 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
109 protected VoltTenantService voltTenantService; 121 protected VoltTenantService voltTenantService;
122 +
123 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
124 + protected ComponentConfigService cfgService;
125 +
110 // Parsed RADIUS server IP address 126 // Parsed RADIUS server IP address
111 protected InetAddress parsedRadiusIpAddress; 127 protected InetAddress parsedRadiusIpAddress;
112 // Parsed NAS IP address 128 // Parsed NAS IP address
113 protected InetAddress parsedNasIpAddress; 129 protected InetAddress parsedNasIpAddress;
114 - @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 130 +
115 - protected ComponentConfigService cfgService;
116 // our application-specific event handler 131 // our application-specific event handler
117 private ReactivePacketProcessor processor = new ReactivePacketProcessor(); 132 private ReactivePacketProcessor processor = new ReactivePacketProcessor();
133 +
118 // our unique identifier 134 // our unique identifier
119 private ApplicationId appId; 135 private ApplicationId appId;
136 +
120 @Property(name = "radiusIpAddress", value = DEFAULT_RADIUS_IP, 137 @Property(name = "radiusIpAddress", value = DEFAULT_RADIUS_IP,
121 label = "RADIUS IP Address") 138 label = "RADIUS IP Address")
122 private String radiusIpAddress = DEFAULT_RADIUS_IP; 139 private String radiusIpAddress = DEFAULT_RADIUS_IP;
140 +
123 @Property(name = "nasIpAddress", value = DEFAULT_NAS_IP, 141 @Property(name = "nasIpAddress", value = DEFAULT_NAS_IP,
124 label = "NAS IP Address") 142 label = "NAS IP Address")
125 private String nasIpAddress = DEFAULT_NAS_IP; 143 private String nasIpAddress = DEFAULT_NAS_IP;
144 +
126 @Property(name = "radiusMacAddress", value = RADIUS_MAC_ADDRESS, 145 @Property(name = "radiusMacAddress", value = RADIUS_MAC_ADDRESS,
127 label = "RADIUS MAC Address") 146 label = "RADIUS MAC Address")
128 private String radiusMacAddress = RADIUS_MAC_ADDRESS; 147 private String radiusMacAddress = RADIUS_MAC_ADDRESS;
148 +
129 @Property(name = "nasMacAddress", value = NAS_MAC_ADDRESS, 149 @Property(name = "nasMacAddress", value = NAS_MAC_ADDRESS,
130 label = "NAS MAC Address") 150 label = "NAS MAC Address")
131 private String nasMacAddress = NAS_MAC_ADDRESS; 151 private String nasMacAddress = NAS_MAC_ADDRESS;
152 +
132 @Property(name = "radiusSecret", value = DEFAULT_RADIUS_SECRET, 153 @Property(name = "radiusSecret", value = DEFAULT_RADIUS_SECRET,
133 label = "RADIUS shared secret") 154 label = "RADIUS shared secret")
134 private String radiusSecret = DEFAULT_RADIUS_SECRET; 155 private String radiusSecret = DEFAULT_RADIUS_SECRET;
156 +
135 @Property(name = "radiusSwitchId", value = DEFAULT_RADIUS_SWITCH, 157 @Property(name = "radiusSwitchId", value = DEFAULT_RADIUS_SWITCH,
136 label = "Radius switch") 158 label = "Radius switch")
137 private String radiusSwitch = DEFAULT_RADIUS_SWITCH; 159 private String radiusSwitch = DEFAULT_RADIUS_SWITCH;
160 +
138 @Property(name = "radiusPortNumber", value = DEFAULT_RADIUS_PORT, 161 @Property(name = "radiusPortNumber", value = DEFAULT_RADIUS_PORT,
139 label = "Radius port") 162 label = "Radius port")
140 private String radiusPort = DEFAULT_RADIUS_PORT; 163 private String radiusPort = DEFAULT_RADIUS_PORT;
...@@ -181,14 +204,14 @@ public class AAA { ...@@ -181,14 +204,14 @@ public class AAA {
181 parsedRadiusIpAddress = InetAddress.getByName(s); 204 parsedRadiusIpAddress = InetAddress.getByName(s);
182 radiusIpAddress = Strings.isNullOrEmpty(s) ? DEFAULT_RADIUS_IP : s; 205 radiusIpAddress = Strings.isNullOrEmpty(s) ? DEFAULT_RADIUS_IP : s;
183 } catch (UnknownHostException e) { 206 } catch (UnknownHostException e) {
184 - log.error("Invalid RADIUS IP address specification: {}", s); 207 + log.error("Invalid RADIUS IP address specification: {}", s, e);
185 } 208 }
186 try { 209 try {
187 s = Tools.get(properties, "nasIpAddress"); 210 s = Tools.get(properties, "nasIpAddress");
188 parsedNasIpAddress = InetAddress.getByName(s); 211 parsedNasIpAddress = InetAddress.getByName(s);
189 nasIpAddress = Strings.isNullOrEmpty(s) ? DEFAULT_NAS_IP : s; 212 nasIpAddress = Strings.isNullOrEmpty(s) ? DEFAULT_NAS_IP : s;
190 } catch (UnknownHostException e) { 213 } catch (UnknownHostException e) {
191 - log.error("Invalid NAS IP address specification: {}", s); 214 + log.error("Invalid NAS IP address specification: {}", s, e);
192 } 215 }
193 216
194 s = Tools.get(properties, "radiusMacAddress"); 217 s = Tools.get(properties, "radiusMacAddress");
...@@ -284,6 +307,7 @@ public class AAA { ...@@ -284,6 +307,7 @@ public class AAA {
284 if (ethPkt == null) { 307 if (ethPkt == null) {
285 return; 308 return;
286 } 309 }
310 + try {
287 // identify if incoming packet comes from supplicant (EAP) or RADIUS 311 // identify if incoming packet comes from supplicant (EAP) or RADIUS
288 switch (EthType.EtherType.lookup(ethPkt.getEtherType())) { 312 switch (EthType.EtherType.lookup(ethPkt.getEtherType())) {
289 case EAPOL: 313 case EAPOL:
...@@ -299,17 +323,17 @@ public class AAA { ...@@ -299,17 +323,17 @@ public class AAA {
299 323
300 byte[] datagram = udpPacket.getPayload().serialize(); 324 byte[] datagram = udpPacket.getPayload().serialize();
301 RADIUS radiusPacket; 325 RADIUS radiusPacket;
302 - try {
303 radiusPacket = RADIUS.deserializer().deserialize(datagram, 0, datagram.length); 326 radiusPacket = RADIUS.deserializer().deserialize(datagram, 0, datagram.length);
304 - } catch (DeserializationException e) {
305 - log.warn("Unable to deserialize RADIUS packet:", e);
306 - return;
307 - }
308 handleRadiusPacket(radiusPacket); 327 handleRadiusPacket(radiusPacket);
309 } 328 }
329 +
310 break; 330 break;
311 default: 331 default:
312 - return; 332 + log.trace("Skipping Ethernet packet type {}",
333 + EthType.EtherType.lookup(ethPkt.getEtherType()));
334 + }
335 + } catch (DeserializationException | StateMachineException e) {
336 + log.warn("Unable to process RADIUS packet:", e);
313 } 337 }
314 } 338 }
315 339
...@@ -319,7 +343,7 @@ public class AAA { ...@@ -319,7 +343,7 @@ public class AAA {
319 * 343 *
320 * @param inPacket Ethernet packet coming from the supplicant 344 * @param inPacket Ethernet packet coming from the supplicant
321 */ 345 */
322 - private void handleSupplicantPacket(InboundPacket inPacket) { 346 + private void handleSupplicantPacket(InboundPacket inPacket) throws StateMachineException {
323 Ethernet ethPkt = inPacket.parsed(); 347 Ethernet ethPkt = inPacket.parsed();
324 // Where does it come from? 348 // Where does it come from?
325 MacAddress srcMAC = ethPkt.getSourceMAC(); 349 MacAddress srcMAC = ethPkt.getSourceMAC();
...@@ -337,7 +361,6 @@ public class AAA { ...@@ -337,7 +361,6 @@ public class AAA {
337 361
338 switch (eapol.getEapolType()) { 362 switch (eapol.getEapolType()) {
339 case EAPOL.EAPOL_START: 363 case EAPOL.EAPOL_START:
340 - try {
341 stateMachine.start(); 364 stateMachine.start();
342 stateMachine.setSupplicantConnectpoint(inPacket.receivedFrom()); 365 stateMachine.setSupplicantConnectpoint(inPacket.receivedFrom());
343 366
...@@ -350,26 +373,27 @@ public class AAA { ...@@ -350,26 +373,27 @@ public class AAA {
350 stateMachine.setVlanId(ethPkt.getVlanID()); 373 stateMachine.setVlanId(ethPkt.getVlanID());
351 374
352 this.sendPacketToSupplicant(eth, stateMachine.supplicantConnectpoint()); 375 this.sendPacketToSupplicant(eth, stateMachine.supplicantConnectpoint());
353 - } catch (StateMachineException e) {
354 - e.printStackTrace();
355 - }
356 376
357 break; 377 break;
358 case EAPOL.EAPOL_PACKET: 378 case EAPOL.EAPOL_PACKET:
379 + RADIUS radiusPayload;
359 //check if this is a Response/Identify or a Response/TLS 380 //check if this is a Response/Identify or a Response/TLS
360 EAP eapPacket = (EAP) eapol.getPayload(); 381 EAP eapPacket = (EAP) eapol.getPayload();
361 382
362 byte dataType = eapPacket.getDataType(); 383 byte dataType = eapPacket.getDataType();
363 switch (dataType) { 384 switch (dataType) {
385 +
364 case EAP.ATTR_IDENTITY: 386 case EAP.ATTR_IDENTITY:
365 - try {
366 //request id access to RADIUS 387 //request id access to RADIUS
367 - RADIUS radiusPayload = new RADIUS(RADIUS.RADIUS_CODE_ACCESS_REQUEST, 388 + stateMachine.setUsername(eapPacket.getData());
389 +
390 + radiusPayload =
391 + new RADIUS(RADIUS.RADIUS_CODE_ACCESS_REQUEST,
368 eapPacket.getIdentifier()); 392 eapPacket.getIdentifier());
369 radiusPayload.setIdentifier(stateMachine.identifier()); 393 radiusPayload.setIdentifier(stateMachine.identifier());
370 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME, 394 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME,
371 eapPacket.getData()); 395 eapPacket.getData());
372 - stateMachine.setUsername(eapPacket.getData()); 396 +
373 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP, 397 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP,
374 AAA.this.parsedNasIpAddress.getAddress()); 398 AAA.this.parsedNasIpAddress.getAddress());
375 399
...@@ -382,16 +406,13 @@ public class AAA { ...@@ -382,16 +406,13 @@ public class AAA {
382 406
383 //change the state to "PENDING" 407 //change the state to "PENDING"
384 stateMachine.requestAccess(); 408 stateMachine.requestAccess();
385 - } catch (StateMachineException e) {
386 - e.printStackTrace();
387 - }
388 break; 409 break;
389 case EAP.ATTR_MD5: 410 case EAP.ATTR_MD5:
390 //verify if the EAP identifier corresponds to the challenge identifier from the client state 411 //verify if the EAP identifier corresponds to the challenge identifier from the client state
391 //machine. 412 //machine.
392 if (eapPacket.getIdentifier() == stateMachine.challengeIdentifier()) { 413 if (eapPacket.getIdentifier() == stateMachine.challengeIdentifier()) {
393 //send the RADIUS challenge response 414 //send the RADIUS challenge response
394 - RADIUS radiusPayload = new RADIUS(RADIUS.RADIUS_CODE_ACCESS_REQUEST, 415 + radiusPayload = new RADIUS(RADIUS.RADIUS_CODE_ACCESS_REQUEST,
395 eapPacket.getIdentifier()); 416 eapPacket.getIdentifier());
396 radiusPayload.setIdentifier(stateMachine.challengeIdentifier()); 417 radiusPayload.setIdentifier(stateMachine.challengeIdentifier());
397 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME, 418 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME,
...@@ -408,9 +429,8 @@ public class AAA { ...@@ -408,9 +429,8 @@ public class AAA {
408 } 429 }
409 break; 430 break;
410 case EAP.ATTR_TLS: 431 case EAP.ATTR_TLS:
411 - try {
412 //request id access to RADIUS 432 //request id access to RADIUS
413 - RADIUS radiusPayload = new RADIUS(RADIUS.RADIUS_CODE_ACCESS_REQUEST, 433 + radiusPayload = new RADIUS(RADIUS.RADIUS_CODE_ACCESS_REQUEST,
414 eapPacket.getIdentifier()); 434 eapPacket.getIdentifier());
415 radiusPayload.setIdentifier(stateMachine.identifier()); 435 radiusPayload.setIdentifier(stateMachine.identifier());
416 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME, 436 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_USERNAME,
...@@ -429,16 +449,14 @@ public class AAA { ...@@ -429,16 +449,14 @@ public class AAA {
429 sendRadiusMessage(radiusPayload); 449 sendRadiusMessage(radiusPayload);
430 // TODO: this gets called on every fragment, should only be called at TLS-Start 450 // TODO: this gets called on every fragment, should only be called at TLS-Start
431 stateMachine.requestAccess(); 451 stateMachine.requestAccess();
432 - } catch (StateMachineException e) { 452 +
433 - e.printStackTrace();
434 - }
435 break; 453 break;
436 default: 454 default:
437 return; 455 return;
438 } 456 }
439 break; 457 break;
440 default: 458 default:
441 - return; 459 + log.trace("Skipping EAPOL message {}", eapol.getEapolType());
442 } 460 }
443 } 461 }
444 462
...@@ -447,15 +465,15 @@ public class AAA { ...@@ -447,15 +465,15 @@ public class AAA {
447 * 465 *
448 * @param radiusPacket RADIUS packet coming from the RADIUS server. 466 * @param radiusPacket RADIUS packet coming from the RADIUS server.
449 */ 467 */
450 - private void handleRadiusPacket(RADIUS radiusPacket) { 468 + private void handleRadiusPacket(RADIUS radiusPacket) throws StateMachineException {
451 StateMachine stateMachine = StateMachine.lookupStateMachineById(radiusPacket.getIdentifier()); 469 StateMachine stateMachine = StateMachine.lookupStateMachineById(radiusPacket.getIdentifier());
452 if (stateMachine == null) { 470 if (stateMachine == null) {
453 log.error("Invalid session identifier, exiting..."); 471 log.error("Invalid session identifier, exiting...");
454 return; 472 return;
455 } 473 }
456 474
457 - EAP eapPayload = new EAP(); 475 + EAP eapPayload;
458 - Ethernet eth = null; 476 + Ethernet eth;
459 switch (radiusPacket.getCode()) { 477 switch (radiusPacket.getCode()) {
460 case RADIUS.RADIUS_CODE_ACCESS_CHALLENGE: 478 case RADIUS.RADIUS_CODE_ACCESS_CHALLENGE:
461 byte[] challengeState = radiusPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_STATE).getValue(); 479 byte[] challengeState = radiusPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_STATE).getValue();
...@@ -467,7 +485,6 @@ public class AAA { ...@@ -467,7 +485,6 @@ public class AAA {
467 this.sendPacketToSupplicant(eth, stateMachine.supplicantConnectpoint()); 485 this.sendPacketToSupplicant(eth, stateMachine.supplicantConnectpoint());
468 break; 486 break;
469 case RADIUS.RADIUS_CODE_ACCESS_ACCEPT: 487 case RADIUS.RADIUS_CODE_ACCESS_ACCEPT:
470 - try {
471 //send an EAPOL - Success to the supplicant. 488 //send an EAPOL - Success to the supplicant.
472 byte[] eapMessage = 489 byte[] eapMessage =
473 radiusPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_EAP_MESSAGE).getValue(); 490 radiusPacket.getAttribute(RADIUSAttribute.RADIUS_ATTR_EAP_MESSAGE).getValue();
...@@ -479,16 +496,9 @@ public class AAA { ...@@ -479,16 +496,9 @@ public class AAA {
479 this.sendPacketToSupplicant(eth, stateMachine.supplicantConnectpoint()); 496 this.sendPacketToSupplicant(eth, stateMachine.supplicantConnectpoint());
480 497
481 stateMachine.authorizeAccess(); 498 stateMachine.authorizeAccess();
482 - } catch (StateMachineException e) {
483 - e.printStackTrace();
484 - }
485 break; 499 break;
486 case RADIUS.RADIUS_CODE_ACCESS_REJECT: 500 case RADIUS.RADIUS_CODE_ACCESS_REJECT:
487 - try {
488 stateMachine.denyAccess(); 501 stateMachine.denyAccess();
489 - } catch (StateMachineException e) {
490 - e.printStackTrace();
491 - }
492 break; 502 break;
493 default: 503 default:
494 log.warn("Unknown RADIUS message received with code: {}", radiusPacket.getCode()); 504 log.warn("Unknown RADIUS message received with code: {}", radiusPacket.getCode());
......