@@ -129,18 +129,6 @@ static acl_ip_type_lookup_t aclIpTypeLookup =
129
129
{ IP_TYPE_ARP_REPLY, SAI_ACL_IP_TYPE_ARP_REPLY }
130
130
};
131
131
132
- inline string trim (const std::string& str, const std::string& whitespace = " \t " )
133
- {
134
- const auto strBegin = str.find_first_not_of (whitespace);
135
- if (strBegin == std::string::npos)
136
- return " " ;
137
-
138
- const auto strEnd = str.find_last_not_of (whitespace);
139
- const auto strRange = strEnd - strBegin + 1 ;
140
-
141
- return str.substr (strBegin, strRange);
142
- }
143
-
144
132
AclRule::AclRule (AclOrch *aclOrch, string rule, string table, acl_table_type_t type, bool createCounter) :
145
133
m_pAclOrch(aclOrch),
146
134
m_id(rule),
@@ -246,40 +234,19 @@ bool AclRule::validateAddMatch(string attr_name, string attr_value)
246
234
}
247
235
else if (attr_name == MATCH_TCP_FLAGS)
248
236
{
249
- vector<string> flagsData;
250
- string flags, mask;
251
- int val;
252
- char *endp = NULL ;
253
- errno = 0 ;
237
+ // Support both exact value match and value/mask match
238
+ auto flag_data = tokenize (attr_value, ' /' );
254
239
255
- split (attr_value, flagsData, ' / ' );
240
+ value. aclfield . data . u8 = to_uint< uint8_t >(flag_data[ 0 ], 0 , 0x3F );
256
241
257
- if (flagsData .size () != 2 ) // expect two parts flags and mask separated with '/'
242
+ if (flag_data .size () == 2 )
258
243
{
259
- SWSS_LOG_ERROR (" Invalid TCP flags format %s" , attr_value.c_str ());
260
- return false ;
244
+ value.aclfield .mask .u8 = to_uint<uint8_t >(flag_data[1 ], 0 , 0x3F );
261
245
}
262
-
263
- flags = trim (flagsData[0 ]);
264
- mask = trim (flagsData[1 ]);
265
-
266
- val = (uint32_t )strtol (flags.c_str (), &endp, 0 );
267
- if (errno || (endp != flags.c_str () + flags.size ()) ||
268
- (val < 0 ) || (val > UCHAR_MAX))
269
- {
270
- SWSS_LOG_ERROR (" TCP flags parse error, value: %s(=%d), errno: %d" , flags.c_str (), val, errno);
271
- return false ;
272
- }
273
- value.aclfield .data .u8 = (uint8_t )val;
274
-
275
- val = (uint32_t )strtol (mask.c_str (), &endp, 0 );
276
- if (errno || (endp != mask.c_str () + mask.size ()) ||
277
- (val < 0 ) || (val > UCHAR_MAX))
246
+ else
278
247
{
279
- SWSS_LOG_ERROR (" TCP mask parse error, value: %s(=%d), errno: %d" , mask.c_str (), val, errno);
280
- return false ;
248
+ value.aclfield .mask .u8 = 0x3F ;
281
249
}
282
- value.aclfield .mask .u8 = (uint8_t )val;
283
250
}
284
251
else if (attr_name == MATCH_ETHER_TYPE || attr_name == MATCH_L4_SRC_PORT || attr_name == MATCH_L4_DST_PORT)
285
252
{
0 commit comments