mirror of
https://github.com/openvswitch/ovs
synced 2025-09-01 23:05:29 +00:00
util: Add be32_prefix_mask().
Shifting a 32-bit entity by 32 bits is undefined behavior. As we have 2 cases where we may hit this, it is a time to introduce a helper for this. Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com> Acked-by: Pravin B Shelar <pshelar@nicira.com>
This commit is contained in:
@@ -1829,7 +1829,7 @@ find_match_wc(const struct cls_subtable *subtable, const struct flow *flow,
|
||||
trie_lookup_value(subtable->ports_trie, &value, 32, &mbits);
|
||||
|
||||
((OVS_FORCE ovs_be32 *)&wc->masks)[TP_PORTS_OFS32] |=
|
||||
mask & htonl(~0 << (32 - mbits));
|
||||
mask & be32_prefix_mask(mbits);
|
||||
|
||||
ofs.start = TP_PORTS_OFS32;
|
||||
goto range_out;
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#include "shash.h"
|
||||
#include "socket-util.h"
|
||||
#include "unaligned.h"
|
||||
#include "util.h"
|
||||
#include "vlog.h"
|
||||
|
||||
VLOG_DEFINE_THIS_MODULE(meta_flow);
|
||||
@@ -2405,13 +2406,10 @@ mf_from_ipv4_string(const struct mf_field *mf, const char *s,
|
||||
/* OK. */
|
||||
} else if (ovs_scan(s, IP_SCAN_FMT"/%d", IP_SCAN_ARGS(ip), &prefix)) {
|
||||
if (prefix <= 0 || prefix > 32) {
|
||||
return xasprintf("%s: network prefix bits not between 1 and "
|
||||
return xasprintf("%s: network prefix bits not between 0 and "
|
||||
"32", s);
|
||||
} else if (prefix == 32) {
|
||||
*mask = OVS_BE32_MAX;
|
||||
} else {
|
||||
*mask = htonl(((1u << prefix) - 1) << (32 - prefix));
|
||||
}
|
||||
*mask = be32_prefix_mask(prefix);
|
||||
} else if (ovs_scan(s, IP_SCAN_FMT, IP_SCAN_ARGS(ip))) {
|
||||
*mask = OVS_BE32_MAX;
|
||||
} else {
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "byte-order.h"
|
||||
#include "compiler.h"
|
||||
#include "openvswitch/types.h"
|
||||
|
||||
@@ -478,6 +479,14 @@ leftmost_1bit_idx(uint32_t x)
|
||||
{
|
||||
return x ? log_2_floor(x) : 32;
|
||||
}
|
||||
|
||||
/* Return a ovs_be32 prefix in network byte order with 'plen' highest bits set.
|
||||
* Shift with 32 is undefined behavior, but we rather use 64-bit shift than
|
||||
* compare. */
|
||||
static inline ovs_be32 be32_prefix_mask(int plen)
|
||||
{
|
||||
return htonl((uint64_t)UINT32_MAX << (32 - plen));
|
||||
}
|
||||
|
||||
bool is_all_zeros(const uint8_t *, size_t);
|
||||
bool is_all_ones(const uint8_t *, size_t);
|
||||
|
Reference in New Issue
Block a user