Committed by
Gerrit Code Review
Updated mfwd delete behavior and fixed some small bugs
Change-Id: Id354a88507e94b83fd0007c084cdbf35093bbd1a
Showing
5 changed files
with
106 additions
and
11 deletions
... | @@ -37,9 +37,32 @@ public class McastDeleteCommand extends AbstractShellCommand { | ... | @@ -37,9 +37,32 @@ public class McastDeleteCommand extends AbstractShellCommand { |
37 | required = true, multiValued = false) | 37 | required = true, multiValued = false) |
38 | String gAddr = null; | 38 | String gAddr = null; |
39 | 39 | ||
40 | + @Argument(index = 2, name = "egressList", | ||
41 | + description = "Egress id/port", | ||
42 | + required = false, multiValued = true) | ||
43 | + String[] egressList = null; | ||
44 | + | ||
45 | + | ||
40 | @Override | 46 | @Override |
41 | protected void execute() { | 47 | protected void execute() { |
48 | + | ||
49 | + boolean deleted = false; | ||
42 | McastRouteTable mrib = McastRouteTable.getInstance(); | 50 | McastRouteTable mrib = McastRouteTable.getInstance(); |
51 | + | ||
52 | + if (egressList == null) { | ||
43 | mrib.removeRoute(sAddr, gAddr); | 53 | mrib.removeRoute(sAddr, gAddr); |
54 | + deleted = true; | ||
55 | + } else { | ||
56 | + // check list for validity before we begin to delete. | ||
57 | + for (String egress : egressList) { | ||
58 | + deleted = mrib.removeEgress(sAddr, gAddr, egress); | ||
59 | + } | ||
60 | + } | ||
61 | + | ||
62 | + if (deleted) { | ||
63 | + print("Successful delete"); | ||
64 | + } else { | ||
65 | + print("Failed to delete"); | ||
66 | + } | ||
44 | } | 67 | } |
45 | } | 68 | } | ... | ... |
... | @@ -79,8 +79,7 @@ public class McastIntentManager { | ... | @@ -79,8 +79,7 @@ public class McastIntentManager { |
79 | TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); | 79 | TrafficSelector.Builder selector = DefaultTrafficSelector.builder(); |
80 | TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment(); | 80 | TrafficTreatment treatment = DefaultTrafficTreatment.emptyTreatment(); |
81 | 81 | ||
82 | - if (mroute.getIngressPoint() == null || | 82 | + if (mroute.getIngressPoint() == null) { |
83 | - mroute.getEgressPoints().isEmpty()) { | ||
84 | return null; | 83 | return null; |
85 | } | 84 | } |
86 | 85 | ||
... | @@ -96,16 +95,22 @@ public class McastIntentManager { | ... | @@ -96,16 +95,22 @@ public class McastIntentManager { |
96 | .matchIPDst(mroute.getGaddr()) | 95 | .matchIPDst(mroute.getGaddr()) |
97 | .matchIPSrc(mroute.getSaddr()); | 96 | .matchIPSrc(mroute.getSaddr()); |
98 | 97 | ||
99 | - SinglePointToMultiPointIntent intent = | 98 | + |
100 | - SinglePointToMultiPointIntent.builder() | 99 | + SinglePointToMultiPointIntent.Builder builder = SinglePointToMultiPointIntent.builder() |
101 | .appId(McastForwarding.getAppId()) | 100 | .appId(McastForwarding.getAppId()) |
102 | .selector(selector.build()) | 101 | .selector(selector.build()) |
103 | .treatment(treatment) | 102 | .treatment(treatment) |
104 | - .ingressPoint(mroute.getIngressPoint().getConnectPoint()) | 103 | + .ingressPoint(mroute.getIngressPoint().getConnectPoint()); |
105 | - .egressPoints(mroute.getEgressConnectPoints()). | 104 | + |
106 | - build(); | 105 | + // allowing intent to be pushed without egress points means we can drop packets. |
106 | + if (!mroute.getEgressPoints().isEmpty()) { | ||
107 | + builder.egressPoints(mroute.getEgressConnectPoints()); | ||
108 | + } | ||
107 | 109 | ||
110 | + SinglePointToMultiPointIntent intent = builder.build(); | ||
108 | intentService.submit(intent); | 111 | intentService.submit(intent); |
112 | + mroute.setDirty(false); | ||
113 | + | ||
109 | return intent; | 114 | return intent; |
110 | } | 115 | } |
111 | 116 | ||
... | @@ -114,9 +119,10 @@ public class McastIntentManager { | ... | @@ -114,9 +119,10 @@ public class McastIntentManager { |
114 | * | 119 | * |
115 | * @param mroute the mcast route whose intent we want to remove | 120 | * @param mroute the mcast route whose intent we want to remove |
116 | */ | 121 | */ |
117 | - public void withdrawIntent(McastRouteBase mroute) { | 122 | + public void withdrawIntent(McastRoute mroute) { |
118 | Intent intent = intentService.getIntent(mroute.getIntentKey()); | 123 | Intent intent = intentService.getIntent(mroute.getIntentKey()); |
119 | intentService.withdraw(intent); | 124 | intentService.withdraw(intent); |
125 | + mroute.setDirty(false); | ||
120 | } | 126 | } |
121 | 127 | ||
122 | /** | 128 | /** | ... | ... |
... | @@ -57,6 +57,21 @@ interface McastRoute { | ... | @@ -57,6 +57,21 @@ interface McastRoute { |
57 | public boolean isIp6(); | 57 | public boolean isIp6(); |
58 | 58 | ||
59 | /** | 59 | /** |
60 | + * Get the dirty state. | ||
61 | + * | ||
62 | + * @return whether this route is dirty or not. | ||
63 | + */ | ||
64 | + public boolean getDirty(); | ||
65 | + | ||
66 | + /** | ||
67 | + * Set the dirty state to indicate that something changed. | ||
68 | + * This may require an update to the flow tables (intents). | ||
69 | + * | ||
70 | + * @param dirty set the dirty bit | ||
71 | + */ | ||
72 | + public void setDirty(boolean dirty); | ||
73 | + | ||
74 | + /** | ||
60 | * Add the ingress ConnectPoint. | 75 | * Add the ingress ConnectPoint. |
61 | * | 76 | * |
62 | * @param cpstr string representing a ConnectPoint | 77 | * @param cpstr string representing a ConnectPoint | ... | ... |
... | @@ -17,7 +17,6 @@ package org.onosproject.mfwd.impl; | ... | @@ -17,7 +17,6 @@ package org.onosproject.mfwd.impl; |
17 | 17 | ||
18 | import static com.google.common.base.Preconditions.checkNotNull; | 18 | import static com.google.common.base.Preconditions.checkNotNull; |
19 | 19 | ||
20 | -import org.apache.commons.collections.set.ListOrderedSet; | ||
21 | import org.onlab.packet.IpPrefix; | 20 | import org.onlab.packet.IpPrefix; |
22 | import org.onosproject.net.ConnectPoint; | 21 | import org.onosproject.net.ConnectPoint; |
23 | import org.onosproject.net.intent.SinglePointToMultiPointIntent; | 22 | import org.onosproject.net.intent.SinglePointToMultiPointIntent; |
... | @@ -267,6 +266,33 @@ public class McastRouteBase implements McastRoute { | ... | @@ -267,6 +266,33 @@ public class McastRouteBase implements McastRoute { |
267 | } | 266 | } |
268 | 267 | ||
269 | /** | 268 | /** |
269 | + * Remove an egress from McastConnectPoint. | ||
270 | + * | ||
271 | + * @param connectPoint the egress connect point | ||
272 | + * @return boolean result of removal | ||
273 | + */ | ||
274 | + public boolean removeEgressPoint(String connectPoint) { | ||
275 | + checkNotNull(connectPoint); | ||
276 | + return this.removeEgressPoint(ConnectPoint.deviceConnectPoint(connectPoint)); | ||
277 | + } | ||
278 | + | ||
279 | + /** | ||
280 | + * Remove an egress from McastConnectPoint. | ||
281 | + * | ||
282 | + * @param cp the egress connect point | ||
283 | + * @return boolean result of removal | ||
284 | + */ | ||
285 | + public boolean removeEgressPoint(ConnectPoint cp) { | ||
286 | + boolean removed = false; | ||
287 | + McastConnectPoint mcp = this.findEgressConnectPoint(checkNotNull(cp)); | ||
288 | + if (mcp != null) { | ||
289 | + removed = egressPoints.remove(mcp); | ||
290 | + setDirty(true); | ||
291 | + } | ||
292 | + return removed; | ||
293 | + } | ||
294 | + | ||
295 | + /** | ||
270 | * Add an egress McastConnectPoint. | 296 | * Add an egress McastConnectPoint. |
271 | * | 297 | * |
272 | * @param cpstr deviceId/port of the connect point | 298 | * @param cpstr deviceId/port of the connect point |
... | @@ -292,7 +318,7 @@ public class McastRouteBase implements McastRoute { | ... | @@ -292,7 +318,7 @@ public class McastRouteBase implements McastRoute { |
292 | * @return Set of egress ConnectPoints | 318 | * @return Set of egress ConnectPoints |
293 | */ | 319 | */ |
294 | public Set<ConnectPoint> getEgressConnectPoints() { | 320 | public Set<ConnectPoint> getEgressConnectPoints() { |
295 | - Set<ConnectPoint> cps = new ListOrderedSet(); | 321 | + Set<ConnectPoint> cps = new HashSet<ConnectPoint>(); |
296 | 322 | ||
297 | for (McastConnectPoint mcp : egressPoints) { | 323 | for (McastConnectPoint mcp : egressPoints) { |
298 | cps.add(mcp.getConnectPoint()); | 324 | cps.add(mcp.getConnectPoint()); |
... | @@ -417,7 +443,7 @@ public class McastRouteBase implements McastRoute { | ... | @@ -417,7 +443,7 @@ public class McastRouteBase implements McastRoute { |
417 | out += "intent: "; | 443 | out += "intent: "; |
418 | out += (intentKey == null) ? "not installed" : this.intentKey.toString(); | 444 | out += (intentKey == null) ? "not installed" : this.intentKey.toString(); |
419 | out += "\n\tingress: "; | 445 | out += "\n\tingress: "; |
420 | - out += (ingressPoint == null) ? "NULL" : ingressPoint.toString(); | 446 | + out += (ingressPoint == null) ? "NULL" : ingressPoint.getConnectPoint().toString(); |
421 | out += "\n\tegress: {\n"; | 447 | out += "\n\tegress: {\n"; |
422 | if (egressPoints != null && !egressPoints.isEmpty()) { | 448 | if (egressPoints != null && !egressPoints.isEmpty()) { |
423 | for (McastConnectPoint eg : egressPoints) { | 449 | for (McastConnectPoint eg : egressPoints) { | ... | ... |
... | @@ -17,6 +17,7 @@ package org.onosproject.mfwd.impl; | ... | @@ -17,6 +17,7 @@ package org.onosproject.mfwd.impl; |
17 | 17 | ||
18 | import org.apache.felix.scr.annotations.Service; | 18 | import org.apache.felix.scr.annotations.Service; |
19 | import org.onlab.packet.IpPrefix; | 19 | import org.onlab.packet.IpPrefix; |
20 | + | ||
20 | import java.util.Map; | 21 | import java.util.Map; |
21 | import java.util.concurrent.ConcurrentHashMap; | 22 | import java.util.concurrent.ConcurrentHashMap; |
22 | import static com.google.common.base.Preconditions.checkNotNull; | 23 | import static com.google.common.base.Preconditions.checkNotNull; |
... | @@ -191,6 +192,30 @@ public final class McastRouteTable { | ... | @@ -191,6 +192,30 @@ public final class McastRouteTable { |
191 | } | 192 | } |
192 | 193 | ||
193 | /** | 194 | /** |
195 | + * Delete a specific egress from the MRIB. | ||
196 | + * | ||
197 | + * @param saddr source address * or x.x.x.x or x.x.x.x/y | ||
198 | + * @param gaddr group address x.x.x.x or x.x.x.x/y | ||
199 | + * @param egress group address x.x.x.x or x.x.x.x/y | ||
200 | + * @return boolean if egress was deleted | ||
201 | + */ | ||
202 | + public boolean removeEgress(String saddr, String gaddr, String egress) { | ||
203 | + | ||
204 | + IpPrefix gpfx = IpPrefix.valueOf(gaddr); | ||
205 | + IpPrefix spfx = IpPrefix.valueOf(0, 0); | ||
206 | + if (saddr != null && !saddr.equals("*")) { | ||
207 | + spfx = IpPrefix.valueOf(saddr); | ||
208 | + } | ||
209 | + | ||
210 | + McastRouteSource src = (McastRouteSource) findBestMatch(spfx, gpfx); | ||
211 | + boolean removed = src.removeEgressPoint(egress); | ||
212 | + if (removed) { | ||
213 | + src.setIntent(); | ||
214 | + } | ||
215 | + return removed; | ||
216 | + } | ||
217 | + | ||
218 | + /** | ||
194 | * Delete a multicast route from the MRIB. | 219 | * Delete a multicast route from the MRIB. |
195 | * | 220 | * |
196 | * @param saddr source address * or x.x.x.x or x.x.x.x/y | 221 | * @param saddr source address * or x.x.x.x or x.x.x.x/y | ... | ... |
-
Please register or login to post a comment