6302a5365a8d17a6b617477ee3433a35913e9df9
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / match / MatchConvertorUtil.java
1 /**
2  * Copyright (c) 2013 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 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
9
10 import java.nio.ByteBuffer;
11 import java.util.Arrays;
12
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntry;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;
15
16 /**
17  * match related tools
18  */
19 public abstract class MatchConvertorUtil {
20
21     /**
22      * @param pField
23      * @return integer containing lower 9 bits filled with corresponding flags
24      */
25     public static Integer ipv6ExthdrFlagsToInt(Ipv6ExthdrFlags pField) {
26         Integer bitmap = 0;
27         bitmap |= pField.isNonext() ? (1 << 0) : 0;
28         bitmap |= pField.isEsp() ?    (1 << 1) : 0;
29         bitmap |= pField.isAuth() ?   (1 << 2) : 0;
30         bitmap |= pField.isDest() ?   (1 << 3) : 0;
31         bitmap |= pField.isFrag() ?   (1 << 4) : 0;
32         bitmap |= pField.isRouter() ? (1 << 5) : 0;
33         bitmap |= pField.isHop() ?    (1 << 6) : 0;
34         bitmap |= pField.isUnrep() ?  (1 << 7) : 0;
35         bitmap |= pField.isUnseq() ?  (1 << 8) : 0;
36         return bitmap;
37     }
38     
39     public static int ipv6NetmaskArrayToCIDRValue(byte[] rawMask){
40
41         /*
42          * Openflow Spec : 1.3.2+
43          * An all-one-bits oxm_mask is equivalent to specifying 0 for oxm_hasmask and omitting oxm_mask.
44          * So when user specify 128 as a mask, switch omit that mask and we get null as a mask in flow
45          * statistics response.
46          */
47
48         int maskValue = 128;
49
50         if (rawMask != null) {
51             maskValue = 0;
52             for(int subArrayCounter=0;subArrayCounter<4;subArrayCounter++){
53                 int copyFrom = subArrayCounter * 4;
54
55                 byte[] subArray = Arrays.copyOfRange(rawMask, copyFrom, copyFrom+4);  
56
57                 int receivedMask = ByteBuffer.wrap(subArray).getInt();
58
59                 int shiftCount=0;
60
61                 if (receivedMask == 0) {
62                     break;
63                 }
64
65                 while(receivedMask != 0xffffffff){
66                     receivedMask = receivedMask >> 1;
67                     shiftCount++;
68                 }
69
70                 maskValue = maskValue+(32-shiftCount);
71                 if(shiftCount != 0) {
72                     break;
73                 }
74             }
75         }
76         return maskValue;
77     }
78
79 }