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;
#include "shash.h"
#include "socket-util.h"
#include "unaligned.h"
+#include "util.h"
#include "vlog.h"
VLOG_DEFINE_THIS_MODULE(meta_flow);
/* 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 {
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include "byte-order.h"
#include "compiler.h"
#include "openvswitch/types.h"
{
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));
+}
\f
bool is_all_zeros(const uint8_t *, size_t);
bool is_all_ones(const uint8_t *, size_t);