ROFL-pipeline  v0.6.0dev
of1x_utils.h
Go to the documentation of this file.
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #ifndef __OF1X_UTILS_H__
6 #define __OF1X_UTILS_H__
7 
8 #include <inttypes.h>
9 #include "../../of_switch.h"
10 
17 //
18 // OpenFlow 1.X specific return values
19 //
20 
25 typedef enum rofl_of1x_fm_result{
26  ROFL_OF1X_FM_SUCCESS = EXIT_SUCCESS,
27  ROFL_OF1X_FM_FAILURE = EXIT_FAILURE,
28  ROFL_OF1X_FM_OVERLAP
30 
31 
32 //
33 // Removal mutex management
34 //
35 
36 /*
37 * Mutex state for flow_entry_removal
38 */
39 typedef enum of1x_mutex_acquisition_required{
40  MUTEX_NOT_ACQUIRED = 0, /*mutex has not been acquired and we must take it*/
41  MUTEX_ALREADY_ACQUIRED_BY_TIMER_EXPIRATION, /*mutex was taken when checking for expirations. We shouldn't call the timers functions*/
42  MUTEX_ALREADY_ACQUIRED_NON_STRICT_SEARCH /*mutex was taken when looking for entries with a non strict definition*/
43 }of1x_mutex_acquisition_required_t;
44 
45 //
46 // Pipeline version
47 //
48 
49 /*
50 * Required pipeline version
51 */
52 typedef struct of1x_ver_req_t{
53  of_version_t min_ver; //of_version_t
54  of_version_t max_ver; //of_version_t
56 
57 #define OF1X_MIN_VERSION OF_VERSION_10
58 #define OF1X_MAX_VERSION OF_VERSION_13
59 
60 
61 //
62 // Match/Actions masks
63 //
64 #if defined(BIG_ENDIAN_DETECTED)
65  /*
66  * Useful masks
67  */
68  //Byte masks
69  #define OF1X_8_BYTE_MASK 0xFFFFFFFFFFFFFFFFULL
70  #define OF1X_6_BYTE_MASK 0xFFFFFFFFFFFF0000ULL
71  #define OF1X_4_BYTE_MASK 0xFFFFFFFF
72  #define OF1X_3_BYTE_MASK 0xFFFFFF00
73  #define OF1X_2_BYTE_MASK 0xFFFF
74  #define OF1X_1_BYTE_MASK 0xFF
75 
76  //Non-multiple of byte masks
77  #define OF1X_48_BITS_MASK 0xFFFFFFFFFFFF0000ULL
78  #define OF1X_20_BITS_MASK 0xFFFFF000
79  #define OF1X_14_BITS_MASK 0xFFFC
80  #define OF1X_13_BITS_MASK 0xFFF8
81  #define OF1X_12_BITS_MASK 0xFFF0
82  #define OF1X_9_BITS_MASK 0xFF80
83  #define OF1X_6_BITS_MASK 0xFC
84  #define OF1X_4_BITS_MASK 0xF0
85  #define OF1X_3_BITS_MASK 0xE0
86 
87  #define OF1X_VLAN_PRESENT_MASK 0x0008
88  #define OF1X_VLAN_ID_MASK 0x0FFF
89 
90  #define OF1X_8MIDDLE_BITS_MASK 0x0FF0 //ipv6 TC
91  #define OF1X_20_BITS_IPV6_FLABEL_MASK 0x0FFFFF00
92 
93 #elif defined(LITTLE_ENDIAN_DETECTED)
94  /*
95  * Useful masks
96  */
97  //Byte masks
98  #define OF1X_8_BYTE_MASK 0xFFFFFFFFFFFFFFFFULL
99  #define OF1X_6_BYTE_MASK 0x0000FFFFFFFFFFFFULL
100  #define OF1X_4_BYTE_MASK 0x00000000FFFFFFFF
101  #define OF1X_3_BYTE_MASK 0x0000000000FFFFFF
102  #define OF1X_2_BYTE_MASK 0x000000000000FFFF
103  #define OF1X_1_BYTE_MASK 0x00000000000000FF
104 
105  //Non-multiple of byte masks
106  #define OF1X_48_BITS_MASK 0x0000FFFFFFFFFFFFULL
107  #define OF1X_20_BITS_MASK 0x0000000000F0FFFF
108  #define OF1X_14_BITS_MASK 0x0000000000003FFF
109  #define OF1X_13_BITS_MASK 0x0000000000001FFF
110  #define OF1X_12_BITS_MASK 0x000000000000FF0F
111  #define OF1X_9_BITS_MASK 0x00000000000001FF
112  #define OF1X_6_BITS_MASK 0x000000000000003F
113  #define OF1X_4_BITS_MASK 0x000000000000000F
114  #define OF1X_3_BITS_MASK 0x0000000000000007
115 
116  #define OF1X_VLAN_PRESENT_MASK 0x0010
117  #define OF1X_VLAN_ID_MASK 0xFF0F
118 
119  #define OF1X_8MIDDLE_BITS_MASK 0xF00F
120  #define OF1X_20_BITS_IPV6_FLABEL_MASK 0x00FFFF0F
121 
122 #else
123  #error Unknwon endianness
124 #endif
125 
126 // Masks and flags (intra byte => not dependent on endianness)
127 #define OF1X_BIT0_MASK 1<<0 // 0x01 // 0000 0001
128 #define OF1X_BIT1_MASK 1<<1 // 0x02 // 0000 0010
129 #define OF1X_BIT2_MASK 1<<2 // 0x04 // 0000 0100
130 #define OF1X_BIT3_MASK 1<<3 // 0x08 // 0000 1000
131 #define OF1X_BIT4_MASK 1<<4 // 0x10 // 0001 0000
132 #define OF1X_BIT5_MASK 1<<5 // 0x20 // 0010 0000
133 #define OF1X_BIT6_MASK 1<<6 // 0x40 // 0100 0000
134 #define OF1X_BIT7_MASK 1<<7 // 0x80 // 1000 0000
135 
136 #define OF1X_4MSBITS_MASK 0xF0 // 1111 0000
137 #define OF1X_4LSBITS_MASK 0x0F // 0000 1111
138 #define OF1X_6MSBITS_MASK 0xFC // 1111 1100
139 #define OF1X_2LSBITS_MASK 0x03 // 0000 0011
140 #define OF1X_3LSBITS_MASK 0x07 // 0000 0111
141 #define OF1X_3MSBITS_MASK 0xE0 // 1110 0000
142 #define OF1X_2MSBITS_MASK 0xC0 // 1100 0000
143 #define OF1X_6LSBITS_MASK 0x3F // 0011 1111
144 #define OF1X_BITS_2AND3_MASK 0x30 // 0000 1100
145 #define OF1X_BITS_4AND5_MASK 0x30 // 0011 0000
146 #define OF1X_BITS_12AND3_MASK 0x0E // 0000 1110
147 
148 
149 //
150 // Bit alignement MACROS
151 //
152 #define OF1X_SHIFT_LEFT(x, y) (x<<y)
153 #define OF1X_SHIFT_RIGHT(x, y) (x>>y)
154 
155 //aligment operations dependent on endiannes
156 #define OF1X_SWAP_AND_SHIFT_64(x, y) do{ \
157  x=__bswap_64(x); \
158  x>>=y; \
159  }while(0)
160 //NOTE swapping will be done externally. DUMPING?
161 
162 
164 
165 //Vlan pcp is found in the 3 most significant bits: 1110 0000
166 #define OF1X_MAC_ALIGN(x) OF1X_SHIFT_LEFT(x, 16)
167 #define OF1X_MAC_VALUE(x) OF1X_SHIFT_RIGHT(x, 16)
168 
169 #define OF1X_VLAN_PCP_ALIGN(x) OF1X_SHIFT_LEFT(x, 5)
170 #define OF1X_VLAN_PCP_VALUE(x) OF1X_SHIFT_RIGHT(x, 5)
171 
172 #define OF1X_MPLS_LABEL_ALIGN(x) OF1X_SHIFT_LEFT(x, 12)
173 #define OF1X_MPLS_LABEL_VALUE(x) OF1X_SHIFT_RIGHT(x, 12)
174 
175 #define OF1X_MPLS_TC_ALIGN(x) OF1X_SHIFT_LEFT(x, 1)
176 #define OF1X_MPLS_TC_VALUE(x) OF1X_SHIFT_RIGHT(x, 1)
177 
178 #define OF1X_IP_DSCP_ALIGN(x) OF1X_SHIFT_LEFT(x, 2)
179 #define OF1X_IP_DSCP_VALUE(x) OF1X_SHIFT_RIGHT(x, 2)
180 
181 #define OF1X_IP6_FLABEL_ALIGN(x) OF1X_SHIFT_LEFT(x, 8)
182 #define OF1X_IP6_FLABEL_VALUE(x) OF1X_SHIFT_RIGHT(x, 8)
183 /*
184 * Align to 64bit
185 */
186 #define OF1X_ALIGN_64_BIT(x) (((x/8)+1)*8)
187 
188 #endif //OF1X_UTILS
rofl_of1x_fm_result
Extended flowmod return codes.
Definition: of1x_utils.h:25
enum rofl_of1x_fm_result rofl_of1x_fm_result_t
Extended flowmod return codes.