Sho SHIMIZU
Committed by Gerrit Code Review

ONOS-2743: Register entire MPLS label space when a link is discovered

Change-Id: Ic57afa75bf57007e6bac2debef0c1a4d3515b0a9
...@@ -15,11 +15,13 @@ ...@@ -15,11 +15,13 @@
15 */ 15 */
16 package org.onosproject.net.newresource.impl; 16 package org.onosproject.net.newresource.impl;
17 17
18 +import org.onlab.packet.MplsLabel;
18 import org.onlab.packet.VlanId; 19 import org.onlab.packet.VlanId;
19 import org.onlab.util.ItemNotFoundException; 20 import org.onlab.util.ItemNotFoundException;
20 import org.onosproject.net.ConnectPoint; 21 import org.onosproject.net.ConnectPoint;
21 import org.onosproject.net.Link; 22 import org.onosproject.net.Link;
22 import org.onosproject.net.LinkKey; 23 import org.onosproject.net.LinkKey;
24 +import org.onosproject.net.behaviour.MplsQuery;
23 import org.onosproject.net.behaviour.VlanQuery; 25 import org.onosproject.net.behaviour.VlanQuery;
24 import org.onosproject.net.driver.DriverHandler; 26 import org.onosproject.net.driver.DriverHandler;
25 import org.onosproject.net.driver.DriverService; 27 import org.onosproject.net.driver.DriverService;
...@@ -30,6 +32,7 @@ import org.onosproject.net.newresource.ResourcePath; ...@@ -30,6 +32,7 @@ import org.onosproject.net.newresource.ResourcePath;
30 32
31 import java.util.List; 33 import java.util.List;
32 import java.util.concurrent.ExecutorService; 34 import java.util.concurrent.ExecutorService;
35 +import java.util.function.Predicate;
33 import java.util.stream.Collectors; 36 import java.util.stream.Collectors;
34 import java.util.stream.IntStream; 37 import java.util.stream.IntStream;
35 38
...@@ -43,6 +46,9 @@ final class ResourceLinkListener implements LinkListener { ...@@ -43,6 +46,9 @@ final class ResourceLinkListener implements LinkListener {
43 private static final int TOTAL_VLANS = 1024; 46 private static final int TOTAL_VLANS = 1024;
44 private static final List<VlanId> ENTIRE_VLAN_IDS = getEntireVlans(); 47 private static final List<VlanId> ENTIRE_VLAN_IDS = getEntireVlans();
45 48
49 + private static final int TOTAL_MPLS_LABELS = 1048576;
50 + private static final List<MplsLabel> ENTIRE_MPLS_LABELS = getEntireMplsLabels();
51 +
46 private final ResourceAdminService adminService; 52 private final ResourceAdminService adminService;
47 private final DriverService driverService; 53 private final DriverService driverService;
48 private final ExecutorService executor; 54 private final ExecutorService executor;
...@@ -80,9 +86,15 @@ final class ResourceLinkListener implements LinkListener { ...@@ -80,9 +86,15 @@ final class ResourceLinkListener implements LinkListener {
80 LinkKey linkKey = LinkKey.linkKey(link); 86 LinkKey linkKey = LinkKey.linkKey(link);
81 adminService.registerResources(ResourcePath.ROOT, linkKey); 87 adminService.registerResources(ResourcePath.ROOT, linkKey);
82 88
89 + ResourcePath linkPath = new ResourcePath(linkKey);
83 // register VLAN IDs against the link 90 // register VLAN IDs against the link
84 - if (isVlanEnabled(link)) { 91 + if (isEnabled(link, this::isVlanEnabled)) {
85 - adminService.registerResources(new ResourcePath(linkKey), ENTIRE_VLAN_IDS); 92 + adminService.registerResources(linkPath, ENTIRE_VLAN_IDS);
93 + }
94 +
95 + // register MPLS labels against the link
96 + if (isEnabled(link, this::isMplsEnabled)) {
97 + adminService.registerResources(linkPath, ENTIRE_MPLS_LABELS);
86 } 98 }
87 }); 99 });
88 } 100 }
...@@ -92,11 +104,8 @@ final class ResourceLinkListener implements LinkListener { ...@@ -92,11 +104,8 @@ final class ResourceLinkListener implements LinkListener {
92 executor.submit(() -> adminService.unregisterResources(ResourcePath.ROOT, linkKey)); 104 executor.submit(() -> adminService.unregisterResources(ResourcePath.ROOT, linkKey));
93 } 105 }
94 106
95 - private boolean isVlanEnabled(Link link) { 107 + private boolean isEnabled(Link link, Predicate<ConnectPoint> predicate) {
96 - ConnectPoint src = link.src(); 108 + return predicate.test(link.src()) && predicate.test(link.dst());
97 - ConnectPoint dst = link.dst();
98 -
99 - return isVlanEnabled(src) && isVlanEnabled(dst);
100 } 109 }
101 110
102 private boolean isVlanEnabled(ConnectPoint cp) { 111 private boolean isVlanEnabled(ConnectPoint cp) {
...@@ -113,9 +122,30 @@ final class ResourceLinkListener implements LinkListener { ...@@ -113,9 +122,30 @@ final class ResourceLinkListener implements LinkListener {
113 } 122 }
114 } 123 }
115 124
125 + private boolean isMplsEnabled(ConnectPoint cp) {
126 + try {
127 + DriverHandler handler = driverService.createHandler(cp.deviceId());
128 + if (handler == null) {
129 + return false;
130 + }
131 +
132 + MplsQuery query = handler.behaviour(MplsQuery.class);
133 + return query != null && query.isEnabled(cp.port());
134 + } catch (ItemNotFoundException e) {
135 + return false;
136 + }
137 + }
138 +
116 private static List<VlanId> getEntireVlans() { 139 private static List<VlanId> getEntireVlans() {
117 return IntStream.range(0, TOTAL_VLANS) 140 return IntStream.range(0, TOTAL_VLANS)
118 .mapToObj(x -> VlanId.vlanId((short) x)) 141 .mapToObj(x -> VlanId.vlanId((short) x))
119 .collect(Collectors.toList()); 142 .collect(Collectors.toList());
120 } 143 }
144 +
145 + private static List<MplsLabel> getEntireMplsLabels() {
146 + // potentially many objects are created
147 + return IntStream.range(0, TOTAL_MPLS_LABELS)
148 + .mapToObj(MplsLabel::mplsLabel)
149 + .collect(Collectors.toList());
150 + }
121 } 151 }
......