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