daniel
Committed by Gerrit Code Review

SONA: OpenstackSwitching - RulePopulator Modified

- Populates flow rules to make suitable for SONA Pipeline

Change-Id: I8e84cd74d843a64771d43db16a9f7c5b2323c965
...@@ -53,7 +53,9 @@ public class OpenstackSwitchingRulePopulator { ...@@ -53,7 +53,9 @@ public class OpenstackSwitchingRulePopulator {
53 53
54 private static Logger log = LoggerFactory 54 private static Logger log = LoggerFactory
55 .getLogger(OpenstackSwitchingRulePopulator.class); 55 .getLogger(OpenstackSwitchingRulePopulator.class);
56 - private static final int SWITCHING_RULE_PRIORITY = 50000; 56 + private static final int SWITCHING_RULE_PRIORITY = 30000;
57 + private static final int EAST_WEST_ROUTING_RULE_PRIORITY = 29000;
58 + private static final int TUNNELTAG_RULE_PRIORITY = 30000;
57 59
58 private FlowObjectiveService flowObjectiveService; 60 private FlowObjectiveService flowObjectiveService;
59 private DriverService driverService; 61 private DriverService driverService;
...@@ -87,6 +89,7 @@ public class OpenstackSwitchingRulePopulator { ...@@ -87,6 +89,7 @@ public class OpenstackSwitchingRulePopulator {
87 openstackPortList = restHandler.getPorts(); 89 openstackPortList = restHandler.getPorts();
88 } 90 }
89 91
92 +
90 /** 93 /**
91 * Populates flow rules for the VM created. 94 * Populates flow rules for the VM created.
92 * 95 *
...@@ -94,11 +97,28 @@ public class OpenstackSwitchingRulePopulator { ...@@ -94,11 +97,28 @@ public class OpenstackSwitchingRulePopulator {
94 * @param port port for the VM created 97 * @param port port for the VM created
95 */ 98 */
96 public void populateSwitchingRules(Device device, Port port) { 99 public void populateSwitchingRules(Device device, Port port) {
100 + populateFlowRulesForVMSetTunnelTag(device, port);
97 populateFlowRulesForTrafficToSameCnode(device, port); 101 populateFlowRulesForTrafficToSameCnode(device, port);
98 populateFlowRulesForTrafficToDifferentCnode(device, port); 102 populateFlowRulesForTrafficToDifferentCnode(device, port);
99 } 103 }
100 104
101 /** 105 /**
106 + * Populate the flow rules for tagging tunnelId according to which inport is came from.
107 + *
108 + * @param device device to put the rules
109 + * @param port port info of the VM
110 + */
111 + private void populateFlowRulesForVMSetTunnelTag(Device device, Port port) {
112 + Ip4Address vmIp = getFixedIpAddressForPort(port.annotations().value("portName"));
113 + String portName = port.annotations().value("portName");
114 + String vni = getVniForPort(portName);
115 +
116 + if (vmIp != null) {
117 + setFlowRuleForVMSetTunnelTag(device.id(), port, vni);
118 + }
119 + }
120 +
121 + /**
102 * Returns OpenstackPort object for the Port reference given. 122 * Returns OpenstackPort object for the Port reference given.
103 * 123 *
104 * @param port Port object 124 * @param port Port object
...@@ -118,8 +138,12 @@ public class OpenstackSwitchingRulePopulator { ...@@ -118,8 +138,12 @@ public class OpenstackSwitchingRulePopulator {
118 */ 138 */
119 private void populateFlowRulesForTrafficToSameCnode(Device device, Port port) { 139 private void populateFlowRulesForTrafficToSameCnode(Device device, Port port) {
120 Ip4Address vmIp = getFixedIpAddressForPort(port.annotations().value("portName")); 140 Ip4Address vmIp = getFixedIpAddressForPort(port.annotations().value("portName"));
141 + String portName = port.annotations().value("portName");
142 + String vni = getVniForPort(portName);
143 + MacAddress vmMacAddress = getVmMacAddressForPort(portName);
144 +
121 if (vmIp != null) { 145 if (vmIp != null) {
122 - setFlowRuleForVMsInSameCnode(vmIp, device.id(), port); 146 + setFlowRuleForVMsInSameCnode(vmIp, device.id(), port, vni, vmMacAddress);
123 } 147 }
124 } 148 }
125 149
...@@ -167,7 +191,7 @@ public class OpenstackSwitchingRulePopulator { ...@@ -167,7 +191,7 @@ public class OpenstackSwitchingRulePopulator {
167 .filter(p -> p.id().startsWith(uuid)) 191 .filter(p -> p.id().startsWith(uuid))
168 .findAny().orElse(null); 192 .findAny().orElse(null);
169 if (port == null) { 193 if (port == null) {
170 - log.warn("No port information for port {}", portName); 194 + log.debug("No port information for port {}", portName);
171 return null; 195 return null;
172 } 196 }
173 197
...@@ -229,33 +253,82 @@ public class OpenstackSwitchingRulePopulator { ...@@ -229,33 +253,82 @@ public class OpenstackSwitchingRulePopulator {
229 return port.macAddress(); 253 return port.macAddress();
230 } 254 }
231 255
256 + private void setFlowRuleForVMSetTunnelTag(DeviceId deviceId, Port port, String vni) {
257 +
258 + TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
259 + TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
260 +
261 + sBuilder.matchEthType(Ethernet.TYPE_IPV4)
262 + .matchInPort(port.number());
263 +
264 + tBuilder.setTunnelId(Long.parseLong(vni));
265 +
266 + ForwardingObjective fo = DefaultForwardingObjective.builder()
267 + .withSelector(sBuilder.build())
268 + .withTreatment(tBuilder.build())
269 + .withPriority(TUNNELTAG_RULE_PRIORITY)
270 + .withFlag(ForwardingObjective.Flag.SPECIFIC)
271 + .fromApp(appId)
272 + .add();
273 +
274 + flowObjectiveService.forward(deviceId, fo);
275 + }
276 +
277 +
232 /** 278 /**
233 * Sets the flow rules for traffic between VMs in the same Cnode. 279 * Sets the flow rules for traffic between VMs in the same Cnode.
234 * 280 *
235 * @param ip4Address VM IP address 281 * @param ip4Address VM IP address
236 * @param id device ID to put rules 282 * @param id device ID to put rules
237 * @param port VM port 283 * @param port VM port
284 + * @param vni VM VNI
285 + * @param vmMacAddress VM MAC address
238 */ 286 */
239 private void setFlowRuleForVMsInSameCnode(Ip4Address ip4Address, DeviceId id, 287 private void setFlowRuleForVMsInSameCnode(Ip4Address ip4Address, DeviceId id,
240 - Port port) { 288 + Port port, String vni, MacAddress vmMacAddress) {
289 +
290 + //For L2 Switching Case
241 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder(); 291 TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
242 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder(); 292 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
243 293
244 sBuilder.matchEthType(Ethernet.TYPE_IPV4) 294 sBuilder.matchEthType(Ethernet.TYPE_IPV4)
245 - .matchIPDst(ip4Address.toIpPrefix()); 295 + .matchIPDst(ip4Address.toIpPrefix())
296 + .matchTunnelId(Long.parseLong(vni));
297 +
246 tBuilder.setOutput(port.number()); 298 tBuilder.setOutput(port.number());
247 299
248 ForwardingObjective fo = DefaultForwardingObjective.builder() 300 ForwardingObjective fo = DefaultForwardingObjective.builder()
249 .withSelector(sBuilder.build()) 301 .withSelector(sBuilder.build())
250 .withTreatment(tBuilder.build()) 302 .withTreatment(tBuilder.build())
251 .withPriority(SWITCHING_RULE_PRIORITY) 303 .withPriority(SWITCHING_RULE_PRIORITY)
252 - .withFlag(ForwardingObjective.Flag.VERSATILE) 304 + .withFlag(ForwardingObjective.Flag.SPECIFIC)
305 + .fromApp(appId)
306 + .add();
307 +
308 + flowObjectiveService.forward(id, fo);
309 +
310 + //For L3 Ease-West Routing Case
311 + sBuilder = DefaultTrafficSelector.builder();
312 + tBuilder = DefaultTrafficTreatment.builder();
313 +
314 + sBuilder.matchEthType(Ethernet.TYPE_IPV4)
315 + .matchIPDst(ip4Address.toIpPrefix());
316 +
317 + tBuilder.setEthDst(vmMacAddress)
318 + .setOutput(port.number());
319 +
320 + fo = DefaultForwardingObjective.builder()
321 + .withSelector(sBuilder.build())
322 + .withTreatment(tBuilder.build())
323 + .withPriority(EAST_WEST_ROUTING_RULE_PRIORITY)
324 + .withFlag(ForwardingObjective.Flag.SPECIFIC)
253 .fromApp(appId) 325 .fromApp(appId)
254 .add(); 326 .add();
255 327
256 flowObjectiveService.forward(id, fo); 328 flowObjectiveService.forward(id, fo);
257 } 329 }
258 330
331 +
259 /** 332 /**
260 * Sets the flow rules between traffic from VMs in different Cnode. 333 * Sets the flow rules between traffic from VMs in different Cnode.
261 * 334 *
...@@ -271,16 +344,17 @@ public class OpenstackSwitchingRulePopulator { ...@@ -271,16 +344,17 @@ public class OpenstackSwitchingRulePopulator {
271 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder(); 344 TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
272 345
273 sBuilder.matchEthType(Ethernet.TYPE_IPV4) 346 sBuilder.matchEthType(Ethernet.TYPE_IPV4)
347 + .matchTunnelId(Long.parseLong(vni))
274 .matchIPDst(vmIp.toIpPrefix()); 348 .matchIPDst(vmIp.toIpPrefix());
275 - tBuilder.setTunnelId(Long.parseLong(vni)) 349 +
276 - .extension(buildNiciraExtenstion(id, hostIp), id) 350 + tBuilder.extension(buildNiciraExtenstion(id, hostIp), id)
277 .setOutput(getTunnelPort(id)); 351 .setOutput(getTunnelPort(id));
278 352
279 ForwardingObjective fo = DefaultForwardingObjective.builder() 353 ForwardingObjective fo = DefaultForwardingObjective.builder()
280 .withSelector(sBuilder.build()) 354 .withSelector(sBuilder.build())
281 .withTreatment(tBuilder.build()) 355 .withTreatment(tBuilder.build())
282 .withPriority(SWITCHING_RULE_PRIORITY) 356 .withPriority(SWITCHING_RULE_PRIORITY)
283 - .withFlag(ForwardingObjective.Flag.VERSATILE) 357 + .withFlag(ForwardingObjective.Flag.SPECIFIC)
284 .fromApp(appId) 358 .fromApp(appId)
285 .add(); 359 .add();
286 360
......