blob: cf81f8610ed4d4963e3981309e008a7764340b68 [file] [log] [blame]
alshabib7410fea2014-09-16 13:48:39 -07001package org.onlab.onos.net.flow.instructions;
2
alshabib99b8fdc2014-09-25 14:30:22 -07003import static com.google.common.base.MoreObjects.toStringHelper;
4
alshabib8ca53902014-10-07 13:11:17 -07005import java.util.Objects;
6
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -07007import org.onlab.packet.IpPrefix;
alshabib7410fea2014-09-16 13:48:39 -07008
9/**
10 * Abstraction of a single traffic treatment step.
alshabib7410fea2014-09-16 13:48:39 -070011 */
12public abstract class L3ModificationInstruction implements Instruction {
13
14 /**
15 * Represents the type of traffic treatment.
16 */
alshabib35edb1a2014-09-16 17:44:44 -070017 public enum L3SubType {
alshabib7410fea2014-09-16 13:48:39 -070018 /**
19 * Ether src modification.
20 */
alshabib99b8fdc2014-09-25 14:30:22 -070021 IP_SRC,
alshabib7410fea2014-09-16 13:48:39 -070022
23 /**
24 * Ether dst modification.
25 */
alshabib99b8fdc2014-09-25 14:30:22 -070026 IP_DST
alshabib7410fea2014-09-16 13:48:39 -070027
28 //TODO: remaining types
29 }
30
31 /**
32 * Returns the subtype of the modification instruction.
33 * @return type of instruction
34 */
alshabib35edb1a2014-09-16 17:44:44 -070035 public abstract L3SubType subtype();
alshabib7410fea2014-09-16 13:48:39 -070036
37 @Override
38 public Type type() {
alshabib35edb1a2014-09-16 17:44:44 -070039 return Type.L3MODIFICATION;
alshabib7410fea2014-09-16 13:48:39 -070040 }
41
42 /**
43 * Represents a L3 src/dst modification instruction.
44 */
45 public static final class ModIPInstruction extends L3ModificationInstruction {
46
alshabib35edb1a2014-09-16 17:44:44 -070047 private final L3SubType subtype;
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070048 private final IpPrefix ip;
alshabib7410fea2014-09-16 13:48:39 -070049
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070050 public ModIPInstruction(L3SubType subType, IpPrefix addr) {
alshabib64231f62014-09-16 17:58:36 -070051
alshabib7410fea2014-09-16 13:48:39 -070052 this.subtype = subType;
53 this.ip = addr;
54 }
55
56 @Override
alshabib35edb1a2014-09-16 17:44:44 -070057 public L3SubType subtype() {
alshabib7410fea2014-09-16 13:48:39 -070058 return this.subtype;
59 }
60
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070061 public IpPrefix ip() {
alshabib7410fea2014-09-16 13:48:39 -070062 return this.ip;
63 }
64
alshabib99b8fdc2014-09-25 14:30:22 -070065 @Override
66 public String toString() {
67 return toStringHelper(subtype().toString())
68 .add("ip", ip).toString();
69 }
70
alshabib8ca53902014-10-07 13:11:17 -070071 @Override
72 public int hashCode() {
73 return Objects.hash(ip, subtype());
74 }
75
76 @Override
77 public boolean equals(Object obj) {
78 if (this == obj) {
79 return true;
80 }
81 if (obj instanceof ModIPInstruction) {
82 ModIPInstruction that = (ModIPInstruction) obj;
83 return Objects.equals(ip, that.ip);
84
85 }
86 return false;
87 }
88
alshabib7410fea2014-09-16 13:48:39 -070089 }
alshabib7410fea2014-09-16 13:48:39 -070090}