Ray Milkey
Committed by Gerrit Code Review

Modify AAA app to use the network configuation service

Change-Id: Ie7e12dfd9a3b80c55db2b55bdfdf431db8157d24
...@@ -16,17 +16,13 @@ ...@@ -16,17 +16,13 @@
16 package org.onosproject.aaa; 16 package org.onosproject.aaa;
17 17
18 import java.net.InetAddress; 18 import java.net.InetAddress;
19 -import java.net.UnknownHostException;
20 import java.nio.ByteBuffer; 19 import java.nio.ByteBuffer;
21 -import java.util.Dictionary;
22 import java.util.Optional; 20 import java.util.Optional;
23 import java.util.Set; 21 import java.util.Set;
24 22
25 import org.apache.felix.scr.annotations.Activate; 23 import org.apache.felix.scr.annotations.Activate;
26 import org.apache.felix.scr.annotations.Component; 24 import org.apache.felix.scr.annotations.Component;
27 import org.apache.felix.scr.annotations.Deactivate; 25 import org.apache.felix.scr.annotations.Deactivate;
28 -import org.apache.felix.scr.annotations.Modified;
29 -import org.apache.felix.scr.annotations.Property;
30 import org.apache.felix.scr.annotations.Reference; 26 import org.apache.felix.scr.annotations.Reference;
31 import org.apache.felix.scr.annotations.ReferenceCardinality; 27 import org.apache.felix.scr.annotations.ReferenceCardinality;
32 import org.onlab.packet.DeserializationException; 28 import org.onlab.packet.DeserializationException;
...@@ -43,14 +39,16 @@ import org.onlab.packet.RADIUSAttribute; ...@@ -43,14 +39,16 @@ import org.onlab.packet.RADIUSAttribute;
43 import org.onlab.packet.TpPort; 39 import org.onlab.packet.TpPort;
44 import org.onlab.packet.UDP; 40 import org.onlab.packet.UDP;
45 import org.onlab.packet.VlanId; 41 import org.onlab.packet.VlanId;
46 -import org.onlab.util.Tools;
47 -import org.onosproject.cfg.ComponentConfigService;
48 import org.onosproject.core.ApplicationId; 42 import org.onosproject.core.ApplicationId;
49 import org.onosproject.core.CoreService; 43 import org.onosproject.core.CoreService;
50 import org.onosproject.net.ConnectPoint; 44 import org.onosproject.net.ConnectPoint;
51 import org.onosproject.net.DeviceId; 45 import org.onosproject.net.DeviceId;
52 import org.onosproject.net.Host; 46 import org.onosproject.net.Host;
53 import org.onosproject.net.PortNumber; 47 import org.onosproject.net.PortNumber;
48 +import org.onosproject.net.config.ConfigFactory;
49 +import org.onosproject.net.config.NetworkConfigEvent;
50 +import org.onosproject.net.config.NetworkConfigListener;
51 +import org.onosproject.net.config.NetworkConfigRegistry;
54 import org.onosproject.net.flow.DefaultTrafficSelector; 52 import org.onosproject.net.flow.DefaultTrafficSelector;
55 import org.onosproject.net.flow.DefaultTrafficTreatment; 53 import org.onosproject.net.flow.DefaultTrafficTreatment;
56 import org.onosproject.net.flow.TrafficSelector; 54 import org.onosproject.net.flow.TrafficSelector;
...@@ -63,43 +61,17 @@ import org.onosproject.net.packet.PacketContext; ...@@ -63,43 +61,17 @@ import org.onosproject.net.packet.PacketContext;
63 import org.onosproject.net.packet.PacketProcessor; 61 import org.onosproject.net.packet.PacketProcessor;
64 import org.onosproject.net.packet.PacketService; 62 import org.onosproject.net.packet.PacketService;
65 import org.onosproject.xosintegration.VoltTenantService; 63 import org.onosproject.xosintegration.VoltTenantService;
66 -import org.osgi.service.component.ComponentContext;
67 import org.slf4j.Logger; 64 import org.slf4j.Logger;
68 65
69 -import com.google.common.base.Strings; 66 +import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
70 -
71 import static org.onosproject.net.packet.PacketPriority.CONTROL; 67 import static org.onosproject.net.packet.PacketPriority.CONTROL;
72 import static org.slf4j.LoggerFactory.getLogger; 68 import static org.slf4j.LoggerFactory.getLogger;
73 69
74 -
75 /** 70 /**
76 * AAA application for ONOS. 71 * AAA application for ONOS.
77 */ 72 */
78 @Component(immediate = true) 73 @Component(immediate = true)
79 public class AAA { 74 public class AAA {
80 - // RADIUS server IP address
81 - private static final String DEFAULT_RADIUS_IP = "192.168.1.10";
82 -
83 - // NAS IP address
84 - private static final String DEFAULT_NAS_IP = "192.168.1.11";
85 -
86 - // RADIUS uplink port
87 - private static final int DEFAULT_RADIUS_UPLINK = 2;
88 -
89 - // RADIUS server shared secret
90 - private static final String DEFAULT_RADIUS_SECRET = "ONOSecret";
91 -
92 - // RADIUS MAC address
93 - private static final String RADIUS_MAC_ADDRESS = "00:00:00:00:01:10";
94 -
95 - // NAS MAC address
96 - private static final String NAS_MAC_ADDRESS = "00:00:00:00:10:01";
97 -
98 - // Radius Switch Id
99 - private static final String DEFAULT_RADIUS_SWITCH = "of:90e2ba82f97791e9";
100 -
101 - // Radius Port Number
102 - private static final String DEFAULT_RADIUS_PORT = "129";
103 75
104 // for verbose output 76 // for verbose output
105 private final Logger log = getLogger(getClass()); 77 private final Logger log = getLogger(getClass());
...@@ -121,46 +93,44 @@ public class AAA { ...@@ -121,46 +93,44 @@ public class AAA {
121 protected VoltTenantService voltTenantService; 93 protected VoltTenantService voltTenantService;
122 94
123 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 95 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
124 - protected ComponentConfigService cfgService; 96 + protected NetworkConfigRegistry netCfgService;
125 97
126 - // Parsed RADIUS server IP address 98 + // Parsed RADIUS server addresses
127 - protected InetAddress parsedRadiusIpAddress; 99 + protected InetAddress radiusIpAddress;
128 - // Parsed NAS IP address 100 + protected String radiusMacAddress;
129 - protected InetAddress parsedNasIpAddress;
130 101
131 - // our application-specific event handler 102 + // NAS IP address
132 - private ReactivePacketProcessor processor = new ReactivePacketProcessor(); 103 + protected InetAddress nasIpAddress;
133 - 104 + protected String nasMacAddress;
134 - // our unique identifier
135 - private ApplicationId appId;
136 105
137 - @Property(name = "radiusIpAddress", value = DEFAULT_RADIUS_IP, 106 + // RADIUS server secret
138 - label = "RADIUS IP Address") 107 + protected String radiusSecret;
139 - protected String radiusIpAddress = DEFAULT_RADIUS_IP;
140 108
141 - @Property(name = "nasIpAddress", value = DEFAULT_NAS_IP, 109 + // ID of RADIUS switch
142 - label = "NAS IP Address") 110 + protected String radiusSwitch;
143 - protected String nasIpAddress = DEFAULT_NAS_IP;
144 111
145 - @Property(name = "radiusMacAddress", value = RADIUS_MAC_ADDRESS, 112 + // RADIUS port number
146 - label = "RADIUS MAC Address") 113 + protected long radiusPort;
147 - protected String radiusMacAddress = RADIUS_MAC_ADDRESS;
148 114
149 - @Property(name = "nasMacAddress", value = NAS_MAC_ADDRESS, 115 + // our application-specific event handler
150 - label = "NAS MAC Address") 116 + private ReactivePacketProcessor processor = new ReactivePacketProcessor();
151 - protected String nasMacAddress = NAS_MAC_ADDRESS;
152 117
153 - @Property(name = "radiusSecret", value = DEFAULT_RADIUS_SECRET, 118 + // our unique identifier
154 - label = "RADIUS shared secret") 119 + private ApplicationId appId;
155 - protected String radiusSecret = DEFAULT_RADIUS_SECRET;
156 120
157 - @Property(name = "radiusSwitchId", value = DEFAULT_RADIUS_SWITCH, 121 + // Configuration properties factory
158 - label = "Radius switch") 122 + private final ConfigFactory factory =
159 - private String radiusSwitch = DEFAULT_RADIUS_SWITCH; 123 + new ConfigFactory<ApplicationId, AAAConfig>(APP_SUBJECT_FACTORY,
124 + AAAConfig.class,
125 + "AAA") {
126 + @Override
127 + public AAAConfig createConfig() {
128 + return new AAAConfig();
129 + }
130 + };
160 131
161 - @Property(name = "radiusPortNumber", value = DEFAULT_RADIUS_PORT, 132 + // Listener for config changes
162 - label = "Radius port") 133 + private final InternalConfigListener cfgListener = new InternalConfigListener();
163 - private String radiusPort = DEFAULT_RADIUS_PORT;
164 134
165 /** 135 /**
166 * Builds an EAPOL packet based on the given parameters. 136 * Builds an EAPOL packet based on the given parameters.
...@@ -195,47 +165,16 @@ public class AAA { ...@@ -195,47 +165,16 @@ public class AAA {
195 return eth; 165 return eth;
196 } 166 }
197 167
198 - @Modified
199 - public void modified(ComponentContext context) {
200 - Dictionary<?, ?> properties = context.getProperties();
201 -
202 - String s = Tools.get(properties, "radiusIpAddress");
203 - try {
204 - parsedRadiusIpAddress = InetAddress.getByName(s);
205 - radiusIpAddress = Strings.isNullOrEmpty(s) ? DEFAULT_RADIUS_IP : s;
206 - } catch (UnknownHostException e) {
207 - log.error("Invalid RADIUS IP address specification: {}", s, e);
208 - }
209 - try {
210 - s = Tools.get(properties, "nasIpAddress");
211 - parsedNasIpAddress = InetAddress.getByName(s);
212 - nasIpAddress = Strings.isNullOrEmpty(s) ? DEFAULT_NAS_IP : s;
213 - } catch (UnknownHostException e) {
214 - log.error("Invalid NAS IP address specification: {}", s, e);
215 - }
216 -
217 - s = Tools.get(properties, "radiusMacAddress");
218 - radiusMacAddress = Strings.isNullOrEmpty(s) ? RADIUS_MAC_ADDRESS : s;
219 -
220 - s = Tools.get(properties, "nasMacAddress");
221 - nasMacAddress = Strings.isNullOrEmpty(s) ? NAS_MAC_ADDRESS : s;
222 -
223 - s = Tools.get(properties, "radiusSecret");
224 - radiusSecret = Strings.isNullOrEmpty(s) ? DEFAULT_RADIUS_SECRET : s;
225 -
226 - s = Tools.get(properties, "radiusSwitchId");
227 - radiusSwitch = Strings.isNullOrEmpty(s) ? DEFAULT_RADIUS_SWITCH : s;
228 -
229 - s = Tools.get(properties, "radiusPortNumber");
230 - radiusPort = Strings.isNullOrEmpty(s) ? DEFAULT_RADIUS_PORT : s;
231 - }
232 -
233 @Activate 168 @Activate
234 - public void activate(ComponentContext context) { 169 + public void activate() {
235 - cfgService.registerProperties(getClass()); 170 + netCfgService.addListener(cfgListener);
236 - modified(context); 171 + netCfgService.registerConfigFactory(factory);
172 +
237 // "org.onosproject.aaa" is the FQDN of our app 173 // "org.onosproject.aaa" is the FQDN of our app
238 appId = coreService.registerApplication("org.onosproject.aaa"); 174 appId = coreService.registerApplication("org.onosproject.aaa");
175 +
176 + cfgListener.reconfigureNetwork(netCfgService.getConfig(appId, AAAConfig.class));
177 +
239 // register our event handler 178 // register our event handler
240 packetService.addProcessor(processor, PacketProcessor.director(2)); 179 packetService.addProcessor(processor, PacketProcessor.director(2));
241 requestIntercepts(); 180 requestIntercepts();
...@@ -247,8 +186,6 @@ public class AAA { ...@@ -247,8 +186,6 @@ public class AAA {
247 186
248 @Deactivate 187 @Deactivate
249 public void deactivate() { 188 public void deactivate() {
250 - cfgService.unregisterProperties(getClass(), false);
251 -
252 appId = coreService.registerApplication("org.onosproject.aaa"); 189 appId = coreService.registerApplication("org.onosproject.aaa");
253 withdrawIntercepts(); 190 withdrawIntercepts();
254 // de-register and null our handler 191 // de-register and null our handler
...@@ -316,7 +253,7 @@ public class AAA { ...@@ -316,7 +253,7 @@ public class AAA {
316 case IPV4: 253 case IPV4:
317 IPv4 ipv4Packet = (IPv4) ethPkt.getPayload(); 254 IPv4 ipv4Packet = (IPv4) ethPkt.getPayload();
318 Ip4Address srcIp = Ip4Address.valueOf(ipv4Packet.getSourceAddress()); 255 Ip4Address srcIp = Ip4Address.valueOf(ipv4Packet.getSourceAddress());
319 - Ip4Address radiusIp4Address = Ip4Address.valueOf(parsedRadiusIpAddress); 256 + Ip4Address radiusIp4Address = Ip4Address.valueOf(radiusIpAddress);
320 if (srcIp.equals(radiusIp4Address) && ipv4Packet.getProtocol() == IPv4.PROTOCOL_UDP) { 257 if (srcIp.equals(radiusIp4Address) && ipv4Packet.getProtocol() == IPv4.PROTOCOL_UDP) {
321 // TODO: check for port as well when it's configurable 258 // TODO: check for port as well when it's configurable
322 UDP udpPacket = (UDP) ipv4Packet.getPayload(); 259 UDP udpPacket = (UDP) ipv4Packet.getPayload();
...@@ -341,7 +278,7 @@ public class AAA { ...@@ -341,7 +278,7 @@ public class AAA {
341 * Creates and initializes common fields of a RADIUS packet. 278 * Creates and initializes common fields of a RADIUS packet.
342 * 279 *
343 * @param identifier RADIUS identifier 280 * @param identifier RADIUS identifier
344 - * @param eapPacket EAP packet 281 + * @param eapPacket EAP packet
345 * @return RADIUS packet 282 * @return RADIUS packet
346 */ 283 */
347 private RADIUS getRadiusPayload(byte identifier, EAP eapPacket) { 284 private RADIUS getRadiusPayload(byte identifier, EAP eapPacket) {
...@@ -353,7 +290,7 @@ public class AAA { ...@@ -353,7 +290,7 @@ public class AAA {
353 eapPacket.getData()); 290 eapPacket.getData());
354 291
355 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP, 292 radiusPayload.setAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP,
356 - AAA.this.parsedNasIpAddress.getAddress()); 293 + AAA.this.nasIpAddress.getAddress());
357 294
358 radiusPayload.encapsulateMessage(eapPacket); 295 radiusPayload.encapsulateMessage(eapPacket);
359 radiusPayload.addMessageAuthenticator(AAA.this.radiusSecret); 296 radiusPayload.addMessageAuthenticator(AAA.this.radiusSecret);
...@@ -519,8 +456,8 @@ public class AAA { ...@@ -519,8 +456,8 @@ public class AAA {
519 udp.setSourcePort((short) 1812); // TODO: make this configurable 456 udp.setSourcePort((short) 1812); // TODO: make this configurable
520 udp.setPayload(radiusMessage); 457 udp.setPayload(radiusMessage);
521 udp.setParent(ip4Packet); 458 udp.setParent(ip4Packet);
522 - ip4Packet.setSourceAddress(AAA.this.nasIpAddress); 459 + ip4Packet.setSourceAddress(AAA.this.nasIpAddress.getHostAddress());
523 - ip4Packet.setDestinationAddress(AAA.this.radiusIpAddress); 460 + ip4Packet.setDestinationAddress(AAA.this.radiusIpAddress.getHostAddress());
524 ip4Packet.setProtocol(IPv4.PROTOCOL_UDP); 461 ip4Packet.setProtocol(IPv4.PROTOCOL_UDP);
525 ip4Packet.setPayload(udp); 462 ip4Packet.setPayload(udp);
526 ip4Packet.setParent(ethPkt); 463 ip4Packet.setParent(ethPkt);
...@@ -530,7 +467,7 @@ public class AAA { ...@@ -530,7 +467,7 @@ public class AAA {
530 ethPkt.setPayload(ip4Packet); 467 ethPkt.setPayload(ip4Packet);
531 468
532 TrafficTreatment treatment = DefaultTrafficTreatment.builder() 469 TrafficTreatment treatment = DefaultTrafficTreatment.builder()
533 - .setOutput(PortNumber.portNumber(Integer.parseInt(radiusPort))).build(); 470 + .setOutput(PortNumber.portNumber(radiusPort)).build();
534 OutboundPacket packet = new DefaultOutboundPacket(DeviceId.deviceId(radiusSwitch), 471 OutboundPacket packet = new DefaultOutboundPacket(DeviceId.deviceId(radiusSwitch),
535 treatment, ByteBuffer.wrap(ethPkt.serialize())); 472 treatment, ByteBuffer.wrap(ethPkt.serialize()));
536 packetService.emit(packet); 473 packetService.emit(packet);
...@@ -552,4 +489,65 @@ public class AAA { ...@@ -552,4 +489,65 @@ public class AAA {
552 489
553 } 490 }
554 491
492 + private class InternalConfigListener implements NetworkConfigListener {
493 +
494 + /**
495 + * Reconfigures the DHCP Server according to the configuration parameters passed.
496 + *
497 + * @param cfg configuration object
498 + */
499 + private void reconfigureNetwork(AAAConfig cfg) {
500 + AAAConfig newCfg;
501 + if (cfg == null) {
502 + newCfg = new AAAConfig();
503 + } else {
504 + newCfg = cfg;
505 + }
506 + if (newCfg.nasIp() != null) {
507 + nasIpAddress = newCfg.nasIp();
508 + }
509 + if (newCfg.radiusIp() != null) {
510 + radiusIpAddress = newCfg.radiusIp();
511 + }
512 + if (newCfg.radiusMac() != null) {
513 + radiusMacAddress = newCfg.radiusMac();
514 + }
515 + if (newCfg.nasMac() != null) {
516 + nasMacAddress = newCfg.nasMac();
517 + }
518 + if (newCfg.radiusSecret() != null) {
519 + radiusSecret = newCfg.radiusSecret();
520 + }
521 + if (newCfg.radiusSwitch() != null) {
522 + radiusSwitch = newCfg.radiusSwitch();
523 + }
524 + if (newCfg.radiusPort() != -1) {
525 + radiusPort = newCfg.radiusPort();
526 + }
527 +
528 + log.info("AAA app configuration:");
529 + log.info("NAS IP is {}", nasIpAddress);
530 + log.info("RADIUS IP is {}", radiusIpAddress);
531 + log.info("NAS MAC is {}", nasMacAddress);
532 + log.info("RADIUS MAC is {}", radiusMacAddress);
533 + log.info("RADIUS secret is {}", radiusSecret);
534 + log.info("RADIUS switch is {}", radiusSwitch);
535 + log.info("RADIUS port is {}", radiusPort);
536 + }
537 +
538 + @Override
539 + public void event(NetworkConfigEvent event) {
540 +
541 + if ((event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
542 + event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED) &&
543 + event.configClass().equals(AAAConfig.class)) {
544 +
545 + AAAConfig cfg = netCfgService.getConfig(appId, AAAConfig.class);
546 + reconfigureNetwork(cfg);
547 + log.info("Reconfigured");
548 + }
549 + }
550 + }
551 +
552 +
555 } 553 }
......
1 +/*
2 + * Copyright 2015 Open Networking Laboratory
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 +package org.onosproject.aaa;
17 +
18 +import java.net.InetAddress;
19 +import java.net.UnknownHostException;
20 +
21 +import org.onosproject.core.ApplicationId;
22 +import org.onosproject.net.config.Config;
23 +import org.onosproject.net.config.basics.BasicElementConfig;
24 +
25 +/**
26 + * Network config for the AAA app.
27 + */
28 +public class AAAConfig extends Config<ApplicationId> {
29 +
30 + private static final String RADIUS_IP = "radiusIp";
31 + private static final String RADIUS_MAC = "radiusMac";
32 + private static final String NAS_IP = "nasIp";
33 + private static final String NAS_MAC = "nasMac";
34 + private static final String RADIUS_SECRET = "radiusSecret";
35 + private static final String RADIUS_SWITCH = "radiusSwitch";
36 + private static final String RADIUS_PORT = "radiusPort";
37 +
38 + // RADIUS server IP address
39 + protected static final String DEFAULT_RADIUS_IP = "192.168.1.10";
40 +
41 + // RADIUS MAC address
42 + protected static final String DEFAULT_RADIUS_MAC = "00:00:00:00:01:10";
43 +
44 + // NAS IP address
45 + protected static final String DEFAULT_NAS_IP = "192.168.1.11";
46 +
47 + // NAS MAC address
48 + protected static final String DEFAULT_NAS_MAC = "00:00:00:00:10:01";
49 +
50 + // RADIUS uplink port
51 + protected static final int DEFAULT_RADIUS_UPLINK = 2;
52 +
53 + // RADIUS server shared secret
54 + protected static final String DEFAULT_RADIUS_SECRET = "ONOSecret";
55 +
56 + // Radius Switch Id
57 + protected static final String DEFAULT_RADIUS_SWITCH = "of:90e2ba82f97791e9";
58 +
59 + // Radius Port Number
60 + protected static final String DEFAULT_RADIUS_PORT = "129";
61 +
62 + /**
63 + * Returns the NAS ip.
64 + *
65 + * @return ip address or null if not set
66 + */
67 + public InetAddress nasIp() {
68 + try {
69 + if (object == null) {
70 + return InetAddress.getByName(DEFAULT_NAS_IP);
71 + }
72 + return InetAddress.getByName(get(NAS_IP, DEFAULT_NAS_IP));
73 + } catch (UnknownHostException e) {
74 + return null;
75 + }
76 + }
77 +
78 + /**
79 + * Sets the NAS ip.
80 + *
81 + * @param ip new ip address; null to clear
82 + * @return self
83 + */
84 + public BasicElementConfig nasIp(String ip) {
85 + return (BasicElementConfig) setOrClear(NAS_IP, ip);
86 + }
87 +
88 + /**
89 + * Returns the RADIUS server ip.
90 + *
91 + * @return ip address or null if not set
92 + */
93 + public InetAddress radiusIp() {
94 + try {
95 + if (object == null) {
96 + return InetAddress.getByName(DEFAULT_RADIUS_IP);
97 + }
98 + return InetAddress.getByName(get(RADIUS_IP, DEFAULT_RADIUS_IP));
99 + } catch (UnknownHostException e) {
100 + return null;
101 + }
102 + }
103 +
104 + /**
105 + * Sets the RADIUS server ip.
106 + *
107 + * @param ip new ip address; null to clear
108 + * @return self
109 + */
110 + public BasicElementConfig radiusIp(String ip) {
111 + return (BasicElementConfig) setOrClear(RADIUS_IP, ip);
112 + }
113 +
114 + /**
115 + * Returns the RADIUS MAC address.
116 + *
117 + * @return mac address or null if not set
118 + */
119 + public String radiusMac() {
120 + if (object == null) {
121 + return DEFAULT_RADIUS_MAC;
122 + }
123 + return get(RADIUS_MAC, DEFAULT_RADIUS_MAC);
124 + }
125 +
126 + /**
127 + * Sets the RADIUS MAC address.
128 + *
129 + * @param mac new MAC address; null to clear
130 + * @return self
131 + */
132 + public BasicElementConfig radiusMac(String mac) {
133 + return (BasicElementConfig) setOrClear(RADIUS_MAC, mac);
134 + }
135 +
136 + /**
137 + * Returns the RADIUS MAC address.
138 + *
139 + * @return mac address or null if not set
140 + */
141 + public String nasMac() {
142 + if (object == null) {
143 + return DEFAULT_NAS_MAC;
144 + }
145 + return get(NAS_MAC, DEFAULT_NAS_MAC);
146 + }
147 +
148 + /**
149 + * Sets the RADIUS MAC address.
150 + *
151 + * @param mac new MAC address; null to clear
152 + * @return self
153 + */
154 + public BasicElementConfig nasMac(String mac) {
155 + return (BasicElementConfig) setOrClear(NAS_MAC, mac);
156 + }
157 +
158 + /**
159 + * Returns the RADIUS secret.
160 + *
161 + * @return radius secret or null if not set
162 + */
163 + public String radiusSecret() {
164 + if (object == null) {
165 + return DEFAULT_RADIUS_SECRET;
166 + }
167 + return get(RADIUS_SECRET, DEFAULT_RADIUS_SECRET);
168 + }
169 +
170 + /**
171 + * Sets the RADIUS secret.
172 + *
173 + * @param secret new MAC address; null to clear
174 + * @return self
175 + */
176 + public BasicElementConfig radiusSecret(String secret) {
177 + return (BasicElementConfig) setOrClear(RADIUS_SECRET, secret);
178 + }
179 +
180 + /**
181 + * Returns the ID of the RADIUS switch.
182 + *
183 + * @return radius switch ID or null if not set
184 + */
185 + public String radiusSwitch() {
186 + if (object == null) {
187 + return DEFAULT_RADIUS_SWITCH;
188 + }
189 + return get(RADIUS_SWITCH, DEFAULT_RADIUS_SWITCH);
190 + }
191 +
192 + /**
193 + * Sets the ID of the RADIUS switch.
194 + *
195 + * @param switchId new RADIUS switch ID; null to clear
196 + * @return self
197 + */
198 + public BasicElementConfig radiusSwitch(String switchId) {
199 + return (BasicElementConfig) setOrClear(RADIUS_SWITCH, switchId);
200 + }
201 +
202 + /**
203 + * Returns the RADIUS port.
204 + *
205 + * @return radius port or null if not set
206 + */
207 + public long radiusPort() {
208 + if (object == null) {
209 + return Integer.parseInt(DEFAULT_RADIUS_PORT);
210 + }
211 + return Integer.parseInt(get(RADIUS_PORT, "-1"));
212 + }
213 +
214 + /**
215 + * Sets the RADIUS port.
216 + *
217 + * @param port new RADIUS port; null to clear
218 + * @return self
219 + */
220 + public BasicElementConfig radiusPort(long port) {
221 + return (BasicElementConfig) setOrClear(RADIUS_PORT, port);
222 + }
223 +
224 +}
...@@ -23,7 +23,6 @@ import java.util.Set; ...@@ -23,7 +23,6 @@ import java.util.Set;
23 import org.junit.After; 23 import org.junit.After;
24 import org.junit.Before; 24 import org.junit.Before;
25 import org.junit.Test; 25 import org.junit.Test;
26 -import org.onlab.osgi.ComponentContextAdapter;
27 import org.onlab.packet.Data; 26 import org.onlab.packet.Data;
28 import org.onlab.packet.DeserializationException; 27 import org.onlab.packet.DeserializationException;
29 import org.onlab.packet.EAP; 28 import org.onlab.packet.EAP;
...@@ -37,12 +36,13 @@ import org.onlab.packet.RADIUS; ...@@ -37,12 +36,13 @@ import org.onlab.packet.RADIUS;
37 import org.onlab.packet.RADIUSAttribute; 36 import org.onlab.packet.RADIUSAttribute;
38 import org.onlab.packet.UDP; 37 import org.onlab.packet.UDP;
39 import org.onlab.packet.VlanId; 38 import org.onlab.packet.VlanId;
40 -import org.onosproject.cfg.ComponentConfigAdapter;
41 import org.onosproject.core.CoreServiceAdapter; 39 import org.onosproject.core.CoreServiceAdapter;
42 import org.onosproject.net.Annotations; 40 import org.onosproject.net.Annotations;
43 import org.onosproject.net.Host; 41 import org.onosproject.net.Host;
44 import org.onosproject.net.HostId; 42 import org.onosproject.net.HostId;
45 import org.onosproject.net.HostLocation; 43 import org.onosproject.net.HostLocation;
44 +import org.onosproject.net.config.Config;
45 +import org.onosproject.net.config.NetworkConfigRegistryAdapter;
46 import org.onosproject.net.host.HostServiceAdapter; 46 import org.onosproject.net.host.HostServiceAdapter;
47 import org.onosproject.net.packet.DefaultInboundPacket; 47 import org.onosproject.net.packet.DefaultInboundPacket;
48 import org.onosproject.net.packet.DefaultPacketContext; 48 import org.onosproject.net.packet.DefaultPacketContext;
...@@ -173,6 +173,18 @@ public class AAATest { ...@@ -173,6 +173,18 @@ public class AAATest {
173 } 173 }
174 174
175 /** 175 /**
176 + * Mocks the network config registry.
177 + */
178 + @SuppressWarnings("unchecked")
179 + private static final class TestNetworkConfigRegistry
180 + extends NetworkConfigRegistryAdapter {
181 + @Override
182 + public <S, C extends Config<S>> C getConfig(S subject, Class<C> configClass) {
183 + return (C) new AAAConfig();
184 + }
185 + }
186 +
187 + /**
176 * Sends an Ethernet packet to the process method of the Packet Processor. 188 * Sends an Ethernet packet to the process method of the Packet Processor.
177 * 189 *
178 * @param reply Ethernet packet 190 * @param reply Ethernet packet
...@@ -261,7 +273,7 @@ public class AAATest { ...@@ -261,7 +273,7 @@ public class AAATest {
261 273
262 IPv4 ipv4 = new IPv4(); 274 IPv4 ipv4 = new IPv4();
263 ipv4.setProtocol(IPv4.PROTOCOL_UDP); 275 ipv4.setProtocol(IPv4.PROTOCOL_UDP);
264 - ipv4.setSourceAddress("127.0.0.1"); 276 + ipv4.setSourceAddress(aaa.radiusIpAddress.getHostAddress());
265 277
266 String challenge = "1234"; 278 String challenge = "1234";
267 279
...@@ -294,11 +306,11 @@ public class AAATest { ...@@ -294,11 +306,11 @@ public class AAATest {
294 @Before 306 @Before
295 public void setUp() { 307 public void setUp() {
296 aaa = new AAA(); 308 aaa = new AAA();
297 - aaa.cfgService = new ComponentConfigAdapter(); 309 + aaa.netCfgService = new TestNetworkConfigRegistry();
298 aaa.coreService = new CoreServiceAdapter(); 310 aaa.coreService = new CoreServiceAdapter();
299 aaa.packetService = new MockPacketService(); 311 aaa.packetService = new MockPacketService();
300 aaa.hostService = new MockHostService(); 312 aaa.hostService = new MockHostService();
301 - aaa.activate(new ComponentContextAdapter()); 313 + aaa.activate();
302 } 314 }
303 315
304 /** 316 /**
...@@ -328,9 +340,9 @@ public class AAATest { ...@@ -328,9 +340,9 @@ public class AAATest {
328 IPv4 ipv4 = (IPv4) supplicantPacket.getPayload(); 340 IPv4 ipv4 = (IPv4) supplicantPacket.getPayload();
329 assertThat(ipv4, notNullValue()); 341 assertThat(ipv4, notNullValue());
330 assertThat(IpAddress.valueOf(ipv4.getSourceAddress()).toString(), 342 assertThat(IpAddress.valueOf(ipv4.getSourceAddress()).toString(),
331 - is(aaa.nasIpAddress)); 343 + is(aaa.nasIpAddress.getHostAddress()));
332 assertThat(IpAddress.valueOf(ipv4.getDestinationAddress()).toString(), 344 assertThat(IpAddress.valueOf(ipv4.getDestinationAddress()).toString(),
333 - is(aaa.radiusIpAddress)); 345 + is(aaa.radiusIpAddress.getHostAddress()));
334 346
335 assertThat(ipv4.getPayload(), instanceOf(UDP.class)); 347 assertThat(ipv4.getPayload(), instanceOf(UDP.class));
336 UDP udp = (UDP) ipv4.getPayload(); 348 UDP udp = (UDP) ipv4.getPayload();
...@@ -418,7 +430,7 @@ public class AAATest { ...@@ -418,7 +430,7 @@ public class AAATest {
418 IpAddress.valueOf(IpAddress.Version.INET, 430 IpAddress.valueOf(IpAddress.Version.INET,
419 radiusAccessRequest.getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP) 431 radiusAccessRequest.getAttribute(RADIUSAttribute.RADIUS_ATTR_NAS_IP)
420 .getValue()); 432 .getValue());
421 - assertThat(nasIp.toString(), is("127.0.0.1")); 433 + assertThat(nasIp.toString(), is(aaa.nasIpAddress.getHostAddress()));
422 434
423 // State machine should have been created by now 435 // State machine should have been created by now
424 436
...@@ -482,4 +494,20 @@ public class AAATest { ...@@ -482,4 +494,20 @@ public class AAATest {
482 assertThat(stateMachine, notNullValue()); 494 assertThat(stateMachine, notNullValue());
483 assertThat(stateMachine.state(), is(StateMachine.STATE_AUTHORIZED)); 495 assertThat(stateMachine.state(), is(StateMachine.STATE_AUTHORIZED));
484 } 496 }
497 +
498 +
499 + private static final String RADIUS_SECRET = "radiusSecret";
500 + private static final String RADIUS_SWITCH = "radiusSwitch";
501 + private static final String RADIUS_PORT = "radiusPort";
502 +
503 + /**
504 + * Tests the default configuration.
505 + */
506 + @Test
507 + public void testConfig() {
508 + assertThat(aaa.nasIpAddress.getHostAddress(), is(AAAConfig.DEFAULT_NAS_IP));
509 + assertThat(aaa.nasMacAddress, is(AAAConfig.DEFAULT_NAS_MAC));
510 + assertThat(aaa.radiusIpAddress.getHostAddress(), is(AAAConfig.DEFAULT_RADIUS_IP));
511 + assertThat(aaa.radiusMacAddress, is(AAAConfig.DEFAULT_RADIUS_MAC));
512 + }
485 } 513 }
......