jiangrui
Committed by Gerrit Code Review

ONOS-3404 Change p2p tunnel to p2any tunnel by using set tunnel_dst in

flow.

Change-Id: I06cb6d42772434de9c016e795de5c6d8a6f45dfb
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
15 */ 15 */
16 package org.onosproject.vtn.table; 16 package org.onosproject.vtn.table;
17 17
18 +import org.onlab.packet.IpAddress;
18 import org.onlab.packet.MacAddress; 19 import org.onlab.packet.MacAddress;
19 import org.onosproject.net.DeviceId; 20 import org.onosproject.net.DeviceId;
20 import org.onosproject.net.PortNumber; 21 import org.onosproject.net.PortNumber;
...@@ -22,13 +23,14 @@ import org.onosproject.net.flowobjective.Objective; ...@@ -22,13 +23,14 @@ import org.onosproject.net.flowobjective.Objective;
22 import org.onosproject.vtnrsc.SegmentationId; 23 import org.onosproject.vtnrsc.SegmentationId;
23 24
24 /** 25 /**
25 - * Applies L2 flows to the device. 26 + * Applies L2 flows to the device. L2Forward table is Table(50).
26 */ 27 */
27 public interface L2ForwardService { 28 public interface L2ForwardService {
28 29
29 /** 30 /**
30 - * The local broadcast rule that message matches Table(50) Match: broadcast 31 + * The local broadcast rule that message matches Table(50).
31 - * mac and vnid Action: output port. 32 + * Match: broadcast mac and vnid.
33 + * Action: set output port.
32 * 34 *
33 * @param deviceId Device Id 35 * @param deviceId Device Id
34 * @param segmentationId the vnid of the host belong to 36 * @param segmentationId the vnid of the host belong to
...@@ -45,8 +47,9 @@ public interface L2ForwardService { ...@@ -45,8 +47,9 @@ public interface L2ForwardService {
45 Objective.Operation type); 47 Objective.Operation type);
46 48
47 /** 49 /**
48 - * The tunnel broadcast rule that message matches Table(50) Match: broadcast 50 + * The tunnel broadcast rule that message matches Table(50).
49 - * mac and vnid Action: output port. 51 + * Match: broadcast mac and vnid.
52 + * Action: output port.
50 * 53 *
51 * @param deviceId Device Id 54 * @param deviceId Device Id
52 * @param segmentationId the vnid of the host belong to 55 * @param segmentationId the vnid of the host belong to
...@@ -61,8 +64,9 @@ public interface L2ForwardService { ...@@ -61,8 +64,9 @@ public interface L2ForwardService {
61 Objective.Operation type); 64 Objective.Operation type);
62 65
63 /** 66 /**
64 - * The local out rule that message matches. Table(50) Match: local host mac 67 + * The local out rule that message matches Table(50).
65 - * and vnid Action: output local host port. 68 + * Match: local host mac and vnid.
69 + * Action: output local host port.
66 * 70 *
67 * @param deviceId Device Id 71 * @param deviceId Device Id
68 * @param segmentationId the vnid of the host belong to 72 * @param segmentationId the vnid of the host belong to
...@@ -75,17 +79,19 @@ public interface L2ForwardService { ...@@ -75,17 +79,19 @@ public interface L2ForwardService {
75 Objective.Operation type); 79 Objective.Operation type);
76 80
77 /** 81 /**
78 - * The tunnel out rule that message matches. Table(50) Match: host mac and 82 + * The tunnel out rule that message matches Table(50).
79 - * vnid Action: output tunnel port. 83 + * Match: host mac and vnid.
84 + * Action: output tunnel port.
80 * 85 *
81 * @param deviceId Device Id 86 * @param deviceId Device Id
82 * @param segmentationId the vnid of the host belong to 87 * @param segmentationId the vnid of the host belong to
83 * @param tunnelOutPort the port of the tunnel 88 * @param tunnelOutPort the port of the tunnel
84 * @param dstMac the mac of the host 89 * @param dstMac the mac of the host
85 * @param type the operation of the flow 90 * @param type the operation of the flow
91 + * @param ipAddress the ipAddress of the node
86 */ 92 */
87 void programTunnelOut(DeviceId deviceId, SegmentationId segmentationId, 93 void programTunnelOut(DeviceId deviceId, SegmentationId segmentationId,
88 PortNumber tunnelOutPort, MacAddress dstMac, 94 PortNumber tunnelOutPort, MacAddress dstMac,
89 - Objective.Operation type); 95 + Objective.Operation type, IpAddress ipAddress);
90 96
91 } 97 }
......
...@@ -16,19 +16,28 @@ ...@@ -16,19 +16,28 @@
16 package org.onosproject.vtn.table.impl; 16 package org.onosproject.vtn.table.impl;
17 17
18 import static com.google.common.base.Preconditions.checkNotNull; 18 import static com.google.common.base.Preconditions.checkNotNull;
19 +import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST;
19 import static org.slf4j.LoggerFactory.getLogger; 20 import static org.slf4j.LoggerFactory.getLogger;
20 21
21 import org.onlab.osgi.DefaultServiceDirectory; 22 import org.onlab.osgi.DefaultServiceDirectory;
22 import org.onlab.osgi.ServiceDirectory; 23 import org.onlab.osgi.ServiceDirectory;
24 +import org.onlab.packet.Ip4Address;
25 +import org.onlab.packet.IpAddress;
23 import org.onlab.packet.MacAddress; 26 import org.onlab.packet.MacAddress;
24 import org.onosproject.core.ApplicationId; 27 import org.onosproject.core.ApplicationId;
28 +import org.onosproject.core.DefaultGroupId;
25 import org.onosproject.net.DeviceId; 29 import org.onosproject.net.DeviceId;
26 import org.onosproject.net.PortNumber; 30 import org.onosproject.net.PortNumber;
31 +import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
32 +import org.onosproject.net.driver.DriverHandler;
33 +import org.onosproject.net.driver.DriverService;
27 import org.onosproject.net.flow.DefaultTrafficSelector; 34 import org.onosproject.net.flow.DefaultTrafficSelector;
28 import org.onosproject.net.flow.DefaultTrafficTreatment; 35 import org.onosproject.net.flow.DefaultTrafficTreatment;
29 import org.onosproject.net.flow.TrafficSelector; 36 import org.onosproject.net.flow.TrafficSelector;
30 import org.onosproject.net.flow.TrafficTreatment; 37 import org.onosproject.net.flow.TrafficTreatment;
38 +import org.onosproject.net.flow.TrafficTreatment.Builder;
31 import org.onosproject.net.flow.criteria.Criteria; 39 import org.onosproject.net.flow.criteria.Criteria;
40 +import org.onosproject.net.flow.instructions.ExtensionTreatment;
32 import org.onosproject.net.flowobjective.DefaultForwardingObjective; 41 import org.onosproject.net.flowobjective.DefaultForwardingObjective;
33 import org.onosproject.net.flowobjective.FlowObjectiveService; 42 import org.onosproject.net.flowobjective.FlowObjectiveService;
34 import org.onosproject.net.flowobjective.ForwardingObjective; 43 import org.onosproject.net.flowobjective.ForwardingObjective;
...@@ -47,10 +56,10 @@ public final class L2ForwardServiceImpl implements L2ForwardService { ...@@ -47,10 +56,10 @@ public final class L2ForwardServiceImpl implements L2ForwardService {
47 private final Logger log = getLogger(getClass()); 56 private final Logger log = getLogger(getClass());
48 57
49 private static final int MAC_PRIORITY = 0xffff; 58 private static final int MAC_PRIORITY = 0xffff;
50 - 59 + public static final Integer GROUP_ID = 1;
51 private final FlowObjectiveService flowObjectiveService; 60 private final FlowObjectiveService flowObjectiveService;
52 private final ApplicationId appId; 61 private final ApplicationId appId;
53 - 62 + private final DriverService driverService;
54 /** 63 /**
55 * Constructor. 64 * Constructor.
56 * 65 *
...@@ -60,6 +69,7 @@ public final class L2ForwardServiceImpl implements L2ForwardService { ...@@ -60,6 +69,7 @@ public final class L2ForwardServiceImpl implements L2ForwardService {
60 this.appId = checkNotNull(appId, "ApplicationId can not be null"); 69 this.appId = checkNotNull(appId, "ApplicationId can not be null");
61 ServiceDirectory serviceDirectory = new DefaultServiceDirectory(); 70 ServiceDirectory serviceDirectory = new DefaultServiceDirectory();
62 this.flowObjectiveService = serviceDirectory.get(FlowObjectiveService.class); 71 this.flowObjectiveService = serviceDirectory.get(FlowObjectiveService.class);
72 + this.driverService = serviceDirectory.get(DriverService.class);
63 } 73 }
64 74
65 @Override 75 @Override
...@@ -91,9 +101,7 @@ public final class L2ForwardServiceImpl implements L2ForwardService { ...@@ -91,9 +101,7 @@ public final class L2ForwardServiceImpl implements L2ForwardService {
91 if (type.equals(Objective.Operation.REMOVE) && inPort == lp) { 101 if (type.equals(Objective.Operation.REMOVE) && inPort == lp) {
92 flag = false; 102 flag = false;
93 } 103 }
94 - for (PortNumber outport : localTunnelPorts) { 104 + treatment.group(new DefaultGroupId(GROUP_ID));
95 - treatment.setOutput(outport);
96 - }
97 ForwardingObjective.Builder objective = DefaultForwardingObjective 105 ForwardingObjective.Builder objective = DefaultForwardingObjective
98 .builder().withTreatment(treatment.build()) 106 .builder().withTreatment(treatment.build())
99 .withSelector(selector).fromApp(appId).makePermanent() 107 .withSelector(selector).fromApp(appId).makePermanent()
...@@ -171,15 +179,26 @@ public final class L2ForwardServiceImpl implements L2ForwardService { ...@@ -171,15 +179,26 @@ public final class L2ForwardServiceImpl implements L2ForwardService {
171 public void programTunnelOut(DeviceId deviceId, 179 public void programTunnelOut(DeviceId deviceId,
172 SegmentationId segmentationId, 180 SegmentationId segmentationId,
173 PortNumber tunnelOutPort, MacAddress dstMac, 181 PortNumber tunnelOutPort, MacAddress dstMac,
174 - Objective.Operation type) { 182 + Objective.Operation type, IpAddress ipAddress) {
175 TrafficSelector selector = DefaultTrafficSelector.builder() 183 TrafficSelector selector = DefaultTrafficSelector.builder()
176 .matchEthDst(dstMac).add(Criteria.matchTunnelId(Long 184 .matchEthDst(dstMac).add(Criteria.matchTunnelId(Long
177 .parseLong(segmentationId.toString()))) 185 .parseLong(segmentationId.toString())))
178 .build(); 186 .build();
179 - TrafficTreatment treatment = DefaultTrafficTreatment.builder() 187 +
188 + DriverHandler handler = driverService.createHandler(deviceId);
189 + ExtensionTreatmentResolver resolver = handler.behaviour(ExtensionTreatmentResolver.class);
190 + ExtensionTreatment treatment = resolver.getExtensionInstruction(NICIRA_SET_TUNNEL_DST.type());
191 + try {
192 + treatment.setPropertyValue("tunnelDst", Ip4Address.valueOf(ipAddress.toString()));
193 + } catch (Exception e) {
194 + log.error("Failed to get extension instruction to set tunnel dst {}", deviceId);
195 + }
196 +
197 + Builder builder = DefaultTrafficTreatment.builder();
198 + builder.extension(treatment, deviceId)
180 .setOutput(tunnelOutPort).build(); 199 .setOutput(tunnelOutPort).build();
181 ForwardingObjective.Builder objective = DefaultForwardingObjective 200 ForwardingObjective.Builder objective = DefaultForwardingObjective
182 - .builder().withTreatment(treatment).withSelector(selector) 201 + .builder().withTreatment(builder.build()).withSelector(selector)
183 .fromApp(appId).withFlag(Flag.SPECIFIC) 202 .fromApp(appId).withFlag(Flag.SPECIFIC)
184 .withPriority(MAC_PRIORITY); 203 .withPriority(MAC_PRIORITY);
185 if (type.equals(Objective.Operation.ADD)) { 204 if (type.equals(Objective.Operation.ADD)) {
...@@ -189,5 +208,4 @@ public final class L2ForwardServiceImpl implements L2ForwardService { ...@@ -189,5 +208,4 @@ public final class L2ForwardServiceImpl implements L2ForwardService {
189 } 208 }
190 209
191 } 210 }
192 -
193 } 211 }
......
...@@ -15,9 +15,12 @@ ...@@ -15,9 +15,12 @@
15 */ 15 */
16 package org.onosproject.vtn.util; 16 package org.onosproject.vtn.util;
17 17
18 +import java.util.HashMap;
19 +import java.util.Map;
18 import java.util.Set; 20 import java.util.Set;
19 21
20 import org.onlab.packet.IpAddress; 22 import org.onlab.packet.IpAddress;
23 +import org.onosproject.net.DefaultAnnotations;
21 import org.onosproject.net.PortNumber; 24 import org.onosproject.net.PortNumber;
22 import org.onosproject.net.behaviour.BridgeConfig; 25 import org.onosproject.net.behaviour.BridgeConfig;
23 import org.onosproject.net.behaviour.BridgeName; 26 import org.onosproject.net.behaviour.BridgeName;
...@@ -26,6 +29,7 @@ import org.onosproject.net.behaviour.IpTunnelEndPoint; ...@@ -26,6 +29,7 @@ import org.onosproject.net.behaviour.IpTunnelEndPoint;
26 import org.onosproject.net.behaviour.TunnelConfig; 29 import org.onosproject.net.behaviour.TunnelConfig;
27 import org.onosproject.net.behaviour.TunnelDescription; 30 import org.onosproject.net.behaviour.TunnelDescription;
28 import org.onosproject.net.behaviour.TunnelEndPoint; 31 import org.onosproject.net.behaviour.TunnelEndPoint;
32 +import org.onosproject.net.behaviour.TunnelName;
29 import org.onosproject.net.driver.DriverHandler; 33 import org.onosproject.net.driver.DriverHandler;
30 34
31 /** 35 /**
...@@ -34,7 +38,13 @@ import org.onosproject.net.driver.DriverHandler; ...@@ -34,7 +38,13 @@ import org.onosproject.net.driver.DriverHandler;
34 public final class VtnConfig { 38 public final class VtnConfig {
35 39
36 private static final String DEFAULT_BRIDGE_NAME = "br-int"; 40 private static final String DEFAULT_BRIDGE_NAME = "br-int";
37 - 41 + private static final String DEFAULT_TUNNEL = "vxlan-0.0.0.0";
42 + private static final Map<String, String> DEFAULT_TUNNEL_OPTIONS = new HashMap<String, String>() {
43 + {
44 + put("key", "flow");
45 + put("remote_ip", "flow");
46 + }
47 + };
38 /** 48 /**
39 * Constructs a vtn config object. Utility classes should not have a 49 * Constructs a vtn config object. Utility classes should not have a
40 * public or default constructor, otherwise IDE will compile unsuccessfully. This 50 * public or default constructor, otherwise IDE will compile unsuccessfully. This
...@@ -64,15 +74,19 @@ public final class VtnConfig { ...@@ -64,15 +74,19 @@ public final class VtnConfig {
64 */ 74 */
65 public static void applyTunnelConfig(DriverHandler handler, IpAddress srcIp, 75 public static void applyTunnelConfig(DriverHandler handler, IpAddress srcIp,
66 IpAddress dstIp) { 76 IpAddress dstIp) {
77 + DefaultAnnotations.Builder optionBuilder = DefaultAnnotations.builder();
78 + for (String key : DEFAULT_TUNNEL_OPTIONS.keySet()) {
79 + optionBuilder.set(key, DEFAULT_TUNNEL_OPTIONS.get(key));
80 + }
67 TunnelConfig tunnelConfig = handler.behaviour(TunnelConfig.class); 81 TunnelConfig tunnelConfig = handler.behaviour(TunnelConfig.class);
68 TunnelEndPoint tunnelAsSrc = IpTunnelEndPoint.ipTunnelPoint(srcIp); 82 TunnelEndPoint tunnelAsSrc = IpTunnelEndPoint.ipTunnelPoint(srcIp);
69 - TunnelEndPoint tunnelAsDst = IpTunnelEndPoint.ipTunnelPoint(dstIp);
70 TunnelDescription tunnel = new DefaultTunnelDescription( 83 TunnelDescription tunnel = new DefaultTunnelDescription(
71 tunnelAsSrc, 84 tunnelAsSrc,
72 - tunnelAsDst, 85 + null,
73 TunnelDescription.Type.VXLAN, 86 TunnelDescription.Type.VXLAN,
74 - null); 87 + TunnelName.tunnelName(DEFAULT_TUNNEL),
75 - tunnelConfig.createTunnel(tunnel); 88 + optionBuilder.build());
89 + tunnelConfig.createTunnelInterface(BridgeName.bridgeName(DEFAULT_BRIDGE_NAME), tunnel);
76 } 90 }
77 91
78 /** 92 /**
......