Kev Mann / mbed-dev-OS5_10_4
Committer:
kevman
Date:
Wed Nov 28 15:10:15 2018 +0000
Revision:
0:38ceb79fef03
RTC modified

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 0:38ceb79fef03 1 /* Copyright (c) 2017 ARM Limited
kevman 0:38ceb79fef03 2 *
kevman 0:38ceb79fef03 3 * Licensed under the Apache License, Version 2.0 (the "License");
kevman 0:38ceb79fef03 4 * you may not use this file except in compliance with the License.
kevman 0:38ceb79fef03 5 * You may obtain a copy of the License at
kevman 0:38ceb79fef03 6 *
kevman 0:38ceb79fef03 7 * http://www.apache.org/licenses/LICENSE-2.0
kevman 0:38ceb79fef03 8 *
kevman 0:38ceb79fef03 9 * Unless required by applicable law or agreed to in writing, software
kevman 0:38ceb79fef03 10 * distributed under the License is distributed on an "AS IS" BASIS,
kevman 0:38ceb79fef03 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 0:38ceb79fef03 12 * See the License for the specific language governing permissions and
kevman 0:38ceb79fef03 13 * limitations under the License.
kevman 0:38ceb79fef03 14 */
kevman 0:38ceb79fef03 15
kevman 0:38ceb79fef03 16 #include "pbuf.h"
kevman 0:38ceb79fef03 17 #include "LWIPMemoryManager.h"
kevman 0:38ceb79fef03 18
kevman 0:38ceb79fef03 19 emac_mem_buf_t *LWIPMemoryManager::alloc_heap(uint32_t size, uint32_t align)
kevman 0:38ceb79fef03 20 {
kevman 0:38ceb79fef03 21 struct pbuf *pbuf = pbuf_alloc(PBUF_RAW, size + align, PBUF_RAM);
kevman 0:38ceb79fef03 22 if (pbuf == NULL) {
kevman 0:38ceb79fef03 23 return NULL;
kevman 0:38ceb79fef03 24 }
kevman 0:38ceb79fef03 25
kevman 0:38ceb79fef03 26 align_memory(pbuf, align);
kevman 0:38ceb79fef03 27
kevman 0:38ceb79fef03 28 return static_cast<emac_mem_buf_t *>(pbuf);
kevman 0:38ceb79fef03 29 }
kevman 0:38ceb79fef03 30
kevman 0:38ceb79fef03 31 emac_mem_buf_t *LWIPMemoryManager::alloc_pool(uint32_t size, uint32_t align)
kevman 0:38ceb79fef03 32 {
kevman 0:38ceb79fef03 33 uint32_t total_align = count_total_align(size, align);
kevman 0:38ceb79fef03 34
kevman 0:38ceb79fef03 35 struct pbuf *pbuf = pbuf_alloc(PBUF_RAW, size + total_align, PBUF_POOL);
kevman 0:38ceb79fef03 36 if (pbuf == NULL) {
kevman 0:38ceb79fef03 37 return NULL;
kevman 0:38ceb79fef03 38 }
kevman 0:38ceb79fef03 39
kevman 0:38ceb79fef03 40 align_memory(pbuf, align);
kevman 0:38ceb79fef03 41
kevman 0:38ceb79fef03 42 return static_cast<emac_mem_buf_t *>(pbuf);
kevman 0:38ceb79fef03 43 }
kevman 0:38ceb79fef03 44
kevman 0:38ceb79fef03 45 uint32_t LWIPMemoryManager::get_pool_alloc_unit(uint32_t align) const
kevman 0:38ceb79fef03 46 {
kevman 0:38ceb79fef03 47 uint32_t alloc_unit = LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE) - align;
kevman 0:38ceb79fef03 48 return alloc_unit;
kevman 0:38ceb79fef03 49 }
kevman 0:38ceb79fef03 50
kevman 0:38ceb79fef03 51 void LWIPMemoryManager::free(emac_mem_buf_t *buf)
kevman 0:38ceb79fef03 52 {
kevman 0:38ceb79fef03 53 pbuf_free(static_cast<struct pbuf *>(buf));
kevman 0:38ceb79fef03 54 }
kevman 0:38ceb79fef03 55
kevman 0:38ceb79fef03 56 uint32_t LWIPMemoryManager::get_total_len(const emac_mem_buf_t *buf) const
kevman 0:38ceb79fef03 57 {
kevman 0:38ceb79fef03 58 return (static_cast<const struct pbuf *>(buf))->tot_len;
kevman 0:38ceb79fef03 59 }
kevman 0:38ceb79fef03 60
kevman 0:38ceb79fef03 61 void LWIPMemoryManager::copy(emac_mem_buf_t *to_buf, const emac_mem_buf_t *from_buf)
kevman 0:38ceb79fef03 62 {
kevman 0:38ceb79fef03 63 pbuf_copy(static_cast<struct pbuf *>(to_buf), static_cast<const struct pbuf *>(from_buf));
kevman 0:38ceb79fef03 64 }
kevman 0:38ceb79fef03 65
kevman 0:38ceb79fef03 66 void LWIPMemoryManager::copy_to_buf(emac_mem_buf_t *to_buf, const void *ptr, uint32_t len)
kevman 0:38ceb79fef03 67 {
kevman 0:38ceb79fef03 68 pbuf_take(static_cast<struct pbuf *>(to_buf), ptr, len);
kevman 0:38ceb79fef03 69 }
kevman 0:38ceb79fef03 70
kevman 0:38ceb79fef03 71 uint32_t LWIPMemoryManager::copy_from_buf(void *ptr, uint32_t len, const emac_mem_buf_t *from_buf) const
kevman 0:38ceb79fef03 72 {
kevman 0:38ceb79fef03 73 return pbuf_copy_partial(static_cast<const struct pbuf *>(from_buf), ptr, len, 0);
kevman 0:38ceb79fef03 74 }
kevman 0:38ceb79fef03 75
kevman 0:38ceb79fef03 76 void LWIPMemoryManager::cat(emac_mem_buf_t *to_buf, emac_mem_buf_t *cat_buf)
kevman 0:38ceb79fef03 77 {
kevman 0:38ceb79fef03 78 pbuf_cat(static_cast<struct pbuf *>(to_buf), static_cast<struct pbuf *>(cat_buf));
kevman 0:38ceb79fef03 79 }
kevman 0:38ceb79fef03 80
kevman 0:38ceb79fef03 81 emac_mem_buf_t *LWIPMemoryManager::get_next(const emac_mem_buf_t *buf) const
kevman 0:38ceb79fef03 82 {
kevman 0:38ceb79fef03 83 if (!buf) {
kevman 0:38ceb79fef03 84 return NULL;
kevman 0:38ceb79fef03 85 }
kevman 0:38ceb79fef03 86 struct pbuf *next = (static_cast<const struct pbuf *>(buf))->next;
kevman 0:38ceb79fef03 87 return static_cast<emac_mem_buf_t *>(next);
kevman 0:38ceb79fef03 88 }
kevman 0:38ceb79fef03 89
kevman 0:38ceb79fef03 90 void *LWIPMemoryManager::get_ptr(const emac_mem_buf_t *buf) const
kevman 0:38ceb79fef03 91 {
kevman 0:38ceb79fef03 92 return (static_cast<const struct pbuf *>(buf))->payload;
kevman 0:38ceb79fef03 93 }
kevman 0:38ceb79fef03 94
kevman 0:38ceb79fef03 95 uint32_t LWIPMemoryManager::get_len(const emac_mem_buf_t *buf) const
kevman 0:38ceb79fef03 96 {
kevman 0:38ceb79fef03 97 return (static_cast<const struct pbuf *>(buf))->len;
kevman 0:38ceb79fef03 98 }
kevman 0:38ceb79fef03 99
kevman 0:38ceb79fef03 100 void LWIPMemoryManager::set_len(emac_mem_buf_t *buf, uint32_t len)
kevman 0:38ceb79fef03 101 {
kevman 0:38ceb79fef03 102 struct pbuf *pbuf = static_cast<struct pbuf *>(buf);
kevman 0:38ceb79fef03 103 pbuf->len = len;
kevman 0:38ceb79fef03 104 set_total_len(pbuf);
kevman 0:38ceb79fef03 105 }
kevman 0:38ceb79fef03 106
kevman 0:38ceb79fef03 107 uint32_t LWIPMemoryManager::count_total_align(uint32_t size, uint32_t align)
kevman 0:38ceb79fef03 108 {
kevman 0:38ceb79fef03 109 uint32_t buffers = size / get_pool_alloc_unit(align);
kevman 0:38ceb79fef03 110 if (size % get_pool_alloc_unit(align) != 0) {
kevman 0:38ceb79fef03 111 buffers++;
kevman 0:38ceb79fef03 112 }
kevman 0:38ceb79fef03 113 return buffers * align;
kevman 0:38ceb79fef03 114 }
kevman 0:38ceb79fef03 115
kevman 0:38ceb79fef03 116 void LWIPMemoryManager::align_memory(struct pbuf *pbuf, uint32_t align)
kevman 0:38ceb79fef03 117 {
kevman 0:38ceb79fef03 118 if (!align) {
kevman 0:38ceb79fef03 119 return;
kevman 0:38ceb79fef03 120 }
kevman 0:38ceb79fef03 121
kevman 0:38ceb79fef03 122 struct pbuf *pbuf_start = pbuf;
kevman 0:38ceb79fef03 123
kevman 0:38ceb79fef03 124 while (pbuf) {
kevman 0:38ceb79fef03 125 uint32_t remainder = reinterpret_cast<uint32_t>(pbuf->payload) % align;
kevman 0:38ceb79fef03 126 if (remainder) {
kevman 0:38ceb79fef03 127 uint32_t offset = align - remainder;
kevman 0:38ceb79fef03 128 if (offset >= align) {
kevman 0:38ceb79fef03 129 offset = align;
kevman 0:38ceb79fef03 130 }
kevman 0:38ceb79fef03 131 pbuf->payload = static_cast<char *>(pbuf->payload) + offset;
kevman 0:38ceb79fef03 132 }
kevman 0:38ceb79fef03 133 pbuf->len -= align;
kevman 0:38ceb79fef03 134 pbuf = pbuf->next;
kevman 0:38ceb79fef03 135 }
kevman 0:38ceb79fef03 136
kevman 0:38ceb79fef03 137 // Correct total lengths
kevman 0:38ceb79fef03 138 set_total_len(pbuf_start);
kevman 0:38ceb79fef03 139 }
kevman 0:38ceb79fef03 140
kevman 0:38ceb79fef03 141 void LWIPMemoryManager::set_total_len(struct pbuf *pbuf)
kevman 0:38ceb79fef03 142 {
kevman 0:38ceb79fef03 143 if (!pbuf->next) {
kevman 0:38ceb79fef03 144 pbuf->tot_len = pbuf->len;
kevman 0:38ceb79fef03 145 return;
kevman 0:38ceb79fef03 146 }
kevman 0:38ceb79fef03 147
kevman 0:38ceb79fef03 148 uint32_t total_len;
kevman 0:38ceb79fef03 149 struct pbuf *pbuf_tailing;
kevman 0:38ceb79fef03 150
kevman 0:38ceb79fef03 151 while (pbuf) {
kevman 0:38ceb79fef03 152 total_len = pbuf->len;
kevman 0:38ceb79fef03 153
kevman 0:38ceb79fef03 154 pbuf_tailing = pbuf->next;
kevman 0:38ceb79fef03 155 while (pbuf_tailing) {
kevman 0:38ceb79fef03 156 total_len += pbuf_tailing->len;
kevman 0:38ceb79fef03 157 pbuf_tailing = pbuf_tailing->next;
kevman 0:38ceb79fef03 158 }
kevman 0:38ceb79fef03 159
kevman 0:38ceb79fef03 160 pbuf->tot_len = total_len;
kevman 0:38ceb79fef03 161 pbuf = pbuf->next;
kevman 0:38ceb79fef03 162 }
kevman 0:38ceb79fef03 163 }