7c326954458b8da17f15872064b70d107629cee4
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / match / MatchConvertorImpl.java
1 /**
2  * Copyright (c) 2013, 2015 Ericsson. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
10
11 import static org.opendaylight.openflowjava.util.ByteBufUtils.macAddressToString;
12
13 import com.google.common.base.Optional;
14 import java.math.BigInteger;
15 import java.nio.ByteBuffer;
16 import java.util.ArrayList;
17 import java.util.Iterator;
18 import java.util.List;
19 import javax.annotation.Nonnull;
20 import org.opendaylight.openflowjava.util.ByteBufUtils;
21 import org.opendaylight.openflowplugin.api.OFConstants;
22 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
23 import org.opendaylight.openflowplugin.extension.api.ConverterExtensionKey;
24 import org.opendaylight.openflowplugin.extension.api.ConvertorToOFJava;
25 import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionResolvers;
26 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.OFApprovedExperimenterIds;
27 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.IpConversionUtil;
28 import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
29 import org.opendaylight.openflowplugin.openflow.md.util.ActionUtil;
30 import org.opendaylight.openflowplugin.openflow.md.util.ByteUtil;
31 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6FlowLabel;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetField;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddress;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddress;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestination;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSource;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetType;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6ExtHeader;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6ExtHeaderBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6Label;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6LabelBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4Match;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6Match;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFields;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatch;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TcpFlagsMatchBuilder;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMask;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMask;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4Match;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatch;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.Pbb;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanId;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlags;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainer;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.TcpFlagsContainerBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.approved.extensions.rev160802.oxm.container.match.entry.value.experimenter.id._case.TcpFlagsBuilder;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCase;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCaseBuilder;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.experimenter.id._case.ExperimenterBuilder;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetFieldCase;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.set.field._case.SetFieldAction;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ExperimenterId;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpOp;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSha;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSpa;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTha;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTpa;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ExperimenterClass;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;
125 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;
126 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;
127 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
128 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpDscp;
129 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;
130 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;
131 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst;
132 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Src;
133 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Dst;
134 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Exthdr;
135 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Flabel;
136 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdSll;
137 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTarget;
138 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTll;
139 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Src;
140 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
141 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata;
142 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos;
143 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;
144 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;
145 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
146 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;
147 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpDst;
148 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpSrc;
149 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpDst;
150 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpSrc;
151 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;
152 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpDst;
153 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpSrc;
154 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanPcp;
155 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;
156 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
157 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
158 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCase;
159 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCaseBuilder;
160 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCase;
161 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCaseBuilder;
162 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCase;
163 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCaseBuilder;
164 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCase;
165 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCaseBuilder;
166 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCase;
167 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCaseBuilder;
168 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCase;
169 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCaseBuilder;
170 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCase;
171 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCaseBuilder;
172 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCase;
173 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCaseBuilder;
174 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCase;
175 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCaseBuilder;
176 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCase;
177 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCaseBuilder;
178 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCase;
179 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCaseBuilder;
180 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCase;
181 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCaseBuilder;
182 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCase;
183 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCaseBuilder;
184 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCase;
185 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCaseBuilder;
186 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCase;
187 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCaseBuilder;
188 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCase;
189 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCaseBuilder;
190 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCase;
191 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCaseBuilder;
192 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCase;
193 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCaseBuilder;
194 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCase;
195 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCaseBuilder;
196 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCase;
197 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCaseBuilder;
198 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCase;
199 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCaseBuilder;
200 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCase;
201 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCaseBuilder;
202 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCase;
203 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCaseBuilder;
204 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCase;
205 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCaseBuilder;
206 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCase;
207 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCaseBuilder;
208 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCase;
209 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCaseBuilder;
210 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCase;
211 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCaseBuilder;
212 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCase;
213 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCaseBuilder;
214 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCase;
215 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCaseBuilder;
216 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCase;
217 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCaseBuilder;
218 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCase;
219 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCaseBuilder;
220 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCase;
221 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCaseBuilder;
222 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCase;
223 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCaseBuilder;
224 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCase;
225 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCaseBuilder;
226 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCase;
227 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCaseBuilder;
228 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCase;
229 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCaseBuilder;
230 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCase;
231 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCaseBuilder;
232 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCase;
233 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCaseBuilder;
234 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCase;
235 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCaseBuilder;
236 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCase;
237 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCaseBuilder;
238 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.op._case.ArpOpBuilder;
239 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.sha._case.ArpShaBuilder;
240 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.spa._case.ArpSpaBuilder;
241 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tha._case.ArpThaBuilder;
242 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tpa._case.ArpTpaBuilder;
243 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.dst._case.EthDstBuilder;
244 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.src._case.EthSrcBuilder;
245 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.type._case.EthTypeBuilder;
246 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.code._case.Icmpv4CodeBuilder;
247 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.type._case.Icmpv4TypeBuilder;
248 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.code._case.Icmpv6CodeBuilder;
249 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.type._case.Icmpv6TypeBuilder;
250 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.phy.port._case.InPhyPortBuilder;
251 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.in.port._case.InPortBuilder;
252 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.dscp._case.IpDscpBuilder;
253 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.ecn._case.IpEcnBuilder;
254 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.proto._case.IpProtoBuilder;
255 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4DstBuilder;
256 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4SrcBuilder;
257 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.dst._case.Ipv6DstBuilder;
258 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.exthdr._case.Ipv6ExthdrBuilder;
259 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.flabel._case.Ipv6FlabelBuilder;
260 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.sll._case.Ipv6NdSllBuilder;
261 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.target._case.Ipv6NdTargetBuilder;
262 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.tll._case.Ipv6NdTllBuilder;
263 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.src._case.Ipv6SrcBuilder;
264 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.bos._case.MplsBosBuilder;
265 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.label._case.MplsLabelBuilder;
266 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.tc._case.MplsTcBuilder;
267 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.pbb.isid._case.PbbIsidBuilder;
268 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.dst._case.SctpDstBuilder;
269 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.src._case.SctpSrcBuilder;
270 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.dst._case.TcpDstBuilder;
271 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.src._case.TcpSrcBuilder;
272 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tunnel.id._case.TunnelIdBuilder;
273 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.dst._case.UdpDstBuilder;
274 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.src._case.UdpSrcBuilder;
275 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.pcp._case.VlanPcpBuilder;
276 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.vid._case.VlanVidBuilder;
277 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10;
278 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey;
279 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.GeneralExtensionListGrouping;
280 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList;
281 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelIpv4Dst;
282 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelIpv4Src;
283 import org.slf4j.Logger;
284 import org.slf4j.LoggerFactory;
285
286 /**
287  * Utility class for converting a MD-SAL Flow into the OF flow mod
288  */
289 public class MatchConvertorImpl implements MatchConvertor<List<MatchEntry>> {
290     private static final Logger logger = LoggerFactory.getLogger(MatchConvertorImpl.class);
291     private static final byte[] VLAN_VID_MASK = new byte[]{16, 0};
292     private static final short PROTO_TCP = 6;
293     private static final short PROTO_UDP = 17;
294     private static final short PROTO_ICMPV4 = 1;
295     private static final String NO_IP = "0.0.0.0/0";
296
297     // Pre-calculated masks for the 33 possible values. Do not give them out, but clone() them as they may
298     // end up being leaked and vulnerable.
299     private static final byte[][] IPV4_MASKS;
300     static {
301         final byte[][] tmp = new byte[33][];
302         for (int i = 0; i <= 32; ++i) {
303             final int mask = 0xffffffff << (32 - i);
304             tmp[i] =  new byte[]{(byte) (mask >>> 24), (byte) (mask >>> 16), (byte) (mask >>> 8), (byte) mask};
305         }
306
307         IPV4_MASKS = tmp;
308     }
309
310     @Override
311     public List<MatchEntry> convert(
312             final org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match) {
313         List<MatchEntry> matchEntryList = new ArrayList<>();
314         if (match == null) {
315             return matchEntryList;
316         }
317         if (match.getInPort() != null) {
318             //TODO: currently this matchconverter is mapped to OF1.3 in MatchReactorMappingFactory. Will need to revisit during 1.4+
319             matchEntryList.add(toOfPort(InPort.class,
320                     InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, match.getInPort())));
321         }
322
323         if (match.getInPhyPort() != null) {
324             //TODO: currently this matchconverter is mapped to OF1.3 in MatchReactorMappingFactory. Will need to revisit during 1.4+
325             matchEntryList.add(toOfPhyPort(InPhyPort.class,
326                     InventoryDataServiceUtil.portNumberfromNodeConnectorId(OpenflowVersion.OF13, match.getInPhyPort())));
327         }
328
329         org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Metadata metadata = match
330                 .getMetadata();
331         if (metadata != null) {
332             matchEntryList.add(toOfMetadata(Metadata.class, metadata.getMetadata(), metadata.getMetadataMask()));
333         }
334
335         ethernetMatch(matchEntryList, match.getEthernetMatch());
336         vlanMatch(matchEntryList, match.getVlanMatch());
337         ipMatch(matchEntryList, match.getIpMatch());
338         layer4Match(matchEntryList, match.getLayer4Match());
339         icmpv4Match(matchEntryList, match.getIcmpv4Match());
340         icmpv6Match(matchEntryList, match.getIcmpv6Match());
341         layer3Match(matchEntryList, match.getLayer3Match());
342         protocolMatchFields(matchEntryList, match.getProtocolMatchFields());
343         tcpFlagsMatch(matchEntryList, match.getTcpFlagsMatch());
344
345         org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Tunnel tunnel = match
346                 .getTunnel();
347         if (tunnel != null) {
348             MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
349             TunnelIdCaseBuilder tunnelIdCaseBuilder = new TunnelIdCaseBuilder();
350             TunnelIdBuilder tunnelIdBuilder = new TunnelIdBuilder();
351             boolean hasMask = false;
352             if (null != tunnel.getTunnelMask()) {
353                 hasMask = true;
354                 tunnelIdBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelMask(), OFConstants.SIZE_OF_LONG_IN_BYTES));
355             }
356             tunnelIdBuilder.setTunnelId(ByteUtil.convertBigIntegerToNBytes(tunnel.getTunnelId(), OFConstants.SIZE_OF_LONG_IN_BYTES));
357             tunnelIdCaseBuilder.setTunnelId(tunnelIdBuilder.build());
358             matchEntryBuilder.setMatchEntryValue(tunnelIdCaseBuilder.build());
359             matchEntryBuilder.setHasMask(hasMask);
360             matchEntryBuilder.setOxmMatchField(TunnelId.class);
361             matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
362             matchEntryList.add(matchEntryBuilder.build());
363         }
364
365
366         /**
367          * TODO: EXTENSION PROPOSAL (match, MD-SAL to OFJava)
368          * - we might need version for conversion and for key
369          * - sanitize NPE
370          */
371         Optional<GeneralExtensionListGrouping> extensionListOpt = ExtensionResolvers.getMatchExtensionResolver().getExtension(match);
372         if (extensionListOpt.isPresent()) {
373             for (ExtensionList extensionItem : extensionListOpt.get().getExtensionList()) {
374                 // TODO: get real version
375                 ConverterExtensionKey<? extends ExtensionKey> key = new ConverterExtensionKey<>(extensionItem.getExtensionKey(), OFConstants.OFP_VERSION_1_3);
376                 ConvertorToOFJava<MatchEntry> convertor =
377                         OFSessionUtil.getExtensionConvertorProvider().getConverter(key);
378                 MatchEntry ofMatch = convertor.convert(extensionItem.getExtension());
379                 matchEntryList.add(ofMatch);
380             }
381         }
382
383         return matchEntryList;
384     }
385
386     private static void tcpFlagsMatch(List<MatchEntry> matchEntryList, TcpFlagsMatch tcpFlagsMatch) {
387         ExperimenterIdCaseBuilder expIdCaseBuilder = new ExperimenterIdCaseBuilder();
388         if (tcpFlagsMatch != null) {
389             MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
390             matchEntryBuilder.setOxmClass(ExperimenterClass.class);
391             matchEntryBuilder.setHasMask(false);
392             matchEntryBuilder.setOxmMatchField(TcpFlags.class);
393
394             TcpFlagsContainerBuilder tcpFlagsContainerBuilder = new TcpFlagsContainerBuilder();
395             TcpFlagsBuilder tcpFlagsBuilder = new TcpFlagsBuilder();
396             tcpFlagsBuilder.setFlags(tcpFlagsMatch.getTcpFlags());
397             if(tcpFlagsMatch.getTcpFlagsMask() != null) {
398                 matchEntryBuilder.setHasMask(true);
399                 tcpFlagsBuilder.setMask(ByteUtil.unsignedShortToBytes(tcpFlagsMatch.getTcpFlagsMask()));
400             }
401             tcpFlagsContainerBuilder.setTcpFlags(tcpFlagsBuilder.build());
402
403             //Set experimenter ID.
404             ExperimenterBuilder experimenterBuilder = new ExperimenterBuilder();
405             experimenterBuilder.setExperimenter(new ExperimenterId(OFApprovedExperimenterIds.MATCH_TCP_FLAGS_EXP_ID));
406             expIdCaseBuilder.setExperimenter(experimenterBuilder.build());
407
408             expIdCaseBuilder.addAugmentation(TcpFlagsContainer.class, tcpFlagsContainerBuilder.build());
409             matchEntryBuilder.setMatchEntryValue(expIdCaseBuilder.build());
410             matchEntryList.add(matchEntryBuilder.build());
411         }
412     }
413
414     private static void protocolMatchFields(final List<MatchEntry> matchEntryList,
415             final ProtocolMatchFields protocolMatchFields) {
416         if (protocolMatchFields != null) {
417             if (protocolMatchFields.getMplsLabel() != null) {
418                 matchEntryList.add(toOfMplsLabel(protocolMatchFields.getMplsLabel()));
419             }
420
421             if (protocolMatchFields.getMplsBos() != null) {
422                 matchEntryList.add(toOfMplsBos(protocolMatchFields.getMplsBos()));
423             }
424
425             if (protocolMatchFields.getMplsTc() != null) {
426                 matchEntryList.add(toOfMplsTc(protocolMatchFields.getMplsTc()));
427             }
428
429             if (protocolMatchFields.getPbb() != null) {
430                 matchEntryList.add(toOfMplsPbb(protocolMatchFields.getPbb()));
431             }
432         }
433     }
434
435
436     private static void layer3Match(final List<MatchEntry> matchEntryList, final Layer3Match layer3Match) {
437         if (layer3Match != null) {
438             if(layer3Match instanceof Ipv6MatchArbitraryBitMask){
439                 Ipv6MatchArbitraryBitMask Ipv6ArbitraryMaskMatchFields = (Ipv6MatchArbitraryBitMask) layer3Match;
440                 if (Ipv6ArbitraryMaskMatchFields.getIpv6SourceAddressNoMask() != null) {
441                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
442                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
443                     matchEntryBuilder.setOxmMatchField(Ipv6Src.class);
444
445                     Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder();
446                     Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder();
447                     ipv6SrcBuilder.setIpv6Address(Ipv6ArbitraryMaskMatchFields.getIpv6SourceAddressNoMask());
448                     Ipv6ArbitraryMask sourceArbitrarySubNetMask = Ipv6ArbitraryMaskMatchFields.getIpv6SourceArbitraryBitmask();
449                     boolean hasMask = false;
450                     if (sourceArbitrarySubNetMask != null) {
451                         byte[] maskByteArray = IpConversionUtil.convertIpv6ArbitraryMaskToByteArray(sourceArbitrarySubNetMask);
452                         if (maskByteArray != null) {
453                             ipv6SrcBuilder.setMask(maskByteArray);
454                             hasMask = true;
455                         }
456                     }
457                     matchEntryBuilder.setHasMask(hasMask);
458                     ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build());
459                     matchEntryBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.build());
460                     matchEntryList.add(matchEntryBuilder.build());
461                 }
462                 if (Ipv6ArbitraryMaskMatchFields.getIpv6DestinationAddressNoMask() != null) {
463                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
464                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
465                     matchEntryBuilder.setOxmMatchField(Ipv6Dst.class);
466
467                     Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder();
468                     Ipv6DstBuilder ipv6DstBuilder = new Ipv6DstBuilder();
469
470                     ipv6DstBuilder.setIpv6Address(Ipv6ArbitraryMaskMatchFields.getIpv6DestinationAddressNoMask());
471                     Ipv6ArbitraryMask destinationArbitrarySubNetMask = Ipv6ArbitraryMaskMatchFields.getIpv6DestinationArbitraryBitmask();
472
473                     boolean hasMask = false;
474                     if (destinationArbitrarySubNetMask != null) {
475                         byte[] maskByteArray = IpConversionUtil.convertIpv6ArbitraryMaskToByteArray(destinationArbitrarySubNetMask);
476                         if (maskByteArray != null) {
477                             ipv6DstBuilder.setMask(maskByteArray);
478                             hasMask = true;
479                         }
480                     }
481                     matchEntryBuilder.setHasMask(hasMask);
482                     ipv6DstCaseBuilder.setIpv6Dst(ipv6DstBuilder.build());
483                     matchEntryBuilder.setMatchEntryValue(ipv6DstCaseBuilder.build());
484                     matchEntryList.add(matchEntryBuilder.build());
485                 }
486             }
487             if(layer3Match instanceof Ipv4MatchArbitraryBitMask) {
488                 Ipv4MatchArbitraryBitMask ipv4MatchArbitraryBitMaskFields = (Ipv4MatchArbitraryBitMask) layer3Match;
489                 if (ipv4MatchArbitraryBitMaskFields.getIpv4SourceAddressNoMask() != null) {
490                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
491                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
492                     matchEntryBuilder.setOxmMatchField(Ipv4Src.class);
493
494                     Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder();
495                     Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder();
496
497                     ipv4SrcBuilder.setIpv4Address(ipv4MatchArbitraryBitMaskFields.getIpv4SourceAddressNoMask());
498                     DottedQuad sourceArbitrarySubNetMask = ipv4MatchArbitraryBitMaskFields.getIpv4SourceArbitraryBitmask();
499
500                     boolean hasMask = false;
501                     if (sourceArbitrarySubNetMask != null) {
502                         byte[] maskByteArray = IpConversionUtil.convertArbitraryMaskToByteArray(sourceArbitrarySubNetMask);
503                         if (maskByteArray != null) {
504                             ipv4SrcBuilder.setMask(maskByteArray);
505                             hasMask = true;
506                         }
507                     }
508                     matchEntryBuilder.setHasMask(hasMask);
509                     ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build());
510                     matchEntryBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build());
511                     matchEntryList.add(matchEntryBuilder.build());
512                 }
513                 if (ipv4MatchArbitraryBitMaskFields.getIpv4DestinationAddressNoMask() != null) {
514                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
515                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
516                     matchEntryBuilder.setOxmMatchField(Ipv4Dst.class);
517
518                     Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();
519                     Ipv4DstBuilder ipv4DstBuilder = new Ipv4DstBuilder();
520
521                     ipv4DstBuilder.setIpv4Address(ipv4MatchArbitraryBitMaskFields.getIpv4DestinationAddressNoMask());
522                     DottedQuad destArbitrarySubNetMask = ipv4MatchArbitraryBitMaskFields.getIpv4DestinationArbitraryBitmask();
523
524                     boolean hasMask = false;
525                     if (destArbitrarySubNetMask != null) {
526                         byte[] maskByteArray = IpConversionUtil.convertArbitraryMaskToByteArray(destArbitrarySubNetMask);
527                         if (maskByteArray != null) {
528                             ipv4DstBuilder.setMask(maskByteArray);
529                             hasMask = true;
530                         }
531                     }
532                     matchEntryBuilder.setHasMask(hasMask);
533                     ipv4DstCaseBuilder.setIpv4Dst(ipv4DstBuilder.build());
534                     matchEntryBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());
535                     matchEntryList.add(matchEntryBuilder.build());
536                 }
537             }
538             if(layer3Match instanceof Ipv4Match){
539                 Ipv4Match ipv4Match = (Ipv4Match) layer3Match;
540                 if (ipv4Match.getIpv4Source() != null) {
541                     Ipv4Prefix ipv4Prefix = ipv4Match.getIpv4Source();
542                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
543                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
544                     matchEntryBuilder.setOxmMatchField(Ipv4Src.class);
545
546                     Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder();
547                     Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder();
548
549                     Iterator<String> addressParts = IpConversionUtil.splitToParts(ipv4Prefix);
550                     Ipv4Address ipv4Address = new Ipv4Address(addressParts.next());
551                     ipv4SrcBuilder.setIpv4Address(ipv4Address);
552                     boolean hasMask = false;
553                     byte[] mask = extractIpv4Mask(addressParts);
554                     if (null != mask) {
555                         ipv4SrcBuilder.setMask(mask);
556                         hasMask = true;
557                     }
558                     matchEntryBuilder.setHasMask(hasMask);
559                     ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build());
560                     matchEntryBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build());
561                     matchEntryList.add(matchEntryBuilder.build());
562                 }
563                 if (ipv4Match.getIpv4Destination() != null) {
564                     Ipv4Prefix ipv4Prefix = ipv4Match.getIpv4Destination();
565                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
566                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
567                     matchEntryBuilder.setOxmMatchField(Ipv4Dst.class);
568
569                     Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();
570                     Ipv4DstBuilder ipv4DstBuilder = new Ipv4DstBuilder();
571
572                     Iterator<String> addressParts = IpConversionUtil.splitToParts(ipv4Prefix);
573                     Ipv4Address ipv4Address = new Ipv4Address(addressParts.next());
574                     ipv4DstBuilder.setIpv4Address(ipv4Address);
575                     boolean hasMask = false;
576                     byte[] mask = extractIpv4Mask(addressParts);
577                     if (null != mask) {
578                         ipv4DstBuilder.setMask(mask);
579                         hasMask = true;
580                     }
581                     matchEntryBuilder.setHasMask(hasMask);
582                     ipv4DstCaseBuilder.setIpv4Dst(ipv4DstBuilder.build());
583                     matchEntryBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());
584                     matchEntryList.add(matchEntryBuilder.build());
585                 }
586             }
587             if (layer3Match instanceof TunnelIpv4Match) {
588                 TunnelIpv4Match tunnelIpv4Src = (TunnelIpv4Match) layer3Match;
589                 if (tunnelIpv4Src.getTunnelIpv4Source() != null) {
590                     Ipv4Prefix ipv4Prefix = tunnelIpv4Src.getTunnelIpv4Source();
591                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
592                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
593                     matchEntryBuilder.setOxmMatchField(Ipv4Src.class);
594
595                     Ipv4SrcCaseBuilder ipv4SrcCaseBuilder = new Ipv4SrcCaseBuilder();
596                     Ipv4SrcBuilder ipv4SrcBuilder = new Ipv4SrcBuilder();
597
598                     Iterator<String> addressParts = IpConversionUtil.splitToParts(ipv4Prefix);
599                     Ipv4Address ipv4Address = new Ipv4Address(addressParts.next());
600                     ipv4SrcBuilder.setIpv4Address(ipv4Address);
601                     boolean hasMask = false;
602                     byte[] mask = extractIpv4Mask(addressParts);
603                     if (null != mask) {
604                         ipv4SrcBuilder.setMask(mask);
605                         hasMask = true;
606                     }
607                     matchEntryBuilder.setHasMask(hasMask);
608                     ipv4SrcCaseBuilder.setIpv4Src(ipv4SrcBuilder.build());
609                     matchEntryBuilder.setMatchEntryValue(ipv4SrcCaseBuilder.build());
610                     matchEntryList.add(matchEntryBuilder.build());
611                 }
612                 if (tunnelIpv4Src.getTunnelIpv4Destination() != null) {
613                     Ipv4Prefix ipv4Prefix = tunnelIpv4Src.getTunnelIpv4Destination();
614                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
615                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
616                     matchEntryBuilder.setOxmMatchField(Ipv4Dst.class);
617
618                     Ipv4DstCaseBuilder ipv4DstCaseBuilder = new Ipv4DstCaseBuilder();
619                     Ipv4DstBuilder ipv4DstBuilder = new Ipv4DstBuilder();
620
621                     Iterator<String> addressParts = IpConversionUtil.splitToParts(ipv4Prefix);
622                     Ipv4Address ipv4Address = new Ipv4Address(addressParts.next());
623                     ipv4DstBuilder.setIpv4Address(ipv4Address);
624                     boolean hasMask = false;
625                     byte[] mask = extractIpv4Mask(addressParts);
626                     if (null != mask) {
627                         ipv4DstBuilder.setMask(mask);
628                         hasMask = true;
629                     }
630                     matchEntryBuilder.setHasMask(hasMask);
631                     ipv4DstCaseBuilder.setIpv4Dst(ipv4DstBuilder.build());
632                     matchEntryBuilder.setMatchEntryValue(ipv4DstCaseBuilder.build());
633                     matchEntryList.add(matchEntryBuilder.build());
634                 }
635             } else if (layer3Match instanceof ArpMatch) {
636                 ArpMatch arpMatch = (ArpMatch) layer3Match;
637                 if (arpMatch.getArpOp() != null) {
638                     matchEntryList.add(toOfArpOpCode(arpMatch.getArpOp()));
639                 }
640
641                 if (arpMatch.getArpSourceTransportAddress() != null) {
642                     Ipv4Prefix ipv4Prefix = arpMatch.getArpSourceTransportAddress();
643                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
644                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
645                     matchEntryBuilder.setOxmMatchField(ArpSpa.class);
646
647                     ArpSpaCaseBuilder arpSpaCaseBuilder = new ArpSpaCaseBuilder();
648                     ArpSpaBuilder arpSpaBuilder = new ArpSpaBuilder();
649
650                     Iterator<String> addressParts = IpConversionUtil.splitToParts(ipv4Prefix);
651                     Ipv4Address ipv4Address = new Ipv4Address(addressParts.next());
652                     arpSpaBuilder.setIpv4Address(ipv4Address);
653                     boolean hasMask = false;
654                     byte[] mask = extractIpv4Mask(addressParts);
655                     if (null != mask) {
656                         arpSpaBuilder.setMask(mask);
657                         hasMask = true;
658                     }
659                     matchEntryBuilder.setHasMask(hasMask);
660                     arpSpaCaseBuilder.setArpSpa(arpSpaBuilder.build());
661                     matchEntryBuilder.setMatchEntryValue(arpSpaCaseBuilder.build());
662                     matchEntryList.add(matchEntryBuilder.build());
663                 }
664
665                 if (arpMatch.getArpTargetTransportAddress() != null) {
666                     Ipv4Prefix ipv4Prefix = arpMatch.getArpTargetTransportAddress();
667                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
668                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
669                     matchEntryBuilder.setOxmMatchField(ArpTpa.class);
670
671                     ArpTpaCaseBuilder arpTpaCaseBuilder = new ArpTpaCaseBuilder();
672                     ArpTpaBuilder arpTpaBuilder = new ArpTpaBuilder();
673
674                     Iterator<String> addressParts = IpConversionUtil.splitToParts(ipv4Prefix);
675                     Ipv4Address ipv4Address = new Ipv4Address(addressParts.next());
676                     arpTpaBuilder.setIpv4Address(ipv4Address);
677                     boolean hasMask = false;
678                     byte[] mask = extractIpv4Mask(addressParts);
679                     if (null != mask) {
680                         arpTpaBuilder.setMask(mask);
681                         hasMask = true;
682                     }
683                     matchEntryBuilder.setHasMask(hasMask);
684                     arpTpaCaseBuilder.setArpTpa(arpTpaBuilder.build());
685                     matchEntryBuilder.setMatchEntryValue(arpTpaCaseBuilder.build());
686                     matchEntryList.add(matchEntryBuilder.build());
687                 }
688
689                 ArpSourceHardwareAddress arpSourceHardwareAddress = arpMatch.getArpSourceHardwareAddress();
690                 if (arpSourceHardwareAddress != null) {
691                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
692                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
693                     matchEntryBuilder.setOxmMatchField(ArpSha.class);
694
695                     ArpShaCaseBuilder arpShaCaseBuilder = new ArpShaCaseBuilder();
696                     ArpShaBuilder arpShaBuilder = new ArpShaBuilder();
697                     arpShaBuilder.setMacAddress(arpSourceHardwareAddress.getAddress());
698                     boolean hasMask = false;
699                     if (null != arpSourceHardwareAddress.getMask()) {
700                         arpShaBuilder.setMask(ByteBufUtils.macAddressToBytes(arpSourceHardwareAddress.getMask().getValue()));
701                         hasMask = true;
702                     }
703                     arpShaCaseBuilder.setArpSha(arpShaBuilder.build());
704                     matchEntryBuilder.setMatchEntryValue(arpShaCaseBuilder.build());
705                     matchEntryBuilder.setHasMask(hasMask);
706                     matchEntryList.add(matchEntryBuilder.build());
707                 }
708
709                 ArpTargetHardwareAddress arpTargetHardwareAddress = arpMatch.getArpTargetHardwareAddress();
710                 if (arpTargetHardwareAddress != null) {
711                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
712                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
713                     matchEntryBuilder.setOxmMatchField(ArpTha.class);
714
715                     ArpThaCaseBuilder arpThaCaseBuilder = new ArpThaCaseBuilder();
716                     ArpThaBuilder arpThaBuilder = new ArpThaBuilder();
717                     arpThaBuilder.setMacAddress(arpTargetHardwareAddress.getAddress());
718                     boolean hasMask = false;
719                     if (null != arpTargetHardwareAddress.getMask()) {
720                         arpThaBuilder.setMask(ByteBufUtils.macAddressToBytes(arpTargetHardwareAddress.getMask().getValue()));
721                         hasMask = true;
722                     }
723                     arpThaCaseBuilder.setArpTha(arpThaBuilder.build());
724                     matchEntryBuilder.setMatchEntryValue(arpThaCaseBuilder.build());
725                     matchEntryBuilder.setHasMask(hasMask);
726                     matchEntryList.add(matchEntryBuilder.build());
727                 }
728             } else if (layer3Match instanceof Ipv6Match) {
729                 Ipv6Match ipv6Match = (Ipv6Match) layer3Match;
730                 if (ipv6Match.getIpv6Source() != null) {
731                     Ipv6Prefix ipv6Prefix = ipv6Match.getIpv6Source();
732                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
733                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
734                     matchEntryBuilder.setOxmMatchField(Ipv6Src.class);
735
736                     Ipv6SrcCaseBuilder ipv6SrcCaseBuilder = new Ipv6SrcCaseBuilder();
737                     Ipv6SrcBuilder ipv6SrcBuilder = new Ipv6SrcBuilder();
738                     final Integer prefix = IpConversionUtil.extractIpv6Prefix(ipv6Prefix);
739                     boolean hasMask = false;
740                     if (null != prefix) {
741                         ipv6SrcBuilder.setMask(IpConversionUtil.convertIpv6PrefixToByteArray(prefix));
742                         hasMask = true;
743                     }
744                     ipv6SrcBuilder.setIpv6Address(IpConversionUtil.extractIpv6Address(ipv6Prefix));
745                     ipv6SrcCaseBuilder.setIpv6Src(ipv6SrcBuilder.build());
746                     matchEntryBuilder.setHasMask(hasMask);
747                     matchEntryBuilder.setMatchEntryValue(ipv6SrcCaseBuilder.build());
748                     matchEntryList.add(matchEntryBuilder.build());
749                 }
750
751                 if (ipv6Match.getIpv6Destination() != null) {
752                     Ipv6Prefix ipv6Prefix = ipv6Match.getIpv6Destination();
753                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
754                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
755                     matchEntryBuilder.setOxmMatchField(Ipv6Dst.class);
756
757                     Ipv6DstCaseBuilder ipv6DstCaseBuilder = new Ipv6DstCaseBuilder();
758                     Ipv6DstBuilder ipv6DstBuilder = new Ipv6DstBuilder();
759                     final Integer prefix = IpConversionUtil.extractIpv6Prefix(ipv6Prefix);
760                     boolean hasMask = false;
761                     if (null != prefix) {
762                         ipv6DstBuilder.setMask(IpConversionUtil.convertIpv6PrefixToByteArray(prefix));
763                         hasMask = true;
764                     }
765                     ipv6DstBuilder.setIpv6Address(IpConversionUtil.extractIpv6Address(ipv6Prefix));
766                     ipv6DstCaseBuilder.setIpv6Dst(ipv6DstBuilder.build());
767                     matchEntryBuilder.setHasMask(hasMask);
768                     matchEntryBuilder.setMatchEntryValue(ipv6DstCaseBuilder.build());
769                     matchEntryList.add(matchEntryBuilder.build());
770                 }
771
772                 if (ipv6Match.getIpv6Label() != null) {
773                     matchEntryList.add(toOfIpv6FlowLabel(ipv6Match.getIpv6Label()));
774                 }
775
776                 if (ipv6Match.getIpv6NdTarget() != null) {
777                     matchEntryList.add(toOfIpv6NdTargetAddress(ipv6Match.getIpv6NdTarget()));
778                 }
779
780                 if (ipv6Match.getIpv6NdSll() != null) {
781                     MacAddress ipv6NdSll = ipv6Match.getIpv6NdSll();
782                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
783                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
784                     matchEntryBuilder.setOxmMatchField(Ipv6NdSll.class);
785
786                     Ipv6NdSllCaseBuilder ipv6NdSllCaseBuilder = new Ipv6NdSllCaseBuilder();
787                     Ipv6NdSllBuilder ipv6NdSllBuilder = new Ipv6NdSllBuilder();
788                     ipv6NdSllBuilder.setMacAddress(ipv6NdSll);
789                     ipv6NdSllCaseBuilder.setIpv6NdSll(ipv6NdSllBuilder.build());
790                     matchEntryBuilder.setMatchEntryValue(ipv6NdSllCaseBuilder.build());
791                     matchEntryBuilder.setHasMask(false);
792                     matchEntryList.add(matchEntryBuilder.build());
793                 }
794
795                 if (ipv6Match.getIpv6NdTll() != null) {
796                     MacAddress ipv6NdSll = ipv6Match.getIpv6NdTll();
797                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
798                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
799                     matchEntryBuilder.setOxmMatchField(Ipv6NdTll.class);
800
801                     Ipv6NdTllCaseBuilder ipv6NdTllCaseBuilder = new Ipv6NdTllCaseBuilder();
802                     Ipv6NdTllBuilder ipv6NdTllBuilder = new Ipv6NdTllBuilder();
803                     ipv6NdTllBuilder.setMacAddress(ipv6NdSll);
804                     ipv6NdTllCaseBuilder.setIpv6NdTll(ipv6NdTllBuilder.build());
805                     matchEntryBuilder.setMatchEntryValue(ipv6NdTllCaseBuilder.build());
806                     matchEntryBuilder.setHasMask(false);
807                     matchEntryList.add(matchEntryBuilder.build());
808
809                 }
810
811                 if (ipv6Match.getIpv6ExtHeader() != null) {
812                     matchEntryList.add(toOfIpv6ExtHeader(ipv6Match.getIpv6ExtHeader()));
813                 }
814             }
815         }
816     }
817
818
819     private static void icmpv6Match(final List<MatchEntry> matchEntryList, final Icmpv6Match icmpv6Match) {
820         if (icmpv6Match != null) {
821             if (icmpv6Match.getIcmpv6Type() != null) {
822                 matchEntryList.add(toOfIcmpv6Type(icmpv6Match.getIcmpv6Type()));
823             }
824
825             if (icmpv6Match.getIcmpv6Code() != null) {
826                 matchEntryList.add(toOfIcmpv6Code(icmpv6Match.getIcmpv6Code()));
827             }
828         }
829     }
830
831
832     private static void icmpv4Match(final List<MatchEntry> matchEntryList, final Icmpv4Match icmpv4Match) {
833         if (icmpv4Match != null) {
834             if (icmpv4Match.getIcmpv4Type() != null) {
835                 matchEntryList.add(toOfIcmpv4Type(icmpv4Match.getIcmpv4Type()));
836             }
837
838             if (icmpv4Match.getIcmpv4Code() != null) {
839                 matchEntryList.add(toOfIcmpv4Code(icmpv4Match.getIcmpv4Code()));
840             }
841         }
842     }
843
844
845     private static void layer4Match(final List<MatchEntry> matchEntryList, final Layer4Match layer4Match) {
846         if (layer4Match != null) {
847             if (layer4Match instanceof TcpMatch) {
848                 TcpMatch tcpMatch = (TcpMatch) layer4Match;
849
850                 if (tcpMatch.getTcpSourcePort() != null) {
851                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
852                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
853                     matchEntryBuilder.setOxmMatchField(TcpSrc.class);
854
855                     TcpSrcCaseBuilder tcpSrcCaseBuilder = new TcpSrcCaseBuilder();
856                     TcpSrcBuilder tcpSrcBuilder = new TcpSrcBuilder();
857                     tcpSrcBuilder.setPort(tcpMatch.getTcpSourcePort());
858                     tcpSrcCaseBuilder.setTcpSrc(tcpSrcBuilder.build());
859
860                     matchEntryBuilder.setMatchEntryValue(tcpSrcCaseBuilder.build());
861                     matchEntryBuilder.setHasMask(false);
862                     matchEntryList.add(matchEntryBuilder.build());
863                 }
864                 if (tcpMatch.getTcpDestinationPort() != null) {
865                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
866                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
867                     matchEntryBuilder.setOxmMatchField(TcpDst.class);
868
869                     TcpDstCaseBuilder tcpDstCaseBuilder = new TcpDstCaseBuilder();
870                     TcpDstBuilder tcpDstBuilder = new TcpDstBuilder();
871                     tcpDstBuilder.setPort(tcpMatch.getTcpDestinationPort());
872                     tcpDstCaseBuilder.setTcpDst(tcpDstBuilder.build());
873                     matchEntryBuilder.setMatchEntryValue(tcpDstCaseBuilder.build());
874                     matchEntryBuilder.setHasMask(false);
875                     matchEntryList.add(matchEntryBuilder.build());
876                 }
877             } else if (layer4Match instanceof UdpMatch) {
878                 UdpMatch udpMatch = (UdpMatch) layer4Match;
879                 if (udpMatch.getUdpSourcePort() != null) {
880                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
881                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
882                     matchEntryBuilder.setOxmMatchField(UdpSrc.class);
883
884                     UdpSrcCaseBuilder udpSrcCaseBuilder = new UdpSrcCaseBuilder();
885                     UdpSrcBuilder udpSrcBuilder = new UdpSrcBuilder();
886                     boolean hasMask = false;
887                     udpSrcBuilder.setPort(udpMatch.getUdpSourcePort());
888                     udpSrcCaseBuilder.setUdpSrc(udpSrcBuilder.build());
889                     matchEntryBuilder.setMatchEntryValue(udpSrcCaseBuilder.build());
890                     matchEntryBuilder.setHasMask(hasMask);
891                     matchEntryList.add(matchEntryBuilder.build());
892                 }
893
894                 if (udpMatch.getUdpDestinationPort() != null) {
895                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
896                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
897                     matchEntryBuilder.setOxmMatchField(UdpDst.class);
898
899                     UdpDstCaseBuilder udpDstCaseBuilder = new UdpDstCaseBuilder();
900                     UdpDstBuilder udpDstBuilder = new UdpDstBuilder();
901                     udpDstBuilder.setPort(udpMatch.getUdpDestinationPort());
902                     udpDstCaseBuilder.setUdpDst(udpDstBuilder.build());
903                     matchEntryBuilder.setMatchEntryValue(udpDstCaseBuilder.build());
904                     matchEntryBuilder.setHasMask(false);
905                     matchEntryList.add(matchEntryBuilder.build());
906                 }
907             } else if (layer4Match instanceof SctpMatch) {
908                 SctpMatch sctpMatch = (SctpMatch) layer4Match;
909                 if (sctpMatch.getSctpSourcePort() != null) {
910                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
911                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
912                     matchEntryBuilder.setOxmMatchField(SctpSrc.class);
913
914                     SctpSrcCaseBuilder sctpSrcCaseBuilder = new SctpSrcCaseBuilder();
915                     SctpSrcBuilder sctpSrcBuilder = new SctpSrcBuilder();
916                     sctpSrcBuilder.setPort(sctpMatch.getSctpSourcePort());
917                     sctpSrcCaseBuilder.setSctpSrc(sctpSrcBuilder.build());
918                     matchEntryBuilder.setMatchEntryValue(sctpSrcCaseBuilder.build());
919                     matchEntryBuilder.setHasMask(false);
920                     matchEntryList.add(matchEntryBuilder.build());
921                 }
922
923                 if (sctpMatch.getSctpDestinationPort() != null) {
924                     MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
925                     matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
926                     matchEntryBuilder.setOxmMatchField(SctpDst.class);
927
928                     SctpDstCaseBuilder sctpDstCaseBuilder = new SctpDstCaseBuilder();
929                     SctpDstBuilder sctpDstBuilder = new SctpDstBuilder();
930                     sctpDstBuilder.setPort(sctpMatch.getSctpDestinationPort());
931                     sctpDstCaseBuilder.setSctpDst(sctpDstBuilder.build());
932                     matchEntryBuilder.setMatchEntryValue(sctpDstCaseBuilder.build());
933                     matchEntryBuilder.setHasMask(false);
934                     matchEntryList.add(matchEntryBuilder.build());
935                 }
936             }
937         }
938     }
939
940
941     private static void ipMatch(final List<MatchEntry> matchEntryList, final IpMatch ipMatch) {
942         if (ipMatch != null) {
943             if (ipMatch.getIpDscp() != null) {
944                 matchEntryList.add(toOfIpDscp(ipMatch.getIpDscp()));
945             }
946
947             if (ipMatch.getIpEcn() != null) {
948                 matchEntryList.add(toOfIpEcn(ipMatch.getIpEcn()));
949             }
950
951             if (ipMatch.getIpProtocol() != null) {
952                 matchEntryList.add(toOfIpProto(ipMatch.getIpProtocol()));
953             }
954         }
955     }
956
957
958     private static void vlanMatch(final List<MatchEntry> matchEntryList, final VlanMatch vlanMatch) {
959         if (vlanMatch != null) {
960             if (vlanMatch.getVlanId() != null) {
961                 VlanId vlanId = vlanMatch.getVlanId();
962                 MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
963                 matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
964                 matchEntryBuilder.setOxmMatchField(VlanVid.class);
965
966                 VlanVidCaseBuilder vlanVidCaseBuilder = new VlanVidCaseBuilder();
967                 VlanVidBuilder vlanVidBuilder = new VlanVidBuilder();
968                 boolean setCfiBit = false;
969                 Integer vidEntryValue = 0;
970                 boolean hasmask = false;
971                 if (Boolean.TRUE.equals(vlanId.isVlanIdPresent())) {
972                     setCfiBit = true;
973                     if (vlanId.getVlanId() != null) {
974                         vidEntryValue = vlanId.getVlanId().getValue();
975                     }
976                     hasmask = (vidEntryValue == 0);
977                     if (hasmask) {
978                         vlanVidBuilder.setMask(VLAN_VID_MASK);
979                     }
980                 }
981
982                 vlanVidBuilder.setCfiBit(setCfiBit);
983                 vlanVidBuilder.setVlanVid(vidEntryValue);
984                 vlanVidCaseBuilder.setVlanVid(vlanVidBuilder.build());
985                 matchEntryBuilder.setMatchEntryValue(vlanVidCaseBuilder.build());
986                 matchEntryBuilder.setHasMask(hasmask);
987                 matchEntryList.add(matchEntryBuilder.build());
988             }
989
990             if (vlanMatch.getVlanPcp() != null) {
991                 matchEntryList.add(toOfVlanPcp(vlanMatch.getVlanPcp()));
992             }
993         }
994     }
995
996
997     private static void ethernetMatch(final List<MatchEntry> matchEntryList, final EthernetMatch ethernetMatch) {
998         if (ethernetMatch != null) {
999             EthernetDestination ethernetDestination = ethernetMatch.getEthernetDestination();
1000             if (ethernetDestination != null) {
1001                 MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
1002                 matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
1003                 matchEntryBuilder.setOxmMatchField(EthDst.class);
1004                 EthDstCaseBuilder ethDstCaseBuilder = new EthDstCaseBuilder();
1005                 EthDstBuilder ethDstBuilder = new EthDstBuilder();
1006                 ethDstBuilder.setMacAddress(ethernetDestination.getAddress());
1007                 boolean hasMask = false;
1008                 if (null != ethernetDestination.getMask()) {
1009                     ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetDestination.getMask().getValue()));
1010                     hasMask = true;
1011                 }
1012                 ethDstCaseBuilder.setEthDst(ethDstBuilder.build());
1013                 matchEntryBuilder.setMatchEntryValue(ethDstCaseBuilder.build());
1014                 matchEntryBuilder.setHasMask(hasMask);
1015                 matchEntryList.add(matchEntryBuilder.build());
1016             }
1017
1018             EthernetSource ethernetSource = ethernetMatch.getEthernetSource();
1019             if (ethernetSource != null) {
1020                 MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
1021                 matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
1022                 matchEntryBuilder.setOxmMatchField(EthSrc.class);
1023
1024                 EthSrcCaseBuilder ethSrcCaseBuilder = new EthSrcCaseBuilder();
1025                 EthSrcBuilder ethDstBuilder = new EthSrcBuilder();
1026                 ethDstBuilder.setMacAddress(ethernetSource.getAddress());
1027                 boolean hasMask = false;
1028                 if (null != ethernetSource.getMask()) {
1029                     ethDstBuilder.setMask(ByteBufUtils.macAddressToBytes(ethernetSource.getMask().getValue()));
1030                     hasMask = true;
1031                 }
1032                 ethSrcCaseBuilder.setEthSrc(ethDstBuilder.build());
1033                 matchEntryBuilder.setMatchEntryValue(ethSrcCaseBuilder.build());
1034                 matchEntryBuilder.setHasMask(hasMask);
1035                 matchEntryList.add(matchEntryBuilder.build());
1036             }
1037
1038             if (ethernetMatch.getEthernetType() != null) {
1039                 matchEntryList.add(toOfEthernetType(ethernetMatch.getEthernetType()));
1040             }
1041         }
1042     }
1043
1044
1045     private static byte[] extractIpv4Mask(final Iterator<String> addressParts) {
1046         final int prefix;
1047         if (addressParts.hasNext()) {
1048             int potentionalPrefix = Integer.parseInt(addressParts.next());
1049             prefix = potentionalPrefix < 32 ? potentionalPrefix : 0;
1050         } else {
1051             prefix = 0;
1052         }
1053
1054         if (prefix != 0) {
1055             // clone() is necessary to protect our constants
1056             return IPV4_MASKS[prefix].clone();
1057         }
1058         return null;
1059     }
1060
1061     /**
1062      * Method convert Openflow 1.0 specific flow match to MD-SAL format flow
1063      * match
1064      * @param swMatch source match
1065      * @param datapathid datapath id
1066      * @param ofVersion openflow version
1067      * @return match builder
1068      */
1069     public static MatchBuilder fromOFMatchV10ToSALMatch(@Nonnull final MatchV10 swMatch, @Nonnull final BigInteger datapathid, @Nonnull final OpenflowVersion ofVersion) {
1070         MatchBuilder matchBuilder = new MatchBuilder();
1071         EthernetMatchBuilder ethMatchBuilder = new EthernetMatchBuilder();
1072         VlanMatchBuilder vlanMatchBuilder = new VlanMatchBuilder();
1073         Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
1074         IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();
1075         if (!swMatch.getWildcards().isINPORT().booleanValue() && swMatch.getInPort() != null) {
1076             matchBuilder.setInPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid,
1077                     (long) swMatch.getInPort(), ofVersion));
1078         }
1079
1080         if (!swMatch.getWildcards().isDLSRC().booleanValue() && swMatch.getDlSrc() != null) {
1081             EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();
1082             ethSrcBuilder.setAddress(swMatch.getDlSrc());
1083             ethMatchBuilder.setEthernetSource(ethSrcBuilder.build());
1084             matchBuilder.setEthernetMatch(ethMatchBuilder.build());
1085         }
1086         if (!swMatch.getWildcards().isDLDST().booleanValue() && swMatch.getDlDst() != null) {
1087             EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();
1088             ethDstBuilder.setAddress(swMatch.getDlDst());
1089             ethMatchBuilder.setEthernetDestination(ethDstBuilder.build());
1090             matchBuilder.setEthernetMatch(ethMatchBuilder.build());
1091         }
1092         if (!swMatch.getWildcards().isDLTYPE().booleanValue() && swMatch.getDlType() != null) {
1093             EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
1094             ethTypeBuilder.setType(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType(
1095                     (long) swMatch.getDlType()));
1096             ethMatchBuilder.setEthernetType(ethTypeBuilder.build());
1097             matchBuilder.setEthernetMatch(ethMatchBuilder.build());
1098         }
1099         if (!swMatch.getWildcards().isDLVLAN().booleanValue() && swMatch.getDlVlan() != null) {
1100             VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
1101             int vlanId = (swMatch.getDlVlan() == (0xffff)) ? 0 : swMatch.getDlVlan();
1102             vlanIdBuilder.setVlanId(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId(vlanId));
1103             vlanIdBuilder.setVlanIdPresent(vlanId == 0 ? false : true);
1104             vlanMatchBuilder.setVlanId(vlanIdBuilder.build());
1105             matchBuilder.setVlanMatch(vlanMatchBuilder.build());
1106         }
1107         if (!swMatch.getWildcards().isDLVLANPCP().booleanValue() && swMatch.getDlVlanPcp() != null) {
1108             vlanMatchBuilder.setVlanPcp(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp(
1109                     swMatch.getDlVlanPcp()));
1110             matchBuilder.setVlanMatch(vlanMatchBuilder.build());
1111         }
1112         if (!swMatch.getWildcards().isDLTYPE().booleanValue() && swMatch.getNwSrc() != null) {
1113             final Ipv4Prefix prefix;
1114             if (swMatch.getNwSrcMask() != null) {
1115                 prefix = IetfInetUtil.INSTANCE.ipv4PrefixFor(swMatch.getNwSrc(), swMatch.getNwSrcMask());
1116             } else {
1117                 //Openflow Spec : 1.3.2
1118                 //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask.
1119                 // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow
1120                 // statistics response.
1121                 prefix = IetfInetUtil.INSTANCE.ipv4PrefixFor(swMatch.getNwSrc());
1122             }
1123             if (!NO_IP.equals(prefix.getValue())) {
1124                 ipv4MatchBuilder.setIpv4Source(prefix);
1125                 matchBuilder.setLayer3Match(ipv4MatchBuilder.build());
1126             }
1127         }
1128         if (!swMatch.getWildcards().isDLTYPE().booleanValue() && swMatch.getNwDst() != null) {
1129             final Ipv4Prefix prefix;
1130             if (swMatch.getNwDstMask() != null) {
1131                 prefix = IetfInetUtil.INSTANCE.ipv4PrefixFor(swMatch.getNwDst(), swMatch.getNwDstMask());
1132             } else {
1133                 //Openflow Spec : 1.3.2
1134                 //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask.
1135                 // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow
1136                 // statistics response.
1137                 prefix = IetfInetUtil.INSTANCE.ipv4PrefixFor(swMatch.getNwDst());
1138             }
1139             if (!NO_IP.equals(prefix.getValue())) {
1140                 ipv4MatchBuilder.setIpv4Destination(prefix);
1141                 matchBuilder.setLayer3Match(ipv4MatchBuilder.build());
1142             }
1143         }
1144         if (!swMatch.getWildcards().isNWPROTO().booleanValue() && swMatch.getNwProto() != null) {
1145             Short nwProto = swMatch.getNwProto();
1146             ipMatchBuilder.setIpProtocol(nwProto);
1147             matchBuilder.setIpMatch(ipMatchBuilder.build());
1148
1149             int proto = nwProto.intValue();
1150             if (proto == PROTO_TCP) {
1151                 TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
1152                 boolean hasTcp = false;
1153                 if (!swMatch.getWildcards().isTPSRC().booleanValue() && swMatch.getTpSrc() != null) {
1154                     tcpMatchBuilder
1155                             .setTcpSourcePort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber(
1156                                     swMatch.getTpSrc()));
1157                     hasTcp = true;
1158                 }
1159                 if (!swMatch.getWildcards().isTPDST().booleanValue() && swMatch.getTpDst() != null) {
1160                     tcpMatchBuilder
1161                             .setTcpDestinationPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber(
1162                                     swMatch.getTpDst()));
1163                     hasTcp = true;
1164                 }
1165
1166                 if (hasTcp) {
1167                     matchBuilder.setLayer4Match(tcpMatchBuilder.build());
1168                 }
1169             } else if (proto == PROTO_UDP) {
1170                 UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
1171                 boolean hasUdp = false;
1172                 if (!swMatch.getWildcards().isTPSRC().booleanValue() && swMatch.getTpSrc() != null) {
1173                     udpMatchBuilder
1174                             .setUdpSourcePort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber(
1175                                     swMatch.getTpSrc()));
1176                     hasUdp = true;
1177                 }
1178                 if (!swMatch.getWildcards().isTPDST().booleanValue() && swMatch.getTpDst() != null) {
1179                     udpMatchBuilder
1180                             .setUdpDestinationPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber(
1181                                     swMatch.getTpDst()));
1182                     hasUdp = true;
1183                 }
1184
1185                 if (hasUdp) {
1186                     matchBuilder.setLayer4Match(udpMatchBuilder.build());
1187                 }
1188             } else if (proto == PROTO_ICMPV4) {
1189                 Icmpv4MatchBuilder icmpv4MatchBuilder = new Icmpv4MatchBuilder();
1190                 boolean hasIcmpv4 = false;
1191                 if (!swMatch.getWildcards().isTPSRC().booleanValue()) {
1192                     Integer type = swMatch.getTpSrc();
1193                     if (type != null) {
1194                         icmpv4MatchBuilder.setIcmpv4Type(type.shortValue());
1195                         hasIcmpv4 = true;
1196                     }
1197                 }
1198                 if (!swMatch.getWildcards().isTPDST().booleanValue()) {
1199                     Integer code = swMatch.getTpDst();
1200                     if (code != null) {
1201                         icmpv4MatchBuilder.setIcmpv4Code(code.shortValue());
1202                         hasIcmpv4 = true;
1203                     }
1204                 }
1205
1206                 if (hasIcmpv4) {
1207                     matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build());
1208                 }
1209             }
1210         }
1211         if (!swMatch.getWildcards().isNWTOS().booleanValue() && swMatch.getNwTos() != null) {
1212             Short dscp = ActionUtil.tosToDscp(swMatch.getNwTos().shortValue());
1213             ipMatchBuilder.setIpDscp(new Dscp(dscp));
1214             matchBuilder.setIpMatch(ipMatchBuilder.build());
1215         }
1216
1217         return matchBuilder;
1218     }
1219
1220     /**
1221      * Method converts Openflow 1.3+ specific flow match to MD-SAL format flow
1222      * match
1223      *
1224      * @param swMatch source match
1225      * @param datapathid datapath id
1226      * @param ofVersion openflow version
1227      * @return md-sal match instance
1228      * @author avishnoi@in.ibm.com
1229      */
1230     public static MatchBuilder fromOFMatchToSALMatch(
1231             @Nonnull final org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match swMatch,
1232             @Nonnull final BigInteger datapathid, @Nonnull final OpenflowVersion ofVersion) {
1233         return OfMatchToSALMatchConvertor(swMatch.getMatchEntry(), datapathid, ofVersion);
1234     }
1235
1236     private static MatchBuilder OfMatchToSALMatchConvertor(final List<MatchEntry> swMatchList, final BigInteger datapathid,
1237                                                            final OpenflowVersion ofVersion) {
1238
1239         MatchBuilder matchBuilder = new MatchBuilder();
1240         EthernetMatchBuilder ethMatchBuilder = new EthernetMatchBuilder();
1241         VlanMatchBuilder vlanMatchBuilder = new VlanMatchBuilder();
1242         IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();
1243         TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
1244         UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
1245         SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
1246         Icmpv4MatchBuilder icmpv4MatchBuilder = new Icmpv4MatchBuilder();
1247         Icmpv6MatchBuilder icmpv6MatchBuilder = new Icmpv6MatchBuilder();
1248         Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
1249         Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
1250         ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder();
1251         Ipv6MatchBuilder ipv6MatchBuilder = new Ipv6MatchBuilder();
1252         Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder = new Ipv6MatchArbitraryBitMaskBuilder();
1253         ProtocolMatchFieldsBuilder protocolMatchFieldsBuilder = new ProtocolMatchFieldsBuilder();
1254         TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = new TunnelIpv4MatchBuilder();
1255         TcpFlagsMatchBuilder tcpFlagsMatchBuilder = new TcpFlagsMatchBuilder();
1256
1257         for (MatchEntry ofMatch : swMatchList) {
1258
1259             if (ofMatch.getOxmMatchField().equals(InPort.class)) {
1260                 PortNumber portNumber = ((InPortCase) ofMatch.getMatchEntryValue()).getInPort().getPortNumber();
1261                 if (portNumber != null) {
1262                     matchBuilder.setInPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid, portNumber.getValue(), ofVersion));
1263                 }
1264             } else if (ofMatch.getOxmMatchField().equals(InPhyPort.class)) {
1265                 PortNumber portNumber = ((InPhyPortCase) ofMatch.getMatchEntryValue()).getInPhyPort().getPortNumber();
1266                 matchBuilder.setInPhyPort(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathid,
1267                         portNumber.getValue(), ofVersion));
1268             } else if (ofMatch.getOxmMatchField().equals(Metadata.class)) {
1269                 MetadataBuilder metadataBuilder = new MetadataBuilder();
1270                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.Metadata metadata = ((MetadataCase) ofMatch.getMatchEntryValue()).getMetadata();
1271                 if (metadata != null) {
1272                     metadataBuilder.setMetadata(new BigInteger(OFConstants.SIGNUM_UNSIGNED, metadata.getMetadata()));
1273                     byte[] metadataMask = metadata.getMask();
1274                     if (metadataMask != null) {
1275                         metadataBuilder.setMetadataMask(new BigInteger(OFConstants.SIGNUM_UNSIGNED, metadataMask));
1276                     }
1277                     matchBuilder.setMetadata(metadataBuilder.build());
1278                 }
1279             } else if (ofMatch.getOxmMatchField().equals(EthSrc.class)) {
1280                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.src._case.EthSrc ethSrcCase = ((EthSrcCase) ofMatch.getMatchEntryValue()).getEthSrc();
1281                 if (ethSrcCase != null) {
1282                     EthernetSourceBuilder ethSourceBuilder = new EthernetSourceBuilder();
1283                     ethSourceBuilder.setAddress(ethSrcCase.getMacAddress());
1284                     byte[] mask = ethSrcCase.getMask();
1285                     if (mask != null) {
1286                         ethSourceBuilder.setMask(new MacAddress(macAddressToString(mask)));
1287                     }
1288                     ethMatchBuilder.setEthernetSource(ethSourceBuilder.build());
1289                     matchBuilder.setEthernetMatch(ethMatchBuilder.build());
1290                 }
1291             } else if (ofMatch.getOxmMatchField().equals(EthDst.class)) {
1292                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.dst._case.EthDst ethDstCase = ((EthDstCase) ofMatch.getMatchEntryValue()).getEthDst();
1293                 if (ethDstCase != null) {
1294                     EthernetDestinationBuilder ethDestinationBuilder = new EthernetDestinationBuilder();
1295                     ethDestinationBuilder.setAddress(ethDstCase.getMacAddress());
1296                     byte[] destinationMask = ethDstCase.getMask();
1297                     if (destinationMask != null) {
1298                         ethDestinationBuilder.setMask(new MacAddress(macAddressToString(destinationMask)));
1299                     }
1300                     ethMatchBuilder.setEthernetDestination(ethDestinationBuilder.build());
1301                     matchBuilder.setEthernetMatch(ethMatchBuilder.build());
1302                 }
1303             } else if (ofMatch.getOxmMatchField().equals(EthType.class)) {
1304                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.eth.type._case.EthType ethTypeCase = ((EthTypeCase) ofMatch.getMatchEntryValue()).getEthType();
1305                 if (ethTypeCase != null) {
1306                     EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
1307                     ethTypeBuilder
1308                             .setType(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType(
1309                                     (long) ethTypeCase.getEthType().getValue()));
1310                     ethMatchBuilder.setEthernetType(ethTypeBuilder.build());
1311                     matchBuilder.setEthernetMatch(ethMatchBuilder.build());
1312                 }
1313             } else if (ofMatch.getOxmMatchField().equals(VlanVid.class)) {
1314                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.vid._case.VlanVid vlanVid = ((VlanVidCase) ofMatch.getMatchEntryValue()).getVlanVid();
1315                 if (vlanVid != null) {
1316                     VlanIdBuilder vlanBuilder = new VlanIdBuilder();
1317                     vlanBuilder.setVlanId(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId(
1318                             vlanVid.getVlanVid()))
1319                             .setVlanIdPresent(vlanVid.isCfiBit());
1320                     vlanBuilder.setVlanIdPresent(vlanVid.isCfiBit());
1321                     vlanMatchBuilder.setVlanId(vlanBuilder.build());
1322
1323                     matchBuilder.setVlanMatch(vlanMatchBuilder.build());
1324                 }
1325             } else if (ofMatch.getOxmMatchField().equals(VlanPcp.class)) {
1326                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.pcp._case.VlanPcp vlanPcp = ((VlanPcpCase) ofMatch.getMatchEntryValue()).getVlanPcp();
1327                 if (vlanPcp != null) {
1328                     vlanMatchBuilder
1329                             .setVlanPcp(new org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp(
1330                                     vlanPcp.getVlanPcp()));
1331                     matchBuilder.setVlanMatch(vlanMatchBuilder.build());
1332                 }
1333             } else if (ofMatch.getOxmMatchField().equals(IpDscp.class)) {
1334                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.dscp._case.IpDscp ipDscp = ((IpDscpCase) ofMatch.getMatchEntryValue()).getIpDscp();
1335                 if (ipDscp != null) {
1336                     ipMatchBuilder.setIpDscp(new Dscp(ipDscp.getDscp().getValue()));
1337                     matchBuilder.setIpMatch(ipMatchBuilder.build());
1338                 }
1339             } else if (ofMatch.getOxmMatchField().equals(IpEcn.class)) {
1340                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.ecn._case.IpEcn ipEcn = ((IpEcnCase) ofMatch.getMatchEntryValue()).getIpEcn();
1341                 if (ipEcn != null) {
1342                     ipMatchBuilder.setIpEcn(ipEcn.getEcn());
1343                     matchBuilder.setIpMatch(ipMatchBuilder.build());
1344                 }
1345             } else if (ofMatch.getOxmMatchField().equals(IpProto.class)) {
1346                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.proto._case.IpProto ipProto = ((IpProtoCase) ofMatch.getMatchEntryValue()).getIpProto();
1347                 Short protocolNumber = ipProto.getProtocolNumber();
1348                 if (protocolNumber != null) {
1349                     ipMatchBuilder.setIpProtocol(protocolNumber);
1350                     matchBuilder.setIpMatch(ipMatchBuilder.build());
1351                 }
1352             } else if (ofMatch.getOxmMatchField().equals(TcpSrc.class)) {
1353                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.src._case.TcpSrc tcpSrc = ((TcpSrcCase) ofMatch.getMatchEntryValue()).getTcpSrc();
1354                 if (tcpSrc != null) {
1355                     tcpMatchBuilder.setTcpSourcePort(tcpSrc.getPort());
1356                     matchBuilder.setLayer4Match(tcpMatchBuilder.build());
1357                 }
1358             } else if (ofMatch.getOxmMatchField().equals(TcpDst.class)) {
1359                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tcp.dst._case.TcpDst tcpDst = ((TcpDstCase) ofMatch.getMatchEntryValue()).getTcpDst();
1360                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber portNumber = tcpDst.getPort();
1361                 if (portNumber != null) {
1362                     tcpMatchBuilder.setTcpDestinationPort(portNumber);
1363                     matchBuilder.setLayer4Match(tcpMatchBuilder.build());
1364                 }
1365             } else if (ofMatch.getOxmMatchField().equals(UdpSrc.class)) {
1366                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.src._case.UdpSrc udpSrc = ((UdpSrcCase) ofMatch.getMatchEntryValue()).getUdpSrc();
1367                 if (udpSrc != null) {
1368                     udpMatchBuilder.setUdpSourcePort(udpSrc.getPort());
1369                     matchBuilder.setLayer4Match(udpMatchBuilder.build());
1370                 }
1371             } else if (ofMatch.getOxmMatchField().equals(UdpDst.class)) {
1372                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.udp.dst._case.UdpDst udpDst = ((UdpDstCase) ofMatch.getMatchEntryValue()).getUdpDst();
1373                 if (udpDst != null) {
1374                     udpMatchBuilder.setUdpDestinationPort(udpDst.getPort());
1375                     matchBuilder.setLayer4Match(udpMatchBuilder.build());
1376                 }
1377             } else if (ofMatch.getOxmMatchField().equals(SctpSrc.class)) {
1378                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.src._case.SctpSrc sctpSrc = ((SctpSrcCase) ofMatch.getMatchEntryValue()).getSctpSrc();
1379                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber portNumber = sctpSrc.getPort();
1380                 if (portNumber != null) {
1381                     sctpMatchBuilder.setSctpSourcePort(portNumber);
1382                     matchBuilder.setLayer4Match(sctpMatchBuilder.build());
1383                 }
1384             } else if (ofMatch.getOxmMatchField().equals(SctpDst.class)) {
1385                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.sctp.dst._case.SctpDst sctpDst = ((SctpDstCase) ofMatch.getMatchEntryValue()).getSctpDst();
1386                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber portNumber = sctpDst.getPort();
1387                 if (portNumber != null) {
1388                     sctpMatchBuilder.setSctpDestinationPort(portNumber);
1389                     matchBuilder.setLayer4Match(sctpMatchBuilder.build());
1390                 }
1391             } else if (ofMatch.getOxmMatchField().equals(Icmpv4Type.class)) {
1392                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.type._case.Icmpv4Type icmpv4Type = ((Icmpv4TypeCase) ofMatch.getMatchEntryValue()).getIcmpv4Type();
1393                 Short type = icmpv4Type.getIcmpv4Type();
1394                 if (type != null) {
1395                     icmpv4MatchBuilder.setIcmpv4Type(type);
1396                     matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build());
1397                 }
1398             } else if (ofMatch.getOxmMatchField().equals(Icmpv4Code.class)) {
1399                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv4.code._case.Icmpv4Code icmpv4Code = ((Icmpv4CodeCase) ofMatch.getMatchEntryValue()).getIcmpv4Code();
1400                 Short v4code = icmpv4Code.getIcmpv4Code();
1401                 if (v4code != null) {
1402                     icmpv4MatchBuilder.setIcmpv4Code(v4code);
1403                     matchBuilder.setIcmpv4Match(icmpv4MatchBuilder.build());
1404                 }
1405             } else if (ofMatch.getOxmMatchField().equals(Icmpv6Type.class)) {
1406                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.type._case.Icmpv6Type icmpv6Type = ((Icmpv6TypeCase) ofMatch.getMatchEntryValue()).getIcmpv6Type();
1407                 Short v6type = icmpv6Type.getIcmpv6Type();
1408                 if (v6type != null) {
1409                     icmpv6MatchBuilder.setIcmpv6Type(v6type);
1410                     matchBuilder.setIcmpv6Match(icmpv6MatchBuilder.build());
1411                 }
1412             } else if (ofMatch.getOxmMatchField().equals(Icmpv6Code.class)) {
1413                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.icmpv6.code._case.Icmpv6Code icmpv6Code = ((Icmpv6CodeCase) ofMatch.getMatchEntryValue()).getIcmpv6Code();
1414                 Short v6code = icmpv6Code.getIcmpv6Code();
1415                 if (v6code != null) {
1416                     icmpv6MatchBuilder.setIcmpv6Code(v6code);
1417                     matchBuilder.setIcmpv6Match(icmpv6MatchBuilder.build());
1418                 }
1419             } else if (ofMatch.getOxmMatchField().equals(Ipv4Src.class)) {
1420                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4Src ipv4Address = ((Ipv4SrcCase) ofMatch.getMatchEntryValue()).getIpv4Src();
1421                 if (ipv4Address != null) {
1422                     byte[] mask = ipv4Address.getMask();
1423                     if (mask != null && IpConversionUtil.isArbitraryBitMask(mask)) {
1424                         // case where ipv4dst is of type ipv4MatchBuilder and ipv4src is of type ipv4MatchArbitrary.
1425                         // Needs to convert ipv4dst to ipv4MatchArbitrary.
1426                         if (ipv4MatchBuilder.getIpv4Destination() != null) {
1427                             Ipv4Prefix ipv4PrefixDestinationAddress = ipv4MatchBuilder.getIpv4Destination();
1428                             Ipv4Address ipv4DstAddress = IpConversionUtil.extractIpv4Address(ipv4PrefixDestinationAddress);
1429                             DottedQuad dstDottedQuadMask = IpConversionUtil.extractIpv4AddressMask(ipv4PrefixDestinationAddress);
1430                             setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch,
1431                                     dstDottedQuadMask, ipv4DstAddress.getValue());
1432                         }
1433                         DottedQuad srcDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
1434                         String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue();
1435                         setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch,
1436                                 srcDottedQuadMask, stringIpv4SrcAddress);
1437                         matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
1438                     } else if (ipv4MatchArbitraryBitMaskBuilder.getIpv4DestinationAddressNoMask() != null) {
1439                          /*
1440                         Case where destination is of type ipv4MatchArbitraryBitMask already exists in Layer3Match,
1441                         source which of type ipv4Match needs to be converted to ipv4MatchArbitraryBitMask.
1442                         We convert 36.36.36.0/24 to 36.36.0/255.255.255.0
1443                         expected output example:-
1444                         <ipv4-destination>36.36.36.0/24</ipv4-destination>
1445                         <ipv4-source-address-no-mask>36.36.36.0</ipv4-source-address-no-mask>
1446                         <ipv4-source-arbitrary-bitmask>255.0.255.0</ipv4-source-arbitrary-bitmask>
1447                         after conversion output example:-
1448                         <ipv4-destination-address-no-mask>36.36.36.0</ipv4-destination-address-no-mask>
1449                         <ipv4-destination-arbitrary-bitmask>255.255.255.0</ipv4-destination-arbitrary-bitmask>
1450                         <ipv4-source-address-no-mask>36.36.36.0</ipv4-source-address-no-mask>
1451                         <ipv4-source-arbitrary-bitmask>255.0.255.0</ipv4-source-arbitrary-bitmask>
1452                         */
1453                         DottedQuad srcDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
1454                         String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue();
1455                         setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch,
1456                                 srcDottedQuadMask, stringIpv4SrcAddress);
1457                         matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
1458                     } else {
1459                         String stringIpv4SrcAddress = ipv4Address.getIpv4Address().getValue();
1460                         setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, stringIpv4SrcAddress);
1461                         matchBuilder.setLayer3Match(ipv4MatchBuilder.build());
1462                     }
1463                 }
1464             } else if (ofMatch.getOxmMatchField().equals(Ipv4Dst.class)) {
1465                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4Dst ipv4Address = ((Ipv4DstCase) ofMatch.getMatchEntryValue()).getIpv4Dst();
1466                 if (ipv4Address != null) {
1467                     byte[] mask = ipv4Address.getMask();
1468                     if (mask != null && IpConversionUtil.isArbitraryBitMask(mask)) {
1469                         // case where ipv4src is of type ipv4MatchBuilder and ipv4dst is of type ipv4MatchArbitrary.
1470                         // Needs to convert ipv4src to ipv4MatchArbitrary.
1471                         if (ipv4MatchBuilder.getIpv4Source() != null) {
1472                             Ipv4Prefix ipv4PrefixSourceAddress = ipv4MatchBuilder.getIpv4Source();
1473                             Ipv4Address ipv4SourceAddress = IpConversionUtil.extractIpv4Address(ipv4PrefixSourceAddress);
1474                             DottedQuad srcDottedQuad = IpConversionUtil.extractIpv4AddressMask(ipv4PrefixSourceAddress);
1475                             setSrcIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder,ofMatch,
1476                                     srcDottedQuad, ipv4SourceAddress.getValue());
1477                         }
1478                         DottedQuad dstDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
1479                         String stringIpv4DstAddress = ipv4Address.getIpv4Address().getValue();
1480                         setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch,
1481                                 dstDottedQuadMask, stringIpv4DstAddress);
1482                         matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
1483                     } else if (ipv4MatchArbitraryBitMaskBuilder.getIpv4SourceAddressNoMask() != null) {
1484                         /*
1485                         Case where source is of type ipv4MatchArbitraryBitMask already exists in Layer3Match,
1486                         destination which of type ipv4Match needs to be converted to ipv4MatchArbitraryBitMask.
1487                         We convert 36.36.36.0/24 to 36.36.0/255.255.255.0
1488                         expected output example:-
1489                         <ipv4-source>36.36.36.0/24</ipv4-source>
1490                         <ipv4-destination-address-no-mask>36.36.36.0</ipv4-destination-address-no-mask>
1491                         <ipv4-destination-arbitrary-bitmask>255.0.255.0</ipv4-destination-arbitrary-bitmask>
1492                         after conversion output example:-
1493                         <ipv4-source-address-no-mask>36.36.36.0</ipv4-source-address-no-mask>
1494                         <ipv4-source-arbitrary-bitmask>255.255.255.0</ipv4-source-arbitrary-bitmask>
1495                         <ipv4-destination-address-no-mask>36.36.36.0</ipv4-destination-address-no-mask>
1496                         <ipv4-destination-arbitrary-bitmask>255.0.255.0</ipv4-destination-arbitrary-bitmask>
1497                         */
1498                         DottedQuad dstDottedQuadMask = IpConversionUtil.createArbitraryBitMask(mask);
1499                         String stringIpv4DstAddress = ipv4Address.getIpv4Address().getValue();
1500                         setDstIpv4MatchArbitraryBitMaskBuilderFields(ipv4MatchArbitraryBitMaskBuilder, ofMatch,
1501                                 dstDottedQuadMask, stringIpv4DstAddress);
1502                         matchBuilder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
1503                     }
1504                     else {
1505                         String ipv4PrefixStr = ipv4Address.getIpv4Address().getValue();
1506                         setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, ipv4PrefixStr);
1507                         matchBuilder.setLayer3Match(ipv4MatchBuilder.build());
1508                     }
1509                 }
1510             } else if (ofMatch.getOxmMatchField().equals(TunnelIpv4Dst.class)
1511                     || ofMatch.getOxmMatchField().equals(TunnelIpv4Src.class)) {
1512                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.dst._case.Ipv4Dst tunnelIpv4Dst = ((Ipv4DstCase) ofMatch.getMatchEntryValue()).getIpv4Dst();
1513                 if (tunnelIpv4Dst != null) {
1514                     String ipv4PrefixStr = tunnelIpv4Dst.getIpv4Address().getValue();
1515                     byte[] mask = tunnelIpv4Dst.getMask();
1516                     ipv4PrefixStr += IpConversionUtil.PREFIX_SEPARATOR + ByteBuffer.wrap(tunnelIpv4Dst.getMask()).getInt();
1517                     setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, ipv4PrefixStr);
1518                     matchBuilder.setLayer3Match(tunnelIpv4MatchBuilder.build());
1519                 }
1520             } else if (ofMatch.getOxmMatchField().equals(TunnelIpv4Src.class)) {
1521                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv4.src._case.Ipv4Src tunnelIpv4Dst = ((Ipv4SrcCase) ofMatch.getMatchEntryValue()).getIpv4Src();
1522                 if (tunnelIpv4Dst != null) {
1523                     String ipv4PrefixStr = tunnelIpv4Dst.getIpv4Address().getValue();
1524                     byte[] mask = tunnelIpv4Dst.getMask();
1525                     ipv4PrefixStr += IpConversionUtil.PREFIX_SEPARATOR + ByteBuffer.wrap(tunnelIpv4Dst.getMask()).getInt();
1526                     setIpv4MatchBuilderFields(ipv4MatchBuilder, ofMatch, mask, ipv4PrefixStr);
1527                     matchBuilder.setLayer3Match(tunnelIpv4MatchBuilder.build());
1528                 }
1529             } else if (ofMatch.getOxmMatchField().equals(ArpOp.class)) {
1530                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.op._case.ArpOp arpOp = ((ArpOpCase) ofMatch.getMatchEntryValue()).getArpOp();
1531                 if (arpOp != null) {
1532                     arpMatchBuilder.setArpOp(arpOp.getOpCode());
1533
1534                     matchBuilder.setLayer3Match(arpMatchBuilder.build());
1535                 }
1536             } else if (ofMatch.getOxmMatchField().equals(ArpSpa.class)) {
1537                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.spa._case.ArpSpa arpSpa = ((ArpSpaCase) ofMatch.getMatchEntryValue()).getArpSpa();
1538                 if (arpSpa != null) {
1539                     int mask = 32;
1540                     if (null != arpSpa.getMask()){
1541                         mask = IpConversionUtil.countBits(arpSpa.getMask());
1542                     }
1543                     Ipv4Prefix ipv4Prefix = IpConversionUtil.createPrefix(arpSpa.getIpv4Address(), mask);
1544                     arpMatchBuilder.setArpSourceTransportAddress(ipv4Prefix);
1545                     matchBuilder.setLayer3Match(arpMatchBuilder.build());
1546                 }
1547             } else if (ofMatch.getOxmMatchField().equals(ArpTpa.class)) {
1548                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tpa._case.ArpTpa arpTpa = ((ArpTpaCase) ofMatch.getMatchEntryValue()).getArpTpa();
1549                 if (arpTpa != null) {
1550                     int mask = 32;
1551                     if (null != arpTpa.getMask()){
1552                         mask = IpConversionUtil.countBits(arpTpa.getMask());
1553                     }
1554                     Ipv4Prefix ipv4Prefix = IpConversionUtil.createPrefix(arpTpa.getIpv4Address(), mask);
1555
1556                     arpMatchBuilder.setArpTargetTransportAddress(ipv4Prefix);
1557                     matchBuilder.setLayer3Match(arpMatchBuilder.build());
1558                 }
1559             } else if (ofMatch.getOxmMatchField().equals(ArpSha.class)) {
1560                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.sha._case.ArpSha arpSha = ((ArpShaCase) ofMatch.getMatchEntryValue()).getArpSha();
1561                 MacAddress macAddress = arpSha.getMacAddress();
1562                 if (macAddress != null) {
1563                     if (ofMatch.getOxmMatchField().equals(ArpSha.class)) {
1564                         ArpSourceHardwareAddressBuilder arpSourceHardwareAddressBuilder = new ArpSourceHardwareAddressBuilder();
1565                         arpSourceHardwareAddressBuilder.setAddress(macAddress);
1566                         byte[] mask = arpSha.getMask();
1567                         if (mask != null) {
1568                             arpSourceHardwareAddressBuilder.setMask(new MacAddress(ByteBufUtils
1569                                     .macAddressToString(mask)));
1570                         }
1571                         arpMatchBuilder.setArpSourceHardwareAddress(arpSourceHardwareAddressBuilder.build());
1572                         matchBuilder.setLayer3Match(arpMatchBuilder.build());
1573                     }
1574                 }
1575             } else if (ofMatch.getOxmMatchField().equals(ArpTha.class)) {
1576                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.arp.tha._case.ArpTha arpTha = ((ArpThaCase) ofMatch.getMatchEntryValue()).getArpTha();
1577                 MacAddress macAddress = arpTha.getMacAddress();
1578                 if (macAddress != null) {
1579                     if (ofMatch.getOxmMatchField().equals(ArpTha.class)) {
1580                         ArpTargetHardwareAddressBuilder arpTargetHardwareAddressBuilder = new ArpTargetHardwareAddressBuilder();
1581                         arpTargetHardwareAddressBuilder.setAddress(macAddress);
1582                         byte[] mask = arpTha.getMask();
1583                         if (mask != null) {
1584                             arpTargetHardwareAddressBuilder.setMask(new MacAddress(ByteBufUtils
1585                                     .macAddressToString(mask)));
1586                         }
1587                         arpMatchBuilder.setArpTargetHardwareAddress(arpTargetHardwareAddressBuilder.build());
1588                         matchBuilder.setLayer3Match(arpMatchBuilder.build());
1589                     }
1590                 }
1591             } else if (ofMatch.getOxmMatchField().equals(Ipv6Src.class)) {
1592                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.src._case.Ipv6Src ipv6Address = ((Ipv6SrcCase) ofMatch.getMatchEntryValue()).getIpv6Src();
1593                 if (ipv6Address != null) {
1594                     byte[] mask = ipv6Address.getMask();
1595                     if (mask != null && IpConversionUtil.isIpv6ArbitraryBitMask(mask)) {
1596                         // case where ipv6dst is of type ipv6MatchBuilder and ipv6src is of type ipv6MatchArbitrary.
1597                         // Need to convert ipv6dst to ipv6MatchArbitrary.
1598
1599                         if (ipv6MatchBuilder.getIpv6Destination() != null) {
1600                             Ipv6Prefix ipv6PrefixDestinationAddress = ipv6MatchBuilder.getIpv6Destination();
1601                             Ipv6Address ipv6DstAddress = IpConversionUtil.extractIpv6Address(ipv6PrefixDestinationAddress);
1602                             Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
1603                                     IpConversionUtil.extractIpv6AddressMask(ipv6PrefixDestinationAddress));
1604                             setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch,
1605                                     dstIpv6ArbitraryMask, IpConversionUtil.compressedIpv6Format(ipv6DstAddress.getValue()));
1606                         }
1607                         Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
1608                                 IpConversionUtil.createIpv6ArbitraryBitMask(mask));
1609                         String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue());
1610                         setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch,
1611                                 srcIpv6ArbitraryMask, stringIpv6SrcAddress);
1612                         matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
1613                     } else if (ipv6MatchArbitraryBitMaskBuilder.getIpv6DestinationAddressNoMask() != null) {
1614                          /*
1615                          TODO Change comments
1616                         Case where destination is of type ipv6MatchArbitraryBitMask already exists in Layer3Match,
1617                         source which of type ipv6Match needs to be converted to ipv4MatchArbitraryBitMask.
1618                         We convert 1::/32 to 1::/FFFF:FFFF::
1619                         example:-
1620                         <ipv6-source>1::/32</ipv4-source>
1621                         <ipv6-destination-address-no-mask>1::1</ipv6-destination-address-no-mask>
1622                         <ipv6-destination-arbitrary-bitmask>FFFF::0001</ipv6-destination-arbitrary-bitmask>
1623                         after conversion output example:-
1624                         <ipv6-source-address-no-mask>1::</ipv6-source-address-no-mask>
1625                         <ipv6-source-arbitrary-bitmask>FFFF:FFFF::</ipv6-source-arbitrary-bitmask>
1626                         <ipv6-destination-address-no-mask>1::1</ipv6-destination-address-no-mask>
1627                         <ipv6-destination-arbitrary-bitmask>FFFF::0001</ipv6-destination-arbitrary-bitmask>
1628                         */
1629                         Ipv6ArbitraryMask srcIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
1630                                 IpConversionUtil.createIpv6ArbitraryBitMask(mask));
1631                         String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue());
1632                         setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch,
1633                                 srcIpv6ArbitraryMask, stringIpv6SrcAddress);
1634                         matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
1635                     } else {
1636                         String stringIpv6SrcAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue());
1637                         setIpv6MatchBuilderFields(ipv6MatchBuilder, ofMatch, mask, stringIpv6SrcAddress);
1638                         matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
1639                     }
1640                 }
1641             } else if (ofMatch.getOxmMatchField().equals(Ipv6Dst.class)) {
1642                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.dst._case.Ipv6Dst ipv6Address = ((Ipv6DstCase) ofMatch.getMatchEntryValue()).getIpv6Dst();
1643                 if (ipv6Address != null) {
1644                     byte[] mask = ipv6Address.getMask();
1645                     if (mask != null && IpConversionUtil.isIpv6ArbitraryBitMask(mask)) {
1646                         // case where ipv6src is of type ipv6MatchBuilder and ipv6dst is of type ipv6MatchArbitrary.
1647                         // Need to convert ipv6src to ipv6MatchArbitrary.
1648
1649                         if (ipv6MatchBuilder.getIpv6Source() != null) {
1650                             Ipv6Prefix ipv6PrefixSourceAddress = ipv6MatchBuilder.getIpv6Source();
1651                             Ipv6Address ipv6SrcAddress = IpConversionUtil.extractIpv6Address(ipv6PrefixSourceAddress);
1652                             Ipv6ArbitraryMask srcIpv6Arbitrary = IpConversionUtil.compressedIpv6MaskFormat(
1653                                     IpConversionUtil.extractIpv6AddressMask(ipv6PrefixSourceAddress));
1654                             setSrcIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch,
1655                                     srcIpv6Arbitrary, IpConversionUtil.compressedIpv6Format(ipv6SrcAddress.getValue()));
1656                         }
1657                         Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
1658                                 IpConversionUtil.createIpv6ArbitraryBitMask(mask));
1659                         String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue());
1660                         setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch,
1661                                 dstIpv6ArbitraryMask, stringIpv6DstAddress);
1662                         matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
1663                     } else if (ipv6MatchArbitraryBitMaskBuilder.getIpv6SourceAddressNoMask() != null) {
1664                          /*
1665                          TODO Change comments
1666                         Case where source is of type ipv4MatchArbitraryBitMask already exists in Layer3Match,
1667                         source which of type ipv6Match needs to be converted to ipv6MatchArbitraryBitMask.
1668                         We convert 1::/32 to 1::/FFFF:FFFF::
1669                         example:-
1670                         <ipv6-destination>1::/32</ipv6-destination>
1671                         <ipv6-source-address-no-mask>1::1</ipv6-source-address-no-mask>
1672                         <ipv6-source-arbitrary-bitmask>FFFF::0001</ipv6-source-arbitrary-bitmask>
1673                         after conversion output example:-
1674                         <ipv6-destination-address-no-mask>1::</ipv6-destination-address-no-mask>
1675                         <ipv6-destination-arbitrary-bitmask>FFFF:FFFF::</ipv6-destination-arbitrary-bitmask>
1676                         <ipv6-source-address-no-mask>1::1</ipv6-source-address-no-mask>
1677                         <ipv6-source-arbitrary-bitmask>FFFF::0001</ipv6-source-arbitrary-bitmask>
1678                         */
1679                         Ipv6ArbitraryMask dstIpv6ArbitraryMask = IpConversionUtil.compressedIpv6MaskFormat(
1680                                 IpConversionUtil.createIpv6ArbitraryBitMask(mask));
1681                         String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue());
1682                         setDstIpv6MatchArbitraryBitMaskBuilderFields(ipv6MatchArbitraryBitMaskBuilder, ofMatch,
1683                                 dstIpv6ArbitraryMask, stringIpv6DstAddress);
1684                         matchBuilder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
1685                     } else {
1686                         String stringIpv6DstAddress = IpConversionUtil.compressedIpv6Format(ipv6Address.getIpv6Address().getValue());
1687                         setIpv6MatchBuilderFields(ipv6MatchBuilder, ofMatch, mask, stringIpv6DstAddress);
1688                         matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
1689                     }
1690                 }
1691             } else if (ofMatch.getOxmMatchField().equals(Ipv6Flabel.class)) {
1692                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.flabel._case.Ipv6Flabel ipv6Flabel = ((Ipv6FlabelCase) ofMatch.getMatchEntryValue()).getIpv6Flabel();
1693                 if (ipv6Flabel != null) {
1694                     Ipv6LabelBuilder ipv6LabelBuilder = new Ipv6LabelBuilder();
1695                     ipv6LabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(ipv6Flabel.getIpv6Flabel()));
1696                     byte[] mask = ipv6Flabel.getMask();
1697                     if (mask != null) {
1698                         ipv6LabelBuilder.setFlabelMask(new Ipv6FlowLabel(Long.valueOf(ByteUtil
1699                                 .bytesToUnsignedInt(mask))));
1700                     }
1701                     ipv6MatchBuilder.setIpv6Label(ipv6LabelBuilder.build());
1702                     matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
1703                 }
1704             } else if (ofMatch.getOxmMatchField().equals(Ipv6NdTarget.class)) {
1705                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.target._case.Ipv6NdTarget ipv6NdTarget = ((Ipv6NdTargetCase) ofMatch.getMatchEntryValue()).getIpv6NdTarget();
1706                 if (ipv6NdTarget != null) {
1707                     ipv6MatchBuilder.setIpv6NdTarget(ipv6NdTarget.getIpv6Address());
1708                     matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
1709                 }
1710             } else if (ofMatch.getOxmMatchField().equals(Ipv6NdSll.class)) {
1711                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.sll._case.Ipv6NdSll ipv6NdSll = ((Ipv6NdSllCase) ofMatch.getMatchEntryValue()).getIpv6NdSll();
1712                 if (ipv6NdSll != null) {
1713                     ipv6MatchBuilder.setIpv6NdSll(ipv6NdSll.getMacAddress());
1714                     matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
1715                 }
1716             } else if (ofMatch.getOxmMatchField().equals(Ipv6NdTll.class)) {
1717                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.nd.tll._case.Ipv6NdTll ipv6NdTll = ((Ipv6NdTllCase) ofMatch.getMatchEntryValue()).getIpv6NdTll();
1718                 if (ipv6NdTll != null) {
1719                     ipv6MatchBuilder.setIpv6NdTll(ipv6NdTll.getMacAddress());
1720                     matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
1721                 }
1722             } else if (ofMatch.getOxmMatchField().equals(Ipv6Exthdr.class)) {
1723                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ipv6.exthdr._case.Ipv6Exthdr ipv6Exthdr = ((Ipv6ExthdrCase) ofMatch.getMatchEntryValue()).getIpv6Exthdr();
1724                 if (ipv6Exthdr != null) {
1725                     Ipv6ExtHeaderBuilder ipv6ExtHeaderBuilder = new Ipv6ExtHeaderBuilder();
1726
1727                     Ipv6ExthdrFlags pField = ipv6Exthdr.getPseudoField();
1728                     Integer bitmap = MatchConvertorUtil.ipv6ExthdrFlagsToInt(pField);
1729
1730                     ipv6ExtHeaderBuilder.setIpv6Exthdr(bitmap);
1731                     byte[] mask = ipv6Exthdr.getMask();
1732                     if (mask != null) {
1733                         ipv6ExtHeaderBuilder.setIpv6ExthdrMask(ByteUtil.bytesToUnsignedShort(mask));
1734                     }
1735                     ipv6MatchBuilder.setIpv6ExtHeader(ipv6ExtHeaderBuilder.build());
1736                     matchBuilder.setLayer3Match(ipv6MatchBuilder.build());
1737                 }
1738             } else if (ofMatch.getOxmMatchField().equals(MplsLabel.class)) {
1739                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.label._case.MplsLabel mplsLabel = ((MplsLabelCase) ofMatch.getMatchEntryValue()).getMplsLabel();
1740                 if (mplsLabel != null) {
1741                     protocolMatchFieldsBuilder.setMplsLabel(mplsLabel.getMplsLabel());
1742                     matchBuilder.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
1743                 }
1744             } else if (ofMatch.getOxmMatchField().equals(MplsBos.class)) {
1745                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.bos._case.MplsBos mplsBos = ((MplsBosCase) ofMatch.getMatchEntryValue()).getMplsBos();
1746                 if (mplsBos != null) {
1747                     protocolMatchFieldsBuilder.setMplsBos(mplsBos.isBos() ? (short) 1 : (short) 0);
1748                     matchBuilder.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
1749                 }
1750             } else if (ofMatch.getOxmMatchField().equals(MplsTc.class)) {
1751                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.mpls.tc._case.MplsTc mplsTc = ((MplsTcCase) ofMatch.getMatchEntryValue()).getMplsTc();
1752                 if (mplsTc != null) {
1753                     protocolMatchFieldsBuilder.setMplsTc(mplsTc.getTc());
1754                     matchBuilder.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
1755                 }
1756             } else if (ofMatch.getOxmMatchField().equals(PbbIsid.class)) {
1757                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.pbb.isid._case.PbbIsid pbbIsid = ((PbbIsidCase) ofMatch.getMatchEntryValue()).getPbbIsid();
1758                 if (pbbIsid != null) {
1759                     PbbBuilder pbbBuilder = new PbbBuilder();
1760                     pbbBuilder.setPbbIsid(pbbIsid.getIsid());
1761                     byte[] mask = pbbIsid.getMask();
1762                     if (mask != null) {
1763                         pbbBuilder.setPbbMask(ByteUtil.bytesToUnsignedMedium(mask));
1764                     }
1765                     protocolMatchFieldsBuilder.setPbb(pbbBuilder.build());
1766                     matchBuilder.setProtocolMatchFields(protocolMatchFieldsBuilder.build());
1767                 }
1768             } else if (ofMatch.getOxmMatchField().equals(TunnelId.class)) {
1769                 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.tunnel.id._case.TunnelId tunnelId = ((TunnelIdCase) ofMatch.getMatchEntryValue()).getTunnelId();
1770                 TunnelBuilder tunnelBuilder = new TunnelBuilder();
1771                 if (tunnelId.getTunnelId()!= null) {
1772                     tunnelBuilder.setTunnelId(new BigInteger(OFConstants.SIGNUM_UNSIGNED, tunnelId.getTunnelId()));
1773                     byte[] mask = tunnelId.getMask();
1774                     if (null != mask) {
1775                         tunnelBuilder.setTunnelMask(new BigInteger(OFConstants.SIGNUM_UNSIGNED, mask));
1776                     }
1777                     matchBuilder.setTunnel(tunnelBuilder.build());
1778                 }
1779             } else if (ofMatch.getOxmMatchField().equals(TcpFlags.class)) {
1780                 ExperimenterIdCase experimenterIdCase = ((ExperimenterIdCase) ofMatch.getMatchEntryValue());
1781                 TcpFlagsContainer tcpFlagsContainer = experimenterIdCase.getAugmentation(TcpFlagsContainer.class);
1782
1783                 if (tcpFlagsContainer != null) {
1784                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.
1785                             approved.extensions.rev160802.oxm.container.match.entry.
1786                             value.experimenter.id._case.TcpFlags tcpFlags = tcpFlagsContainer.getTcpFlags();
1787
1788                     tcpFlagsMatchBuilder.setTcpFlags(tcpFlags.getFlags());
1789                     byte[] mask = tcpFlags.getMask();
1790                     if (mask != null) {
1791                         tcpFlagsMatchBuilder.setTcpFlagsMask(ByteUtil.bytesToUnsignedShort(mask));
1792                     }
1793                     matchBuilder.setTcpFlagsMatch(tcpFlagsMatchBuilder.build());
1794                 }
1795             }
1796         }
1797         return matchBuilder;
1798     }
1799
1800     private static void setIpv6MatchBuilderFields(final Ipv6MatchBuilder ipv6MatchBuilder, final MatchEntry ofMatch, final byte[] mask, final String ipv6PrefixStr) {
1801         Ipv6Prefix ipv6Prefix;
1802
1803         if (mask != null) {
1804             ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr), mask);
1805         } else {
1806             ipv6Prefix = IpConversionUtil.createPrefix(new Ipv6Address(ipv6PrefixStr));
1807         }
1808
1809         if (ofMatch.getOxmMatchField().equals(Ipv6Src.class)) {
1810             ipv6MatchBuilder.setIpv6Source(ipv6Prefix);
1811         }
1812         if (ofMatch.getOxmMatchField().equals(Ipv6Dst.class)) {
1813             ipv6MatchBuilder.setIpv6Destination(ipv6Prefix);
1814         }
1815     }
1816
1817     private static void setIpv4MatchBuilderFields(final Ipv4MatchBuilder ipv4MatchBuilder, final MatchEntry ofMatch, final byte[] mask, final String ipv4PrefixStr) {
1818         final Ipv4Prefix ipv4Prefix;
1819         if (mask != null) {
1820             ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr), mask);
1821         } else {
1822             //Openflow Spec : 1.3.2
1823             //An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask.
1824             // So when user specify 32 as a mast, switch omit that mast and we get null as a mask in flow
1825             // statistics response.
1826             ipv4Prefix = IpConversionUtil.createPrefix(new Ipv4Address(ipv4PrefixStr));
1827         }
1828         if (ofMatch.getOxmMatchField().equals(Ipv4Src.class)) {
1829             ipv4MatchBuilder.setIpv4Source(ipv4Prefix);
1830         }
1831         if (ofMatch.getOxmMatchField().equals(Ipv4Dst.class)) {
1832             ipv4MatchBuilder.setIpv4Destination(ipv4Prefix);
1833         }
1834     }
1835
1836     private static void setSrcIpv4MatchArbitraryBitMaskBuilderFields(
1837             final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder,
1838             final MatchEntry ofMatch, final DottedQuad mask, final String ipv4AddressStr) {
1839         Ipv4Address ipv4Address;
1840         if (mask != null) {
1841             ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(mask);
1842         }
1843         ipv4Address = new Ipv4Address(ipv4AddressStr);
1844         ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask(ipv4Address);
1845     }
1846
1847     private static void setDstIpv4MatchArbitraryBitMaskBuilderFields(
1848             final Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder,
1849             final MatchEntry ofMatch, final DottedQuad mask, final String ipv4AddressStr) {
1850         Ipv4Address ipv4Address;
1851         if (mask != null) {
1852             ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(mask);
1853         }
1854         ipv4Address = new Ipv4Address(ipv4AddressStr);
1855         ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask(ipv4Address);
1856     }
1857
1858     private static void setSrcIpv6MatchArbitraryBitMaskBuilderFields(
1859             final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder,
1860             final MatchEntry ofMatch, final Ipv6ArbitraryMask mask, final String ipv6AddressStr) {
1861         Ipv6Address ipv6Address;
1862         if (mask != null) {
1863             ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(mask);
1864         }
1865         ipv6Address = new Ipv6Address(ipv6AddressStr);
1866         ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(ipv6Address);
1867     }
1868
1869     private static void setDstIpv6MatchArbitraryBitMaskBuilderFields(
1870             final Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder,
1871             final MatchEntry ofMatch, final Ipv6ArbitraryMask mask, final String ipv6AddressStr) {
1872         Ipv6Address ipv6Address;
1873         if (mask != null) {
1874             ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(mask);
1875         }
1876         ipv6Address = new Ipv6Address(ipv6AddressStr);
1877         ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(ipv6Address);
1878     }
1879
1880     private static MatchEntry toOfMplsPbb(final Pbb pbb) {
1881         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
1882         boolean hasmask = false;
1883         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
1884         matchEntryBuilder.setOxmMatchField(PbbIsid.class);
1885         PbbIsidCaseBuilder pbbIsidCaseBuilder = new PbbIsidCaseBuilder();
1886         PbbIsidBuilder pbbIsidBuilder = new PbbIsidBuilder();
1887         pbbIsidBuilder.setIsid(pbb.getPbbIsid());
1888         if (pbb.getPbbMask() != null) {
1889             hasmask = true;
1890             pbbIsidBuilder.setMask(ByteUtil.unsignedMediumToBytes(pbb.getPbbMask()));
1891         }
1892         pbbIsidCaseBuilder.setPbbIsid(pbbIsidBuilder.build());
1893         matchEntryBuilder.setMatchEntryValue(pbbIsidCaseBuilder.build());
1894         matchEntryBuilder.setHasMask(hasmask);
1895         return matchEntryBuilder.build();
1896     }
1897
1898     private static MatchEntry toOfMplsTc(final Short mplsTc) {
1899         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
1900         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
1901         matchEntryBuilder.setHasMask(false);
1902         matchEntryBuilder.setOxmMatchField(MplsTc.class);
1903         MplsTcCaseBuilder mplsTcCaseBuilder = new MplsTcCaseBuilder();
1904         MplsTcBuilder mplsTcBuilder = new MplsTcBuilder();
1905         mplsTcBuilder.setTc(mplsTc);
1906         mplsTcCaseBuilder.setMplsTc(mplsTcBuilder.build());
1907         matchEntryBuilder.setMatchEntryValue(mplsTcCaseBuilder.build());
1908         return matchEntryBuilder.build();
1909     }
1910
1911     private static MatchEntry toOfMplsBos(final Short mplsBos) {
1912         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
1913         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
1914         matchEntryBuilder.setHasMask(false);
1915         matchEntryBuilder.setOxmMatchField(MplsBos.class);
1916         MplsBosCaseBuilder mplsBosCaseBuilder = new MplsBosCaseBuilder();
1917         MplsBosBuilder mplsBosBuilder = new MplsBosBuilder();
1918         boolean isBos = false;
1919         if (mplsBos.shortValue() != 0) {
1920             isBos = true;
1921         }
1922         mplsBosBuilder.setBos(isBos);
1923         mplsBosCaseBuilder.setMplsBos(mplsBosBuilder.build());
1924
1925         matchEntryBuilder.setMatchEntryValue(mplsBosCaseBuilder.build());
1926         return matchEntryBuilder.build();
1927     }
1928
1929     private static MatchEntry toOfMplsLabel(final Long mplsLabel) {
1930         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
1931         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
1932         matchEntryBuilder.setHasMask(false);
1933         matchEntryBuilder.setOxmMatchField(MplsLabel.class);
1934
1935         MplsLabelCaseBuilder mplsLabelCaseBuilder = new MplsLabelCaseBuilder();
1936         MplsLabelBuilder mplsLabelBuilder = new MplsLabelBuilder();
1937         mplsLabelBuilder.setMplsLabel(mplsLabel);
1938         mplsLabelCaseBuilder.setMplsLabel(mplsLabelBuilder.build());
1939         matchEntryBuilder.setMatchEntryValue(mplsLabelCaseBuilder.build());
1940         return matchEntryBuilder.build();
1941     }
1942
1943     private static MatchEntry toOfIpv6ExtHeader(final Ipv6ExtHeader ipv6ExtHeader) {
1944         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
1945         boolean hasmask = false;
1946         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
1947         matchEntryBuilder.setOxmMatchField(Ipv6Exthdr.class);
1948         Ipv6ExthdrCaseBuilder ipv6ExthdrCaseBuilder = new Ipv6ExthdrCaseBuilder();
1949         Ipv6ExthdrBuilder ipv6ExthdrBuilder = new Ipv6ExthdrBuilder();
1950
1951         Integer bitmap = ipv6ExtHeader.getIpv6Exthdr();
1952         final Boolean NONEXT = ((bitmap) & (1 << 0)) != 0;
1953         final Boolean ESP = ((bitmap) & (1 << 1)) != 0;
1954         final Boolean AUTH = ((bitmap) & (1 << 2)) != 0;
1955         final Boolean DEST = ((bitmap) & (1 << 3)) != 0;
1956         final Boolean FRAG = ((bitmap) & (1 << 4)) != 0;
1957         final Boolean ROUTER = ((bitmap) & (1 << 5)) != 0;
1958         final Boolean HOP = ((bitmap) & (1 << 6)) != 0;
1959         final Boolean UNREP = ((bitmap) & (1 << 7)) != 0;
1960         final Boolean UNSEQ = ((bitmap) & (1 << 8)) != 0;
1961
1962         ipv6ExthdrBuilder.setPseudoField(new Ipv6ExthdrFlags(AUTH, DEST, ESP, FRAG, HOP, NONEXT, ROUTER, UNREP, UNSEQ));
1963         //TODO ipv6ExthdrBuilder.setMask()
1964         if (ipv6ExtHeader.getIpv6ExthdrMask() != null) {
1965             hasmask = true;
1966             ipv6ExthdrBuilder.setMask(ByteUtil.unsignedShortToBytes(ipv6ExtHeader.getIpv6ExthdrMask()));
1967         }
1968         ipv6ExthdrCaseBuilder.setIpv6Exthdr(ipv6ExthdrBuilder.build());
1969         matchEntryBuilder.setMatchEntryValue(ipv6ExthdrCaseBuilder.build());
1970         matchEntryBuilder.setHasMask(hasmask);
1971         return matchEntryBuilder.build();
1972     }
1973
1974     private static MatchEntry toOfIpv6FlowLabel(final Ipv6Label ipv6Label) {
1975         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
1976         boolean hasmask = false;
1977         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
1978         matchEntryBuilder.setOxmMatchField(Ipv6Flabel.class);
1979         Ipv6FlabelCaseBuilder ipv6FlabelCaseBuilder = new Ipv6FlabelCaseBuilder();
1980         Ipv6FlabelBuilder ipv6FlabelBuilder = new Ipv6FlabelBuilder();
1981         ipv6FlabelBuilder.setIpv6Flabel(ipv6Label.getIpv6Flabel());
1982         if (ipv6Label.getFlabelMask() != null) {
1983             hasmask = true;
1984             ipv6FlabelBuilder.setMask(ByteUtil.unsignedIntToBytes(ipv6Label.getFlabelMask().getValue()));
1985         }
1986         ipv6FlabelCaseBuilder.setIpv6Flabel(ipv6FlabelBuilder.build());
1987         matchEntryBuilder.setMatchEntryValue(ipv6FlabelCaseBuilder.build());
1988         matchEntryBuilder.setHasMask(hasmask);
1989         return matchEntryBuilder.build();
1990     }
1991
1992     private static MatchEntry toOfPort(final Class<? extends MatchField> field, final Long portNumber) {
1993         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
1994         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
1995         matchEntryBuilder.setHasMask(false);
1996         matchEntryBuilder.setOxmMatchField(field);
1997         InPortCaseBuilder caseBuilder = new InPortCaseBuilder();
1998         InPortBuilder portBuilder = new InPortBuilder();
1999         portBuilder.setPortNumber(new PortNumber(portNumber));
2000         caseBuilder.setInPort(portBuilder.build());
2001         matchEntryBuilder.setMatchEntryValue(caseBuilder.build());
2002
2003         return matchEntryBuilder.build();
2004     }
2005
2006     private static MatchEntry toOfPhyPort(final Class<? extends MatchField> field, final Long portNumber) {
2007         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2008         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2009         matchEntryBuilder.setHasMask(false);
2010         matchEntryBuilder.setOxmMatchField(field);
2011         InPhyPortCaseBuilder caseBuilder = new InPhyPortCaseBuilder();
2012         InPhyPortBuilder portBuilder = new InPhyPortBuilder();
2013         portBuilder.setPortNumber(new PortNumber(portNumber));
2014         caseBuilder.setInPhyPort(portBuilder.build());
2015         matchEntryBuilder.setMatchEntryValue(caseBuilder.build());
2016
2017         return matchEntryBuilder.build();
2018     }
2019
2020     private static MatchEntry toOfMetadata(final Class<? extends MatchField> field, final BigInteger metadata,
2021                                            final BigInteger metadataMask) {
2022         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2023         boolean hasmask = false;
2024         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2025         matchEntryBuilder.setOxmMatchField(field);
2026         MetadataCaseBuilder metadataCaseBuilder = new MetadataCaseBuilder();
2027         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder metadataBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.metadata._case.MetadataBuilder();
2028         metadataBuilder.setMetadata(ByteUtil.convertBigIntegerToNBytes(metadata, OFConstants.SIZE_OF_LONG_IN_BYTES));
2029         if (metadataMask != null) {
2030             hasmask = true;
2031             metadataBuilder.setMask(ByteUtil.convertBigIntegerToNBytes(metadataMask, OFConstants.SIZE_OF_LONG_IN_BYTES));
2032         }
2033         metadataCaseBuilder.setMetadata(metadataBuilder.build());
2034         matchEntryBuilder.setMatchEntryValue(metadataCaseBuilder.build());
2035         matchEntryBuilder.setHasMask(hasmask);
2036         return matchEntryBuilder.build();
2037     }
2038
2039     private static MatchEntry toOfEthernetType(final EthernetType ethernetType) {
2040         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2041         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2042         matchEntryBuilder.setHasMask(false);
2043         matchEntryBuilder.setOxmMatchField(EthType.class);
2044         EthTypeCaseBuilder ethTypeCaseBuilder = new EthTypeCaseBuilder();
2045         EthTypeBuilder ethTypeBuilder = new EthTypeBuilder();
2046         EtherType etherType = new EtherType(ethernetType.getType().getValue().intValue());
2047         ethTypeBuilder.setEthType(etherType);
2048         ethTypeCaseBuilder.setEthType(ethTypeBuilder.build());
2049         matchEntryBuilder.setMatchEntryValue(ethTypeCaseBuilder.build());
2050         return matchEntryBuilder.build();
2051     }
2052
2053     private static MatchEntry toOfIcmpv4Type(final Short icmpv4Type) {
2054         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2055         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2056         matchEntryBuilder.setHasMask(false);
2057         matchEntryBuilder.setOxmMatchField(Icmpv4Type.class);
2058         Icmpv4TypeCaseBuilder icmpv4TypeCaseBuilder = new Icmpv4TypeCaseBuilder();
2059         Icmpv4TypeBuilder icmpv4TypeBuilder = new Icmpv4TypeBuilder();
2060         icmpv4TypeBuilder.setIcmpv4Type(icmpv4Type);
2061         icmpv4TypeCaseBuilder.setIcmpv4Type(icmpv4TypeBuilder.build());
2062         matchEntryBuilder.setMatchEntryValue(icmpv4TypeCaseBuilder.build());
2063         return matchEntryBuilder.build();
2064     }
2065
2066     private static MatchEntry toOfIcmpv4Code(final Short icmpv4Code) {
2067         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2068         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2069         matchEntryBuilder.setHasMask(false);
2070         matchEntryBuilder.setOxmMatchField(Icmpv4Code.class);
2071         Icmpv4CodeCaseBuilder icmpv4CodeCaseBuilder = new Icmpv4CodeCaseBuilder();
2072         Icmpv4CodeBuilder icmpv4CodeBuilder = new Icmpv4CodeBuilder();
2073         icmpv4CodeBuilder.setIcmpv4Code(icmpv4Code);
2074         icmpv4CodeCaseBuilder.setIcmpv4Code(icmpv4CodeBuilder.build());
2075         matchEntryBuilder.setMatchEntryValue(icmpv4CodeCaseBuilder.build());
2076         return matchEntryBuilder.build();
2077     }
2078
2079     private static MatchEntry toOfIcmpv6Type(final Short icmpv6Type) {
2080         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2081         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2082         matchEntryBuilder.setHasMask(false);
2083         matchEntryBuilder.setOxmMatchField(Icmpv6Type.class);
2084         Icmpv6TypeCaseBuilder icmpv6TypeCaseBuilder = new Icmpv6TypeCaseBuilder();
2085         Icmpv6TypeBuilder icmpv6TypeBuilder = new Icmpv6TypeBuilder();
2086         icmpv6TypeBuilder.setIcmpv6Type(icmpv6Type);
2087         icmpv6TypeCaseBuilder.setIcmpv6Type(icmpv6TypeBuilder.build());
2088         matchEntryBuilder.setMatchEntryValue(icmpv6TypeCaseBuilder.build());
2089         return matchEntryBuilder.build();
2090     }
2091
2092     private static MatchEntry toOfIcmpv6Code(final Short icmpv6Code) {
2093         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2094         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2095         matchEntryBuilder.setHasMask(false);
2096         matchEntryBuilder.setOxmMatchField(Icmpv6Code.class);
2097         Icmpv6CodeCaseBuilder icmpv6CodeCaseBuilder = new Icmpv6CodeCaseBuilder();
2098         Icmpv6CodeBuilder icmpv6CodeBuilder = new Icmpv6CodeBuilder();
2099         icmpv6CodeBuilder.setIcmpv6Code(icmpv6Code);
2100         icmpv6CodeCaseBuilder.setIcmpv6Code(icmpv6CodeBuilder.build());
2101         matchEntryBuilder.setMatchEntryValue(icmpv6CodeCaseBuilder.build());
2102         return matchEntryBuilder.build();
2103     }
2104
2105     public static MatchEntry toOfIpDscp(final Dscp ipDscp) {
2106         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2107         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2108         matchEntryBuilder.setHasMask(false);
2109         matchEntryBuilder.setOxmMatchField(IpDscp.class);
2110
2111         IpDscpCaseBuilder ipDscpCaseBuilder = new IpDscpCaseBuilder();
2112         IpDscpBuilder ipDscpBuilder = new IpDscpBuilder();
2113         ipDscpBuilder.setDscp(ipDscp);
2114         ipDscpCaseBuilder.setIpDscp(ipDscpBuilder.build());
2115         matchEntryBuilder.setMatchEntryValue(ipDscpCaseBuilder.build());
2116         return matchEntryBuilder.build();
2117     }
2118
2119     public static MatchEntry toOfVlanPcp(
2120             final org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp vlanPcp) {
2121         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2122         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2123         matchEntryBuilder.setHasMask(false);
2124         matchEntryBuilder.setOxmMatchField(VlanPcp.class);
2125         VlanPcpCaseBuilder vlanPcpCaseBuilder = new VlanPcpCaseBuilder();
2126         VlanPcpBuilder vlanPcpBuilder = new VlanPcpBuilder();
2127         vlanPcpBuilder.setVlanPcp(vlanPcp.getValue());
2128         vlanPcpCaseBuilder.setVlanPcp(vlanPcpBuilder.build());
2129         matchEntryBuilder.setMatchEntryValue(vlanPcpCaseBuilder.build());
2130         return matchEntryBuilder.build();
2131     }
2132
2133
2134     private static MatchEntry toOfIpProto(final Short ipProtocol) {
2135         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2136         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2137         matchEntryBuilder.setHasMask(false);
2138         matchEntryBuilder.setOxmMatchField(IpProto.class);
2139         IpProtoCaseBuilder ipProtoCaseBuilder = new IpProtoCaseBuilder();
2140         IpProtoBuilder ipProtoBuilder = new IpProtoBuilder();
2141         ipProtoBuilder.setProtocolNumber(ipProtocol);
2142         ipProtoCaseBuilder.setIpProto(ipProtoBuilder.build());
2143         matchEntryBuilder.setMatchEntryValue(ipProtoCaseBuilder.build());
2144         return matchEntryBuilder.build();
2145     }
2146
2147     private static MatchEntry toOfIpEcn(final Short ipEcn) {
2148         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2149         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2150         matchEntryBuilder.setHasMask(false);
2151         matchEntryBuilder.setOxmMatchField(IpEcn.class);
2152         IpEcnCaseBuilder ipEcnCaseBuilder = new IpEcnCaseBuilder();
2153         IpEcnBuilder ipEcnBuilder = new IpEcnBuilder();
2154         ipEcnBuilder.setEcn(ipEcn);
2155         ipEcnCaseBuilder.setIpEcn(ipEcnBuilder.build());
2156         matchEntryBuilder.setMatchEntryValue(ipEcnCaseBuilder.build());
2157         return matchEntryBuilder.build();
2158     }
2159
2160     private static MatchEntry toOfArpOpCode(final Integer arpOp) {
2161         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2162         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2163         matchEntryBuilder.setHasMask(false);
2164         matchEntryBuilder.setOxmMatchField(ArpOp.class);
2165         ArpOpCaseBuilder arpOpCaseBuilder = new ArpOpCaseBuilder();
2166         ArpOpBuilder arpOpBuilder = new ArpOpBuilder();
2167         arpOpBuilder.setOpCode(arpOp);
2168         arpOpCaseBuilder.setArpOp(arpOpBuilder.build());
2169         matchEntryBuilder.setMatchEntryValue(arpOpCaseBuilder.build());
2170         return matchEntryBuilder.build();
2171     }
2172
2173     private static MatchEntry toOfIpv6NdTargetAddress(final Ipv6Address address) {
2174         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
2175         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
2176         matchEntryBuilder.setHasMask(false);
2177         matchEntryBuilder.setOxmMatchField(Ipv6NdTarget.class);
2178
2179         Ipv6NdTargetCaseBuilder ipv6NdTargetCaseBuilder = new Ipv6NdTargetCaseBuilder();
2180         Ipv6NdTargetBuilder ipv6NdTargetBuilder = new Ipv6NdTargetBuilder();
2181         ipv6NdTargetBuilder.setIpv6Address(address);
2182         ipv6NdTargetCaseBuilder.setIpv6NdTarget(ipv6NdTargetBuilder.build());
2183         matchEntryBuilder.setMatchEntryValue(ipv6NdTargetCaseBuilder.build());
2184         return matchEntryBuilder.build();
2185     }
2186
2187
2188
2189
2190     /**
2191      * Method converts OF SetField action to SAL SetFiled action.
2192      *
2193      * @param action input action
2194      * @param ofVersion current ofp version
2195      * @return set field builder
2196      */
2197     public static SetField fromOFSetFieldToSALSetFieldAction(
2198             final Action action, final OpenflowVersion ofVersion) {
2199         logger.debug("Converting OF SetField action to SAL SetField action");
2200         SetFieldCase setFieldCase = (SetFieldCase) action.getActionChoice();
2201         SetFieldAction setFieldAction = setFieldCase.getSetFieldAction();
2202
2203         SetFieldBuilder setField = new SetFieldBuilder();
2204         MatchBuilder match = OfMatchToSALMatchConvertor(setFieldAction.getMatchEntry(), null, ofVersion);
2205         setField.fieldsFrom(match.build());
2206         return setField.build();
2207     }
2208
2209 }