X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fofpbuf.c;h=29698dcd83beefdedb2ba985f4305e63a9eaa4d9;hb=efb80167f7ebf51456df2940e3b42376ecbceb61;hp=8166d6b1c1a1f3ee29ed361fbae3afc9ef1690be;hpb=7ecb095d0bf4940406ce684c5c6d5c7adac4cf77;p=openvswitch diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c index 8166d6b1..29698dcd 100644 --- a/lib/ofpbuf.c +++ b/lib/ofpbuf.c @@ -129,7 +129,7 @@ ofpbuf_new_with_headroom(size_t size, size_t headroom) struct ofpbuf * ofpbuf_clone(const struct ofpbuf *buffer) { - return ofpbuf_clone_data(buffer->data, buffer->size); + return ofpbuf_clone_with_headroom(buffer, 0); } /* Creates and returns a new ofpbuf whose data are copied from 'buffer'. The @@ -137,8 +137,27 @@ ofpbuf_clone(const struct ofpbuf *buffer) struct ofpbuf * ofpbuf_clone_with_headroom(const struct ofpbuf *buffer, size_t headroom) { - return ofpbuf_clone_data_with_headroom(buffer->data, buffer->size, - headroom); + struct ofpbuf *new_buffer; + uintptr_t data_delta; + + new_buffer = ofpbuf_clone_data_with_headroom(buffer->data, buffer->size, + headroom); + data_delta = (char *) new_buffer->data - (char *) buffer->data; + + if (buffer->l2) { + new_buffer->l2 = (char *) buffer->l2 + data_delta; + } + if (buffer->l3) { + new_buffer->l3 = (char *) buffer->l3 + data_delta; + } + if (buffer->l4) { + new_buffer->l4 = (char *) buffer->l4 + data_delta; + } + if (buffer->l7) { + new_buffer->l7 = (char *) buffer->l7 + data_delta; + } + + return new_buffer; } /* Creates and returns a new ofpbuf that initially contains a copy of the @@ -289,6 +308,16 @@ ofpbuf_trim(struct ofpbuf *b) } } +/* If 'b' is shorter than 'length' bytes, pads its tail out with zeros to that + * length. */ +void +ofpbuf_padto(struct ofpbuf *b, size_t length) +{ + if (b->size < length) { + ofpbuf_put_zeros(b, length - b->size); + } +} + /* Appends 'size' bytes of data to the tail end of 'b', reallocating and * copying its data if necessary. Returns a pointer to the first byte of the * new data, which is left uninitialized. */