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