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