1 package org.opendaylight.controller.sal.compability;
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.core.NodeConnector;
19 import org.opendaylight.controller.sal.match.Match;
20 import org.opendaylight.controller.sal.match.MatchField;
21 import org.opendaylight.controller.sal.match.MatchType;
22 import org.opendaylight.controller.sal.utils.NetUtils;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
27 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;
61 import com.google.common.net.InetAddresses;
70 import static org.opendaylight.controller.sal.compability.ProtocolConstants.*;
71 import static org.opendaylight.controller.sal.compability.NodeMapping.*;
73 public class FromSalConversionsUtils {
75 private FromSalConversionsUtils() {
79 public static GetNodeConnectorStatisticsInput nodeConnectorStatistics(
80 NodeConnector connector) {
81 GetNodeConnectorStatisticsInputBuilder target = new GetNodeConnectorStatisticsInputBuilder();
83 NodeRef nodeRef = toNodeRef(connector.getNode());
84 target.setNode(nodeRef);
86 NodeConnectorRef nodeConnectorRef = toNodeConnectorRef(connector);
87 target.setNodeConnector(nodeConnectorRef);
89 return target.build();
92 private static Address addressFromAction(InetAddress inetAddress) {
93 String strInetAddresss = InetAddresses.toAddrString(inetAddress);
94 if (inetAddress instanceof Inet4Address) {
95 Ipv4Builder ipv4Builder = new Ipv4Builder();
96 ipv4Builder.setIpv4Address(new Ipv4Prefix(strInetAddresss));
97 return ipv4Builder.build();
98 } else if (inetAddress instanceof Inet6Address) {
99 Ipv6Builder ipv6Builder = new Ipv6Builder();
100 ipv6Builder.setIpv6Address(new Ipv6Prefix(strInetAddresss));
101 return ipv6Builder.build();
106 public static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match toMatch(
108 if (sourceMatch != null) {
109 MatchBuilder targetBuilder = new MatchBuilder();
111 targetBuilder.setEthernetMatch(ethernetMatch(sourceMatch));
112 targetBuilder.setIpMatch(ipMatch(sourceMatch));
113 targetBuilder.setVlanMatch(vlanMatch(sourceMatch));
114 targetBuilder.setLayer3Match(layer3Match(sourceMatch));
115 targetBuilder.setLayer4Match(layer4Match(sourceMatch));
117 return targetBuilder.build();
123 private static Layer4Match layer4Match(final Match sourceMatch) {
124 MatchField nwProto = sourceMatch.getField(MatchType.NW_PROTO);
125 Short nwProtocolSource = null;
126 if (nwProto != null && nwProto.getValue() != null) {
127 nwProtocolSource = (short) ((byte) nwProto.getValue());
128 switch (nwProtocolSource) {
130 return Layer4MatchAsTcp(sourceMatch);
132 return Layer4MatchAsUdp(sourceMatch);
134 return Layer4MatchAsSctp(sourceMatch);
140 private static Layer4Match Layer4MatchAsSctp(final Match sourceMatch) {
141 SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
143 Integer sourcePort = transportPort(sourceMatch, MatchType.TP_SRC);
144 Integer destinationPort = transportPort(sourceMatch,
147 if (sourcePort != null) {
148 sctpMatchBuilder.setSctpSourcePort(new PortNumber(sourcePort));
150 if (destinationPort != null) {
151 sctpMatchBuilder.setSctpDestinationPort(new PortNumber(
155 return sctpMatchBuilder.build();
158 private static Layer4Match Layer4MatchAsUdp(final Match sourceMatch) {
159 UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
161 Integer sourcePort = transportPort(sourceMatch, MatchType.TP_SRC);
162 Integer destinationPort = transportPort(sourceMatch,
165 if (sourcePort != null) {
166 udpMatchBuilder.setUdpSourcePort(new PortNumber(sourcePort));
169 if (destinationPort != null) {
170 udpMatchBuilder.setUdpDestinationPort(new PortNumber(
174 return udpMatchBuilder.build();
177 private static Layer4Match Layer4MatchAsTcp(final Match sourceMatch) {
178 TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
180 Integer sourcePort = transportPort(sourceMatch, MatchType.TP_SRC);
181 Integer destinationPort = transportPort(sourceMatch,
184 if (sourcePort != null) {
185 tcpMatchBuilder.setTcpSourcePort(new PortNumber(sourcePort));
187 if (destinationPort != null) {
188 tcpMatchBuilder.setTcpDestinationPort(new PortNumber(
192 return tcpMatchBuilder.build();
195 private static Integer transportPort(final Match sourceMatch,
196 final MatchType matchType) {
197 MatchField transportPort = sourceMatch.getField(matchType);
198 if (transportPort != null && transportPort.getValue() != null
199 && transportPort.getValue().getClass().equals(Short.class)) {
200 return new Integer(NetUtils.getUnsignedShort((short) transportPort
206 private static VlanMatch vlanMatch(final Match sourceMatch) {
207 VlanMatchBuilder vlanMatchBuild = new VlanMatchBuilder();
209 MatchField vlan = sourceMatch.getField(MatchType.DL_VLAN);
210 if (vlan != null && vlan.getValue() != null) {
211 VlanIdBuilder vlanIDBuilder = new VlanIdBuilder();
212 vlanIDBuilder.setVlanId(new VlanId((int) (NetUtils
213 .getUnsignedShort((short) vlan.getValue()))));
214 vlanMatchBuild.setVlanId(vlanIDBuilder.build());
217 MatchField vlanPriority = sourceMatch.getField(MatchType.DL_VLAN_PR);
218 if (vlanPriority != null && vlanPriority.getValue() != null) {
219 vlanMatchBuild.setVlanPcp(new VlanPcp((short) ((byte) vlanPriority
223 return vlanMatchBuild.build();
226 private static IpMatch ipMatch(final Match sourceMatch) {
227 IpMatchBuilder targetIpMatchBuild = new IpMatchBuilder();
228 MatchField networkTos = sourceMatch.getField(MatchType.NW_TOS);
229 if (networkTos != null && networkTos.getValue() != null) {
230 Dscp dscp = new Dscp(
231 (short) (NetUtils.getUnsignedByte((Byte) networkTos
233 targetIpMatchBuild.setIpDscp(dscp);
236 MatchField protocol = sourceMatch.getField(MatchType.NW_PROTO);
237 if (protocol != null && protocol.getValue() != null) {
238 targetIpMatchBuild.setIpProtocol((short) ((byte) protocol
242 return targetIpMatchBuild.build();
246 private static EthernetMatch ethernetMatch(final Match sourceMatch) {
247 final EthernetMatchBuilder targetEthMatchBuild = new EthernetMatchBuilder();
249 EthernetSourceBuilder ethSourBuild = new EthernetSourceBuilder()
250 .setAddress(ethernetSourceAddress(sourceMatch));
251 targetEthMatchBuild.setEthernetSource(ethSourBuild.build());
253 EthernetDestinationBuilder ethDestBuild = new EthernetDestinationBuilder()
254 .setAddress(ethernetDestAddress(sourceMatch));
255 targetEthMatchBuild.setEthernetDestination(ethDestBuild.build());
257 final MatchField dataLinkType = sourceMatch.getField(MatchType.DL_TYPE);
258 if (dataLinkType != null && dataLinkType.getValue() != null) {
259 EtherType etherType = new EtherType(new Long(
260 NetUtils.getUnsignedShort((Short) dataLinkType.getValue())));
261 EthernetTypeBuilder ethType = new EthernetTypeBuilder()
263 targetEthMatchBuild.setEthernetType(ethType.build());
265 return targetEthMatchBuild.build();
268 private static MacAddress ethernetSourceAddress(final Match sourceMatch) {
269 final MatchField dataLinkSource = sourceMatch.getField(DL_SRC);
270 if (dataLinkSource != null && dataLinkSource.getValue() != null) {
271 return MDFlowMapping.toMacAddress((byte[])dataLinkSource.getValue());
277 private static Layer3Match layer3Match(final Match sourceMatch) {
278 InetAddress inetSourceAddress = null;
279 MatchField netSource = sourceMatch.getField(MatchType.NW_SRC);
280 if (netSource != null && netSource.getValue() != null) {
281 inetSourceAddress = (InetAddress) (netSource.getValue());
284 InetAddress inetDestAddress = null;
285 MatchField netDest = sourceMatch.getField(MatchType.NW_DST);
286 if (netSource != null && netSource.getValue() != null) {
287 inetDestAddress = (InetAddress) (netDest.getValue());
290 if ((inetSourceAddress instanceof Inet4Address)
291 && (inetDestAddress instanceof Inet4Address)) {
292 MatchField dataLinkType = sourceMatch.getField(DL_TYPE);
294 if (dataLinkType != null && dataLinkType.getValue() != null) {
295 dLType = (Short) (dataLinkType.getValue());
297 if (dLType != null && dLType.equals(ETHERNET_ARP)) {
298 return setLayer3MatchAsArp(sourceMatch,
299 (Inet4Address) inetSourceAddress,
300 (Inet4Address) inetDestAddress);
302 return setLayer3MatchAsIpv4((Inet4Address) inetSourceAddress,
303 (Inet4Address) inetDestAddress);
305 } else if ((inetSourceAddress instanceof Inet6Address)
306 && (inetDestAddress instanceof Inet6Address)) {
307 return setLayer3MatchAsIpv6((Inet6Address) inetSourceAddress,
308 (Inet6Address) inetDestAddress);
315 private static Layer3Match setLayer3MatchAsArp(final Match sourceMatch,
316 final Inet4Address inetSourceAddress,
317 final Inet4Address inetDestAddress) {
318 String inetSourceAddressStr = InetAddresses
319 .toAddrString(inetSourceAddress);
320 Ipv4Prefix ipv4SourcePrefix = new Ipv4Prefix(inetSourceAddressStr);
322 String inetDestAddressValue = InetAddresses
323 .toAddrString(inetDestAddress);
324 Ipv4Prefix ipv4DestPrefix = new Ipv4Prefix(inetDestAddressValue);
326 ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder();
328 arpMatchBuilder.setArpSourceTransportAddress(ipv4SourcePrefix);
329 arpMatchBuilder.setArpTargetTransportAddress(ipv4DestPrefix);
331 ArpSourceHardwareAddressBuilder arpSourceHardwareAddressBuilder = new ArpSourceHardwareAddressBuilder();
332 arpSourceHardwareAddressBuilder
333 .setAddress(ethernetSourceAddress(sourceMatch));
335 .setArpSourceHardwareAddress(arpSourceHardwareAddressBuilder
338 ArpTargetHardwareAddressBuilder arpTargetHardwareAddressBuilder = new ArpTargetHardwareAddressBuilder();
339 arpTargetHardwareAddressBuilder
340 .setAddress(ethernetDestAddress(sourceMatch));
342 .setArpTargetHardwareAddress(arpTargetHardwareAddressBuilder
345 return arpMatchBuilder.build();
349 private static MacAddress ethernetDestAddress(final Match sourceMatch) {
350 final MatchField dataLinkDest = sourceMatch.getField(DL_DST);
351 if (dataLinkDest != null && dataLinkDest.getValue() != null) {
352 return MDFlowMapping.toMacAddress((byte[]) dataLinkDest.getValue());
357 private static Layer3Match setLayer3MatchAsIpv4(
358 final Inet4Address inetSourceAddress,
359 final Inet4Address inetDestAddress) {
360 String inetSrcAddressString = InetAddresses
361 .toAddrString(inetSourceAddress);
362 String inetDstAddressString = InetAddresses
363 .toAddrString(inetDestAddress);
365 Ipv4MatchBuilder layer4MatchBuild = new Ipv4MatchBuilder();
366 layer4MatchBuild.setIpv4Source(new Ipv4Prefix(inetSrcAddressString));
368 .setIpv4Destination(new Ipv4Prefix(inetDstAddressString));
369 return layer4MatchBuild.build();
373 private static Layer3Match setLayer3MatchAsIpv6(
374 final Inet6Address inetSourceAddress,
375 final Inet6Address inetDestAddress) {
376 String inetSrcAddressString = InetAddresses
377 .toAddrString(inetSourceAddress);
378 String inetDstAddressString = InetAddresses
379 .toAddrString(inetDestAddress);
380 Ipv6MatchBuilder layer6MatchBuild = new Ipv6MatchBuilder();
382 layer6MatchBuild.setIpv6Source(new Ipv6Prefix(inetSrcAddressString));
384 .setIpv6Destination(new Ipv6Prefix(inetDstAddressString));
385 return layer6MatchBuild.build();