Committed by
Gerrit Code Review
NullDeviceProvider now takes configurations for :
- Number of devices per ONOS instance. - Number of ports on the devices. This value is global. The islands created by each instances' providers are joined together in a chain (circle). Reference : ONOS-860 Change-Id: I875ad1fbc1d4441869373c25de2ae5b62838e0d4
Showing
5 changed files
with
188 additions
and
19 deletions
... | @@ -31,4 +31,11 @@ | ... | @@ -31,4 +31,11 @@ |
31 | 31 | ||
32 | <description>ONOS Null protocol device provider</description> | 32 | <description>ONOS Null protocol device provider</description> |
33 | 33 | ||
34 | + <dependencies> | ||
35 | + <dependency> | ||
36 | + <groupId>org.osgi</groupId> | ||
37 | + <artifactId>org.osgi.compendium</artifactId> | ||
38 | + </dependency> | ||
39 | + </dependencies> | ||
40 | + | ||
34 | </project> | 41 | </project> | ... | ... |
providers/null/device/src/main/java/org/onosproject/provider/nil/device/impl/NullDeviceProvider.java
... | @@ -15,16 +15,21 @@ | ... | @@ -15,16 +15,21 @@ |
15 | */ | 15 | */ |
16 | package org.onosproject.provider.nil.device.impl; | 16 | package org.onosproject.provider.nil.device.impl; |
17 | 17 | ||
18 | +import static com.google.common.base.Strings.isNullOrEmpty; | ||
18 | 19 | ||
19 | import com.google.common.collect.Lists; | 20 | import com.google.common.collect.Lists; |
20 | import com.google.common.collect.Maps; | 21 | import com.google.common.collect.Maps; |
22 | + | ||
21 | import org.apache.felix.scr.annotations.Activate; | 23 | import org.apache.felix.scr.annotations.Activate; |
22 | import org.apache.felix.scr.annotations.Component; | 24 | import org.apache.felix.scr.annotations.Component; |
23 | import org.apache.felix.scr.annotations.Deactivate; | 25 | import org.apache.felix.scr.annotations.Deactivate; |
26 | +import org.apache.felix.scr.annotations.Modified; | ||
27 | +import org.apache.felix.scr.annotations.Property; | ||
24 | import org.apache.felix.scr.annotations.Reference; | 28 | import org.apache.felix.scr.annotations.Reference; |
25 | import org.apache.felix.scr.annotations.ReferenceCardinality; | 29 | import org.apache.felix.scr.annotations.ReferenceCardinality; |
26 | import org.onlab.packet.ChassisId; | 30 | import org.onlab.packet.ChassisId; |
27 | import org.onosproject.cluster.ClusterService; | 31 | import org.onosproject.cluster.ClusterService; |
32 | +import org.onosproject.cluster.NodeId; | ||
28 | import org.onosproject.net.Device; | 33 | import org.onosproject.net.Device; |
29 | import org.onosproject.net.DeviceId; | 34 | import org.onosproject.net.DeviceId; |
30 | import org.onosproject.net.MastershipRole; | 35 | import org.onosproject.net.MastershipRole; |
... | @@ -39,10 +44,12 @@ import org.onosproject.net.device.DeviceProviderService; | ... | @@ -39,10 +44,12 @@ import org.onosproject.net.device.DeviceProviderService; |
39 | import org.onosproject.net.device.PortDescription; | 44 | import org.onosproject.net.device.PortDescription; |
40 | import org.onosproject.net.provider.AbstractProvider; | 45 | import org.onosproject.net.provider.AbstractProvider; |
41 | import org.onosproject.net.provider.ProviderId; | 46 | import org.onosproject.net.provider.ProviderId; |
47 | +import org.osgi.service.component.ComponentContext; | ||
42 | import org.slf4j.Logger; | 48 | import org.slf4j.Logger; |
43 | 49 | ||
44 | import java.net.URI; | 50 | import java.net.URI; |
45 | import java.net.URISyntaxException; | 51 | import java.net.URISyntaxException; |
52 | +import java.util.Dictionary; | ||
46 | import java.util.List; | 53 | import java.util.List; |
47 | import java.util.Map; | 54 | import java.util.Map; |
48 | import java.util.concurrent.ExecutorService; | 55 | import java.util.concurrent.ExecutorService; |
... | @@ -78,14 +85,22 @@ public class NullDeviceProvider extends AbstractProvider implements DeviceProvid | ... | @@ -78,14 +85,22 @@ public class NullDeviceProvider extends AbstractProvider implements DeviceProvid |
78 | 85 | ||
79 | //currently hardcoded. will be made configurable via rest/cli. | 86 | //currently hardcoded. will be made configurable via rest/cli. |
80 | private static final String SCHEME = "null"; | 87 | private static final String SCHEME = "null"; |
81 | - private static final int NUMDEVICES = 10; | 88 | + private static final int DEF_NUMDEVICES = 10; |
82 | - private static final int NUMPORTSPERDEVICE = 10; | 89 | + private static final int DEF_NUMPORTS = 10; |
83 | 90 | ||
84 | //Delay between events in ms. | 91 | //Delay between events in ms. |
85 | private static final int EVENTINTERVAL = 5; | 92 | private static final int EVENTINTERVAL = 5; |
86 | 93 | ||
87 | private final Map<Integer, DeviceDescription> descriptions = Maps.newHashMap(); | 94 | private final Map<Integer, DeviceDescription> descriptions = Maps.newHashMap(); |
88 | 95 | ||
96 | + @Property(name = "devConfigs", value = "", label = "Instance-specific configurations") | ||
97 | + private String devConfigs = ""; | ||
98 | + | ||
99 | + private int numDevices = DEF_NUMDEVICES; | ||
100 | + | ||
101 | + @Property(name = "numPorts", intValue = DEF_NUMPORTS, label = "Number of ports per devices") | ||
102 | + private int numPorts = DEF_NUMPORTS; | ||
103 | + | ||
89 | private DeviceCreator creator; | 104 | private DeviceCreator creator; |
90 | 105 | ||
91 | 106 | ||
... | @@ -99,15 +114,17 @@ public class NullDeviceProvider extends AbstractProvider implements DeviceProvid | ... | @@ -99,15 +114,17 @@ public class NullDeviceProvider extends AbstractProvider implements DeviceProvid |
99 | } | 114 | } |
100 | 115 | ||
101 | @Activate | 116 | @Activate |
102 | - public void activate() { | 117 | + public void activate(ComponentContext context) { |
103 | providerService = providerRegistry.register(this); | 118 | providerService = providerRegistry.register(this); |
104 | - deviceBuilder.submit(new DeviceCreator(true)); | 119 | + if (modified(context)) { |
120 | + deviceBuilder.submit(new DeviceCreator(true)); | ||
121 | + } | ||
105 | log.info("Started"); | 122 | log.info("Started"); |
106 | 123 | ||
107 | } | 124 | } |
108 | 125 | ||
109 | @Deactivate | 126 | @Deactivate |
110 | - public void deactivate() { | 127 | + public void deactivate(ComponentContext context) { |
111 | deviceBuilder.submit(new DeviceCreator(false)); | 128 | deviceBuilder.submit(new DeviceCreator(false)); |
112 | try { | 129 | try { |
113 | deviceBuilder.awaitTermination(1000, TimeUnit.MILLISECONDS); | 130 | deviceBuilder.awaitTermination(1000, TimeUnit.MILLISECONDS); |
... | @@ -121,6 +138,57 @@ public class NullDeviceProvider extends AbstractProvider implements DeviceProvid | ... | @@ -121,6 +138,57 @@ public class NullDeviceProvider extends AbstractProvider implements DeviceProvid |
121 | log.info("Stopped"); | 138 | log.info("Stopped"); |
122 | } | 139 | } |
123 | 140 | ||
141 | + @Modified | ||
142 | + public boolean modified(ComponentContext context) { | ||
143 | + if (context == null) { | ||
144 | + log.info("No configuration file, using defaults: numDevices={}, numPorts={}", | ||
145 | + numDevices, numPorts); | ||
146 | + return false; | ||
147 | + } | ||
148 | + | ||
149 | + Dictionary<?, ?> properties = context.getProperties(); | ||
150 | + | ||
151 | + int newDevNum = DEF_NUMDEVICES; | ||
152 | + int newPortNum = DEF_NUMPORTS; | ||
153 | + try { | ||
154 | + String s = (String) properties.get("devConfigs"); | ||
155 | + if (!isNullOrEmpty(s)) { | ||
156 | + newDevNum = getDevicesConfig(s); | ||
157 | + } | ||
158 | + s = (String) properties.get("numPorts"); | ||
159 | + newPortNum = isNullOrEmpty(s) ? DEF_NUMPORTS : Integer.valueOf(s.trim()); | ||
160 | + } catch (Exception e) { | ||
161 | + log.warn(e.getMessage()); | ||
162 | + } | ||
163 | + | ||
164 | + boolean chgd = false; | ||
165 | + if (newDevNum != numDevices) { | ||
166 | + numDevices = newDevNum; | ||
167 | + chgd |= true; | ||
168 | + } | ||
169 | + if (newPortNum != numPorts) { | ||
170 | + numPorts = newPortNum; | ||
171 | + chgd |= true; | ||
172 | + } | ||
173 | + log.info("Using settings numDevices={}, numPorts={}", numDevices, numPorts); | ||
174 | + return chgd; | ||
175 | + } | ||
176 | + | ||
177 | + private int getDevicesConfig(String config) { | ||
178 | + for (String sub : config.split(",")) { | ||
179 | + String[] params = sub.split(":"); | ||
180 | + if (params.length == 2) { | ||
181 | + NodeId that = new NodeId(params[0].trim()); | ||
182 | + String nd = params[1]; | ||
183 | + if (clusterService.getLocalNode().id().equals(that)) { | ||
184 | + return Integer.valueOf(nd.trim()); | ||
185 | + } | ||
186 | + continue; | ||
187 | + } | ||
188 | + } | ||
189 | + return DEF_NUMDEVICES; | ||
190 | + } | ||
191 | + | ||
124 | @Override | 192 | @Override |
125 | public void triggerProbe(DeviceId deviceId) {} | 193 | public void triggerProbe(DeviceId deviceId) {} |
126 | 194 | ||
... | @@ -169,10 +237,13 @@ public class NullDeviceProvider extends AbstractProvider implements DeviceProvid | ... | @@ -169,10 +237,13 @@ public class NullDeviceProvider extends AbstractProvider implements DeviceProvid |
169 | ChassisId cid; | 237 | ChassisId cid; |
170 | 238 | ||
171 | // nodeIdHash takes into account for nodeID to avoid collisions when running multi-node providers. | 239 | // nodeIdHash takes into account for nodeID to avoid collisions when running multi-node providers. |
172 | - int nodeIdHash = (clusterService.getLocalNode().hashCode() % NUMDEVICES) * NUMDEVICES; | 240 | + long nodeIdHash = clusterService.getLocalNode().hashCode() << 16; |
241 | + | ||
242 | + for (int i = 0; i < numDevices; i++) { | ||
243 | + // mark 'last' device to facilitate chaining of islands together | ||
244 | + long id = (i + 1 == numDevices) ? nodeIdHash | 0xffff : nodeIdHash | i; | ||
173 | 245 | ||
174 | - for (int i = nodeIdHash; i < nodeIdHash + NUMDEVICES; i++) { | 246 | + did = DeviceId.deviceId(new URI(SCHEME, toHex(id), null)); |
175 | - did = DeviceId.deviceId(new URI(SCHEME, toHex(i), null)); | ||
176 | cid = new ChassisId(i); | 247 | cid = new ChassisId(i); |
177 | DeviceDescription desc = | 248 | DeviceDescription desc = |
178 | new DefaultDeviceDescription(did.uri(), Device.Type.SWITCH, | 249 | new DefaultDeviceDescription(did.uri(), Device.Type.SWITCH, |
... | @@ -187,10 +258,10 @@ public class NullDeviceProvider extends AbstractProvider implements DeviceProvid | ... | @@ -187,10 +258,10 @@ public class NullDeviceProvider extends AbstractProvider implements DeviceProvid |
187 | 258 | ||
188 | private List<PortDescription> buildPorts() { | 259 | private List<PortDescription> buildPorts() { |
189 | List<PortDescription> ports = Lists.newArrayList(); | 260 | List<PortDescription> ports = Lists.newArrayList(); |
190 | - for (int i = 0; i < NUMPORTSPERDEVICE; i++) { | 261 | + for (int i = 0; i < numPorts; i++) { |
191 | ports.add(new DefaultPortDescription(PortNumber.portNumber(i), true, | 262 | ports.add(new DefaultPortDescription(PortNumber.portNumber(i), true, |
192 | Port.Type.COPPER, | 263 | Port.Type.COPPER, |
193 | - (long) 0)); | 264 | + 0)); |
194 | } | 265 | } |
195 | return ports; | 266 | return ports; |
196 | } | 267 | } | ... | ... |
... | @@ -132,7 +132,8 @@ public class NullHostProvider extends AbstractProvider implements HostProvider { | ... | @@ -132,7 +132,8 @@ public class NullHostProvider extends AbstractProvider implements HostProvider { |
132 | public void event(DeviceEvent event) { | 132 | public void event(DeviceEvent event) { |
133 | if (!deviceService.getRole(event.subject().id()) | 133 | if (!deviceService.getRole(event.subject().id()) |
134 | .equals(MastershipRole.MASTER)) { | 134 | .equals(MastershipRole.MASTER)) { |
135 | - log.info("Local node is not master for device", event.subject().id()); | 135 | + log.info("Local node is not master for device {}", event |
136 | + .subject().id()); | ||
136 | return; | 137 | return; |
137 | } | 138 | } |
138 | switch (event.type()) { | 139 | switch (event.type()) { | ... | ... |
... | @@ -46,9 +46,12 @@ import org.onosproject.net.device.DeviceListener; | ... | @@ -46,9 +46,12 @@ import org.onosproject.net.device.DeviceListener; |
46 | import org.onosproject.net.device.DeviceService; | 46 | import org.onosproject.net.device.DeviceService; |
47 | import org.onosproject.net.link.DefaultLinkDescription; | 47 | import org.onosproject.net.link.DefaultLinkDescription; |
48 | import org.onosproject.net.link.LinkDescription; | 48 | import org.onosproject.net.link.LinkDescription; |
49 | +import org.onosproject.net.link.LinkEvent; | ||
50 | +import org.onosproject.net.link.LinkListener; | ||
49 | import org.onosproject.net.link.LinkProvider; | 51 | import org.onosproject.net.link.LinkProvider; |
50 | import org.onosproject.net.link.LinkProviderRegistry; | 52 | import org.onosproject.net.link.LinkProviderRegistry; |
51 | import org.onosproject.net.link.LinkProviderService; | 53 | import org.onosproject.net.link.LinkProviderService; |
54 | +import org.onosproject.net.link.LinkService; | ||
52 | import org.onosproject.net.provider.AbstractProvider; | 55 | import org.onosproject.net.provider.AbstractProvider; |
53 | import org.onosproject.net.provider.ProviderId; | 56 | import org.onosproject.net.provider.ProviderId; |
54 | import org.osgi.service.component.ComponentContext; | 57 | import org.osgi.service.component.ComponentContext; |
... | @@ -74,6 +77,7 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -74,6 +77,7 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { |
74 | 77 | ||
75 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) | 78 | @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) |
76 | protected LinkProviderRegistry providerRegistry; | 79 | protected LinkProviderRegistry providerRegistry; |
80 | + private LinkService linkService; | ||
77 | 81 | ||
78 | private LinkProviderService providerService; | 82 | private LinkProviderService providerService; |
79 | 83 | ||
... | @@ -84,13 +88,16 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -84,13 +88,16 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { |
84 | private static final PortNumber DSTPORT = PortNumber.portNumber(6); | 88 | private static final PortNumber DSTPORT = PortNumber.portNumber(6); |
85 | 89 | ||
86 | private final InternalLinkProvider linkProvider = new InternalLinkProvider(); | 90 | private final InternalLinkProvider linkProvider = new InternalLinkProvider(); |
91 | + private final InternalLinkListener listener = new InternalLinkListener(); | ||
87 | 92 | ||
88 | // Link descriptions | 93 | // Link descriptions |
89 | private final ConcurrentMap<ConnectPoint, LinkDescription> descriptions = Maps | 94 | private final ConcurrentMap<ConnectPoint, LinkDescription> descriptions = Maps |
90 | .newConcurrentMap(); | 95 | .newConcurrentMap(); |
91 | 96 | ||
92 | - // Device ID's that have been seen so far | 97 | + // Local Device ID's that have been seen so far |
93 | private final List<DeviceId> devices = Lists.newArrayList(); | 98 | private final List<DeviceId> devices = Lists.newArrayList(); |
99 | + // tail ends of other islands | ||
100 | + private final List<ConnectPoint> tails = Lists.newArrayList(); | ||
94 | 101 | ||
95 | private ExecutorService linkDriver = Executors.newFixedThreadPool(1, | 102 | private ExecutorService linkDriver = Executors.newFixedThreadPool(1, |
96 | namedThreads("onos-null-link-driver")); | 103 | namedThreads("onos-null-link-driver")); |
... | @@ -112,6 +119,8 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -112,6 +119,8 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { |
112 | @Activate | 119 | @Activate |
113 | public void activate(ComponentContext context) { | 120 | public void activate(ComponentContext context) { |
114 | providerService = providerRegistry.register(this); | 121 | providerService = providerRegistry.register(this); |
122 | + linkService = (LinkService) providerRegistry; | ||
123 | + linkService.addListener(listener); | ||
115 | deviceService.addListener(linkProvider); | 124 | deviceService.addListener(linkProvider); |
116 | modified(context); | 125 | modified(context); |
117 | log.info("started"); | 126 | log.info("started"); |
... | @@ -129,7 +138,9 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -129,7 +138,9 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { |
129 | } | 138 | } |
130 | deviceService.removeListener(linkProvider); | 139 | deviceService.removeListener(linkProvider); |
131 | providerRegistry.unregister(this); | 140 | providerRegistry.unregister(this); |
141 | + linkService.removeListener(listener); | ||
132 | deviceService = null; | 142 | deviceService = null; |
143 | + linkService = null; | ||
133 | 144 | ||
134 | log.info("stopped"); | 145 | log.info("stopped"); |
135 | } | 146 | } |
... | @@ -170,6 +181,11 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -170,6 +181,11 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { |
170 | eventRate); | 181 | eventRate); |
171 | } | 182 | } |
172 | 183 | ||
184 | + // pick out substring from Deviceid | ||
185 | + private String part(String devId) { | ||
186 | + return devId.split(":")[1].substring(12, 16); | ||
187 | + } | ||
188 | + | ||
173 | /** | 189 | /** |
174 | * Adds links as devices are found, and generates LinkEvents. | 190 | * Adds links as devices are found, and generates LinkEvents. |
175 | */ | 191 | */ |
... | @@ -178,9 +194,6 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -178,9 +194,6 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { |
178 | @Override | 194 | @Override |
179 | public void event(DeviceEvent event) { | 195 | public void event(DeviceEvent event) { |
180 | Device dev = event.subject(); | 196 | Device dev = event.subject(); |
181 | - if (!MASTER.equals(roleService.getLocalRole(dev.id()))) { | ||
182 | - return; | ||
183 | - } | ||
184 | switch (event.type()) { | 197 | switch (event.type()) { |
185 | case DEVICE_ADDED: | 198 | case DEVICE_ADDED: |
186 | addLink(dev); | 199 | addLink(dev); |
... | @@ -194,16 +207,26 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -194,16 +207,26 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { |
194 | } | 207 | } |
195 | 208 | ||
196 | private void addLink(Device current) { | 209 | private void addLink(Device current) { |
197 | - devices.add(current.id()); | 210 | + DeviceId did = current.id(); |
198 | - // No link if only one device | 211 | + if (!MASTER.equals(roleService.getLocalRole(did))) { |
212 | + String part = part(did.toString()); | ||
213 | + if (part.equals("ffff")) { | ||
214 | + // 'tail' of an island - link us <- tail | ||
215 | + tails.add(new ConnectPoint(did, SRCPORT)); | ||
216 | + } | ||
217 | + tryLinkTail(); | ||
218 | + return; | ||
219 | + } | ||
220 | + devices.add(did); | ||
221 | + | ||
199 | if (devices.size() == 1) { | 222 | if (devices.size() == 1) { |
200 | return; | 223 | return; |
201 | } | 224 | } |
202 | 225 | ||
203 | - // Attach new device to the last-seen device | 226 | + // Normal flow - attach new device to the last-seen device |
204 | DeviceId prev = devices.get(devices.size() - 2); | 227 | DeviceId prev = devices.get(devices.size() - 2); |
205 | ConnectPoint src = new ConnectPoint(prev, SRCPORT); | 228 | ConnectPoint src = new ConnectPoint(prev, SRCPORT); |
206 | - ConnectPoint dst = new ConnectPoint(current.id(), DSTPORT); | 229 | + ConnectPoint dst = new ConnectPoint(did, DSTPORT); |
207 | 230 | ||
208 | LinkDescription fdesc = new DefaultLinkDescription(src, dst, | 231 | LinkDescription fdesc = new DefaultLinkDescription(src, dst, |
209 | Link.Type.DIRECT); | 232 | Link.Type.DIRECT); |
... | @@ -216,10 +239,66 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { | ... | @@ -216,10 +239,66 @@ public class NullLinkProvider extends AbstractProvider implements LinkProvider { |
216 | providerService.linkDetected(rdesc); | 239 | providerService.linkDetected(rdesc); |
217 | } | 240 | } |
218 | 241 | ||
242 | + // try to link to a tail to first element | ||
243 | + private void tryLinkTail() { | ||
244 | + if (tails.isEmpty() || devices.isEmpty()) { | ||
245 | + return; | ||
246 | + } | ||
247 | + ConnectPoint first = new ConnectPoint(devices.get(0), DSTPORT); | ||
248 | + boolean added = false; | ||
249 | + for (ConnectPoint cp : tails) { | ||
250 | + if (!linkService.getLinks(cp).isEmpty()) { | ||
251 | + continue; | ||
252 | + } | ||
253 | + LinkDescription ld = new DefaultLinkDescription(cp, first, | ||
254 | + Link.Type.DIRECT); | ||
255 | + descriptions.put(cp, ld); | ||
256 | + providerService.linkDetected(ld); | ||
257 | + added = true; | ||
258 | + break; | ||
259 | + } | ||
260 | + if (added) { | ||
261 | + tails.clear(); | ||
262 | + } | ||
263 | + } | ||
264 | + | ||
219 | private void removeLink(Device device) { | 265 | private void removeLink(Device device) { |
266 | + if (!MASTER.equals(roleService.getLocalRole(device.id()))) { | ||
267 | + return; | ||
268 | + } | ||
220 | providerService.linksVanished(device.id()); | 269 | providerService.linksVanished(device.id()); |
221 | devices.remove(device.id()); | 270 | devices.remove(device.id()); |
222 | } | 271 | } |
272 | + | ||
273 | + } | ||
274 | + | ||
275 | + private class InternalLinkListener implements LinkListener { | ||
276 | + | ||
277 | + @Override | ||
278 | + public void event(LinkEvent event) { | ||
279 | + switch (event.type()) { | ||
280 | + case LINK_ADDED: | ||
281 | + // If a link from another island, cast one back. | ||
282 | + DeviceId sdid = event.subject().src().deviceId(); | ||
283 | + PortNumber pn = event.subject().src().port(); | ||
284 | + | ||
285 | + if (roleService.getLocalRole(sdid).equals(MASTER)) { | ||
286 | + String part = part(sdid.toString()); | ||
287 | + if (part.equals("ffff") && SRCPORT.equals(pn)) { | ||
288 | + LinkDescription ld = new DefaultLinkDescription(event | ||
289 | + .subject().dst(), event.subject().src(), | ||
290 | + Link.Type.DIRECT); | ||
291 | + descriptions.put(event.subject().dst(), ld); | ||
292 | + providerService.linkDetected(ld); | ||
293 | + } | ||
294 | + return; | ||
295 | + } | ||
296 | + break; | ||
297 | + default: | ||
298 | + break; | ||
299 | + } | ||
300 | + } | ||
301 | + | ||
223 | } | 302 | } |
224 | 303 | ||
225 | /** | 304 | /** | ... | ... |
-
Please register or login to post a comment