Bug 5540 - PortConvertor, MatchConvertor
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / match / MatchConvertorUtil.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
10
11 import java.util.Iterator;
12 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpDscp;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanPcp;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntryBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCaseBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCaseBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ip.dscp._case.IpDscpBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.vlan.pcp._case.VlanPcpBuilder;
23
24 /**
25  * match related tools
26  */
27 public abstract class MatchConvertorUtil {
28     // Pre-calculated masks for the 33 possible values. Do not give them out, but clone() them as they may
29     // end up being leaked and vulnerable.
30     private static final byte[][] IPV4_MASKS;
31
32     static {
33         final byte[][] tmp = new byte[33][];
34         for (int i = 0; i <= 32; ++i) {
35             final int mask = 0xffffffff << (32 - i);
36             tmp[i] = new byte[]{(byte) (mask >>> 24), (byte) (mask >>> 16), (byte) (mask >>> 8), (byte) mask};
37         }
38
39         IPV4_MASKS = tmp;
40     }
41
42     /**
43      * Ipv 6 exthdr flags to int integer.
44      *
45      * @param pField ipv6 external header flag
46      * @return integer containing lower 9 bits filled with corresponding flags
47      */
48     public static Integer ipv6ExthdrFlagsToInt(final Ipv6ExthdrFlags pField) {
49         Integer bitmap = 0;
50         bitmap |= pField.isNonext() ? 1 : 0;
51         bitmap |= pField.isEsp() ? (1 << 1) : 0;
52         bitmap |= pField.isAuth() ? (1 << 2) : 0;
53         bitmap |= pField.isDest() ? (1 << 3) : 0;
54         bitmap |= pField.isFrag() ? (1 << 4) : 0;
55         bitmap |= pField.isRouter() ? (1 << 5) : 0;
56         bitmap |= pField.isHop() ? (1 << 6) : 0;
57         bitmap |= pField.isUnrep() ? (1 << 7) : 0;
58         bitmap |= pField.isUnseq() ? (1 << 8) : 0;
59         return bitmap;
60     }
61
62     /**
63      * Extract ipv 4 mask byte [ ].
64      *
65      * @param addressParts the address parts
66      * @return the byte [ ]
67      */
68     public static byte[] extractIpv4Mask(final Iterator<String> addressParts) {
69         final int prefix;
70         if (addressParts.hasNext()) {
71             int potentionalPrefix = Integer.parseInt(addressParts.next());
72             prefix = potentionalPrefix < 32 ? potentionalPrefix : 0;
73         } else {
74             prefix = 0;
75         }
76
77         if (prefix != 0) {
78             // clone() is necessary to protect our constants
79             return IPV4_MASKS[prefix].clone();
80         }
81
82         return null;
83     }
84
85     /**
86      * To of ip dscp match entry.
87      *
88      * @param ipDscp the ip dscp
89      * @return the match entry
90      */
91     public static MatchEntry toOfIpDscp(final Dscp ipDscp) {
92         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
93         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
94         matchEntryBuilder.setHasMask(false);
95         matchEntryBuilder.setOxmMatchField(IpDscp.class);
96
97         IpDscpCaseBuilder ipDscpCaseBuilder = new IpDscpCaseBuilder();
98         IpDscpBuilder ipDscpBuilder = new IpDscpBuilder();
99         ipDscpBuilder.setDscp(ipDscp);
100         ipDscpCaseBuilder.setIpDscp(ipDscpBuilder.build());
101         matchEntryBuilder.setMatchEntryValue(ipDscpCaseBuilder.build());
102         return matchEntryBuilder.build();
103     }
104
105     /**
106      * To of vlan pcp match entry.
107      *
108      * @param vlanPcp the vlan pcp
109      * @return the match entry
110      */
111     public static MatchEntry toOfVlanPcp(
112             final org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp vlanPcp) {
113         MatchEntryBuilder matchEntryBuilder = new MatchEntryBuilder();
114         matchEntryBuilder.setOxmClass(OpenflowBasicClass.class);
115         matchEntryBuilder.setHasMask(false);
116         matchEntryBuilder.setOxmMatchField(VlanPcp.class);
117         VlanPcpCaseBuilder vlanPcpCaseBuilder = new VlanPcpCaseBuilder();
118         VlanPcpBuilder vlanPcpBuilder = new VlanPcpBuilder();
119         vlanPcpBuilder.setVlanPcp(vlanPcp.getValue());
120         vlanPcpCaseBuilder.setVlanPcp(vlanPcpBuilder.build());
121         matchEntryBuilder.setMatchEntryValue(vlanPcpCaseBuilder.build());
122         return matchEntryBuilder.build();
123     }
124 }