Yuta HIGUCHI
Committed by Brian O'Connor

Instruction related fixes

- Fixed PushHeaderInstructions bug, where half-baked Ethernet instace was used
  only to hold ethernetType. (ONOS-987)

Conflicts:
	core/api/src/main/java/org/onosproject/net/flow/instructions/Instructions.java
	providers/openflow/group/src/main/java/org/onosproject/provider/of/group/impl/GroupModBuilder.java
	web/api/src/main/java/org/onosproject/codec/impl/InstructionCodec.java
	web/api/src/test/java/org/onosproject/codec/impl/InstructionJsonMatcher.java
	web/api/src/test/java/org/onosproject/rest/FlowsResourceTest.java

Change-Id: I330a862c8a18206250befbd4e22ee6d189beed83
...@@ -148,7 +148,7 @@ public final class Instructions { ...@@ -148,7 +148,7 @@ public final class Instructions {
148 */ 148 */
149 public static Instruction pushMpls() { 149 public static Instruction pushMpls() {
150 return new PushHeaderInstructions(L2SubType.MPLS_PUSH, 150 return new PushHeaderInstructions(L2SubType.MPLS_PUSH,
151 - new Ethernet().setEtherType(Ethernet.MPLS_UNICAST)); 151 + Ethernet.MPLS_UNICAST);
152 } 152 }
153 153
154 /** 154 /**
...@@ -157,7 +157,18 @@ public final class Instructions { ...@@ -157,7 +157,18 @@ public final class Instructions {
157 */ 157 */
158 public static Instruction popMpls() { 158 public static Instruction popMpls() {
159 return new PushHeaderInstructions(L2SubType.MPLS_POP, 159 return new PushHeaderInstructions(L2SubType.MPLS_POP,
160 - new Ethernet().setEtherType(Ethernet.MPLS_UNICAST)); 160 + Ethernet.MPLS_UNICAST);
161 + }
162 +
163 + /**
164 + * Creates a mpls header instruction.
165 + *
166 + * @param etherType Ethernet type to set
167 + * @return a L2 modification.
168 + */
169 + public static Instruction popMpls(Short etherType) {
170 + checkNotNull(etherType, "Ethernet type cannot be null");
171 + return new PushHeaderInstructions(L2SubType.MPLS_POP, etherType);
161 } 172 }
162 173
163 /* 174 /*
......
...@@ -19,7 +19,6 @@ import static com.google.common.base.MoreObjects.toStringHelper; ...@@ -19,7 +19,6 @@ import static com.google.common.base.MoreObjects.toStringHelper;
19 19
20 import java.util.Objects; 20 import java.util.Objects;
21 21
22 -import org.onlab.packet.Ethernet;
23 import org.onlab.packet.MacAddress; 22 import org.onlab.packet.MacAddress;
24 import org.onlab.packet.VlanId; 23 import org.onlab.packet.VlanId;
25 24
...@@ -134,15 +133,15 @@ public abstract class L2ModificationInstruction implements Instruction { ...@@ -134,15 +133,15 @@ public abstract class L2ModificationInstruction implements Instruction {
134 L2ModificationInstruction { 133 L2ModificationInstruction {
135 134
136 private final L2SubType subtype; 135 private final L2SubType subtype;
137 - private final Ethernet ethernetType; 136 + private final short ethernetType; // uint16_t
138 137
139 - public PushHeaderInstructions(L2SubType subType, Ethernet ethernetType) { 138 + PushHeaderInstructions(L2SubType subType, short ethernetType) {
140 this.subtype = subType; 139 this.subtype = subType;
141 this.ethernetType = ethernetType; 140 this.ethernetType = ethernetType;
142 } 141 }
143 142
144 - public Ethernet ethernetType() { 143 + public int ethernetType() {
145 - return ethernetType; 144 + return Short.toUnsignedInt(ethernetType);
146 } 145 }
147 146
148 @Override 147 @Override
...@@ -152,12 +151,14 @@ public abstract class L2ModificationInstruction implements Instruction { ...@@ -152,12 +151,14 @@ public abstract class L2ModificationInstruction implements Instruction {
152 151
153 @Override 152 @Override
154 public String toString() { 153 public String toString() {
155 - return toStringHelper(subtype().toString()).toString(); 154 + return toStringHelper(subtype().toString())
155 + .add("ethernetType", String.format("0x%04x", ethernetType()))
156 + .toString();
156 } 157 }
157 158
158 @Override 159 @Override
159 public int hashCode() { 160 public int hashCode() {
160 - return Objects.hash(type(), subtype); 161 + return Objects.hash(type(), subtype, ethernetType);
161 } 162 }
162 163
163 @Override 164 @Override
...@@ -167,9 +168,8 @@ public abstract class L2ModificationInstruction implements Instruction { ...@@ -167,9 +168,8 @@ public abstract class L2ModificationInstruction implements Instruction {
167 } 168 }
168 if (obj instanceof PushHeaderInstructions) { 169 if (obj instanceof PushHeaderInstructions) {
169 PushHeaderInstructions that = (PushHeaderInstructions) obj; 170 PushHeaderInstructions that = (PushHeaderInstructions) obj;
170 - return Objects.equals(this.type(), that.type()) && 171 + return Objects.equals(subtype, that.subtype) &&
171 - Objects.equals(subtype, that.subtype); 172 + Objects.equals(this.ethernetType, that.ethernetType);
172 -
173 } 173 }
174 return false; 174 return false;
175 } 175 }
......
...@@ -20,6 +20,7 @@ import java.util.List; ...@@ -20,6 +20,7 @@ import java.util.List;
20 import org.junit.Test; 20 import org.junit.Test;
21 import org.onosproject.net.PortNumber; 21 import org.onosproject.net.PortNumber;
22 import org.onosproject.net.flow.instructions.Instruction; 22 import org.onosproject.net.flow.instructions.Instruction;
23 +import org.onosproject.net.flow.instructions.Instructions;
23 import org.onlab.packet.IpAddress; 24 import org.onlab.packet.IpAddress;
24 import org.onlab.packet.MacAddress; 25 import org.onlab.packet.MacAddress;
25 import org.onlab.packet.VlanId; 26 import org.onlab.packet.VlanId;
...@@ -30,8 +31,6 @@ import static org.hamcrest.CoreMatchers.equalTo; ...@@ -30,8 +31,6 @@ import static org.hamcrest.CoreMatchers.equalTo;
30 import static org.hamcrest.MatcherAssert.assertThat; 31 import static org.hamcrest.MatcherAssert.assertThat;
31 import static org.hamcrest.Matchers.hasSize; 32 import static org.hamcrest.Matchers.hasSize;
32 import static org.hamcrest.Matchers.is; 33 import static org.hamcrest.Matchers.is;
33 -import static org.onosproject.net.flow.instructions.L0ModificationInstruction.L0SubType;
34 -import static org.onosproject.net.flow.instructions.L0ModificationInstruction.ModLambdaInstruction;
35 34
36 /** 35 /**
37 * Unit tests for the DefaultTrafficTreatment class. 36 * Unit tests for the DefaultTrafficTreatment class.
...@@ -48,7 +47,7 @@ public class DefaultTrafficTreatmentTest { ...@@ -48,7 +47,7 @@ public class DefaultTrafficTreatmentTest {
48 public void testTreatmentBuilderConstructors() { 47 public void testTreatmentBuilderConstructors() {
49 final TrafficTreatment treatment1 = 48 final TrafficTreatment treatment1 =
50 DefaultTrafficTreatment.builder() 49 DefaultTrafficTreatment.builder()
51 - .add(new ModLambdaInstruction(L0SubType.LAMBDA, (short) 4)) 50 + .add(Instructions.modL0Lambda((short) 4))
52 .build(); 51 .build();
53 final TrafficTreatment treatment2 = 52 final TrafficTreatment treatment2 =
54 DefaultTrafficTreatment.builder(treatment1).build(); 53 DefaultTrafficTreatment.builder(treatment1).build();
...@@ -61,7 +60,7 @@ public class DefaultTrafficTreatmentTest { ...@@ -61,7 +60,7 @@ public class DefaultTrafficTreatmentTest {
61 @Test 60 @Test
62 public void testBuilderMethods() { 61 public void testBuilderMethods() {
63 final Instruction instruction1 = 62 final Instruction instruction1 =
64 - new ModLambdaInstruction(L0SubType.LAMBDA, (short) 4); 63 + Instructions.modL0Lambda((short) 4);
65 64
66 final TrafficTreatment.Builder builder1 = 65 final TrafficTreatment.Builder builder1 =
67 DefaultTrafficTreatment.builder() 66 DefaultTrafficTreatment.builder()
...@@ -95,15 +94,15 @@ public class DefaultTrafficTreatmentTest { ...@@ -95,15 +94,15 @@ public class DefaultTrafficTreatmentTest {
95 public void testEquals() { 94 public void testEquals() {
96 final TrafficTreatment treatment1 = 95 final TrafficTreatment treatment1 =
97 DefaultTrafficTreatment.builder() 96 DefaultTrafficTreatment.builder()
98 - .add(new ModLambdaInstruction(L0SubType.LAMBDA, (short) 4)) 97 + .add(Instructions.modL0Lambda((short) 4))
99 .build(); 98 .build();
100 final TrafficTreatment sameAsTreatment1 = 99 final TrafficTreatment sameAsTreatment1 =
101 DefaultTrafficTreatment.builder() 100 DefaultTrafficTreatment.builder()
102 - .add(new ModLambdaInstruction(L0SubType.LAMBDA, (short) 4)) 101 + .add(Instructions.modL0Lambda((short) 4))
103 .build(); 102 .build();
104 final TrafficTreatment treatment2 = 103 final TrafficTreatment treatment2 =
105 DefaultTrafficTreatment.builder() 104 DefaultTrafficTreatment.builder()
106 - .add(new ModLambdaInstruction(L0SubType.LAMBDA, (short) 2)) 105 + .add(Instructions.modL0Lambda((short) 2))
107 .build(); 106 .build();
108 new EqualsTester() 107 new EqualsTester()
109 .addEqualityGroup(treatment1, sameAsTreatment1) 108 .addEqualityGroup(treatment1, sameAsTreatment1)
......
...@@ -230,12 +230,12 @@ public class FlowModBuilderVer13 extends FlowModBuilder { ...@@ -230,12 +230,12 @@ public class FlowModBuilderVer13 extends FlowModBuilder {
230 PushHeaderInstructions pushHeaderInstructions = 230 PushHeaderInstructions pushHeaderInstructions =
231 (PushHeaderInstructions) l2m; 231 (PushHeaderInstructions) l2m;
232 return factory().actions().pushMpls(EthType.of(pushHeaderInstructions 232 return factory().actions().pushMpls(EthType.of(pushHeaderInstructions
233 - .ethernetType().getEtherType())); 233 + .ethernetType()));
234 case MPLS_POP: 234 case MPLS_POP:
235 PushHeaderInstructions popHeaderInstructions = 235 PushHeaderInstructions popHeaderInstructions =
236 (PushHeaderInstructions) l2m; 236 (PushHeaderInstructions) l2m;
237 return factory().actions().popMpls(EthType.of(popHeaderInstructions 237 return factory().actions().popMpls(EthType.of(popHeaderInstructions
238 - .ethernetType().getEtherType())); 238 + .ethernetType()));
239 case MPLS_LABEL: 239 case MPLS_LABEL:
240 ModMplsLabelInstruction mplsLabel = 240 ModMplsLabelInstruction mplsLabel =
241 (ModMplsLabelInstruction) l2m; 241 (ModMplsLabelInstruction) l2m;
......