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 org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
12 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatch;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatch;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatch;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowWildcardsV10;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10Builder;
28 import java.math.BigInteger;
29 import java.util.Iterator;
34 public class MatchConvertorV10Impl implements MatchConvertor<MatchV10> {
37 public static final MacAddress zeroMac = new MacAddress("00:00:00:00:00:00");
39 public static final Ipv4Address zeroIPv4 = new Ipv4Address("0.0.0.0");
42 * The value 0xffff (OFP_VLAN_NONE) is used to indicate
43 * that no VLAN ID is set for OF Flow.
45 private static final int OFP_VLAN_NONE = (int) 0xffff;
48 * Method builds openflow 1.0 specific match (MatchV10) from MD-SAL match.
49 * @param match MD-SAL match
50 * @return OF-API match
51 * @author avishnoi@in.ibm.com
54 public MatchV10 convert(final Match match,final BigInteger datapathid) {
55 MatchV10Builder matchBuilder = new MatchV10Builder();
56 boolean _dLDST = true;
57 boolean _dLSRC = true;
58 boolean _dLTYPE = true;
59 boolean _dLVLAN = true;
60 boolean _dLVLANPCP = true;
61 boolean _iNPORT = true;
62 boolean _nWPROTO = true;
63 boolean _nWTOS = true;
64 boolean _tPDST = true;
65 boolean _tPSRC = true;
67 matchBuilder.setInPort(0);
68 matchBuilder.setDlDst(zeroMac);
69 matchBuilder.setDlSrc(zeroMac);
70 matchBuilder.setDlType(0);
71 matchBuilder.setDlVlan(OFP_VLAN_NONE);
72 matchBuilder.setDlVlanPcp((short) 0);
73 matchBuilder.setNwDst(zeroIPv4);
74 matchBuilder.setNwDstMask((short) 0);
75 matchBuilder.setNwSrc(zeroIPv4);
76 matchBuilder.setNwSrcMask((short) 0);
77 matchBuilder.setNwProto((short) 0);
78 matchBuilder.setNwTos((short) 0);
79 matchBuilder.setTpSrc(0);
80 matchBuilder.setTpDst(0);
82 EthernetMatch ethernetMatch = match.getEthernetMatch();
83 if(ethernetMatch!= null){
84 _dLDST = convertEthernetDlDst(matchBuilder, ethernetMatch);
85 _dLSRC = convertEthernetDlSrc(matchBuilder, ethernetMatch);
86 _dLTYPE = convertEthernetDlType(matchBuilder, ethernetMatch);
88 VlanMatch vlanMatch = match.getVlanMatch();
90 _dLVLAN = convertDlVlan(matchBuilder, vlanMatch);
91 _dLVLANPCP = convertDlVlanPcp(matchBuilder, vlanMatch);
93 NodeConnectorId inPort = match.getInPort();
95 _iNPORT = convertInPortMatch(matchBuilder, inPort);
97 Layer3Match l3Match = match.getLayer3Match();
99 if(l3Match instanceof Ipv4Match){
100 Ipv4Match ipv4 = (Ipv4Match)l3Match;
101 _tPSRC = convertL3Ipv4SrcMatch(matchBuilder, ipv4);
102 _tPDST = convertL3Ipv4DstMatch(matchBuilder, ipv4);
105 IpMatch ipMatch = match.getIpMatch();
107 _nWPROTO = convertNwProto(matchBuilder, ipMatch);
108 _nWTOS = convertNwTos(matchBuilder, ipMatch);
110 Layer4Match layer4Match = match.getLayer4Match();
111 if (layer4Match != null) {
112 if (layer4Match instanceof TcpMatch) {
113 TcpMatch tcpMatch = (TcpMatch) layer4Match;
114 _tPSRC = convertL4TpSrcMatch(matchBuilder, tcpMatch);
115 _tPDST = convertL4TpDstMatch(matchBuilder, tcpMatch);
116 } else if (layer4Match instanceof UdpMatch) {
117 UdpMatch udpMatch = (UdpMatch) layer4Match;
118 _tPSRC = convertL4UdpSrcMatch(matchBuilder, udpMatch);
119 _tPDST = convertL4UdpDstMatch(matchBuilder, udpMatch);
123 FlowWildcardsV10 wildCards = new FlowWildcardsV10(
124 _dLDST, _dLSRC, _dLTYPE, _dLVLAN,
125 _dLVLANPCP, _iNPORT, _nWPROTO, _nWTOS, _tPDST, _tPSRC);
126 matchBuilder.setWildcards(wildCards);
128 return matchBuilder.build();
132 * @param matchBuilder
134 * @return is wildCard
136 private static boolean convertL4UdpDstMatch(final MatchV10Builder matchBuilder,
137 final UdpMatch udpMatch) {
138 if (udpMatch.getUdpDestinationPort() != null) {
139 matchBuilder.setTpDst(udpMatch.getUdpDestinationPort().getValue());
146 * @param matchBuilder
148 * @return is wildCard
150 private static boolean convertL4UdpSrcMatch(final MatchV10Builder matchBuilder,
151 final UdpMatch udpMatch) {
152 if (udpMatch.getUdpSourcePort() != null) {
153 matchBuilder.setTpSrc(udpMatch.getUdpSourcePort().getValue());
160 * @param matchBuilder
162 * @return is wildCard
164 private static boolean convertL4TpDstMatch(final MatchV10Builder matchBuilder,
165 final TcpMatch tcpMatch) {
166 if (tcpMatch.getTcpDestinationPort() != null) {
167 matchBuilder.setTpDst(tcpMatch.getTcpDestinationPort().getValue());
174 * @param matchBuilder
176 * @return is wildCard
178 private static boolean convertL4TpSrcMatch(final MatchV10Builder matchBuilder,
179 final TcpMatch tcpMatch) {
180 if (tcpMatch.getTcpSourcePort() != null) {
181 matchBuilder.setTpSrc(tcpMatch.getTcpSourcePort().getValue());
188 * @param matchBuilder
190 * @return is wildCard
192 private static boolean convertNwTos(final MatchV10Builder matchBuilder,
193 final IpMatch ipMatch) {
194 if (ipMatch.getIpDscp() != null) {
195 matchBuilder.setNwTos(ipMatch.getIpDscp().getValue());
202 * @param matchBuilder
204 * @return is wildCard
206 private static boolean convertNwProto(final MatchV10Builder matchBuilder, final IpMatch ipMatch) {
207 if (ipMatch.getIpProtocol() != null) {
208 matchBuilder.setNwProto(ipMatch.getIpProtocol());
215 * @param matchBuilder
217 * @return is wildCard
219 private static boolean convertL3Ipv4DstMatch(final MatchV10Builder matchBuilder,
220 final Ipv4Match ipv4) {
221 if(ipv4.getIpv4Destination()!=null){
222 Iterator<String> addressParts = MatchConvertorImpl.PREFIX_SPLITTER.split(ipv4.getIpv4Destination().getValue()).iterator();
223 Ipv4Address ipv4Address = new Ipv4Address(addressParts.next());
224 Integer prefix = buildPrefix(addressParts);
225 matchBuilder.setNwDst(ipv4Address);
226 matchBuilder.setNwDstMask(prefix.shortValue());
233 * @param matchBuilder
235 * @return is wildCard
237 private static boolean convertL3Ipv4SrcMatch(final MatchV10Builder matchBuilder,
238 final Ipv4Match ipv4) {
239 if(ipv4.getIpv4Source()!=null){
240 Iterator<String> addressParts = MatchConvertorImpl.PREFIX_SPLITTER.split(ipv4.getIpv4Source().getValue()).iterator();
241 Ipv4Address ipv4Address = new Ipv4Address(addressParts.next());
242 int prefix = buildPrefix(addressParts);
244 matchBuilder.setNwSrc(ipv4Address);
245 matchBuilder.setNwSrcMask((short) prefix);
252 * @param addressParts
255 private static int buildPrefix(final Iterator<String> addressParts) {
257 if (addressParts.hasNext()) {
258 prefix = Integer.parseInt(addressParts.next());
264 * @param matchBuilder
268 private static boolean convertDlVlanPcp(final MatchV10Builder matchBuilder,
269 final VlanMatch vlanMatch) {
270 if (vlanMatch.getVlanPcp() != null) {
271 matchBuilder.setDlVlanPcp(vlanMatch.getVlanPcp().getValue());
278 * @param matchBuilder
282 private static boolean convertDlVlan(final MatchV10Builder matchBuilder, final VlanMatch vlanMatch) {
283 if (vlanMatch.getVlanId() != null) {
284 int vlanId = vlanMatch.getVlanId().getVlanId().getValue();
285 matchBuilder.setDlVlan((vlanId == 0 ? OFP_VLAN_NONE : vlanId));
292 * @param matchBuilder
293 * @param ethernetMatch
294 * @return is wildCard
296 private static boolean convertEthernetDlType(final MatchV10Builder matchBuilder,
297 final EthernetMatch ethernetMatch) {
298 if (ethernetMatch.getEthernetType() != null) {
299 matchBuilder.setDlType(ethernetMatch.getEthernetType().getType().getValue().intValue());
306 * @param matchBuilder
307 * @param ethernetMatch
308 * @return is wildCard
310 private static boolean convertEthernetDlSrc(final MatchV10Builder matchBuilder,
311 final EthernetMatch ethernetMatch) {
312 if (ethernetMatch.getEthernetSource() != null) {
313 matchBuilder.setDlSrc(ethernetMatch.getEthernetSource().getAddress());
320 * @param matchBuilder
321 * @param ethernetMatch
322 * @return is wildCard
324 private static boolean convertEthernetDlDst(final MatchV10Builder matchBuilder,
325 final EthernetMatch ethernetMatch) {
326 if (ethernetMatch.getEthernetDestination() != null) {
327 matchBuilder.setDlDst(ethernetMatch.getEthernetDestination().getAddress());
334 * @param matchBuilder
337 private static boolean convertInPortMatch(final MatchV10Builder matchBuilder, final NodeConnectorId inPort) {
338 if (inPort != null) {
339 matchBuilder.setInPort(InventoryDataServiceUtil.portNumberfromNodeConnectorId(inPort).intValue());