Charles Chan

Segment Routing bug fix and enhancement

Bugfix:
- Add MPLS BOS matching
- Fix NPE caused by race between filter objective and broadcast next objective

Enhancement:
- Move group handler out from OFDPA pipeline
- Move ARP request from rule populator to packet request

Change-Id: I0ba40e10f7cb7f97277df86725fbd2546a62e890
...@@ -513,7 +513,6 @@ public class DefaultRoutingHandler { ...@@ -513,7 +513,6 @@ public class DefaultRoutingHandler {
513 public void populatePortAddressingRules(DeviceId deviceId) { 513 public void populatePortAddressingRules(DeviceId deviceId) {
514 rulePopulator.populateRouterMacVlanFilters(deviceId); 514 rulePopulator.populateRouterMacVlanFilters(deviceId);
515 rulePopulator.populateRouterIpPunts(deviceId); 515 rulePopulator.populateRouterIpPunts(deviceId);
516 - rulePopulator.populateArpPunts(deviceId);
517 } 516 }
518 517
519 /** 518 /**
......
...@@ -303,6 +303,7 @@ public class RoutingRulePopulator { ...@@ -303,6 +303,7 @@ public class RoutingRulePopulator {
303 // TODO Handle the case of Bos == false 303 // TODO Handle the case of Bos == false
304 sbuilder.matchEthType(Ethernet.MPLS_UNICAST); 304 sbuilder.matchEthType(Ethernet.MPLS_UNICAST);
305 sbuilder.matchMplsLabel(MplsLabel.mplsLabel(segmentId)); 305 sbuilder.matchMplsLabel(MplsLabel.mplsLabel(segmentId));
306 + sbuilder.matchMplsBos(true);
306 TrafficSelector selector = sbuilder.build(); 307 TrafficSelector selector = sbuilder.build();
307 308
308 // setup metadata to pass to nextObjective - indicate the vlan on egress 309 // setup metadata to pass to nextObjective - indicate the vlan on egress
...@@ -525,39 +526,6 @@ public class RoutingRulePopulator { ...@@ -525,39 +526,6 @@ public class RoutingRulePopulator {
525 } 526 }
526 527
527 /** 528 /**
528 - * Creates a forwarding objective to punt all IP packets, destined to the
529 - * router's port IP addresses, to the controller. Note that the input
530 - * port should not be matched on, as these packets can come from any input.
531 - * Furthermore, these are applied only by the master instance.
532 - *
533 - * @param deviceId the switch dpid for the router
534 - */
535 - public void populateArpPunts(DeviceId deviceId) {
536 - if (!srManager.mastershipService.isLocalMaster(deviceId)) {
537 - log.debug("Not installing port-IP punts - not the master for dev:{} ",
538 - deviceId);
539 - return;
540 - }
541 -
542 - ForwardingObjective.Builder puntArp = DefaultForwardingObjective.builder();
543 - TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
544 - TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
545 - sbuilder.matchEthType(Ethernet.TYPE_ARP);
546 - tbuilder.setOutput(PortNumber.CONTROLLER);
547 - puntArp.withSelector(sbuilder.build());
548 - puntArp.withTreatment(tbuilder.build());
549 - puntArp.withFlag(Flag.VERSATILE)
550 - .withPriority(HIGHEST_PRIORITY)
551 - .makePermanent()
552 - .fromApp(srManager.appId);
553 - log.debug("Installing forwarding objective to punt ARPs");
554 - srManager.flowObjectiveService.
555 - forward(deviceId,
556 - puntArp.add(new SRObjectiveContext(deviceId,
557 - SRObjectiveContext.ObjectiveType.FORWARDING)));
558 - }
559 -
560 - /**
561 * Populates a forwarding objective to send packets that miss other high 529 * Populates a forwarding objective to send packets that miss other high
562 * priority Bridging Table entries to a group that contains all ports of 530 * priority Bridging Table entries to a group that contains all ports of
563 * its subnet. 531 * its subnet.
......
...@@ -51,6 +51,7 @@ import org.onosproject.net.flowobjective.ObjectiveContext; ...@@ -51,6 +51,7 @@ import org.onosproject.net.flowobjective.ObjectiveContext;
51 import org.onosproject.net.flowobjective.ObjectiveError; 51 import org.onosproject.net.flowobjective.ObjectiveError;
52 import org.onosproject.net.host.HostEvent; 52 import org.onosproject.net.host.HostEvent;
53 import org.onosproject.net.host.HostListener; 53 import org.onosproject.net.host.HostListener;
54 +import org.onosproject.net.packet.PacketPriority;
54 import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException; 55 import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
55 import org.onosproject.segmentrouting.config.DeviceConfiguration; 56 import org.onosproject.segmentrouting.config.DeviceConfiguration;
56 import org.onosproject.segmentrouting.config.SegmentRoutingConfig; 57 import org.onosproject.segmentrouting.config.SegmentRoutingConfig;
...@@ -90,6 +91,7 @@ import java.util.Collections; ...@@ -90,6 +91,7 @@ import java.util.Collections;
90 import java.util.HashSet; 91 import java.util.HashSet;
91 import java.util.List; 92 import java.util.List;
92 import java.util.Map; 93 import java.util.Map;
94 +import java.util.Optional;
93 import java.util.Set; 95 import java.util.Set;
94 import java.util.concurrent.ConcurrentHashMap; 96 import java.util.concurrent.ConcurrentHashMap;
95 import java.util.concurrent.ConcurrentLinkedQueue; 97 import java.util.concurrent.ConcurrentLinkedQueue;
...@@ -297,6 +299,11 @@ public class SegmentRoutingManager implements SegmentRoutingService { ...@@ -297,6 +299,11 @@ public class SegmentRoutingManager implements SegmentRoutingService {
297 linkService.addListener(linkListener); 299 linkService.addListener(linkListener);
298 deviceService.addListener(deviceListener); 300 deviceService.addListener(deviceListener);
299 301
302 + // Request ARP packet-in
303 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
304 + selector.matchEthType(Ethernet.TYPE_ARP);
305 + packetService.requestPackets(selector.build(), PacketPriority.CONTROL, appId, Optional.empty());
306 +
300 cfgListener.configureNetwork(); 307 cfgListener.configureNetwork();
301 308
302 log.info("Started"); 309 log.info("Started");
...@@ -307,6 +314,11 @@ public class SegmentRoutingManager implements SegmentRoutingService { ...@@ -307,6 +314,11 @@ public class SegmentRoutingManager implements SegmentRoutingService {
307 cfgService.removeListener(cfgListener); 314 cfgService.removeListener(cfgListener);
308 cfgService.unregisterConfigFactory(cfgFactory); 315 cfgService.unregisterConfigFactory(cfgFactory);
309 316
317 + // Withdraw ARP packet-in
318 + TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
319 + selector.matchEthType(Ethernet.TYPE_ARP);
320 + packetService.cancelPackets(selector.build(), PacketPriority.CONTROL, appId, Optional.empty());
321 +
310 packetService.removeProcessor(processor); 322 packetService.removeProcessor(processor);
311 linkService.removeListener(linkListener); 323 linkService.removeListener(linkListener);
312 deviceService.removeListener(deviceListener); 324 deviceService.removeListener(deviceListener);
...@@ -697,7 +709,8 @@ public class SegmentRoutingManager implements SegmentRoutingService { ...@@ -697,7 +709,8 @@ public class SegmentRoutingManager implements SegmentRoutingService {
697 flowObjectiveService, 709 flowObjectiveService,
698 nsNextObjStore, 710 nsNextObjStore,
699 subnetNextObjStore, 711 subnetNextObjStore,
700 - portNextObjStore); 712 + portNextObjStore,
713 + this);
701 } catch (DeviceConfigNotFoundException e) { 714 } catch (DeviceConfigNotFoundException e) {
702 log.warn(e.getMessage() + " Aborting processDeviceAdded."); 715 log.warn(e.getMessage() + " Aborting processDeviceAdded.");
703 return; 716 return;
...@@ -766,7 +779,8 @@ public class SegmentRoutingManager implements SegmentRoutingService { ...@@ -766,7 +779,8 @@ public class SegmentRoutingManager implements SegmentRoutingService {
766 flowObjectiveService, 779 flowObjectiveService,
767 nsNextObjStore, 780 nsNextObjStore,
768 subnetNextObjStore, 781 subnetNextObjStore,
769 - portNextObjStore); 782 + portNextObjStore,
783 + segmentRoutingManager);
770 } catch (DeviceConfigNotFoundException e) { 784 } catch (DeviceConfigNotFoundException e) {
771 log.warn(e.getMessage() + " Aborting configureNetwork."); 785 log.warn(e.getMessage() + " Aborting configureNetwork.");
772 return; 786 return;
...@@ -836,23 +850,33 @@ public class SegmentRoutingManager implements SegmentRoutingService { ...@@ -836,23 +850,33 @@ public class SegmentRoutingManager implements SegmentRoutingService {
836 private ForwardingObjective.Builder getForwardingObjectiveBuilder( 850 private ForwardingObjective.Builder getForwardingObjectiveBuilder(
837 DeviceId deviceId, MacAddress mac, VlanId vlanId, 851 DeviceId deviceId, MacAddress mac, VlanId vlanId,
838 PortNumber outport) { 852 PortNumber outport) {
853 + // Get assigned VLAN for the subnet
854 + VlanId outvlan = null;
855 + Ip4Prefix subnet = deviceConfiguration.getPortSubnet(deviceId, outport);
856 + if (subnet == null) {
857 + outvlan = VlanId.vlanId(ASSIGNED_VLAN_NO_SUBNET);
858 + } else {
859 + outvlan = getSubnetAssignedVlanId(deviceId, subnet);
860 + }
861 +
839 // match rule 862 // match rule
840 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder(); 863 TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
841 sbuilder.matchEthDst(mac); 864 sbuilder.matchEthDst(mac);
865 + /*
866 + * Note: for untagged packets, match on the assigned VLAN.
867 + * for tagged packets, match on its incoming VLAN.
868 + */
869 + if (vlanId.equals(VlanId.NONE)) {
870 + sbuilder.matchVlanId(outvlan);
871 + } else {
842 sbuilder.matchVlanId(vlanId); 872 sbuilder.matchVlanId(vlanId);
873 + }
843 874
844 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder(); 875 TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
845 tbuilder.immediate().popVlan(); 876 tbuilder.immediate().popVlan();
846 tbuilder.immediate().setOutput(outport); 877 tbuilder.immediate().setOutput(outport);
847 878
848 // for switch pipelines that need it, provide outgoing vlan as metadata 879 // for switch pipelines that need it, provide outgoing vlan as metadata
849 - VlanId outvlan = null;
850 - Ip4Prefix subnet = deviceConfiguration.getPortSubnet(deviceId, outport);
851 - if (subnet == null) {
852 - outvlan = VlanId.vlanId(ASSIGNED_VLAN_NO_SUBNET);
853 - } else {
854 - outvlan = getSubnetAssignedVlanId(deviceId, subnet);
855 - }
856 TrafficSelector meta = DefaultTrafficSelector.builder() 880 TrafficSelector meta = DefaultTrafficSelector.builder()
857 .matchVlanId(outvlan).build(); 881 .matchVlanId(outvlan).build();
858 882
......
...@@ -24,6 +24,7 @@ import org.onosproject.net.DeviceId; ...@@ -24,6 +24,7 @@ import org.onosproject.net.DeviceId;
24 import org.onosproject.net.Link; 24 import org.onosproject.net.Link;
25 import org.onosproject.net.flowobjective.FlowObjectiveService; 25 import org.onosproject.net.flowobjective.FlowObjectiveService;
26 import org.onosproject.net.link.LinkService; 26 import org.onosproject.net.link.LinkService;
27 +import org.onosproject.segmentrouting.SegmentRoutingManager;
27 import org.onosproject.segmentrouting.config.DeviceProperties; 28 import org.onosproject.segmentrouting.config.DeviceProperties;
28 import org.onosproject.store.service.EventuallyConsistentMap; 29 import org.onosproject.store.service.EventuallyConsistentMap;
29 30
...@@ -46,7 +47,7 @@ import org.onosproject.store.service.EventuallyConsistentMap; ...@@ -46,7 +47,7 @@ import org.onosproject.store.service.EventuallyConsistentMap;
46 * 8) what about ecmp no label case 47 * 8) what about ecmp no label case
47 */ 48 */
48 public class DefaultEdgeGroupHandler extends DefaultGroupHandler { 49 public class DefaultEdgeGroupHandler extends DefaultGroupHandler {
49 - 50 + // TODO Access stores through srManager
50 protected DefaultEdgeGroupHandler(DeviceId deviceId, 51 protected DefaultEdgeGroupHandler(DeviceId deviceId,
51 ApplicationId appId, 52 ApplicationId appId,
52 DeviceProperties config, 53 DeviceProperties config,
...@@ -58,9 +59,10 @@ public class DefaultEdgeGroupHandler extends DefaultGroupHandler { ...@@ -58,9 +59,10 @@ public class DefaultEdgeGroupHandler extends DefaultGroupHandler {
58 EventuallyConsistentMap<SubnetNextObjectiveStoreKey, 59 EventuallyConsistentMap<SubnetNextObjectiveStoreKey,
59 Integer> subnetNextObjStore, 60 Integer> subnetNextObjStore,
60 EventuallyConsistentMap<PortNextObjectiveStoreKey, 61 EventuallyConsistentMap<PortNextObjectiveStoreKey,
61 - Integer> portNextObjStore) { 62 + Integer> portNextObjStore,
63 + SegmentRoutingManager srManager) {
62 super(deviceId, appId, config, linkService, flowObjService, 64 super(deviceId, appId, config, linkService, flowObjService,
63 - nsNextObjStore, subnetNextObjStore, portNextObjStore); 65 + nsNextObjStore, subnetNextObjStore, portNextObjStore, srManager);
64 } 66 }
65 67
66 @Override 68 @Override
......
...@@ -87,6 +87,7 @@ public class DefaultGroupHandler { ...@@ -87,6 +87,7 @@ public class DefaultGroupHandler {
87 SubnetNextObjectiveStoreKey, Integer> subnetNextObjStore = null; 87 SubnetNextObjectiveStoreKey, Integer> subnetNextObjStore = null;
88 protected EventuallyConsistentMap< 88 protected EventuallyConsistentMap<
89 PortNextObjectiveStoreKey, Integer> portNextObjStore = null; 89 PortNextObjectiveStoreKey, Integer> portNextObjStore = null;
90 + private SegmentRoutingManager srManager;
90 91
91 protected KryoNamespace.Builder kryo = new KryoNamespace.Builder() 92 protected KryoNamespace.Builder kryo = new KryoNamespace.Builder()
92 .register(URI.class).register(HashSet.class) 93 .register(URI.class).register(HashSet.class)
...@@ -96,6 +97,7 @@ public class DefaultGroupHandler { ...@@ -96,6 +97,7 @@ public class DefaultGroupHandler {
96 .register(GroupBucketIdentifier.class) 97 .register(GroupBucketIdentifier.class)
97 .register(GroupBucketIdentifier.BucketOutputType.class); 98 .register(GroupBucketIdentifier.BucketOutputType.class);
98 99
100 + // TODO Access stores through srManager
99 protected DefaultGroupHandler(DeviceId deviceId, ApplicationId appId, 101 protected DefaultGroupHandler(DeviceId deviceId, ApplicationId appId,
100 DeviceProperties config, 102 DeviceProperties config,
101 LinkService linkService, 103 LinkService linkService,
...@@ -105,7 +107,8 @@ public class DefaultGroupHandler { ...@@ -105,7 +107,8 @@ public class DefaultGroupHandler {
105 EventuallyConsistentMap<SubnetNextObjectiveStoreKey, 107 EventuallyConsistentMap<SubnetNextObjectiveStoreKey,
106 Integer> subnetNextObjStore, 108 Integer> subnetNextObjStore,
107 EventuallyConsistentMap<PortNextObjectiveStoreKey, 109 EventuallyConsistentMap<PortNextObjectiveStoreKey,
108 - Integer> portNextObjStore) { 110 + Integer> portNextObjStore,
111 + SegmentRoutingManager srManager) {
109 this.deviceId = checkNotNull(deviceId); 112 this.deviceId = checkNotNull(deviceId);
110 this.appId = checkNotNull(appId); 113 this.appId = checkNotNull(appId);
111 this.deviceConfig = checkNotNull(config); 114 this.deviceConfig = checkNotNull(config);
...@@ -123,6 +126,7 @@ public class DefaultGroupHandler { ...@@ -123,6 +126,7 @@ public class DefaultGroupHandler {
123 this.nsNextObjStore = nsNextObjStore; 126 this.nsNextObjStore = nsNextObjStore;
124 this.subnetNextObjStore = subnetNextObjStore; 127 this.subnetNextObjStore = subnetNextObjStore;
125 this.portNextObjStore = portNextObjStore; 128 this.portNextObjStore = portNextObjStore;
129 + this.srManager = srManager;
126 130
127 populateNeighborMaps(); 131 populateNeighborMaps();
128 } 132 }
...@@ -153,7 +157,8 @@ public class DefaultGroupHandler { ...@@ -153,7 +157,8 @@ public class DefaultGroupHandler {
153 EventuallyConsistentMap<SubnetNextObjectiveStoreKey, 157 EventuallyConsistentMap<SubnetNextObjectiveStoreKey,
154 Integer> subnetNextObjStore, 158 Integer> subnetNextObjStore,
155 EventuallyConsistentMap<PortNextObjectiveStoreKey, 159 EventuallyConsistentMap<PortNextObjectiveStoreKey,
156 - Integer> portNextObjStore) 160 + Integer> portNextObjStore,
161 + SegmentRoutingManager srManager)
157 throws DeviceConfigNotFoundException { 162 throws DeviceConfigNotFoundException {
158 // handle possible exception in the caller 163 // handle possible exception in the caller
159 if (config.isEdgeDevice(deviceId)) { 164 if (config.isEdgeDevice(deviceId)) {
...@@ -162,14 +167,17 @@ public class DefaultGroupHandler { ...@@ -162,14 +167,17 @@ public class DefaultGroupHandler {
162 flowObjService, 167 flowObjService,
163 nsNextObjStore, 168 nsNextObjStore,
164 subnetNextObjStore, 169 subnetNextObjStore,
165 - portNextObjStore); 170 + portNextObjStore,
171 + srManager
172 + );
166 } else { 173 } else {
167 return new DefaultTransitGroupHandler(deviceId, appId, config, 174 return new DefaultTransitGroupHandler(deviceId, appId, config,
168 linkService, 175 linkService,
169 flowObjService, 176 flowObjService,
170 nsNextObjStore, 177 nsNextObjStore,
171 subnetNextObjStore, 178 subnetNextObjStore,
172 - portNextObjStore); 179 + portNextObjStore,
180 + srManager);
173 } 181 }
174 } 182 }
175 183
...@@ -663,11 +671,17 @@ public class DefaultGroupHandler { ...@@ -663,11 +671,17 @@ public class DefaultGroupHandler {
663 return; 671 return;
664 } 672 }
665 673
674 + VlanId assignedVlanId =
675 + srManager.getSubnetAssignedVlanId(this.deviceId, subnet);
676 + TrafficSelector metadata =
677 + DefaultTrafficSelector.builder().matchVlanId(assignedVlanId).build();
678 +
666 int nextId = flowObjectiveService.allocateNextId(); 679 int nextId = flowObjectiveService.allocateNextId();
667 680
668 NextObjective.Builder nextObjBuilder = DefaultNextObjective 681 NextObjective.Builder nextObjBuilder = DefaultNextObjective
669 .builder().withId(nextId) 682 .builder().withId(nextId)
670 - .withType(NextObjective.Type.BROADCAST).fromApp(appId); 683 + .withType(NextObjective.Type.BROADCAST).fromApp(appId)
684 + .withMeta(metadata);
671 685
672 ports.forEach(port -> { 686 ports.forEach(port -> {
673 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder(); 687 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
......
...@@ -23,6 +23,7 @@ import org.onosproject.net.DeviceId; ...@@ -23,6 +23,7 @@ import org.onosproject.net.DeviceId;
23 import org.onosproject.net.Link; 23 import org.onosproject.net.Link;
24 import org.onosproject.net.flowobjective.FlowObjectiveService; 24 import org.onosproject.net.flowobjective.FlowObjectiveService;
25 import org.onosproject.net.link.LinkService; 25 import org.onosproject.net.link.LinkService;
26 +import org.onosproject.segmentrouting.SegmentRoutingManager;
26 import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException; 27 import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
27 import org.onosproject.segmentrouting.config.DeviceProperties; 28 import org.onosproject.segmentrouting.config.DeviceProperties;
28 import org.onosproject.store.service.EventuallyConsistentMap; 29 import org.onosproject.store.service.EventuallyConsistentMap;
...@@ -40,7 +41,7 @@ import org.onosproject.store.service.EventuallyConsistentMap; ...@@ -40,7 +41,7 @@ import org.onosproject.store.service.EventuallyConsistentMap;
40 * 2) all ports to D3 + with no label push, 41 * 2) all ports to D3 + with no label push,
41 */ 42 */
42 public class DefaultTransitGroupHandler extends DefaultGroupHandler { 43 public class DefaultTransitGroupHandler extends DefaultGroupHandler {
43 - 44 + // TODO Access stores through srManager
44 protected DefaultTransitGroupHandler(DeviceId deviceId, 45 protected DefaultTransitGroupHandler(DeviceId deviceId,
45 ApplicationId appId, 46 ApplicationId appId,
46 DeviceProperties config, 47 DeviceProperties config,
...@@ -52,9 +53,10 @@ public class DefaultTransitGroupHandler extends DefaultGroupHandler { ...@@ -52,9 +53,10 @@ public class DefaultTransitGroupHandler extends DefaultGroupHandler {
52 EventuallyConsistentMap<SubnetNextObjectiveStoreKey, 53 EventuallyConsistentMap<SubnetNextObjectiveStoreKey,
53 Integer> subnetNextObjStore, 54 Integer> subnetNextObjStore,
54 EventuallyConsistentMap<PortNextObjectiveStoreKey, 55 EventuallyConsistentMap<PortNextObjectiveStoreKey,
55 - Integer> portNextObjStore) { 56 + Integer> portNextObjStore,
57 + SegmentRoutingManager srManager) {
56 super(deviceId, appId, config, linkService, flowObjService, 58 super(deviceId, appId, config, linkService, flowObjService,
57 - nsNextObjStore, subnetNextObjStore, portNextObjStore); 59 + nsNextObjStore, subnetNextObjStore, portNextObjStore, srManager);
58 } 60 }
59 61
60 @Override 62 @Override
......
...@@ -27,6 +27,7 @@ import java.util.List; ...@@ -27,6 +27,7 @@ import java.util.List;
27 import org.onlab.packet.MacAddress; 27 import org.onlab.packet.MacAddress;
28 import org.onlab.packet.MplsLabel; 28 import org.onlab.packet.MplsLabel;
29 import org.onosproject.core.ApplicationId; 29 import org.onosproject.core.ApplicationId;
30 +import org.onosproject.segmentrouting.SegmentRoutingManager;
30 import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException; 31 import org.onosproject.segmentrouting.config.DeviceConfigNotFoundException;
31 import org.onosproject.segmentrouting.config.DeviceProperties; 32 import org.onosproject.segmentrouting.config.DeviceProperties;
32 import org.onosproject.segmentrouting.grouphandler.GroupBucketIdentifier.BucketOutputType; 33 import org.onosproject.segmentrouting.grouphandler.GroupBucketIdentifier.BucketOutputType;
...@@ -60,6 +61,7 @@ public class PolicyGroupHandler extends DefaultGroupHandler { ...@@ -60,6 +61,7 @@ public class PolicyGroupHandler extends DefaultGroupHandler {
60 * @param nsNextObjStore NeighborSet next objective store map 61 * @param nsNextObjStore NeighborSet next objective store map
61 * @param subnetNextObjStore subnet next objective store map 62 * @param subnetNextObjStore subnet next objective store map
62 */ 63 */
64 + // TODO Access stores through srManager
63 public PolicyGroupHandler(DeviceId deviceId, 65 public PolicyGroupHandler(DeviceId deviceId,
64 ApplicationId appId, 66 ApplicationId appId,
65 DeviceProperties config, 67 DeviceProperties config,
...@@ -70,9 +72,10 @@ public class PolicyGroupHandler extends DefaultGroupHandler { ...@@ -70,9 +72,10 @@ public class PolicyGroupHandler extends DefaultGroupHandler {
70 EventuallyConsistentMap<SubnetNextObjectiveStoreKey, 72 EventuallyConsistentMap<SubnetNextObjectiveStoreKey,
71 Integer> subnetNextObjStore, 73 Integer> subnetNextObjStore,
72 EventuallyConsistentMap<PortNextObjectiveStoreKey, 74 EventuallyConsistentMap<PortNextObjectiveStoreKey,
73 - Integer> portNextObjStore) { 75 + Integer> portNextObjStore,
76 + SegmentRoutingManager srManager) {
74 super(deviceId, appId, config, linkService, flowObjService, 77 super(deviceId, appId, config, linkService, flowObjService,
75 - nsNextObjStore, subnetNextObjStore, portNextObjStore); 78 + nsNextObjStore, subnetNextObjStore, portNextObjStore, srManager);
76 } 79 }
77 80
78 public PolicyGroupIdentifier createPolicyGroupChain(String id, 81 public PolicyGroupIdentifier createPolicyGroupChain(String id,
......
...@@ -106,13 +106,13 @@ public class CpqdOFDPA2Pipeline extends OFDPA2Pipeline { ...@@ -106,13 +106,13 @@ public class CpqdOFDPA2Pipeline extends OFDPA2Pipeline {
106 106
107 for (PortNumber pnum : portnums) { 107 for (PortNumber pnum : portnums) {
108 // update storage 108 // update storage
109 - port2Vlan.put(pnum, storeVlan); 109 + ofdpa2GroupHandler.port2Vlan.put(pnum, storeVlan);
110 - Set<PortNumber> vlanPorts = vlan2Port.get(storeVlan); 110 + Set<PortNumber> vlanPorts = ofdpa2GroupHandler.vlan2Port.get(storeVlan);
111 if (vlanPorts == null) { 111 if (vlanPorts == null) {
112 vlanPorts = Collections.newSetFromMap( 112 vlanPorts = Collections.newSetFromMap(
113 new ConcurrentHashMap<PortNumber, Boolean>()); 113 new ConcurrentHashMap<PortNumber, Boolean>());
114 vlanPorts.add(pnum); 114 vlanPorts.add(pnum);
115 - vlan2Port.put(storeVlan, vlanPorts); 115 + ofdpa2GroupHandler.vlan2Port.put(storeVlan, vlanPorts);
116 } else { 116 } else {
117 vlanPorts.add(pnum); 117 vlanPorts.add(pnum);
118 } 118 }
......
...@@ -51,6 +51,7 @@ import org.onosproject.net.flow.criteria.Criterion.Type; ...@@ -51,6 +51,7 @@ import org.onosproject.net.flow.criteria.Criterion.Type;
51 import org.onosproject.net.flow.criteria.EthCriterion; 51 import org.onosproject.net.flow.criteria.EthCriterion;
52 import org.onosproject.net.flow.criteria.EthTypeCriterion; 52 import org.onosproject.net.flow.criteria.EthTypeCriterion;
53 import org.onosproject.net.flow.criteria.IPCriterion; 53 import org.onosproject.net.flow.criteria.IPCriterion;
54 +import org.onosproject.net.flow.criteria.MplsBosCriterion;
54 import org.onosproject.net.flow.criteria.MplsCriterion; 55 import org.onosproject.net.flow.criteria.MplsCriterion;
55 import org.onosproject.net.flow.criteria.PortCriterion; 56 import org.onosproject.net.flow.criteria.PortCriterion;
56 import org.onosproject.net.flow.criteria.VlanIdCriterion; 57 import org.onosproject.net.flow.criteria.VlanIdCriterion;
...@@ -593,9 +594,10 @@ public class SpringOpenTTP extends AbstractHandlerBehaviour ...@@ -593,9 +594,10 @@ public class SpringOpenTTP extends AbstractHandlerBehaviour
593 .matchEthType(Ethernet.MPLS_UNICAST) 594 .matchEthType(Ethernet.MPLS_UNICAST)
594 .matchMplsLabel(((MplsCriterion) 595 .matchMplsLabel(((MplsCriterion)
595 selector.getCriterion(Criterion.Type.MPLS_LABEL)).label()); 596 selector.getCriterion(Criterion.Type.MPLS_LABEL)).label());
596 - //TODO: Add Match for BoS 597 + if (selector.getCriterion(Criterion.Type.MPLS_BOS) != null) {
597 - //if (selector.getCriterion(Criterion.Type.MPLS_BOS) != null) { 598 + filteredSelectorBuilder.matchMplsBos(((MplsBosCriterion)
598 - //} 599 + selector.getCriterion(Type.MPLS_BOS)).mplsBos());
600 + }
599 forTableId = mplsTableId; 601 forTableId = mplsTableId;
600 log.debug("processing MPLS specific forwarding objective:{} in dev:{}", 602 log.debug("processing MPLS specific forwarding objective:{} in dev:{}",
601 fwd.id(), deviceId); 603 fwd.id(), deviceId);
......
...@@ -34,6 +34,7 @@ import org.onosproject.net.flow.criteria.Criterion; ...@@ -34,6 +34,7 @@ import org.onosproject.net.flow.criteria.Criterion;
34 import org.onosproject.net.flow.criteria.EthCriterion; 34 import org.onosproject.net.flow.criteria.EthCriterion;
35 import org.onosproject.net.flow.criteria.EthTypeCriterion; 35 import org.onosproject.net.flow.criteria.EthTypeCriterion;
36 import org.onosproject.net.flow.criteria.IPCriterion; 36 import org.onosproject.net.flow.criteria.IPCriterion;
37 +import org.onosproject.net.flow.criteria.MplsBosCriterion;
37 import org.onosproject.net.flow.criteria.MplsCriterion; 38 import org.onosproject.net.flow.criteria.MplsCriterion;
38 import org.onosproject.net.flow.criteria.VlanIdCriterion; 39 import org.onosproject.net.flow.criteria.VlanIdCriterion;
39 import org.onosproject.net.flow.instructions.Instruction; 40 import org.onosproject.net.flow.instructions.Instruction;
...@@ -116,9 +117,10 @@ public class SpringOpenTTPDell extends SpringOpenTTP { ...@@ -116,9 +117,10 @@ public class SpringOpenTTPDell extends SpringOpenTTP {
116 .matchEthType(Ethernet.MPLS_UNICAST) 117 .matchEthType(Ethernet.MPLS_UNICAST)
117 .matchMplsLabel(((MplsCriterion) 118 .matchMplsLabel(((MplsCriterion)
118 selector.getCriterion(Criterion.Type.MPLS_LABEL)).label()); 119 selector.getCriterion(Criterion.Type.MPLS_LABEL)).label());
119 - //TODO: Add Match for BoS 120 + if (selector.getCriterion(Criterion.Type.MPLS_BOS) != null) {
120 - //if (selector.getCriterion(Criterion.Type.MPLS_BOS) != null) { 121 + filteredSelectorBuilder.matchMplsBos(((MplsBosCriterion)
121 - //} 122 + selector.getCriterion(Criterion.Type.MPLS_BOS)).mplsBos());
123 + }
122 forTableId = mplsTableId; 124 forTableId = mplsTableId;
123 log.debug("processing MPLS specific forwarding objective"); 125 log.debug("processing MPLS specific forwarding objective");
124 } 126 }
......