forked from contiv/libOpenflow
-
Notifications
You must be signed in to change notification settings - Fork 16
/
nx_util.go
318 lines (292 loc) · 14.9 KB
/
nx_util.go
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
package openflow15
import (
"fmt"
"strings"
)
const (
// OFPP_IN_PORT is the default number of in_port field in resubmit actions.
OFPP_IN_PORT = 0xfff8
)
// NX_CT_STATES
const (
NX_CT_STATE_NEW_OFS = 0
NX_CT_STATE_EST_OFS = 1
NX_CT_STATE_REL_OFS = 2
NX_CT_STATE_RPL_OFS = 3
NX_CT_STATE_INV_OFS = 4
NX_CT_STATE_TRK_OFS = 5
NX_CT_STATE_SNAT_OFS = 6
NX_CT_STATE_DNAT_OFS = 7
)
// NX_CT Flags
const (
NX_CT_F_COMMIT = 1 << 0
NX_CT_F_FORCE = 1 << 1
NX_CT_RECIRC_NONE = 0xff
)
// NX_NAT_RANGE flags
const (
NX_NAT_RANGE_IPV4_MIN = 1 << 0
NX_NAT_RANGE_IPV4_MAX = 1 << 1
NX_NAT_RANGE_IPV6_MIN = 1 << 2
NX_NAT_RANGE_IPV6_MAX = 1 << 3
NX_NAT_RANGE_PROTO_MIN = 1 << 4
NX_NAT_RANGE_PROTO_MAX = 1 << 5
)
// NX_NAT flags
const (
NX_NAT_F_SRC = 1 << 0
NX_NAT_F_DST = 1 << 1
NX_NAT_F_PERSISTENT = 1 << 2
NX_NAT_F_PROTO_HASH = 1 << 3
NX_NAT_F_PROTO_RANDOM = 1 << 4
NX_NAT_F_MASK = (NX_NAT_F_SRC | NX_NAT_F_DST | NX_NAT_F_PERSISTENT | NX_NAT_F_PROTO_HASH | NX_NAT_F_PROTO_RANDOM)
)
// NX_LEARN flags
const (
NX_LEARN_F_SEND_FLOW_REM = 1 << 0
NX_LEARN_F_DELETE_LEARNED = 1 << 1
NX_LEARN_F_WRITE_RESULT = 1 << 2
)
// NX_LEARN field offset
const (
LEARN_SPEC_HEADER_LOAD = 11
LEARN_SPEC_HEADER_MATCH = 13
)
// NXM_OF fields. The class number of these fields are 0x0000.
const (
NXM_OF_IN_PORT uint8 = iota
NXM_OF_ETH_DST
NXM_OF_ETH_SRC
NXM_OF_ETH_TYPE
NXM_OF_VLAN_TCI
NXM_OF_IP_TOS
NXM_OF_IP_PROTO
NXM_OF_IP_SRC
NXM_OF_IP_DST
NXM_OF_TCP_SRC
NXM_OF_TCP_DST
NXM_OF_UDP_SRC
NXM_OF_UDP_DST
NXM_OF_ICMP_TYPE
NXM_OF_ICMP_CODE
NXM_OF_ARP_OP
NXM_OF_ARP_SPA
NXM_OF_ARP_TPA
)
// TLV_Table_Mod commands.
const (
NXTTMC_ADD = iota
NXTTMC_DELETE
NXTTMC_CLEAR
)
func newMatchFieldHeader(class uint16, field uint8, length uint8) *MatchField {
var fieldLength = length
return &MatchField{Class: class, Field: field, Length: fieldLength, HasMask: false}
}
// oxxFieldHeaderMap is map to find target field header without mask using an OVS known OXX field name
var oxxFieldHeaderMap = map[string]*MatchField{
"NXM_OF_IN_PORT": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_IN_PORT, 2),
"NXM_OF_ETH_DST": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_ETH_DST, 6),
"NXM_OF_ETH_SRC": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_ETH_SRC, 6),
"NXM_OF_ETH_TYPE": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_ETH_TYPE, 2),
"NXM_OF_VLAN_TCI": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_VLAN_TCI, 2),
"NXM_OF_IP_TOS": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_IP_TOS, 1),
"NXM_OF_IP_PROTO": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_IP_PROTO, 1),
"NXM_OF_IP_SRC": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_IP_SRC, 4),
"NXM_OF_IP_DST": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_IP_DST, 4),
"NXM_OF_TCP_SRC": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_TCP_SRC, 2),
"NXM_OF_TCP_DST": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_TCP_DST, 2),
"NXM_OF_UDP_SRC": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_UDP_SRC, 2),
"NXM_OF_UDP_DST": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_UDP_DST, 2),
"NXM_OF_ICMP_TYPE": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_ICMP_TYPE, 1),
"NXM_OF_ICMP_CODE": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_ICMP_CODE, 1),
"NXM_OF_ARP_OP": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_ARP_OP, 2),
"NXM_OF_ARP_SPA": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_ARP_SPA, 4),
"NXM_OF_ARP_TPA": newMatchFieldHeader(OXM_CLASS_NXM_0, NXM_OF_ARP_TPA, 4),
"NXM_NX_REG0": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG0, 4),
"NXM_NX_REG1": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG1, 4),
"NXM_NX_REG2": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG2, 4),
"NXM_NX_REG3": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG3, 4),
"NXM_NX_REG4": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG4, 4),
"NXM_NX_REG5": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG5, 4),
"NXM_NX_REG6": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG6, 4),
"NXM_NX_REG7": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG7, 4),
"NXM_NX_REG8": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG8, 4),
"NXM_NX_REG9": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG9, 4),
"NXM_NX_REG10": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG10, 4),
"NXM_NX_REG11": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG11, 4),
"NXM_NX_REG12": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG12, 4),
"NXM_NX_REG13": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG13, 4),
"NXM_NX_REG14": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG14, 4),
"NXM_NX_REG15": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_REG15, 4),
"NXM_NX_TUN_ID": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_ID, 8),
"NXM_NX_ARP_SHA": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_ARP_SHA, 6),
"NXM_NX_ARP_THA": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_ARP_THA, 6),
"NXM_NX_IPV6_SRC": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_IPV6_SRC, 16),
"NXM_NX_IPV6_DST": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_IPV6_DST, 16),
"NXM_NX_ICMPV6_TYPE": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_ICMPV6_TYPE, 1),
"NXM_NX_ICMPV6_CODE": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_ICMPV6_CODE, 1),
"NXM_NX_ND_TARGET": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_ND_TARGET, 16),
"NXM_NX_ND_SLL": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_ND_SLL, 6),
"NXM_NX_ND_TLL": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_ND_TLL, 6),
"NXM_NX_IP_FRAG": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_IP_FRAG, 1),
"NXM_NX_IPV6_LABEL": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_IPV6_LABEL, 1),
"NXM_NX_IP_ECN": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_IP_ECN, 1),
"NXM_NX_IP_TTL": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_IP_TTL, 1),
"NXM_NX_MPLS_TTL": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_MPLS_TTL, 1),
"NXM_NX_TUN_IPV4_SRC": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_IPV4_SRC, 4),
"NXM_NX_TUN_IPV4_DST": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_IPV4_DST, 4),
"NXM_NX_PKT_MARK": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_PKT_MARK, 4),
"NXM_NX_TCP_FLAGS": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TCP_FLAGS, 2),
"NXM_NX_CONJ_ID": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_CONJ_ID, 4),
"NXM_NX_TUN_GBP_ID": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_GBP_ID, 2),
"NXM_NX_TUN_GBP_FLAGS": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_GBP_FLAGS, 1),
"NXM_NX_TUN_FLAGS": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_FLAGS, 2),
"NXM_NX_CT_STATE": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_CT_STATE, 4),
"NXM_NX_CT_ZONE": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_CT_ZONE, 2),
"NXM_NX_CT_MARK": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_CT_MARK, 4),
"NXM_NX_CT_LABEL": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_CT_LABEL, 16),
"NXM_NX_TUN_IPV6_SRC": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_IPV6_SRC, 16),
"NXM_NX_TUN_IPV6_DST": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_IPV6_DST, 16),
"NXM_NX_CT_NW_PROTO": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_CT_NW_PROTO, 1),
"NXM_NX_CT_NW_SRC": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_CT_NW_SRC, 4),
"NXM_NX_CT_NW_DST": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_CT_NW_DST, 4),
"NXM_NX_CT_IPV6_SRC": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_CT_IPV6_SRC, 16),
"NXM_NX_CT_IPV6_DST": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_CT_IPV6_DST, 16),
"NXM_NX_CT_TP_SRC": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_CT_TP_SRC, 2),
"NXM_NX_CT_TP_DST": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_CT_TP_DST, 2),
"NXM_NX_TUN_METADATA0": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_METADATA0, 128),
"NXM_NX_TUN_METADATA1": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_METADATA1, 128),
"NXM_NX_TUN_METADATA2": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_METADATA2, 128),
"NXM_NX_TUN_METADATA3": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_METADATA3, 128),
"NXM_NX_TUN_METADATA4": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_METADATA4, 128),
"NXM_NX_TUN_METADATA5": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_METADATA5, 128),
"NXM_NX_TUN_METADATA6": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_METADATA6, 128),
"NXM_NX_TUN_METADATA7": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_TUN_METADATA7, 128),
"NXM_NX_XXREG0": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_XXREG0, 16),
"NXM_NX_XXREG1": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_XXREG1, 16),
"NXM_NX_XXREG2": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_XXREG2, 16),
"NXM_NX_XXREG3": newMatchFieldHeader(OXM_CLASS_NXM_1, NXM_NX_XXREG3, 16),
"OXM_OF_IN_PORT": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IN_PORT, 4),
"OXM_OF_IN_PHY_PORT": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IN_PHY_PORT, 4),
"OXM_OF_METADATA": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_METADATA, 8),
"OXM_OF_ETH_DST": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_ETH_DST, 6),
"OXM_OF_ETH_SRC": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_ETH_SRC, 6),
"OXM_OF_ETH_TYPE": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_ETH_TYPE, 2),
"OXM_OF_VLAN_VID": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_VLAN_VID, 2),
"OXM_OF_VLAN_PCP": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_VLAN_PCP, 1),
"OXM_OF_IP_DSCP": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IP_DSCP, 1),
"OXM_OF_IP_ECN": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IP_ECN, 1),
"OXM_OF_IP_PROTO": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IP_PROTO, 1),
"OXM_OF_IPV4_SRC": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IPV4_SRC, 4),
"OXM_OF_IPV4_DST": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IPV4_DST, 4),
"OXM_OF_TCP_SRC": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_TCP_SRC, 2),
"OXM_OF_TCP_DST": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_TCP_DST, 2),
"OXM_OF_UDP_SRC": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_UDP_SRC, 2),
"OXM_OF_UDP_DST": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_UDP_DST, 2),
"OXM_OF_SCTP_SRC": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_SCTP_SRC, 2),
"OXM_OF_SCTP_DST": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_SCTP_DST, 2),
"OXM_OF_ICMPV4_TYPE": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_ICMPV4_TYPE, 1),
"OXM_OF_ICMPV4_CODE": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_ICMPV4_CODE, 1),
"OXM_OF_ARP_OP": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_ARP_OP, 2),
"OXM_OF_ARP_SPA": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_ARP_SPA, 4),
"OXM_OF_ARP_TPA": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_ARP_TPA, 4),
"OXM_OF_ARP_SHA": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_ARP_SHA, 6),
"OXM_OF_ARP_THA": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_ARP_THA, 6),
"OXM_OF_IPV6_SRC": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IPV6_SRC, 16),
"OXM_OF_IPV6_DST": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IPV6_DST, 16),
"OXM_OF_IPV6_FLABEL": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IPV6_FLABEL, 4),
"OXM_OF_ICMPV6_TYPE": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_ICMPV6_TYPE, 1),
"OXM_OF_ICMPV6_CODE": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_ICMPV6_CODE, 1),
"OXM_OF_IPV6_ND_TARGET": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IPV6_ND_TARGET, 16),
"OXM_OF_IPV6_ND_SLL": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IPV6_ND_SLL, 6),
"OXM_OF_IPV6_ND_TLL": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IPV6_ND_TLL, 6),
"OXM_OF_MPLS_LABEL": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_MPLS_LABEL, 4),
"OXM_OF_MPLS_TC": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_MPLS_TC, 1),
"OXM_OF_MPLS_BOS": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_MPLS_BOS, 1),
"OXM_OF_PBB_ISID": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_PBB_ISID, 3),
"OXM_OF_TUNNEL_ID": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_TUNNEL_ID, 8),
"OXM_OF_IPV6_EXTHDR": newMatchFieldHeader(OXM_CLASS_OPENFLOW_BASIC, OXM_FIELD_IPV6_EXTHDR, 2),
}
// FindFieldHeaderByName finds OXM/NXM field by name and mask.
func FindFieldHeaderByName(fieldName string, hasMask bool) (*MatchField, error) {
fieldKey := strings.ToUpper(fieldName)
field, found := oxxFieldHeaderMap[fieldKey]
if !found {
return nil, fmt.Errorf("failed to find header by name %s", fieldName)
}
length := field.Length
if hasMask {
length = field.Length * 2
}
// Create a new MatchField and return it to the caller, then it could avoid race condition.
return &MatchField{
Class: field.Class,
Field: field.Field,
HasMask: hasMask,
Length: length,
}, nil
}
func FindOxmIdByName(fieldName string, hasMask bool) (*OxmId, error) {
matchField, err := FindFieldHeaderByName(fieldName, hasMask)
if err != nil {
return nil, err
}
return &OxmId{
Class: matchField.Class,
Field: matchField.Field,
HasMask: matchField.HasMask,
Length: matchField.Length,
}, nil
}
// encodeOfsNbitsStartEnd encodes the range to a uint16 number.
func encodeOfsNbitsStartEnd(start uint16, end uint16) uint16 {
return (start << 6) + (end - start)
}
// Encode the range to a uint16 number.
// ofs is the start pos, nBits is the count of the range.
func encodeOfsNbits(ofs uint16, nBits uint16) uint16 {
return ofs<<6 | (nBits - 1)
}
func decodeOfs(ofsNbits uint16) uint16 {
return ofsNbits >> 6
}
func decodeNbits(ofsNbits uint16) uint16 {
return (ofsNbits & 0x3f) + 1
}
// NewNXRange creates a NXRange using start and end number.
func NewNXRange(start int, end int) *NXRange {
return &NXRange{start: start, end: end}
}
// NewNXRangeByOfsNBits creates a NXRange using offshift and bit count.
func NewNXRangeByOfsNBits(ofs int, nBits int) *NXRange {
return &NXRange{start: ofs, end: ofs + nBits - 1}
}
// ToUint32Mask generates a uint32 number mask from NXRange.
func (n *NXRange) ToUint32Mask() uint32 {
start := n.start
maxLength := 32
var end int
if n.end != 0 {
end = n.end
} else {
end = maxLength
}
mask1 := ^uint32(0)
mask1 = mask1 >> uint32(maxLength-(end-n.start+1))
mask1 = mask1 << uint32(start)
return mask1
}
// ToOfsBits encodes the NXRange to a uint16 number to identify offshift and bits count.
func (n *NXRange) ToOfsBits() uint16 {
return encodeOfsNbitsStartEnd(uint16(n.start), uint16(n.end))
}
// GetOfs returns the offshift number from NXRange.
func (n *NXRange) GetOfs() uint16 {
return uint16(n.start)
}
// GetNbits returns the bits count from NXRange.
func (n *NXRange) GetNbits() uint16 {
return uint16(n.end - n.start + 1)
}