mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 09:58:01 +00:00
ofpbuf: Add helper method to truncate the buffer.
Add helper to truncate the buffer to certain size which might be useful if some earlier part of the buffer can be reused multiple times without copying the whole buffer. Signed-off-by: Ales Musil <amusil@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
parent
4d09d6b48e
commit
7b1ce8e2a0
@ -292,6 +292,13 @@ static inline bool ofpbuf_oversized(const struct ofpbuf *ofpacts)
|
||||
return (char *)ofpbuf_tail(ofpacts) - (char *)ofpacts->header > UINT16_MAX;
|
||||
}
|
||||
|
||||
/* Truncates the buffer to 'new_size' bytes from the tail end of 'b'. */
|
||||
static inline void ofpbuf_truncate(struct ofpbuf *b, size_t new_size)
|
||||
{
|
||||
ovs_assert(b->size >= new_size);
|
||||
b->size = new_size;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -9674,7 +9674,7 @@ ofpacts_parse(char *str, const struct ofpact_parse_params *pp,
|
||||
uint32_t orig_size = pp->ofpacts->size;
|
||||
char *error = ofpacts_parse__(str, pp, allow_instructions, outer_action);
|
||||
if (error) {
|
||||
pp->ofpacts->size = orig_size;
|
||||
ofpbuf_truncate(pp->ofpacts, orig_size);
|
||||
}
|
||||
CONST_CAST(struct ofpact_parse_params *, pp)->depth--;
|
||||
return error;
|
||||
|
@ -24,6 +24,7 @@
|
||||
#define BUF_SIZE 100
|
||||
#define HDR_OFS 10
|
||||
#define MSG_OFS 50
|
||||
#define DATA_SIZE 16
|
||||
|
||||
static void
|
||||
test_ofpbuf_main(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
|
||||
@ -59,6 +60,15 @@ test_ofpbuf_main(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
|
||||
ovs_assert(buf->header == (char *) buf->base + BUF_SIZE + HDR_OFS);
|
||||
ovs_assert(buf->msg == (char *) buf->base + BUF_SIZE + MSG_OFS);
|
||||
|
||||
size_t prev_size = buf->size;
|
||||
ofpbuf_put_uninit(buf, DATA_SIZE);
|
||||
ofpbuf_truncate(buf, prev_size);
|
||||
/* Check that everything else is unchanged after truncate. */
|
||||
ovs_assert(!buf->size);
|
||||
ovs_assert((char *) buf->base + BUF_SIZE == buf->data);
|
||||
ovs_assert(buf->header == (char *) buf->base + BUF_SIZE + HDR_OFS);
|
||||
ovs_assert(buf->msg == (char *) buf->base + BUF_SIZE + MSG_OFS);
|
||||
|
||||
ofpbuf_delete(buf);
|
||||
exit(exit_code);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user