ONOS-2581 Add codec for tunnel id
Change-Id: I6ff456b0419b427945cc53fb74fd0a91cdfa758e
Showing
9 changed files
with
49 additions
and
4 deletions
... | @@ -60,6 +60,7 @@ public final class CriterionCodec extends JsonCodec<Criterion> { | ... | @@ -60,6 +60,7 @@ public final class CriterionCodec extends JsonCodec<Criterion> { |
60 | protected static final String SPACING_MULIPLIER = "spacingMultiplier"; | 60 | protected static final String SPACING_MULIPLIER = "spacingMultiplier"; |
61 | protected static final String SLOT_GRANULARITY = "slotGranularity"; | 61 | protected static final String SLOT_GRANULARITY = "slotGranularity"; |
62 | protected static final String OCH_SIGNAL_ID = "ochSignalId"; | 62 | protected static final String OCH_SIGNAL_ID = "ochSignalId"; |
63 | + protected static final String TUNNEL_ID = "tunnelId"; | ||
63 | 64 | ||
64 | @Override | 65 | @Override |
65 | public ObjectNode encode(Criterion criterion, CodecContext context) { | 66 | public ObjectNode encode(Criterion criterion, CodecContext context) { | ... | ... |
... | @@ -93,6 +93,7 @@ public final class DecodeCriterionCodecHelper { | ... | @@ -93,6 +93,7 @@ public final class DecodeCriterionCodecHelper { |
93 | decoderMap.put(Criterion.Type.IPV6_EXTHDR.name(), new IpV6ExthdrDecoder()); | 93 | decoderMap.put(Criterion.Type.IPV6_EXTHDR.name(), new IpV6ExthdrDecoder()); |
94 | decoderMap.put(Criterion.Type.OCH_SIGID.name(), new OchSigIdDecoder()); | 94 | decoderMap.put(Criterion.Type.OCH_SIGID.name(), new OchSigIdDecoder()); |
95 | decoderMap.put(Criterion.Type.OCH_SIGTYPE.name(), new OchSigTypeDecoder()); | 95 | decoderMap.put(Criterion.Type.OCH_SIGTYPE.name(), new OchSigTypeDecoder()); |
96 | + decoderMap.put(Criterion.Type.TUNNEL_ID.name(), new TunnelIdDecoder()); | ||
96 | } | 97 | } |
97 | 98 | ||
98 | private class EthTypeDecoder implements CriterionDecoder { | 99 | private class EthTypeDecoder implements CriterionDecoder { |
... | @@ -417,6 +418,15 @@ public final class DecodeCriterionCodecHelper { | ... | @@ -417,6 +418,15 @@ public final class DecodeCriterionCodecHelper { |
417 | } | 418 | } |
418 | } | 419 | } |
419 | 420 | ||
421 | + private class TunnelIdDecoder implements CriterionDecoder { | ||
422 | + @Override | ||
423 | + public Criterion decodeCriterion(ObjectNode json) { | ||
424 | + long tunnelId = nullIsIllegal(json.get(CriterionCodec.TUNNEL_ID), | ||
425 | + CriterionCodec.TUNNEL_ID + MISSING_MEMBER_MESSAGE).asLong(); | ||
426 | + return Criteria.matchTunnelId(tunnelId); | ||
427 | + } | ||
428 | + } | ||
429 | + | ||
420 | /** | 430 | /** |
421 | * Decodes the JSON into a criterion object. | 431 | * Decodes the JSON into a criterion object. |
422 | * | 432 | * | ... | ... |
... | @@ -88,6 +88,10 @@ public final class DecodeInstructionCodecHelper { | ... | @@ -88,6 +88,10 @@ public final class DecodeInstructionCodecHelper { |
88 | return Instructions.popVlan(); | 88 | return Instructions.popVlan(); |
89 | } else if (subType.equals(L2ModificationInstruction.L2SubType.VLAN_PUSH.name())) { | 89 | } else if (subType.equals(L2ModificationInstruction.L2SubType.VLAN_PUSH.name())) { |
90 | return Instructions.pushVlan(); | 90 | return Instructions.pushVlan(); |
91 | + } else if (subType.equals(L2ModificationInstruction.L2SubType.TUNNEL_ID.name())) { | ||
92 | + long tunnelId = nullIsIllegal(json.get(InstructionCodec.TUNNEL_ID), | ||
93 | + InstructionCodec.TUNNEL_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asLong(); | ||
94 | + return Instructions.modTunnelId(tunnelId); | ||
91 | } | 95 | } |
92 | throw new IllegalArgumentException("L2 Instruction subtype " | 96 | throw new IllegalArgumentException("L2 Instruction subtype " |
93 | + subType + " is not supported"); | 97 | + subType + " is not supported"); | ... | ... |
... | @@ -41,6 +41,7 @@ import org.onosproject.net.flow.criteria.OchSignalTypeCriterion; | ... | @@ -41,6 +41,7 @@ import org.onosproject.net.flow.criteria.OchSignalTypeCriterion; |
41 | import org.onosproject.net.flow.criteria.PortCriterion; | 41 | import org.onosproject.net.flow.criteria.PortCriterion; |
42 | import org.onosproject.net.flow.criteria.SctpPortCriterion; | 42 | import org.onosproject.net.flow.criteria.SctpPortCriterion; |
43 | import org.onosproject.net.flow.criteria.TcpPortCriterion; | 43 | import org.onosproject.net.flow.criteria.TcpPortCriterion; |
44 | +import org.onosproject.net.flow.criteria.TunnelIdCriterion; | ||
44 | import org.onosproject.net.flow.criteria.UdpPortCriterion; | 45 | import org.onosproject.net.flow.criteria.UdpPortCriterion; |
45 | import org.onosproject.net.flow.criteria.VlanIdCriterion; | 46 | import org.onosproject.net.flow.criteria.VlanIdCriterion; |
46 | import org.onosproject.net.flow.criteria.VlanPcpCriterion; | 47 | import org.onosproject.net.flow.criteria.VlanPcpCriterion; |
... | @@ -105,6 +106,7 @@ public final class EncodeCriterionCodecHelper { | ... | @@ -105,6 +106,7 @@ public final class EncodeCriterionCodecHelper { |
105 | formatMap.put(Criterion.Type.IPV6_EXTHDR, new FormatIpV6Exthdr()); | 106 | formatMap.put(Criterion.Type.IPV6_EXTHDR, new FormatIpV6Exthdr()); |
106 | formatMap.put(Criterion.Type.OCH_SIGID, new FormatOchSigId()); | 107 | formatMap.put(Criterion.Type.OCH_SIGID, new FormatOchSigId()); |
107 | formatMap.put(Criterion.Type.OCH_SIGTYPE, new FormatOchSigType()); | 108 | formatMap.put(Criterion.Type.OCH_SIGTYPE, new FormatOchSigType()); |
109 | + formatMap.put(Criterion.Type.TUNNEL_ID, new FormatTunnelId()); | ||
108 | formatMap.put(Criterion.Type.DUMMY, new FormatDummyType()); | 110 | formatMap.put(Criterion.Type.DUMMY, new FormatDummyType()); |
109 | 111 | ||
110 | // Currently unimplemented | 112 | // Currently unimplemented |
... | @@ -116,7 +118,6 @@ public final class EncodeCriterionCodecHelper { | ... | @@ -116,7 +118,6 @@ public final class EncodeCriterionCodecHelper { |
116 | formatMap.put(Criterion.Type.MPLS_TC, new FormatUnknown()); | 118 | formatMap.put(Criterion.Type.MPLS_TC, new FormatUnknown()); |
117 | formatMap.put(Criterion.Type.MPLS_BOS, new FormatUnknown()); | 119 | formatMap.put(Criterion.Type.MPLS_BOS, new FormatUnknown()); |
118 | formatMap.put(Criterion.Type.PBB_ISID, new FormatUnknown()); | 120 | formatMap.put(Criterion.Type.PBB_ISID, new FormatUnknown()); |
119 | - formatMap.put(Criterion.Type.TUNNEL_ID, new FormatUnknown()); | ||
120 | formatMap.put(Criterion.Type.UNASSIGNED_40, new FormatUnknown()); | 121 | formatMap.put(Criterion.Type.UNASSIGNED_40, new FormatUnknown()); |
121 | formatMap.put(Criterion.Type.PBB_UCA, new FormatUnknown()); | 122 | formatMap.put(Criterion.Type.PBB_UCA, new FormatUnknown()); |
122 | formatMap.put(Criterion.Type.TCP_FLAGS, new FormatUnknown()); | 123 | formatMap.put(Criterion.Type.TCP_FLAGS, new FormatUnknown()); |
... | @@ -354,6 +355,15 @@ public final class EncodeCriterionCodecHelper { | ... | @@ -354,6 +355,15 @@ public final class EncodeCriterionCodecHelper { |
354 | } | 355 | } |
355 | } | 356 | } |
356 | 357 | ||
358 | + private static class FormatTunnelId implements CriterionTypeFormatter { | ||
359 | + @Override | ||
360 | + public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) { | ||
361 | + final TunnelIdCriterion tunnelIdCriterion = | ||
362 | + (TunnelIdCriterion) criterion; | ||
363 | + return root.put(CriterionCodec.TUNNEL_ID, tunnelIdCriterion.tunnelId()); | ||
364 | + } | ||
365 | + } | ||
366 | + | ||
357 | private class FormatDummyType implements CriterionTypeFormatter { | 367 | private class FormatDummyType implements CriterionTypeFormatter { |
358 | 368 | ||
359 | @Override | 369 | @Override | ... | ... |
... | @@ -123,6 +123,12 @@ public final class EncodeInstructionCodecHelper { | ... | @@ -123,6 +123,12 @@ public final class EncodeInstructionCodecHelper { |
123 | pushHeaderInstructions.ethernetType().toShort()); | 123 | pushHeaderInstructions.ethernetType().toShort()); |
124 | break; | 124 | break; |
125 | 125 | ||
126 | + case TUNNEL_ID: | ||
127 | + final L2ModificationInstruction.ModTunnelIdInstruction modTunnelIdInstruction = | ||
128 | + (L2ModificationInstruction.ModTunnelIdInstruction) instruction; | ||
129 | + result.put(InstructionCodec.TUNNEL_ID, modTunnelIdInstruction.tunnelId()); | ||
130 | + break; | ||
131 | + | ||
126 | default: | 132 | default: |
127 | log.info("Cannot convert L2 subtype of {}", instruction.subtype()); | 133 | log.info("Cannot convert L2 subtype of {}", instruction.subtype()); |
128 | break; | 134 | break; | ... | ... |
... | @@ -47,6 +47,7 @@ public final class InstructionCodec extends JsonCodec<Instruction> { | ... | @@ -47,6 +47,7 @@ public final class InstructionCodec extends JsonCodec<Instruction> { |
47 | protected static final String SPACING_MULTIPLIER = "spacingMultiplier"; | 47 | protected static final String SPACING_MULTIPLIER = "spacingMultiplier"; |
48 | protected static final String SLOT_GRANULARITY = "slotGranularity"; | 48 | protected static final String SLOT_GRANULARITY = "slotGranularity"; |
49 | protected static final String ETHERNET_TYPE = "ethernetType"; | 49 | protected static final String ETHERNET_TYPE = "ethernetType"; |
50 | + protected static final String TUNNEL_ID = "tunnelId"; | ||
50 | 51 | ||
51 | protected static final String MISSING_MEMBER_MESSAGE = | 52 | protected static final String MISSING_MEMBER_MESSAGE = |
52 | " member is required in Instruction"; | 53 | " member is required in Instruction"; | ... | ... |
... | @@ -58,6 +58,7 @@ import org.onosproject.net.flow.criteria.OchSignalCriterion; | ... | @@ -58,6 +58,7 @@ import org.onosproject.net.flow.criteria.OchSignalCriterion; |
58 | import org.onosproject.net.flow.criteria.PortCriterion; | 58 | import org.onosproject.net.flow.criteria.PortCriterion; |
59 | import org.onosproject.net.flow.criteria.SctpPortCriterion; | 59 | import org.onosproject.net.flow.criteria.SctpPortCriterion; |
60 | import org.onosproject.net.flow.criteria.TcpPortCriterion; | 60 | import org.onosproject.net.flow.criteria.TcpPortCriterion; |
61 | +import org.onosproject.net.flow.criteria.TunnelIdCriterion; | ||
61 | import org.onosproject.net.flow.criteria.UdpPortCriterion; | 62 | import org.onosproject.net.flow.criteria.UdpPortCriterion; |
62 | import org.onosproject.net.flow.criteria.VlanIdCriterion; | 63 | import org.onosproject.net.flow.criteria.VlanIdCriterion; |
63 | import org.onosproject.net.flow.criteria.VlanPcpCriterion; | 64 | import org.onosproject.net.flow.criteria.VlanPcpCriterion; |
... | @@ -205,7 +206,7 @@ public class FlowRuleCodecTest { | ... | @@ -205,7 +206,7 @@ public class FlowRuleCodecTest { |
205 | instruction.type().name() + "/" + subType, instruction); | 206 | instruction.type().name() + "/" + subType, instruction); |
206 | }); | 207 | }); |
207 | 208 | ||
208 | - assertThat(rule.treatment().allInstructions().size(), is(19)); | 209 | + assertThat(rule.treatment().allInstructions().size(), is(20)); |
209 | 210 | ||
210 | Instruction instruction; | 211 | Instruction instruction; |
211 | 212 | ||
... | @@ -273,6 +274,12 @@ public class FlowRuleCodecTest { | ... | @@ -273,6 +274,12 @@ public class FlowRuleCodecTest { |
273 | assertThat(instruction.type(), is(Instruction.Type.L2MODIFICATION)); | 274 | assertThat(instruction.type(), is(Instruction.Type.L2MODIFICATION)); |
274 | assertThat(instruction, instanceOf(L2ModificationInstruction.PushHeaderInstructions.class)); | 275 | assertThat(instruction, instanceOf(L2ModificationInstruction.PushHeaderInstructions.class)); |
275 | 276 | ||
277 | + instruction = getInstruction(Instruction.Type.L2MODIFICATION, | ||
278 | + L2ModificationInstruction.L2SubType.TUNNEL_ID.name()); | ||
279 | + assertThat(instruction.type(), is(Instruction.Type.L2MODIFICATION)); | ||
280 | + assertThat(((L2ModificationInstruction.ModTunnelIdInstruction) instruction) | ||
281 | + .tunnelId(), is(100L)); | ||
282 | + | ||
276 | instruction = getInstruction(Instruction.Type.L3MODIFICATION, | 283 | instruction = getInstruction(Instruction.Type.L3MODIFICATION, |
277 | L3ModificationInstruction.L3SubType.IPV4_SRC.name()); | 284 | L3ModificationInstruction.L3SubType.IPV4_SRC.name()); |
278 | assertThat(instruction.type(), is(Instruction.Type.L3MODIFICATION)); | 285 | assertThat(instruction.type(), is(Instruction.Type.L3MODIFICATION)); |
... | @@ -347,7 +354,7 @@ public class FlowRuleCodecTest { | ... | @@ -347,7 +354,7 @@ public class FlowRuleCodecTest { |
347 | 354 | ||
348 | checkCommonData(rule); | 355 | checkCommonData(rule); |
349 | 356 | ||
350 | - assertThat(rule.selector().criteria().size(), is(32)); | 357 | + assertThat(rule.selector().criteria().size(), is(33)); |
351 | 358 | ||
352 | rule.selector().criteria() | 359 | rule.selector().criteria() |
353 | .stream() | 360 | .stream() |
... | @@ -479,6 +486,10 @@ public class FlowRuleCodecTest { | ... | @@ -479,6 +486,10 @@ public class FlowRuleCodecTest { |
479 | criterion = getCriterion(Criterion.Type.OCH_SIGID); | 486 | criterion = getCriterion(Criterion.Type.OCH_SIGID); |
480 | assertThat(((IndexedLambdaCriterion) criterion).lambda(), | 487 | assertThat(((IndexedLambdaCriterion) criterion).lambda(), |
481 | is(Lambda.indexedLambda(122))); | 488 | is(Lambda.indexedLambda(122))); |
489 | + | ||
490 | + criterion = getCriterion(Criterion.Type.TUNNEL_ID); | ||
491 | + assertThat(((TunnelIdCriterion) criterion).tunnelId(), | ||
492 | + is(100L)); | ||
482 | } | 493 | } |
483 | 494 | ||
484 | /** | 495 | /** | ... | ... |
... | @@ -37,7 +37,8 @@ | ... | @@ -37,7 +37,8 @@ |
37 | {"type":"IPV6_ND_TLL", "mac":"00:11:22:33:44:57"}, | 37 | {"type":"IPV6_ND_TLL", "mac":"00:11:22:33:44:57"}, |
38 | {"type":"MPLS_LABEL", "label":123}, | 38 | {"type":"MPLS_LABEL", "label":123}, |
39 | {"type":"IPV6_EXTHDR", "exthdrFlags":99}, | 39 | {"type":"IPV6_EXTHDR", "exthdrFlags":99}, |
40 | - {"type":"OCH_SIGID", "lambda":122} | 40 | + {"type":"OCH_SIGID", "lambda":122}, |
41 | + {"type":"TUNNEL_ID", "tunnelId":100} | ||
41 | ] | 42 | ] |
42 | } | 43 | } |
43 | } | 44 | } | ... | ... |
... | @@ -19,6 +19,7 @@ | ... | @@ -19,6 +19,7 @@ |
19 | {"type":"L2MODIFICATION","subtype":"DEC_MPLS_TTL"}, | 19 | {"type":"L2MODIFICATION","subtype":"DEC_MPLS_TTL"}, |
20 | {"type":"L2MODIFICATION","subtype":"VLAN_POP"}, | 20 | {"type":"L2MODIFICATION","subtype":"VLAN_POP"}, |
21 | {"type":"L2MODIFICATION","subtype":"VLAN_PUSH"}, | 21 | {"type":"L2MODIFICATION","subtype":"VLAN_PUSH"}, |
22 | + {"type":"L2MODIFICATION","subtype":"TUNNEL_ID", "tunnelId":100}, | ||
22 | {"type":"L3MODIFICATION","subtype":"IPV4_SRC", "ip":"1.2.3.4"}, | 23 | {"type":"L3MODIFICATION","subtype":"IPV4_SRC", "ip":"1.2.3.4"}, |
23 | {"type":"L3MODIFICATION","subtype":"IPV4_DST", "ip":"1.2.3.3"}, | 24 | {"type":"L3MODIFICATION","subtype":"IPV4_DST", "ip":"1.2.3.3"}, |
24 | {"type":"L3MODIFICATION","subtype":"IPV6_SRC", "ip":"1.2.3.2"}, | 25 | {"type":"L3MODIFICATION","subtype":"IPV6_SRC", "ip":"1.2.3.2"}, | ... | ... |
-
Please register or login to post a comment