--- /dev/null
+#ifndef FIX_LINUX_TC_PEDIT_H
+#define FIX_LINUX_TC_PEDIT_H
+
+#ifndef __CHECKER__
+#error "Use this header only with sparse. It is not a correct implementation."
+#endif
+
+#include_next <linux/tc_act/tc_pedit.h>
+
+/* Fixes endianness of 'mask' and 'val' members. */
+#define tc_pedit_key rpl_tc_pedit_key
+struct rpl_tc_pedit_key {
+ ovs_be32 mask; /* AND */
+ ovs_be32 val; /* XOR */
+ __u32 off; /* offset */
+ __u32 at;
+ __u32 offmask;
+ __u32 shift;
+};
+
+#define tc_pedit_sel rpl_tc_pedit_sel
+struct rpl_tc_pedit_sel {
+ tc_gen;
+ unsigned char nkeys;
+ unsigned char flags;
+ struct tc_pedit_key keys[0];
+};
+
+#endif
if ((keys->off >= mf && keys->off < mf + sz)
|| (keys->off + 3 >= mf && keys->off + 3 < mf + sz)) {
int diff = flower_off + (keys->off - mf);
- uint32_t *dst = (void *) (rewrite_key + diff);
- uint32_t *dst_m = (void *) (rewrite_mask + diff);
- uint32_t mask = ~(keys->mask);
+ ovs_be32 *dst = (void *) (rewrite_key + diff);
+ ovs_be32 *dst_m = (void *) (rewrite_mask + diff);
+ ovs_be32 mask = ~(keys->mask);
uint32_t zero_bits;
if (keys->off < mf) {
zero_bits = 8 * (mf - keys->off);
- mask &= UINT32_MAX << zero_bits;
+ mask &= htonl(UINT32_MAX >> zero_bits);
} else if (keys->off + 4 > mf + m->size) {
zero_bits = 8 * (keys->off + 4 - mf - m->size);
- mask &= UINT32_MAX >> zero_bits;
+ mask &= htonl(UINT32_MAX << zero_bits);
}
*dst_m |= mask;
* (as we read entire words). */
static void
calc_offsets(struct tc_flower *flower, struct flower_key_to_pedit *m,
- int *cur_offset, int *cnt, uint32_t *last_word_mask,
- uint32_t *first_word_mask, uint32_t **mask, uint32_t **data)
+ int *cur_offset, int *cnt, ovs_be32 *last_word_mask,
+ ovs_be32 *first_word_mask, ovs_be32 **mask, ovs_be32 **data)
{
int start_offset, max_offset, total_size;
int diff, right_zero_bits, left_zero_bits;
*cur_offset = start_offset;
*cnt = (total_size / 4) + (total_size % 4 ? 1 : 0);
- *last_word_mask = UINT32_MAX >> right_zero_bits;
- *first_word_mask = UINT32_MAX << left_zero_bits;
+ *last_word_mask = htonl(UINT32_MAX << right_zero_bits);
+ *first_word_mask = htonl(UINT32_MAX >> left_zero_bits);
*data = (void *) (rewrite_key + m->flower_offset - diff);
*mask = (void *) (rewrite_mask + m->flower_offset - diff);
}
struct flower_key_to_pedit *m = &flower_pedit_map[i];
struct tc_pedit_key *pedit_key = NULL;
struct tc_pedit_key_ex *pedit_key_ex = NULL;
- uint32_t *mask, *data, first_word_mask, last_word_mask;
+ ovs_be32 *mask, *data, first_word_mask, last_word_mask;
int cnt = 0, cur_offset = 0;
if (!m->size) {
&first_word_mask, &mask, &data);
for (j = 0; j < cnt; j++, mask++, data++, cur_offset += 4) {
- uint32_t mask_word = *mask;
+ ovs_be32 mask_word = *mask;
if (j == 0) {
mask_word &= first_word_mask;