blob: 78eaaa9a54af90c2e22fae8b5b113f57f19e99be [file] [log] [blame]
alshabib55a55d92014-09-16 11:59:31 -07001package org.onlab.onos.net.flow.instructions;
2
Ayaka Koshibea9c199f2014-09-16 16:21:40 -07003import org.onlab.packet.MacAddress;
4import org.onlab.packet.VlanId;
alshabib55a55d92014-09-16 11:59:31 -07005
6/**
7 * Abstraction of a single traffic treatment step.
8 * @param <T> the type parameter for the instruction
9 */
10public abstract class L2ModificationInstruction implements Instruction {
11
12 /**
13 * Represents the type of traffic treatment.
14 */
alshabib35edb1a2014-09-16 17:44:44 -070015 public enum L2SubType {
alshabib55a55d92014-09-16 11:59:31 -070016 /**
17 * Ether src modification.
18 */
19 L2_SRC,
20
21 /**
22 * Ether dst modification.
23 */
24 L2_DST,
25
26 /**
alshabib55a55d92014-09-16 11:59:31 -070027 * VLAN id modification.
28 */
29 VLAN_ID,
30
31 /**
32 * VLAN priority modification.
33 */
34 VLAN_PCP
35 }
36
37 // TODO: Create factory class 'Instructions' that will have various factory
38 // to create specific instructions.
39
alshabib35edb1a2014-09-16 17:44:44 -070040 public abstract L2SubType subtype();
alshabib55a55d92014-09-16 11:59:31 -070041
42 @Override
43 public Type type() {
alshabib35edb1a2014-09-16 17:44:44 -070044 return Type.L2MODIFICATION;
alshabib55a55d92014-09-16 11:59:31 -070045 }
46
47 /**
48 * Represents a L2 src/dst modification instruction.
49 */
50 public static final class ModEtherInstruction extends L2ModificationInstruction {
51
alshabib35edb1a2014-09-16 17:44:44 -070052 private final L2SubType subtype;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070053 private final MacAddress mac;
alshabib55a55d92014-09-16 11:59:31 -070054
alshabib64231f62014-09-16 17:58:36 -070055 public ModEtherInstruction(L2SubType subType, MacAddress addr) {
56
alshabib55a55d92014-09-16 11:59:31 -070057 this.subtype = subType;
58 this.mac = addr;
59 }
60
61 @Override
alshabib35edb1a2014-09-16 17:44:44 -070062 public L2SubType subtype() {
alshabib55a55d92014-09-16 11:59:31 -070063 return this.subtype;
64 }
65
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070066 public MacAddress mac() {
alshabib55a55d92014-09-16 11:59:31 -070067 return this.mac;
68 }
69
70 }
71
72 /**
alshabib55a55d92014-09-16 11:59:31 -070073 * Represents a VLAN id modification instruction.
74 */
75 public static final class ModVlanIdInstruction extends L2ModificationInstruction {
76
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070077 public final VlanId vlanId;
alshabib55a55d92014-09-16 11:59:31 -070078
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070079 public ModVlanIdInstruction(VlanId vlanId) {
alshabib55a55d92014-09-16 11:59:31 -070080 this.vlanId = vlanId;
81 }
82
83 @Override
alshabib35edb1a2014-09-16 17:44:44 -070084 public L2SubType subtype() {
alshabib7410fea2014-09-16 13:48:39 -070085 return L2SubType.VLAN_ID;
alshabib55a55d92014-09-16 11:59:31 -070086 }
87
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070088 public VlanId vlanId() {
alshabib55a55d92014-09-16 11:59:31 -070089 return this.vlanId;
90 }
91
92 }
93
alshabib7410fea2014-09-16 13:48:39 -070094 /**
95 * Represents a VLAN PCP modification instruction.
96 */
97 public static final class ModVlanPcpInstruction extends L2ModificationInstruction {
98
99 public final Byte vlanPcp;
100
101 public ModVlanPcpInstruction(Byte vlanPcp) {
102 this.vlanPcp = vlanPcp;
103 }
104
105 @Override
alshabib35edb1a2014-09-16 17:44:44 -0700106 public L2SubType subtype() {
alshabib7410fea2014-09-16 13:48:39 -0700107 return L2SubType.VLAN_PCP;
108 }
109
110 public Byte vlanPcp() {
111 return this.vlanPcp;
112 }
113
114 }
115
alshabib55a55d92014-09-16 11:59:31 -0700116
117}