blob: a0ab04c98acc2ab221e5a65c666c26ee7ac27af8 [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.
alshabib55a55d92014-09-16 11:59:31 -07008 */
9public abstract class L2ModificationInstruction implements Instruction {
10
11 /**
12 * Represents the type of traffic treatment.
13 */
alshabib35edb1a2014-09-16 17:44:44 -070014 public enum L2SubType {
alshabib55a55d92014-09-16 11:59:31 -070015 /**
16 * Ether src modification.
17 */
18 L2_SRC,
19
20 /**
21 * Ether dst modification.
22 */
23 L2_DST,
24
25 /**
alshabib55a55d92014-09-16 11:59:31 -070026 * VLAN id modification.
27 */
28 VLAN_ID,
29
30 /**
31 * VLAN priority modification.
32 */
33 VLAN_PCP
34 }
35
36 // TODO: Create factory class 'Instructions' that will have various factory
37 // to create specific instructions.
38
alshabib35edb1a2014-09-16 17:44:44 -070039 public abstract L2SubType subtype();
alshabib55a55d92014-09-16 11:59:31 -070040
41 @Override
42 public Type type() {
alshabib35edb1a2014-09-16 17:44:44 -070043 return Type.L2MODIFICATION;
alshabib55a55d92014-09-16 11:59:31 -070044 }
45
46 /**
47 * Represents a L2 src/dst modification instruction.
48 */
49 public static final class ModEtherInstruction extends L2ModificationInstruction {
50
alshabib35edb1a2014-09-16 17:44:44 -070051 private final L2SubType subtype;
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070052 private final MacAddress mac;
alshabib55a55d92014-09-16 11:59:31 -070053
alshabib64231f62014-09-16 17:58:36 -070054 public ModEtherInstruction(L2SubType subType, MacAddress addr) {
55
alshabib55a55d92014-09-16 11:59:31 -070056 this.subtype = subType;
57 this.mac = addr;
58 }
59
60 @Override
alshabib35edb1a2014-09-16 17:44:44 -070061 public L2SubType subtype() {
alshabib55a55d92014-09-16 11:59:31 -070062 return this.subtype;
63 }
64
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070065 public MacAddress mac() {
alshabib55a55d92014-09-16 11:59:31 -070066 return this.mac;
67 }
68
69 }
70
71 /**
alshabib55a55d92014-09-16 11:59:31 -070072 * Represents a VLAN id modification instruction.
73 */
74 public static final class ModVlanIdInstruction extends L2ModificationInstruction {
75
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070076 public final VlanId vlanId;
alshabib55a55d92014-09-16 11:59:31 -070077
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070078 public ModVlanIdInstruction(VlanId vlanId) {
alshabib55a55d92014-09-16 11:59:31 -070079 this.vlanId = vlanId;
80 }
81
82 @Override
alshabib35edb1a2014-09-16 17:44:44 -070083 public L2SubType subtype() {
alshabib7410fea2014-09-16 13:48:39 -070084 return L2SubType.VLAN_ID;
alshabib55a55d92014-09-16 11:59:31 -070085 }
86
Ayaka Koshibea9c199f2014-09-16 16:21:40 -070087 public VlanId vlanId() {
alshabib55a55d92014-09-16 11:59:31 -070088 return this.vlanId;
89 }
90
91 }
92
alshabib7410fea2014-09-16 13:48:39 -070093 /**
94 * Represents a VLAN PCP modification instruction.
95 */
96 public static final class ModVlanPcpInstruction extends L2ModificationInstruction {
97
98 public final Byte vlanPcp;
99
100 public ModVlanPcpInstruction(Byte vlanPcp) {
101 this.vlanPcp = vlanPcp;
102 }
103
104 @Override
alshabib35edb1a2014-09-16 17:44:44 -0700105 public L2SubType subtype() {
alshabib7410fea2014-09-16 13:48:39 -0700106 return L2SubType.VLAN_PCP;
107 }
108
109 public Byte vlanPcp() {
110 return this.vlanPcp;
111 }
112
113 }
114
alshabib55a55d92014-09-16 11:59:31 -0700115
116}