aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowValueMapper.java
blob: 2f0831c64933c360ce769f19dadd0fbdec600ac6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
 * Copyright 2015 Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.onosproject.provider.of.flow.impl;

import com.google.common.collect.BiMap;
import com.google.common.collect.EnumHashBiMap;
import org.onosproject.net.ChannelSpacing;
import org.onosproject.net.GridType;
import org.onosproject.net.OchSignalType;

/**
 * Collection of helper methods to convert protocol agnostic models to values used in OpenFlow spec.
 */
final class OpenFlowValueMapper {

    // prohibit instantiation
    private OpenFlowValueMapper() {}

    private static final BiMap<GridType, Byte> GRID_TYPES = EnumHashBiMap.create(GridType.class);
    static {
        // See ONF "Optical Transport Protocol Extensions Version 1.0" for the following values
        GRID_TYPES.put(GridType.DWDM, (byte) 1); // OFPGRIDT_DWDM of enum ofp_grid_type
        GRID_TYPES.put(GridType.CWDM, (byte) 2); // OFPGRIDT_CWDM of enum ofp_grid_type
        GRID_TYPES.put(GridType.FLEX, (byte) 3); // OFPGRIDT_FLEX of enum ofp_grid_type
    }

    private static final BiMap<ChannelSpacing, Byte> CHANNEL_SPACING = EnumHashBiMap.create(ChannelSpacing.class);
    static {
        // See ONF "Optical Transport Protocol Extensions Version 1.0" for the following values
        CHANNEL_SPACING.put(ChannelSpacing.CHL_100GHZ, (byte) 1);   // OFPCS_100GHZ of enum ofp_chl_spacing
        CHANNEL_SPACING.put(ChannelSpacing.CHL_50GHZ, (byte) 2);    // OFPCS_50GHZ of enum ofp_chl_spacing
        CHANNEL_SPACING.put(ChannelSpacing.CHL_25GHZ, (byte) 3);    // OFPCS_25GHZ of enum ofp_chl_spacing
        CHANNEL_SPACING.put(ChannelSpacing.CHL_12P5GHZ, (byte) 4);  // OFPCS_12P5GHZ of enum ofp_chl_spacing
        CHANNEL_SPACING.put(ChannelSpacing.CHL_6P25GHZ, (byte) 5);  // OFPCS_6P25GHZ of enum ofp_chl_spacing
    }

    private static final BiMap<OchSignalType, Byte> OCH_SIGNAL_TYPES = EnumHashBiMap.create(OchSignalType.class);
    static {
        // See ONF "Optical Transport Protocol Extensions Version 1.0" for the following values
        OCH_SIGNAL_TYPES.put(OchSignalType.FIXED_GRID, (byte) 1); // OFPOCHT_FIX_GRID of enum ofp_och_signal_type
        OCH_SIGNAL_TYPES.put(OchSignalType.FLEX_GRID, (byte) 2);  // OFPOCHT_FLEX_GRID of enum ofp_och_signal_type
    }

    /**
     * Looks up the specified input value to the corresponding value with the specified map.
     *
     * @param map bidirectional mapping
     * @param input input value
     * @param cls class of output value
     * @param <I> type of input value
     * @param <O> type of output value
     * @return the corresponding value stored in the specified map
     * @throws NoMappingFoundException if no corresponding value is found
     */
    private static <I, O> O lookup(BiMap<I, O> map, I input, Class<O> cls) {
        if (!map.containsKey(input)) {
            throw new NoMappingFoundException(input, cls);
        }

        return map.get(input);
    }

    /**
     * Looks up the corresponding byte value defined in
     * ONF "Optical Transport Protocol Extensions Version 1.0"
     * from the specified {@link GridType} instance.
     *
     * @param type grid type
     * @return the byte value corresponding to the specified grid type
     * @throws NoMappingFoundException if the specified grid type is not found
     */
    static byte lookupGridType(GridType type) {
        return lookup(GRID_TYPES, type, Byte.class);
    }

    /**
     * Looks up the corresponding {@link GridType} instance
     * from the specified byte value for grid type
     * defined in ONF "Optical Transport Protocol Extensions Version 1.0".
     *
     * @param type byte value as grid type defined the spec
     * @return the corresponding GridType instance
     */
    static GridType lookupGridType(byte type) {
        return lookup(GRID_TYPES.inverse(), type, GridType.class);
    }

    /**
     * Looks up the corresponding byte value for channel spacing defined in
     * ONF "Optical Transport Protocol Extensions Version 1.0"
     * from the specified {@link ChannelSpacing} instance.
     *
     * @param spacing channel spacing
     * @return byte value corresponding to the specified channel spacing
     * @throws NoMappingFoundException if the specified channel spacing is not found
     */
    static byte lookupChannelSpacing(ChannelSpacing spacing) {
        return lookup(CHANNEL_SPACING, spacing, Byte.class);
    }

    /**
     * Looks up the corresponding {@link ChannelSpacing} instance
     * from the specified byte value for channel spacing
     * defined in ONF "Optical Transport Protocol Extensions Version 1.0".
     *
     * @param spacing byte value as channel spacing defined the spec
     * @return the corresponding ChannelSpacing instance
     * @throws NoMappingFoundException if the specified channel spacing is not found
     */
    static ChannelSpacing lookupChannelSpacing(byte spacing) {
        return lookup(CHANNEL_SPACING.inverse(), spacing, ChannelSpacing.class);
    }

    /**
     * Looks up the corresponding byte value for Och signal type defined in
     * ONF "Optical Transport Protocol Extensions Version 1.0"
     * from the specified {@link OchSignalType} instance.
     *
     * @param signalType optical signal type
     * @return byte value corresponding to the specified OCh signal type
     * @throws NoMappingFoundException if the specified Och signal type is not found
     */
    static byte lookupOchSignalType(OchSignalType signalType) {
        return lookup(OCH_SIGNAL_TYPES, signalType, Byte.class);
    }

    /**
     * Looks up the the corresponding {@link OchSignalType} instance
     * from the specified byte value for Och signal type defined in
     * ONF "Optical Transport Protocol Extensions Version 1.0".
     *
     * @param signalType byte value as Och singal type defined the spec
     * @return the corresponding OchSignalType instance
     * @throws NoMappingFoundException if the specified Och signal type is not found
     */
    static OchSignalType lookupOchSignalType(byte signalType) {
        return lookup(OCH_SIGNAL_TYPES.inverse(), signalType, OchSignalType.class);
    }
}