1 package org.opendaylight.controller.sal.compatibility;
3 import static org.opendaylight.controller.sal.match.MatchType.DL_DST;
4 import static org.opendaylight.controller.sal.match.MatchType.DL_SRC;
5 import static org.opendaylight.controller.sal.match.MatchType.DL_TYPE;
7 import java.math.BigInteger;
8 import java.net.Inet4Address;
9 import java.net.Inet6Address;
10 import java.net.InetAddress;
11 import java.util.ArrayList;
12 import java.util.Arrays;
13 import java.util.List;
15 import org.opendaylight.controller.sal.compatibility.MDFlowMapping;
16 import org.opendaylight.controller.sal.core.NodeConnector;
20 import org.opendaylight.controller.sal.match.Match;
21 import org.opendaylight.controller.sal.match.MatchField;
22 import org.opendaylight.controller.sal.match.MatchType;
23 import org.opendaylight.controller.sal.utils.NetUtils;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsInputBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4Builder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv6Builder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
60 import com.google.common.net.InetAddresses;
61 import static org.opendaylight.controller.sal.compatibility.NodeMapping.*;
62 import static org.opendaylight.controller.sal.compatibility.ProtocolConstants.*;
64 public class FromSalConversionsUtils {
66 private FromSalConversionsUtils() {
70 public static GetNodeConnectorStatisticsInput nodeConnectorStatistics(
71 NodeConnector connector) {
72 GetNodeConnectorStatisticsInputBuilder target = new GetNodeConnectorStatisticsInputBuilder();
74 NodeRef nodeRef = toNodeRef(connector.getNode());
75 target.setNode(nodeRef);
77 NodeConnectorRef nodeConnectorRef = toNodeConnectorRef(connector);
78 target.setNodeConnector(nodeConnectorRef);
80 return target.build();
83 private static Address addressFromAction(InetAddress inetAddress) {
84 String strInetAddresss = InetAddresses.toAddrString(inetAddress);
85 if (inetAddress instanceof Inet4Address) {
86 Ipv4Builder ipv4Builder = new Ipv4Builder();
87 ipv4Builder.setIpv4Address(new Ipv4Prefix(strInetAddresss));
88 return ipv4Builder.build();
89 } else if (inetAddress instanceof Inet6Address) {
90 Ipv6Builder ipv6Builder = new Ipv6Builder();
91 ipv6Builder.setIpv6Address(new Ipv6Prefix(strInetAddresss));
92 return ipv6Builder.build();
97 public static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match toMatch(
99 if (sourceMatch != null) {
100 MatchBuilder targetBuilder = new MatchBuilder();
102 targetBuilder.setEthernetMatch(ethernetMatch(sourceMatch));
103 targetBuilder.setIpMatch(ipMatch(sourceMatch));
104 targetBuilder.setVlanMatch(vlanMatch(sourceMatch));
105 targetBuilder.setLayer3Match(layer3Match(sourceMatch));
106 targetBuilder.setLayer4Match(layer4Match(sourceMatch));
108 return targetBuilder.build();
114 private static Layer4Match layer4Match(final Match sourceMatch) {
115 MatchField nwProto = sourceMatch.getField(MatchType.NW_PROTO);
116 Short nwProtocolSource = null;
117 if (nwProto != null && nwProto.getValue() != null) {
118 nwProtocolSource = (short) ((byte) nwProto.getValue());
119 switch (nwProtocolSource) {
121 return Layer4MatchAsTcp(sourceMatch);
123 return Layer4MatchAsUdp(sourceMatch);
125 return Layer4MatchAsSctp(sourceMatch);
131 private static Layer4Match Layer4MatchAsSctp(final Match sourceMatch) {
132 SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
134 Integer sourcePort = transportPort(sourceMatch, MatchType.TP_SRC);
135 Integer destinationPort = transportPort(sourceMatch,
138 if (sourcePort != null) {
139 sctpMatchBuilder.setSctpSourcePort(new PortNumber(sourcePort));
141 if (destinationPort != null) {
142 sctpMatchBuilder.setSctpDestinationPort(new PortNumber(
146 return sctpMatchBuilder.build();
149 private static Layer4Match Layer4MatchAsUdp(final Match sourceMatch) {
150 UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
152 Integer sourcePort = transportPort(sourceMatch, MatchType.TP_SRC);
153 Integer destinationPort = transportPort(sourceMatch,
156 if (sourcePort != null) {
157 udpMatchBuilder.setUdpSourcePort(new PortNumber(sourcePort));
160 if (destinationPort != null) {
161 udpMatchBuilder.setUdpDestinationPort(new PortNumber(
165 return udpMatchBuilder.build();
168 private static Layer4Match Layer4MatchAsTcp(final Match sourceMatch) {
169 TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
171 Integer sourcePort = transportPort(sourceMatch, MatchType.TP_SRC);
172 Integer destinationPort = transportPort(sourceMatch,
175 if (sourcePort != null) {
176 tcpMatchBuilder.setTcpSourcePort(new PortNumber(sourcePort));
178 if (destinationPort != null) {
179 tcpMatchBuilder.setTcpDestinationPort(new PortNumber(
183 return tcpMatchBuilder.build();
186 private static Integer transportPort(final Match sourceMatch,
187 final MatchType matchType) {
188 MatchField transportPort = sourceMatch.getField(matchType);
189 if (transportPort != null && transportPort.getValue() != null
190 && transportPort.getValue().getClass().equals(Short.class)) {
191 return new Integer(NetUtils.getUnsignedShort((short) transportPort
197 private static VlanMatch vlanMatch(final Match sourceMatch) {
198 VlanMatchBuilder vlanMatchBuild = new VlanMatchBuilder();
200 MatchField vlan = sourceMatch.getField(MatchType.DL_VLAN);
201 if (vlan != null && vlan.getValue() != null) {
202 VlanIdBuilder vlanIDBuilder = new VlanIdBuilder();
203 vlanIDBuilder.setVlanId(new VlanId((int) (NetUtils
204 .getUnsignedShort((short) vlan.getValue()))));
205 vlanMatchBuild.setVlanId(vlanIDBuilder.build());
208 MatchField vlanPriority = sourceMatch.getField(MatchType.DL_VLAN_PR);
209 if (vlanPriority != null && vlanPriority.getValue() != null) {
210 vlanMatchBuild.setVlanPcp(new VlanPcp((short) ((byte) vlanPriority
214 return vlanMatchBuild.build();
217 private static IpMatch ipMatch(final Match sourceMatch) {
218 IpMatchBuilder targetIpMatchBuild = new IpMatchBuilder();
219 MatchField networkTos = sourceMatch.getField(MatchType.NW_TOS);
220 if (networkTos != null && networkTos.getValue() != null) {
221 Dscp dscp = new Dscp(
222 (short) (NetUtils.getUnsignedByte((Byte) networkTos
224 targetIpMatchBuild.setIpDscp(dscp);
227 MatchField protocol = sourceMatch.getField(MatchType.NW_PROTO);
228 if (protocol != null && protocol.getValue() != null) {
229 targetIpMatchBuild.setIpProtocol((short) ((byte) protocol
233 return targetIpMatchBuild.build();
237 private static EthernetMatch ethernetMatch(final Match sourceMatch) {
238 final EthernetMatchBuilder targetEthMatchBuild = new EthernetMatchBuilder();
240 EthernetSourceBuilder ethSourBuild = new EthernetSourceBuilder()
241 .setAddress(ethernetSourceAddress(sourceMatch));
242 targetEthMatchBuild.setEthernetSource(ethSourBuild.build());
244 EthernetDestinationBuilder ethDestBuild = new EthernetDestinationBuilder()
245 .setAddress(ethernetDestAddress(sourceMatch));
246 targetEthMatchBuild.setEthernetDestination(ethDestBuild.build());
248 final MatchField dataLinkType = sourceMatch.getField(MatchType.DL_TYPE);
249 if (dataLinkType != null && dataLinkType.getValue() != null) {
250 EtherType etherType = new EtherType(new Long(
251 NetUtils.getUnsignedShort((Short) dataLinkType.getValue())));
252 EthernetTypeBuilder ethType = new EthernetTypeBuilder()
254 targetEthMatchBuild.setEthernetType(ethType.build());
256 return targetEthMatchBuild.build();
259 private static MacAddress ethernetSourceAddress(final Match sourceMatch) {
260 final MatchField dataLinkSource = sourceMatch.getField(DL_SRC);
261 if (dataLinkSource != null && dataLinkSource.getValue() != null) {
262 return MDFlowMapping.toMacAddress((byte[])dataLinkSource.getValue());
268 private static Layer3Match layer3Match(final Match sourceMatch) {
269 InetAddress inetSourceAddress = null;
270 MatchField netSource = sourceMatch.getField(MatchType.NW_SRC);
271 if (netSource != null && netSource.getValue() != null) {
272 inetSourceAddress = (InetAddress) (netSource.getValue());
275 InetAddress inetDestAddress = null;
276 MatchField netDest = sourceMatch.getField(MatchType.NW_DST);
277 if (netSource != null && netSource.getValue() != null) {
278 inetDestAddress = (InetAddress) (netDest.getValue());
281 if ((inetSourceAddress instanceof Inet4Address)
282 && (inetDestAddress instanceof Inet4Address)) {
283 MatchField dataLinkType = sourceMatch.getField(DL_TYPE);
285 if (dataLinkType != null && dataLinkType.getValue() != null) {
286 dLType = (Short) (dataLinkType.getValue());
288 if (dLType != null && dLType.equals(ETHERNET_ARP)) {
289 return setLayer3MatchAsArp(sourceMatch,
290 (Inet4Address) inetSourceAddress,
291 (Inet4Address) inetDestAddress);
293 return setLayer3MatchAsIpv4((Inet4Address) inetSourceAddress,
294 (Inet4Address) inetDestAddress);
296 } else if ((inetSourceAddress instanceof Inet6Address)
297 && (inetDestAddress instanceof Inet6Address)) {
298 return setLayer3MatchAsIpv6((Inet6Address) inetSourceAddress,
299 (Inet6Address) inetDestAddress);
306 private static Layer3Match setLayer3MatchAsArp(final Match sourceMatch,
307 final Inet4Address inetSourceAddress,
308 final Inet4Address inetDestAddress) {
309 String inetSourceAddressStr = InetAddresses
310 .toAddrString(inetSourceAddress);
311 Ipv4Prefix ipv4SourcePrefix = new Ipv4Prefix(inetSourceAddressStr);
313 String inetDestAddressValue = InetAddresses
314 .toAddrString(inetDestAddress);
315 Ipv4Prefix ipv4DestPrefix = new Ipv4Prefix(inetDestAddressValue);
317 ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder();
319 arpMatchBuilder.setArpSourceTransportAddress(ipv4SourcePrefix);
320 arpMatchBuilder.setArpTargetTransportAddress(ipv4DestPrefix);
322 ArpSourceHardwareAddressBuilder arpSourceHardwareAddressBuilder = new ArpSourceHardwareAddressBuilder();
323 arpSourceHardwareAddressBuilder
324 .setAddress(ethernetSourceAddress(sourceMatch));
326 .setArpSourceHardwareAddress(arpSourceHardwareAddressBuilder
329 ArpTargetHardwareAddressBuilder arpTargetHardwareAddressBuilder = new ArpTargetHardwareAddressBuilder();
330 arpTargetHardwareAddressBuilder
331 .setAddress(ethernetDestAddress(sourceMatch));
333 .setArpTargetHardwareAddress(arpTargetHardwareAddressBuilder
336 return arpMatchBuilder.build();
340 private static MacAddress ethernetDestAddress(final Match sourceMatch) {
341 final MatchField dataLinkDest = sourceMatch.getField(DL_DST);
342 if (dataLinkDest != null && dataLinkDest.getValue() != null) {
343 return MDFlowMapping.toMacAddress((byte[]) dataLinkDest.getValue());
348 private static Layer3Match setLayer3MatchAsIpv4(
349 final Inet4Address inetSourceAddress,
350 final Inet4Address inetDestAddress) {
351 String inetSrcAddressString = InetAddresses
352 .toAddrString(inetSourceAddress);
353 String inetDstAddressString = InetAddresses
354 .toAddrString(inetDestAddress);
356 Ipv4MatchBuilder layer4MatchBuild = new Ipv4MatchBuilder();
357 layer4MatchBuild.setIpv4Source(new Ipv4Prefix(inetSrcAddressString));
359 .setIpv4Destination(new Ipv4Prefix(inetDstAddressString));
360 return layer4MatchBuild.build();
364 private static Layer3Match setLayer3MatchAsIpv6(
365 final Inet6Address inetSourceAddress,
366 final Inet6Address inetDestAddress) {
367 String inetSrcAddressString = InetAddresses
368 .toAddrString(inetSourceAddress);
369 String inetDstAddressString = InetAddresses
370 .toAddrString(inetDestAddress);
371 Ipv6MatchBuilder layer6MatchBuild = new Ipv6MatchBuilder();
373 layer6MatchBuild.setIpv6Source(new Ipv6Prefix(inetSrcAddressString));
375 .setIpv6Destination(new Ipv6Prefix(inetDstAddressString));
376 return layer6MatchBuild.build();