Line data Source code
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>
7 : #include <pkt/control_interface.h>
8 :
9 1 : PacketBufferManager::PacketBufferManager(PktModule *pkt_module) :
10 1 : alloc_(0), free_(0), pkt_module_(pkt_module) {
11 1 : }
12 :
13 2 : PacketBufferManager::~PacketBufferManager() {
14 2 : }
15 :
16 0 : PacketBufferPtr PacketBufferManager::Allocate(uint32_t module, uint16_t len,
17 : uint32_t mdata) {
18 0 : PacketBufferPtr ptr(new PacketBuffer(this, module, len, mdata));
19 0 : alloc_++;
20 0 : return ptr;
21 : }
22 :
23 0 : 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 0 : data_len, mdata));
30 0 : alloc_++;
31 0 : return ptr;
32 : }
33 :
34 0 : void PacketBufferManager::FreeIndication(PacketBuffer *pkt) {
35 0 : free_++;
36 0 : }
37 :
38 0 : PacketBuffer::PacketBuffer(PacketBufferManager *mgr, uint32_t module,
39 0 : uint16_t len, uint32_t mdata) :
40 0 : buffer_(new uint8_t[len]), buffer_len_(len), data_(buffer_.get()),
41 0 : data_len_(len), module_(module), mdata_(mdata), mgr_(mgr) {
42 0 : }
43 :
44 0 : PacketBuffer::PacketBuffer(PacketBufferManager *mgr, uint32_t module,
45 : uint8_t *buff, uint16_t len, uint16_t data_offset,
46 0 : uint16_t data_len, uint32_t mdata) :
47 0 : buffer_(buff), buffer_len_(len), data_(buffer_.get() + data_offset),
48 0 : data_len_(data_len), module_(module), mdata_(mdata), mgr_(mgr) {
49 0 : }
50 :
51 0 : PacketBuffer::~PacketBuffer() {
52 0 : mgr_->FreeIndication(this);
53 0 : data_ = NULL;
54 0 : }
55 :
56 0 : uint8_t *PacketBuffer::data() const {
57 0 : return data_;
58 : }
59 :
60 0 : uint16_t PacketBuffer::data_len() const {
61 0 : return data_len_;
62 : }
63 :
64 : // Move data pointer to offset specified
65 0 : bool PacketBuffer::SetOffset(uint16_t offset) {
66 0 : if (offset > data_len_)
67 0 : return false;
68 0 : data_ += offset;
69 0 : data_len_ -= offset;
70 0 : return true;
71 : }
72 :
73 : // Set data_len in packet buffer
74 0 : void PacketBuffer::set_len(uint32_t len) {
75 0 : uint32_t offset = data_ - buffer_.get();
76 :
77 : // Check if there is enough space first
78 0 : assert((buffer_len_ - offset) >= len);
79 0 : data_len_ = len;
80 0 : }
|