1/* 2 * Copyright 2007 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com 3 * All rights reserved. Distributed under the terms of the MIT License. 4 */ 5#ifndef _SNET_BUFFER_H_ 6#define _SNET_BUFFER_H_ 7 8#include <util/list.h> 9 10/* 11 * This is a simple data structure to hold network buffers. 12 * It drops many functionality that the Haiku net_buffer provides. 13 * 14 * - Inspired by linux sk_buff/bsd mbuf (put/pull) 15 * - Contiguoussafe (no push operation) 16 * 17 * So snet_buffers are ONLY meant to be used when: 18 * 1) You know exactily the maximun/final size of the frame 19 * before allocating it, and you will never exceed it. 20 * 2) You are not supposed to prepend data, only append. 21 * 22 */ 23 24/* Configuration parameters */ 25#define SNB_BUFFER_ATTACHED 26//#define SNB_PERFORMS_OVERFLOW_CHECKS 27//#define SNB_PERFORMS_POINTER_CHECKS 28 29struct snet_buffer; 30 31typedef struct snet_buffer snet_buffer; 32 33/* Creates a snb_buffer allocating size space for its full content */ 34snet_buffer* snb_create(uint16 size); 35/* Free the snb_buffer*/ 36void snb_free(snet_buffer* snb); 37/* Free the snb_buffer*/ 38void* snb_get(snet_buffer* snb); 39/* Size of the snb_buffer*/ 40uint16 snb_size(snet_buffer* snb); 41 42/* Cookie of the snb_buffer*/ 43void* snb_cookie(snet_buffer* snb); 44/* Get Cookie of the snb_buffer*/ 45void snb_set_cookie(snet_buffer* snb, void* cookie); 46 47/* Place the memory given by data to the "tail" of the snb */ 48void snb_put(snet_buffer* snb, void* data, uint16 size); 49/* Returns a header chunk of size data */ 50void* snb_pull(snet_buffer* snb, uint16 size); 51/* Discards all data put or pulled from the buffer */ 52void snb_reset(snet_buffer* snb); 53 54/* Return true if we canot "put" more data in the buffer */ 55bool snb_completed(snet_buffer* snb); 56/* Return true if we cannot pull more more data from the buffer */ 57bool snb_finished(snet_buffer* snb); 58/* Return the amount of data we can still put in the buffer */ 59uint16 snb_remaining_to_put(snet_buffer* snb); 60/* Return the amount of data we can still pull in the buffer */ 61uint16 snb_remaining_to_pull(snet_buffer* snb); 62 63/* These to functions are provided to avoid memory fragmentation 64 * allocating and freeing many snb_buffers and its possible overhead. 65 * Thypical scenario would be 66 * that you create a snb_buffer to send data, once you send you free it, 67 * and need another one to hold the response. The idea would be once you send 68 * that buffer, to snb_park the buffer, and whenever you need to allocate 69 * another one snb_fetch it. That funcion will reuse most appropiated 70 * previous used one snb_buff by its memory use. 71 */ 72void snb_park(struct list* l, snet_buffer* snb); 73snet_buffer* snb_fetch(struct list* l, uint16 size); 74uint16 snb_packets(struct list* l); 75 76void snb_dump(snet_buffer* snb); 77 78#endif 79