lishuai
Committed by Gerrit Code Review

[ONOS-3499] Add the set treatments of ARP_SPA, ARP_SHA and ARP_OP.

Change-Id: I7e1927bcf26e7c25fede43aa864a1b71ae2e8b49
...@@ -489,6 +489,21 @@ public final class DefaultTrafficTreatment implements TrafficTreatment { ...@@ -489,6 +489,21 @@ public final class DefaultTrafficTreatment implements TrafficTreatment {
489 } 489 }
490 490
491 @Override 491 @Override
492 + public Builder setArpSpa(IpAddress addr) {
493 + return add(Instructions.modArpSpa(addr));
494 + }
495 +
496 + @Override
497 + public Builder setArpSha(MacAddress addr) {
498 + return add(Instructions.modArpSha(addr));
499 + }
500 +
501 + @Override
502 + public Builder setArpOp(short op) {
503 + return add(Instructions.modL3ArpOp(op));
504 + }
505 +
506 + @Override
492 public TrafficTreatment.Builder extension(ExtensionTreatment extension, 507 public TrafficTreatment.Builder extension(ExtensionTreatment extension,
493 DeviceId deviceId) { 508 DeviceId deviceId) {
494 return add(Instructions.extension(extension, deviceId)); 509 return add(Instructions.extension(extension, deviceId));
......
...@@ -424,6 +424,30 @@ public interface TrafficTreatment { ...@@ -424,6 +424,30 @@ public interface TrafficTreatment {
424 Builder setUdpDst(TpPort port); 424 Builder setUdpDst(TpPort port);
425 425
426 /** 426 /**
427 + * Sets the arp src ip address.
428 + *
429 + * @param addr an ip
430 + * @return a treatment builder
431 + */
432 + Builder setArpSpa(IpAddress addr);
433 +
434 + /**
435 + * Sets the arp src mac address.
436 + *
437 + * @param addr a macaddress
438 + * @return a treatment builder
439 + */
440 + Builder setArpSha(MacAddress addr);
441 +
442 + /**
443 + * Sets the arp operation.
444 + *
445 + * @param op the value of arp operation.
446 + * @return a treatment builder.
447 + */
448 + Builder setArpOp(short op);
449 +
450 + /**
427 * Uses an extension treatment. 451 * Uses an extension treatment.
428 * 452 *
429 * @param extension extension treatment 453 * @param extension extension treatment
......
...@@ -35,6 +35,9 @@ import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModOchSig ...@@ -35,6 +35,9 @@ import org.onosproject.net.flow.instructions.L0ModificationInstruction.ModOchSig
35 import org.onosproject.net.flow.instructions.L1ModificationInstruction.ModOduSignalIdInstruction; 35 import org.onosproject.net.flow.instructions.L1ModificationInstruction.ModOduSignalIdInstruction;
36 import org.onosproject.net.flow.instructions.L3ModificationInstruction.L3SubType; 36 import org.onosproject.net.flow.instructions.L3ModificationInstruction.L3SubType;
37 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInstruction; 37 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInstruction;
38 +import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModArpIPInstruction;
39 +import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModArpEthInstruction;
40 +import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModArpOpInstruction;
38 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction; 41 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction;
39 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModTtlInstruction; 42 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModTtlInstruction;
40 import org.onosproject.net.flow.instructions.L4ModificationInstruction.L4SubType; 43 import org.onosproject.net.flow.instructions.L4ModificationInstruction.L4SubType;
...@@ -299,6 +302,39 @@ public final class Instructions { ...@@ -299,6 +302,39 @@ public final class Instructions {
299 } 302 }
300 303
301 /** 304 /**
305 + * Creates a L3 ARP IP src modification.
306 + *
307 + * @param addr the ip address to modify to
308 + * @return a L3 modification
309 + */
310 + public static L3ModificationInstruction modArpSpa(IpAddress addr) {
311 + checkNotNull(addr, "Src l3 ARP IP address cannot be null");
312 + return new ModArpIPInstruction(L3SubType.ARP_SPA, addr);
313 + }
314 +
315 + /**
316 + * Creates a l3 ARP Ether src modification.
317 + *
318 + * @param addr the mac address to modify to
319 + * @return a l3 modification
320 + */
321 + public static L3ModificationInstruction modArpSha(MacAddress addr) {
322 + checkNotNull(addr, "Src l3 ARP address cannot be null");
323 + return new ModArpEthInstruction(L3SubType.ARP_SHA, addr);
324 + }
325 +
326 + /**
327 + * Creates a l3 ARP operation modification.
328 + *
329 + * @param op the ARP operation to modify to
330 + * @return a l3 modification
331 + */
332 + public static L3ModificationInstruction modL3ArpOp(short op) {
333 + checkNotNull(op, "Arp operation cannot be null");
334 + return new ModArpOpInstruction(L3SubType.ARP_OP, op);
335 + }
336 +
337 + /**
302 * Creates a push MPLS header instruction. 338 * Creates a push MPLS header instruction.
303 * 339 *
304 * @return a L2 modification. 340 * @return a L2 modification.
......
...@@ -20,6 +20,7 @@ import static com.google.common.base.MoreObjects.toStringHelper; ...@@ -20,6 +20,7 @@ import static com.google.common.base.MoreObjects.toStringHelper;
20 import java.util.Objects; 20 import java.util.Objects;
21 21
22 import org.onlab.packet.IpAddress; 22 import org.onlab.packet.IpAddress;
23 +import org.onlab.packet.MacAddress;
23 24
24 /** 25 /**
25 * Abstraction of a single traffic treatment step. 26 * Abstraction of a single traffic treatment step.
...@@ -68,7 +69,22 @@ public abstract class L3ModificationInstruction implements Instruction { ...@@ -68,7 +69,22 @@ public abstract class L3ModificationInstruction implements Instruction {
68 /** 69 /**
69 * Copy TTL in. 70 * Copy TTL in.
70 */ 71 */
71 - TTL_IN 72 + TTL_IN,
73 +
74 + /**
75 + * ARP IP src modification.
76 + */
77 + ARP_SPA,
78 +
79 + /**
80 + * ARP Ether src modification.
81 + */
82 + ARP_SHA,
83 +
84 + /**
85 + * Arp operation modification.
86 + */
87 + ARP_OP
72 88
73 //TODO: remaining types 89 //TODO: remaining types
74 } 90 }
...@@ -133,6 +149,150 @@ public abstract class L3ModificationInstruction implements Instruction { ...@@ -133,6 +149,150 @@ public abstract class L3ModificationInstruction implements Instruction {
133 } 149 }
134 150
135 /** 151 /**
152 + * Represents a L3 ARP IP src/dst modification instruction.
153 + */
154 + public static final class ModArpIPInstruction extends L3ModificationInstruction {
155 +
156 + private final L3SubType subtype;
157 + private final IpAddress ip;
158 +
159 + ModArpIPInstruction(L3SubType subType, IpAddress addr) {
160 +
161 + this.subtype = subType;
162 + this.ip = addr;
163 + }
164 +
165 + @Override
166 + public L3SubType subtype() {
167 + return this.subtype;
168 + }
169 +
170 + public IpAddress ip() {
171 + return this.ip;
172 + }
173 +
174 + @Override
175 + public String toString() {
176 + return toStringHelper(subtype().toString())
177 + .add("ip", ip).toString();
178 + }
179 +
180 + @Override
181 + public int hashCode() {
182 + return Objects.hash(type(), subtype(), ip);
183 + }
184 +
185 + @Override
186 + public boolean equals(Object obj) {
187 + if (this == obj) {
188 + return true;
189 + }
190 + if (obj instanceof ModArpIPInstruction) {
191 + ModArpIPInstruction that = (ModArpIPInstruction) obj;
192 + return Objects.equals(ip, that.ip) &&
193 + Objects.equals(this.subtype(), that.subtype());
194 + }
195 + return false;
196 + }
197 + }
198 +
199 + /**
200 + * Represents a L3 ARP Ether src/dst modification instruction.
201 + */
202 + public static final class ModArpEthInstruction extends L3ModificationInstruction {
203 +
204 + private final L3SubType subtype;
205 + private final MacAddress mac;
206 +
207 + ModArpEthInstruction(L3SubType subType, MacAddress addr) {
208 +
209 + this.subtype = subType;
210 + this.mac = addr;
211 + }
212 +
213 + @Override
214 + public L3SubType subtype() {
215 + return this.subtype;
216 + }
217 +
218 + public MacAddress mac() {
219 + return this.mac;
220 + }
221 +
222 + @Override
223 + public String toString() {
224 + return toStringHelper(subtype().toString())
225 + .add("mac", mac).toString();
226 + }
227 +
228 + @Override
229 + public int hashCode() {
230 + return Objects.hash(type(), subtype(), mac);
231 + }
232 +
233 + @Override
234 + public boolean equals(Object obj) {
235 + if (this == obj) {
236 + return true;
237 + }
238 + if (obj instanceof ModArpEthInstruction) {
239 + ModArpEthInstruction that = (ModArpEthInstruction) obj;
240 + return Objects.equals(mac, that.mac) &&
241 + Objects.equals(this.subtype(), that.subtype());
242 + }
243 + return false;
244 + }
245 + }
246 +
247 + /**
248 + * Represents a L3 ARP operation modification instruction.
249 + */
250 + public static final class ModArpOpInstruction extends L3ModificationInstruction {
251 +
252 + private final L3SubType subtype;
253 + private final short op;
254 +
255 + ModArpOpInstruction(L3SubType subType, short op) {
256 +
257 + this.subtype = subType;
258 + this.op = op;
259 + }
260 +
261 + @Override
262 + public L3SubType subtype() {
263 + return this.subtype;
264 + }
265 +
266 + public long op() {
267 + return this.op;
268 + }
269 +
270 + @Override
271 + public String toString() {
272 + return toStringHelper(subtype().toString())
273 + .add("op", op).toString();
274 + }
275 +
276 + @Override
277 + public int hashCode() {
278 + return Objects.hash(type(), subtype(), op);
279 + }
280 +
281 + @Override
282 + public boolean equals(Object obj) {
283 + if (this == obj) {
284 + return true;
285 + }
286 + if (obj instanceof ModArpOpInstruction) {
287 + ModArpOpInstruction that = (ModArpOpInstruction) obj;
288 + return Objects.equals(op, that.op) &&
289 + Objects.equals(this.subtype(), that.subtype());
290 + }
291 + return false;
292 + }
293 + }
294 +
295 + /**
136 * Represents a L3 IPv6 Flow Label (RFC 6437) modification instruction 296 * Represents a L3 IPv6 Flow Label (RFC 6437) modification instruction
137 * (20 bits unsigned integer). 297 * (20 bits unsigned integer).
138 */ 298 */
......
...@@ -45,6 +45,9 @@ import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanPc ...@@ -45,6 +45,9 @@ import org.onosproject.net.flow.instructions.L2ModificationInstruction.ModVlanPc
45 import org.onosproject.net.flow.instructions.L2ModificationInstruction.PushHeaderInstructions; 45 import org.onosproject.net.flow.instructions.L2ModificationInstruction.PushHeaderInstructions;
46 import org.onosproject.net.flow.instructions.L3ModificationInstruction; 46 import org.onosproject.net.flow.instructions.L3ModificationInstruction;
47 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInstruction; 47 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInstruction;
48 +import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModArpIPInstruction;
49 +import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModArpEthInstruction;
50 +import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModArpOpInstruction;
48 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction; 51 import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction;
49 import org.onosproject.net.flow.instructions.L4ModificationInstruction; 52 import org.onosproject.net.flow.instructions.L4ModificationInstruction;
50 import org.onosproject.net.flow.instructions.L4ModificationInstruction.ModTransportPortInstruction; 53 import org.onosproject.net.flow.instructions.L4ModificationInstruction.ModTransportPortInstruction;
...@@ -61,6 +64,7 @@ import org.projectfloodlight.openflow.protocol.action.OFActionSetQueue; ...@@ -61,6 +64,7 @@ import org.projectfloodlight.openflow.protocol.action.OFActionSetQueue;
61 import org.projectfloodlight.openflow.protocol.instruction.OFInstruction; 64 import org.projectfloodlight.openflow.protocol.instruction.OFInstruction;
62 import org.projectfloodlight.openflow.protocol.match.Match; 65 import org.projectfloodlight.openflow.protocol.match.Match;
63 import org.projectfloodlight.openflow.protocol.oxm.OFOxm; 66 import org.projectfloodlight.openflow.protocol.oxm.OFOxm;
67 +import org.projectfloodlight.openflow.types.ArpOpcode;
64 import org.projectfloodlight.openflow.types.CircuitSignalID; 68 import org.projectfloodlight.openflow.types.CircuitSignalID;
65 import org.projectfloodlight.openflow.types.EthType; 69 import org.projectfloodlight.openflow.types.EthType;
66 import org.projectfloodlight.openflow.types.IPv4Address; 70 import org.projectfloodlight.openflow.types.IPv4Address;
...@@ -430,6 +434,19 @@ public class FlowModBuilderVer13 extends FlowModBuilder { ...@@ -430,6 +434,19 @@ public class FlowModBuilderVer13 extends FlowModBuilder {
430 int flowLabel = flowLabelInstruction.flowLabel(); 434 int flowLabel = flowLabelInstruction.flowLabel();
431 oxm = factory().oxms().ipv6Flabel(IPv6FlowLabel.of(flowLabel)); 435 oxm = factory().oxms().ipv6Flabel(IPv6FlowLabel.of(flowLabel));
432 break; 436 break;
437 + case ARP_SPA:
438 + ModArpIPInstruction aip = (ModArpIPInstruction) i;
439 + ip4 = aip.ip().getIp4Address();
440 + oxm = factory().oxms().arpSpa(IPv4Address.of(ip4.toInt()));
441 + break;
442 + case ARP_SHA:
443 + ModArpEthInstruction ei = (ModArpEthInstruction) i;
444 + oxm = factory().oxms().arpSha(MacAddress.of(ei.mac().toLong()));
445 + break;
446 + case ARP_OP:
447 + ModArpOpInstruction oi = (ModArpOpInstruction) i;
448 + oxm = factory().oxms().arpOp(ArpOpcode.of((int) oi.op()));
449 + break;
433 case DEC_TTL: 450 case DEC_TTL:
434 return factory().actions().decNwTtl(); 451 return factory().actions().decNwTtl();
435 case TTL_IN: 452 case TTL_IN:
......