lishuai

[ONOS-4502]Fix the bug about the different tenant and the same subnet.With diffe…

…rent tenants and the same subnets, only one of the subnets can ping external network well.
Change-Id: I2ad2c100e933e6c22a7e728f8991967d17ede4c9
...@@ -910,12 +910,12 @@ public class VtnManager implements VtnService { ...@@ -910,12 +910,12 @@ public class VtnManager implements VtnService {
910 .programL3InPortClassifierRules(h.location().deviceId(), 910 .programL3InPortClassifierRules(h.location().deviceId(),
911 h.location().port(), h.mac(), 911 h.location().port(), h.mac(),
912 srcVmGwMac, l3vni, operation); 912 srcVmGwMac, l3vni, operation);
913 - // Arp rules
914 - if (operation == Objective.Operation.ADD) {
915 classifierService.programArpClassifierRules(h.location().deviceId(), 913 classifierService.programArpClassifierRules(h.location().deviceId(),
916 - srcGwIp, 914 + h.location().port(), srcGwIp,
917 network.segmentationId(), 915 network.segmentationId(),
918 operation); 916 operation);
917 + // Arp rules
918 + if (operation == Objective.Operation.ADD) {
919 DriverHandler handler = driverService.createHandler(h.location().deviceId()); 919 DriverHandler handler = driverService.createHandler(h.location().deviceId());
920 arpService.programArpRules(handler, h.location().deviceId(), srcGwIp, 920 arpService.programArpRules(handler, h.location().deviceId(), srcGwIp,
921 network.segmentationId(), srcVmGwMac, 921 network.segmentationId(), srcVmGwMac,
...@@ -1028,10 +1028,10 @@ public class VtnManager implements VtnService { ...@@ -1028,10 +1028,10 @@ public class VtnManager implements VtnService {
1028 fGwMac, exPortMac, 1028 fGwMac, exPortMac,
1029 floatingIp.floatingIp(), 1029 floatingIp.floatingIp(),
1030 fipNetwork.segmentationId(), operation); 1030 fipNetwork.segmentationId(), operation);
1031 - if (operation == Objective.Operation.ADD) { 1031 + classifierService.programArpClassifierRules(deviceId, host.location().port(),
1032 - classifierService.programArpClassifierRules(deviceId, dstVmGwIp, 1032 + dstVmGwIp, vmNetwork.segmentationId(),
1033 - vmNetwork.segmentationId(),
1034 operation); 1033 operation);
1034 + if (operation == Objective.Operation.ADD) {
1035 arpService.programArpRules(handler, deviceId, dstVmGwIp, 1035 arpService.programArpRules(handler, deviceId, dstVmGwIp,
1036 vmNetwork.segmentationId(), dstVmGwMac, 1036 vmNetwork.segmentationId(), dstVmGwMac,
1037 operation); 1037 operation);
......
...@@ -104,6 +104,21 @@ public interface ClassifierService { ...@@ -104,6 +104,21 @@ public interface ClassifierService {
104 Objective.Operation type); 104 Objective.Operation type);
105 105
106 /** 106 /**
107 + * Assemble the Arp Classifier table rules.
108 + * Match: arp type and destination ip.
109 + * Action: set vnid and go to ARP Table(10).
110 + *
111 + * @param deviceId Device Id
112 + * @param inPort the ingress port of the host
113 + * @param dstIp source gateway ip
114 + * @param actionVni the vni of the source network (l2vni)
115 + * @param type the operation type of the flow rules
116 + */
117 + void programArpClassifierRules(DeviceId deviceId, PortNumber inPort,
118 + IpAddress dstIp, SegmentationId actionVni,
119 + Objective.Operation type);
120 +
121 + /**
107 * Assemble the Userdata Classifier table rules. 122 * Assemble the Userdata Classifier table rules.
108 * Match: subnet ip prefix and destination ip. 123 * Match: subnet ip prefix and destination ip.
109 * Action: add flow rule to specific ip for userdata. 124 * Action: add flow rule to specific ip for userdata.
......
...@@ -194,6 +194,30 @@ public class ClassifierServiceImpl implements ClassifierService { ...@@ -194,6 +194,30 @@ public class ClassifierServiceImpl implements ClassifierService {
194 } 194 }
195 195
196 @Override 196 @Override
197 + public void programArpClassifierRules(DeviceId deviceId, PortNumber inPort,
198 + IpAddress dstIp,
199 + SegmentationId actionVni,
200 + Objective.Operation type) {
201 + TrafficSelector selector = DefaultTrafficSelector.builder()
202 + .matchInPort(inPort).matchEthType(ETH_TYPE.ethType().toShort())
203 + .matchArpTpa(Ip4Address.valueOf(dstIp.toString())).build();
204 + TrafficTreatment treatment = DefaultTrafficTreatment.builder()
205 + .setTunnelId(Long.parseLong(actionVni.segmentationId()))
206 + .build();
207 + ForwardingObjective.Builder objective = DefaultForwardingObjective
208 + .builder().withTreatment(treatment).withSelector(selector)
209 + .fromApp(appId).withFlag(Flag.SPECIFIC)
210 + .withPriority(ARP_CLASSIFIER_PRIORITY);
211 + if (type.equals(Objective.Operation.ADD)) {
212 + log.debug("ArpClassifierRules-->ADD");
213 + flowObjectiveService.forward(deviceId, objective.add());
214 + } else {
215 + log.debug("ArpClassifierRules-->REMOVE");
216 + flowObjectiveService.forward(deviceId, objective.remove());
217 + }
218 + }
219 +
220 + @Override
197 public void programUserdataClassifierRules(DeviceId deviceId, 221 public void programUserdataClassifierRules(DeviceId deviceId,
198 IpPrefix ipPrefix, 222 IpPrefix ipPrefix,
199 IpAddress dstIp, 223 IpAddress dstIp,
......