Fix bugs for dynamic interface configuration
- portNextObjStore is not updated when adding or removing portNextObjective
- Group keys for L2IG in flowObjectiveStore are deleted while modifying L2IG, which in turn causes an exception
- L3UG pointing to L2IG, which is already removed, is not removed
- Empty L2FG, with VLAN ID removed from the configuration, is not removed
- Bridging and unicast routing rules for hosts are not updated when changing port VLAN from untagged to tagged and vice versa
Change-Id: I9454fe553ae53e0fc8839a4ad629c0b5b9039a36
diff --git a/app/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultGroupHandler.java b/app/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultGroupHandler.java
index 15513cf..f8d3053 100644
--- a/app/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultGroupHandler.java
+++ b/app/src/main/java/org/onosproject/segmentrouting/grouphandler/DefaultGroupHandler.java
@@ -1353,6 +1353,27 @@
}
/**
+ * Creates simple next objective for a single port.
+ *
+ * @param deviceId device id that has the port to deal with
+ * @param portNum the outgoing port on the device
+ * @param vlanId vlan id associated with the port
+ * @param popVlan true if POP_VLAN action is applied on the packets, false otherwise
+ */
+ public void createPortNextObjective(DeviceId deviceId, PortNumber portNum, VlanId vlanId, boolean popVlan) {
+ TrafficSelector.Builder mbuilder = DefaultTrafficSelector.builder();
+ mbuilder.matchVlanId(vlanId);
+
+ TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
+ tbuilder.immediate().setOutput(portNum);
+ if (popVlan) {
+ tbuilder.immediate().popVlan();
+ }
+
+ createGroupFromPort(portNum, tbuilder.build(), mbuilder.build());
+ }
+
+ /**
* Removes simple next objective for a single port.
*
* @param deviceId device id that has the port to deal with
@@ -1513,16 +1534,23 @@
* does not involve pop vlan tag action.
*/
public void updateL2InterfaceGroupBucket(PortNumber portNumber, VlanId vlanId, boolean pushVlan) {
+ TrafficTreatment.Builder oldTBuilder = DefaultTrafficTreatment.builder();
TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+ tBuilder.setOutput(portNumber);
+ oldTBuilder.setOutput(portNumber);
if (pushVlan) {
tBuilder.popVlan();
+ } else {
+ oldTBuilder.popVlan();
}
- tBuilder.setOutput(portNumber);
TrafficSelector metadata =
DefaultTrafficSelector.builder().matchVlanId(vlanId).build();
- int nextId = getVlanNextObjectiveId(vlanId);
+ // Update portNextObjStore with new L2IG
+ int nextId = getPortNextObjectiveId(portNumber, oldTBuilder.build(), metadata, false);
+ portNextObjStore.remove(new PortNextObjectiveStoreKey(deviceId, portNumber, oldTBuilder.build(), metadata));
+ portNextObjStore.put(new PortNextObjectiveStoreKey(deviceId, portNumber, tBuilder.build(), metadata), nextId);
NextObjective.Builder nextObjBuilder = DefaultNextObjective
.builder().withId(nextId)