OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
packet_buffer.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved.
3  */
4 #include <string>
5 #include <boost/shared_ptr.hpp>
6 #include <pkt/packet_buffer.h>
8 
10  alloc_(0), free_(0), pkt_module_(pkt_module) {
11 }
12 
14 }
15 
16 PacketBufferPtr PacketBufferManager::Allocate(uint32_t module, uint16_t len,
17  uint32_t mdata) {
18  PacketBufferPtr ptr(new PacketBuffer(this, module, len, mdata));
19  alloc_++;
20  return ptr;
21 }
22 
23 PacketBufferPtr PacketBufferManager::Allocate(uint32_t module, uint8_t *buff,
24  uint16_t len,
25  uint16_t data_offset,
26  uint16_t data_len,
27  uint32_t mdata) {
28  PacketBufferPtr ptr(new PacketBuffer(this, module, buff, len, data_offset,
29  data_len, mdata));
30  alloc_++;
31  return ptr;
32 }
33 
35  free_++;
36 }
37 
39  uint16_t len, uint32_t mdata) :
40  buffer_(new uint8_t[len]), buffer_len_(len), data_(buffer_.get()),
41  data_len_(len), module_(module), mdata_(mdata), mgr_(mgr) {
42 }
43 
45  uint8_t *buff, uint16_t len, uint16_t data_offset,
46  uint16_t data_len, uint32_t mdata) :
47  buffer_(buff), buffer_len_(len), data_(buffer_.get() + data_offset),
48  data_len_(data_len), module_(module), mdata_(mdata), mgr_(mgr) {
49 }
50 
52  mgr_->FreeIndication(this);
53  data_ = NULL;
54 }
55 
56 uint8_t *PacketBuffer::data() const {
57  return data_;
58 }
59 
60 uint16_t PacketBuffer::data_len() const {
61  return data_len_;
62 }
63 
64 // Move data pointer to offset specified
65 bool PacketBuffer::SetOffset(uint16_t offset) {
66  if (offset > data_len_)
67  return false;
68  data_ += offset;
69  data_len_ -= offset;
70  return true;
71 }
72 
73 // Set data_len in packet buffer
74 void PacketBuffer::set_len(uint32_t len) {
75  uint32_t offset = data_ - buffer_.get();
76 
77  // Check if there is enough space first
78  assert((buffer_len_ - offset) >= len);
79  data_len_ = len;
80 }
virtual ~PacketBuffer()
boost::shared_ptr< PacketBuffer > PacketBufferPtr
Definition: packet_buffer.h:18
void set_len(uint32_t len)
uint8_t * data_
Definition: packet_buffer.h:50
friend class PacketBuffer
Definition: packet_buffer.h:70
uint16_t buffer_len_
Definition: packet_buffer.h:48
PacketBuffer(PacketBufferManager *mgr, uint32_t module, uint16_t len, uint32_t mdata)
boost::shared_array< uint8_t > buffer_
Definition: packet_buffer.h:47
uint16_t data_len_
Definition: packet_buffer.h:51
uint8_t * data() const
virtual ~PacketBufferManager()
PacketBufferManager * mgr_
Definition: packet_buffer.h:55
PacketBufferManager(PktModule *pkt_module)
Definition: packet_buffer.cc:9
uint16_t data_len() const
PacketBufferPtr Allocate(uint32_t module, uint16_t len, uint32_t mdata)
void FreeIndication(PacketBuffer *)
bool SetOffset(uint16_t offset)