2 * Copyright (c) 2013 Cisco Systems, Inc. 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 java.math.BigInteger;
13 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowWildcardsV10;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10Builder;
33 public class MatchConvertorV10Impl implements MatchConvertor<MatchV10> {
36 public static final MacAddress zeroMac = new MacAddress("00:00:00:00:00:00");
38 public static final Ipv4Address zeroIPv4 = new Ipv4Address("0.0.0.0");
41 * Method builds openflow 1.0 specific match (MatchV10) from MD-SAL match.
42 * @param match MD-SAL match
43 * @return OF-API match
44 * @author avishnoi@in.ibm.com
47 public MatchV10 convert(Match match,BigInteger datapathid) {
48 MatchV10Builder matchBuilder = new MatchV10Builder();
49 boolean _dLDST = true;
50 boolean _dLSRC = true;
51 boolean _dLTYPE = true;
52 boolean _dLVLAN = true;
53 boolean _dLVLANPCP = true;
54 boolean _iNPORT = true;
55 boolean _nWPROTO = true;
56 boolean _nWTOS = true;
57 boolean _tPDST = true;
58 boolean _tPSRC = true;
60 matchBuilder.setInPort(0);
61 matchBuilder.setDlDst(zeroMac);
62 matchBuilder.setDlSrc(zeroMac);
63 matchBuilder.setDlType(0);
64 matchBuilder.setDlVlan(0);
65 matchBuilder.setDlVlanPcp((short) 0);
66 matchBuilder.setNwDst(zeroIPv4);
67 matchBuilder.setNwDstMask((short) 0);
68 matchBuilder.setNwSrc(zeroIPv4);
69 matchBuilder.setNwSrcMask((short) 0);
70 matchBuilder.setNwProto((short) 0);
71 matchBuilder.setNwTos((short) 0);
72 matchBuilder.setTpSrc(0);
73 matchBuilder.setTpDst(0);
75 EthernetMatch ethernetMatch = match.getEthernetMatch();
76 if(ethernetMatch!= null){
77 _dLDST = convertEthernetDlDst(matchBuilder, ethernetMatch);
78 _dLSRC = convertEthernetDlSrc(matchBuilder, ethernetMatch);
79 _dLTYPE = convertEthernetDlType(matchBuilder, ethernetMatch);
81 VlanMatch vlanMatch = match.getVlanMatch();
83 _dLVLAN = convertDlVlan(matchBuilder, vlanMatch);
84 _dLVLANPCP = convertDlVlanPcp(matchBuilder, vlanMatch);
86 NodeConnectorId inPort = match.getInPort();
88 _iNPORT = convertInPortMatch(matchBuilder, inPort);
90 Layer3Match l3Match = match.getLayer3Match();
92 if(l3Match instanceof Ipv4Match){
93 Ipv4Match ipv4 = (Ipv4Match)l3Match;
94 _tPSRC = convertL3Ipv4SrcMatch(matchBuilder, ipv4);
95 _tPDST = convertL3Ipv4DstMatch(matchBuilder, ipv4);
98 IpMatch ipMatch = match.getIpMatch();
100 _nWPROTO = convertNwProto(matchBuilder, ipMatch);
101 _nWTOS = convertNwTos(matchBuilder, ipMatch);
103 Layer4Match layer4Match = match.getLayer4Match();
104 if (layer4Match != null) {
105 if (layer4Match instanceof TcpMatch) {
106 TcpMatch tcpMatch = (TcpMatch) layer4Match;
107 _tPSRC = convertL4TpSrcMatch(matchBuilder, tcpMatch);
108 _tPDST = convertL4TpDstMatch(matchBuilder, tcpMatch);
109 } else if (layer4Match instanceof UdpMatch) {
110 UdpMatch udpMatch = (UdpMatch) layer4Match;
111 _tPSRC = convertL4UdpSrcMatch(matchBuilder, udpMatch);
112 _tPDST = convertL4UdpDstMatch(matchBuilder, udpMatch);
116 FlowWildcardsV10 wildCards = new FlowWildcardsV10(
117 _dLDST, _dLSRC, _dLTYPE, _dLVLAN,
118 _dLVLANPCP, _iNPORT, _nWPROTO, _nWTOS, _tPDST, _tPSRC);
119 matchBuilder.setWildcards(wildCards);
121 return matchBuilder.build();
125 * @param matchBuilder
127 * @return is wildCard
129 private static boolean convertL4UdpDstMatch(MatchV10Builder matchBuilder,
131 if (udpMatch.getUdpDestinationPort() != null) {
132 matchBuilder.setTpDst(udpMatch.getUdpDestinationPort().getValue());
139 * @param matchBuilder
141 * @return is wildCard
143 private static boolean convertL4UdpSrcMatch(MatchV10Builder matchBuilder,
145 if (udpMatch.getUdpSourcePort() != null) {
146 matchBuilder.setTpSrc(udpMatch.getUdpSourcePort().getValue());
153 * @param matchBuilder
155 * @return is wildCard
157 private static boolean convertL4TpDstMatch(MatchV10Builder matchBuilder,
159 if (tcpMatch.getTcpDestinationPort() != null) {
160 matchBuilder.setTpDst(tcpMatch.getTcpDestinationPort().getValue());
167 * @param matchBuilder
169 * @return is wildCard
171 private static boolean convertL4TpSrcMatch(MatchV10Builder matchBuilder,
173 if (tcpMatch.getTcpSourcePort() != null) {
174 matchBuilder.setTpSrc(tcpMatch.getTcpSourcePort().getValue());
181 * @param matchBuilder
183 * @return is wildCard
185 private static boolean convertNwTos(MatchV10Builder matchBuilder,
187 if (ipMatch.getIpDscp() != null) {
188 matchBuilder.setNwTos(ipMatch.getIpDscp().getValue());
195 * @param matchBuilder
197 * @return is wildCard
199 private static boolean convertNwProto(MatchV10Builder matchBuilder, IpMatch ipMatch) {
200 if (ipMatch.getIpProtocol() != null) {
201 matchBuilder.setNwProto(ipMatch.getIpProtocol());
208 * @param matchBuilder
210 * @return is wildCard
212 private static boolean convertL3Ipv4DstMatch(MatchV10Builder matchBuilder,
214 if(ipv4.getIpv4Destination()!=null){
215 String[] addressParts = ipv4.getIpv4Destination().getValue().split("/");
216 Integer prefix = buildPrefix(addressParts);
218 Ipv4Address ipv4Address = new Ipv4Address(addressParts[0]);
219 matchBuilder.setNwDst(ipv4Address);
220 matchBuilder.setNwDstMask(prefix.shortValue());
227 * @param matchBuilder
229 * @return is wildCard
231 private static boolean convertL3Ipv4SrcMatch(MatchV10Builder matchBuilder,
233 if(ipv4.getIpv4Source()!=null){
234 String[] addressParts = ipv4.getIpv4Source().getValue().split(MatchConvertorImpl.PREFIX_SEPARATOR);
235 Ipv4Address ipv4Address = new Ipv4Address(addressParts[0]);
236 int prefix = buildPrefix(addressParts);
238 matchBuilder.setNwSrc(ipv4Address);
239 matchBuilder.setNwSrcMask((short) prefix);
246 * @param addressParts
249 private static int buildPrefix(String[] addressParts) {
251 if (addressParts.length > 1) {
252 prefix = Integer.parseInt(addressParts[1]);
258 * @param matchBuilder
262 private static boolean convertDlVlanPcp(MatchV10Builder matchBuilder,
263 VlanMatch vlanMatch) {
264 if (vlanMatch.getVlanPcp() != null) {
265 matchBuilder.setDlVlanPcp(vlanMatch.getVlanPcp().getValue());
272 * @param matchBuilder
276 private static boolean convertDlVlan(MatchV10Builder matchBuilder, VlanMatch vlanMatch) {
277 if (vlanMatch.getVlanId() != null) {
278 matchBuilder.setDlVlan(vlanMatch.getVlanId().getVlanId().getValue());
285 * @param matchBuilder
286 * @param ethernetMatch
287 * @return is wildCard
289 private static boolean convertEthernetDlType(MatchV10Builder matchBuilder,
290 EthernetMatch ethernetMatch) {
291 if (ethernetMatch.getEthernetType() != null) {
292 matchBuilder.setDlType(ethernetMatch.getEthernetType().getType().getValue().intValue());
299 * @param matchBuilder
300 * @param ethernetMatch
301 * @return is wildCard
303 private static boolean convertEthernetDlSrc(MatchV10Builder matchBuilder,
304 EthernetMatch ethernetMatch) {
305 if (ethernetMatch.getEthernetSource() != null) {
306 matchBuilder.setDlSrc(ethernetMatch.getEthernetSource().getAddress());
313 * @param matchBuilder
314 * @param ethernetMatch
315 * @return is wildCard
317 private static boolean convertEthernetDlDst(MatchV10Builder matchBuilder,
318 EthernetMatch ethernetMatch) {
319 if (ethernetMatch.getEthernetDestination() != null) {
320 matchBuilder.setDlDst(ethernetMatch.getEthernetDestination().getAddress());
327 * @param matchBuilder
330 private static boolean convertInPortMatch(MatchV10Builder matchBuilder, NodeConnectorId inPort) {
331 if (inPort != null) {
332 matchBuilder.setInPort(InventoryDataServiceUtil.portNumberfromNodeConnectorId(inPort).intValue());