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