} else if (!ofconn->pktbuf) {
pin.buffer_id = UINT32_MAX;
} else {
- pin.buffer_id = pktbuf_save(ofconn->pktbuf, pin.packet, flow->in_port);
+ pin.buffer_id = pktbuf_save(ofconn->pktbuf, pin.packet->data,
+ pin.packet->size, flow->in_port);
}
/* Figure out how much of the packet to send. */
}
/* Attempts to allocate an OpenFlow packet buffer id within 'pb'. The packet
- * buffer will store a copy of 'buffer' and the port number 'in_port', which
- * should be the datapath port number on which 'buffer' was received.
+ * buffer will store a copy of 'buffer_size' bytes in 'buffer' and the port
+ * number 'in_port', which should be the OpenFlow port number on which 'buffer'
+ * was received.
*
* If successful, returns the packet buffer id (a number other than
* UINT32_MAX). pktbuf_retrieve() can later be used to retrieve the buffer and
*
* The caller retains ownership of 'buffer'. */
uint32_t
-pktbuf_save(struct pktbuf *pb, struct ofpbuf *buffer, uint16_t in_port)
+pktbuf_save(struct pktbuf *pb, const void *buffer, size_t buffer_size,
+ uint16_t in_port)
{
struct packet *p = &pb->packets[pb->buffer_idx];
pb->buffer_idx = (pb->buffer_idx + 1) & PKTBUF_MASK;
if (++p->cookie >= COOKIE_MAX) {
p->cookie = 0;
}
- p->buffer = ofpbuf_new_with_headroom(buffer->size,
- sizeof(struct ofp_packet_in));
- ofpbuf_put(p->buffer, buffer->data, buffer->size);
+ p->buffer = ofpbuf_clone_data_with_headroom(buffer, buffer_size,
+ sizeof(struct ofp_packet_in));
+
+
p->timeout = time_msec() + OVERWRITE_MSECS;
p->in_port = in_port;
return make_id(p - pb->packets, p->cookie);
#ifndef PKTBUF_H
#define PKTBUF_H 1
+#include <stddef.h>
#include <stdint.h>
struct pktbuf;
struct pktbuf *pktbuf_create(void);
void pktbuf_destroy(struct pktbuf *);
-uint32_t pktbuf_save(struct pktbuf *, struct ofpbuf *buffer, uint16_t in_port);
+uint32_t pktbuf_save(struct pktbuf *, const void *buffer, size_t buffer_size,
+ uint16_t in_port);
uint32_t pktbuf_get_null(void);
int pktbuf_retrieve(struct pktbuf *, uint32_t id, struct ofpbuf **bufferp,
uint16_t *in_port);