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