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