2 * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
\r
4 * This program and the accompanying materials are made available under the
\r
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
\r
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
\r
8 package org.opendaylight.openflowjava.protocol.impl.util;
\r
10 import io.netty.buffer.ByteBuf;
\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpOp;
\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSha;
\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSpa;
\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTha;
\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTpa;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthType;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Code;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Type;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Code;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Type;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Dst;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Flabel;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdSll;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTarget;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTll;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src;
\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField;
\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;
\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;
\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel;
\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc;
\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;
\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;
\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;
\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;
\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;
\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;
\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;
\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpSrc;
\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp;
\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;
\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;
\r
56 * Encodes match ids (oxm_ids) needed in Multipart-TableFeatures messages
\r
57 * @author michal.polkorab
\r
59 public abstract class MatchIdsSerializer {
\r
62 * Encodes oxm headers (without values)
\r
63 * @param entry match entry
\r
64 * @param out output ByteBuf
\r
66 public static void encodeIdsRest(MatchEntries entry, ByteBuf out) {
\r
68 Class<? extends MatchField> field = entry.getOxmMatchField();
\r
69 if (field.isAssignableFrom(InPort.class)) {
\r
71 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_INT_IN_BYTES);
\r
72 } else if (field.isAssignableFrom(InPhyPort.class)) {
\r
74 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_INT_IN_BYTES);
\r
75 } else if (field.isAssignableFrom(Metadata.class)) {
\r
77 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
78 EncodeConstants.SIZE_OF_LONG_IN_BYTES);
\r
79 } else if (field.isAssignableFrom(EthDst.class)) {
\r
81 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
82 EncodeConstants.MAC_ADDRESS_LENGTH);
\r
83 } else if (field.isAssignableFrom(EthSrc.class)) {
\r
85 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
86 EncodeConstants.MAC_ADDRESS_LENGTH);
\r
87 } else if (field.isAssignableFrom(EthType.class)) {
\r
89 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
90 } else if (field.isAssignableFrom(VlanVid.class)) {
\r
92 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
93 EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
94 } else if (field.isAssignableFrom(VlanPcp.class)) {
\r
96 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
\r
97 } else if (field.isAssignableFrom(IpDscp.class)) {
\r
99 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
\r
100 } else if (field.isAssignableFrom(IpEcn.class)) {
\r
102 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
\r
103 } else if (field.isAssignableFrom(IpProto.class)) {
\r
105 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
\r
106 } else if (field.isAssignableFrom(Ipv4Src.class)) {
\r
108 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
109 EncodeConstants.SIZE_OF_INT_IN_BYTES);
\r
110 } else if (field.isAssignableFrom(Ipv4Dst.class)) {
\r
112 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
113 EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
114 } else if (field.isAssignableFrom(TcpSrc.class)) {
\r
116 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
117 } else if (field.isAssignableFrom(TcpDst.class)) {
\r
119 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
120 } else if (field.isAssignableFrom(UdpSrc.class)) {
\r
122 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
123 } else if (field.isAssignableFrom(UdpDst.class)) {
\r
125 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
126 } else if (field.isAssignableFrom(SctpSrc.class)) {
\r
128 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
129 } else if (field.isAssignableFrom(SctpDst.class)) {
\r
131 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
132 } else if (field.isAssignableFrom(Icmpv4Type.class)) {
\r
134 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
\r
135 } else if (field.isAssignableFrom(Icmpv4Code.class)) {
\r
137 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
\r
138 } else if (field.isAssignableFrom(ArpOp.class)) {
\r
140 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
141 } else if (field.isAssignableFrom(ArpSpa.class)) {
\r
143 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
144 EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
145 } else if (field.isAssignableFrom(ArpTpa.class)) {
\r
147 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
148 EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r
149 } else if (field.isAssignableFrom(ArpSha.class)) {
\r
151 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
152 EncodeConstants.MAC_ADDRESS_LENGTH);
\r
153 } else if (field.isAssignableFrom(ArpTha.class)) {
\r
155 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
156 EncodeConstants.MAC_ADDRESS_LENGTH);
\r
157 } else if (field.isAssignableFrom(Ipv6Src.class)) {
\r
159 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
160 EncodeConstants.SIZE_OF_IPV6_ADDRESS_IN_BYTES);
\r
161 } else if (field.isAssignableFrom(Ipv6Dst.class)) {
\r
163 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
164 EncodeConstants.SIZE_OF_IPV6_ADDRESS_IN_BYTES);
\r
165 } else if (field.isAssignableFrom(Ipv6Flabel.class)) {
\r
167 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
168 EncodeConstants.SIZE_OF_INT_IN_BYTES);
\r
169 } else if (field.isAssignableFrom(Icmpv6Type.class)) {
\r
171 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
\r
172 } else if (field.isAssignableFrom(Icmpv6Code.class)) {
\r
174 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
\r
175 } else if (field.isAssignableFrom(Ipv6NdTarget.class)) {
\r
177 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
178 EncodeConstants.SIZE_OF_IPV6_ADDRESS_IN_BYTES);
\r
179 } else if (field.isAssignableFrom(Ipv6NdSll.class)) {
\r
181 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
182 EncodeConstants.MAC_ADDRESS_LENGTH);
\r
183 } else if (field.isAssignableFrom(Ipv6NdTll.class)) {
\r
185 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
186 EncodeConstants.MAC_ADDRESS_LENGTH);
\r
187 } else if (field.isAssignableFrom(MplsLabel.class)) {
\r
189 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_INT_IN_BYTES);
\r
190 } else if (field.isAssignableFrom(MplsTc.class)) {
\r
192 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
\r
193 } else if (field.isAssignableFrom(MplsBos.class)) {
\r
195 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, false, EncodeConstants.SIZE_OF_BYTE_IN_BYTES);
\r
196 } else if (field.isAssignableFrom(PbbIsid.class)) {
\r
198 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(), EncodeConstants.SIZE_OF_3_BYTES);
\r
199 } else if (field.isAssignableFrom(TunnelId.class)) {
\r
201 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
202 EncodeConstants.SIZE_OF_LONG_IN_BYTES);
\r
203 } else if (field.isAssignableFrom(Ipv6Exthdr.class)) {
\r
205 MatchSerializer.writeOxmFieldAndLength(out, fieldValue, entry.isHasMask(),
\r
206 EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
\r