void csp_buffer_free(void *packet) { if (!packet) { csp_log_error("Attempt to free null pointer\r\n"); return; } csp_skbf_t * buf = packet - sizeof(csp_skbf_t); if (((uintptr_t) buf % CSP_BUFFER_ALIGN) > 0) { csp_log_error("FREE: Unaligned CSP buffer pointer %p\r\n", packet); return; } if (buf->skbf_addr != buf) { csp_log_error("FREE: Invalid CSP buffer pointer %p\r\n", packet); return; } if (buf->refcount == 0) { csp_log_error("FREE: Buffer already free %p\r\n", buf); return; } else if (buf->refcount > 1) { buf->refcount--; csp_log_error("FREE: Buffer %p in use by %u users\r\n", buf, buf->refcount); return; } else { buf->refcount = 0; csp_log_buffer("FREE: %p\r\n", buf); csp_queue_enqueue(csp_buffers, &buf, 0); } }
void *csp_buffer_get(size_t buf_size) { csp_skbf_t * buffer = NULL; if (buf_size + CSP_BUFFER_PACKET_OVERHEAD > size) { csp_log_error("Attempt to allocate too large block %u\r\n", buf_size); return NULL; } csp_queue_dequeue(csp_buffers, &buffer, 0); if (buffer == NULL) { csp_log_error("Out of buffers\r\n"); return NULL; } csp_log_buffer("GET: %p %p\r\n", buffer, buffer->skbf_addr); if (buffer != buffer->skbf_addr) { csp_log_error("Corrupt CSP buffer\r\n"); return NULL; } buffer->refcount++; return buffer->skbf_data; }
void *csp_buffer_get(size_t buf_size) { void *buffer; if (buf_size + CSP_BUFFER_PACKET_OVERHEAD > size) { csp_log_error("Attempt to allocate too large block %u\r\n", buf_size); return NULL; } csp_queue_dequeue(csp_buffers, &buffer, 0); if (buffer != NULL) { csp_log_buffer("BUFFER: Using element at %p\r\n", buffer); } else { csp_log_error("Out of buffers\r\n"); } return buffer; }
void csp_buffer_free(void *packet) { csp_log_buffer("BUFFER: Free element at %p\r\n", packet); csp_queue_enqueue(csp_buffers, &packet, 0); }