126 lines
2.8 KiB
C
126 lines
2.8 KiB
C
|
/*
|
||
|
* Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
|
||
|
*
|
||
|
* This document is the property of Apple Computer, Inc.
|
||
|
* It is considered confidential and proprietary.
|
||
|
*
|
||
|
* This document may not be reproduced or transmitted in any form,
|
||
|
* in whole or in part, without the express written permission of
|
||
|
* Apple Computer, Inc.
|
||
|
*/
|
||
|
#include <debug.h>
|
||
|
#include <lib/heap.h>
|
||
|
#include <lib/net/mbuf.h>
|
||
|
|
||
|
#ifndef CPU_CACHELINE_SIZE
|
||
|
# define CPU_CACHELINE_SIZE 32
|
||
|
#endif
|
||
|
|
||
|
mymbuf_t * mbuf_initialize(int packetsize,int header,int tail)
|
||
|
{
|
||
|
mymbuf_t *p = calloc(1, sizeof(mymbuf_t));
|
||
|
|
||
|
p->primarydata = memalign(packetsize + header+tail, CPU_CACHELINE_SIZE);
|
||
|
p->offset = header;
|
||
|
p->allocated_length = packetsize+header+tail;
|
||
|
p->current_length = 0;
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
char *mbuf_head(mymbuf_t *buffer,int len)
|
||
|
{
|
||
|
// mbufentry_t **curr = &buffer->first;
|
||
|
// mbufentry_t *last;
|
||
|
|
||
|
if(len <= buffer->offset && buffer->first == 0) {
|
||
|
char *ret;
|
||
|
//We have space in our buffer, let's just decrease offset and copy the data in
|
||
|
ret = (buffer->primarydata + buffer->offset)-len;
|
||
|
buffer->offset -= len;
|
||
|
buffer->current_length += len;
|
||
|
return ret;
|
||
|
} else {
|
||
|
printf("Request for %d bytes, only %d available\n",len,buffer->offset);
|
||
|
/*
|
||
|
while((*curr)->next) {
|
||
|
curr = &(*curr)->next;
|
||
|
}
|
||
|
// first element
|
||
|
if(*curr == 0) {
|
||
|
buffer->first = malloc(sizeof(mbufentry_t));
|
||
|
last = buffer->first;
|
||
|
} else {
|
||
|
last = (*curr)->next = malloc(sizeof(mbufentry_t));
|
||
|
}
|
||
|
last->len = len;
|
||
|
last->data = malloc(len);
|
||
|
last->flag = ENTRY_FLAG_ALLOCATED;
|
||
|
last->next = 0;
|
||
|
memcpy(last->data,indata,len);
|
||
|
buffer->length += len;
|
||
|
*/
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
char *mbuf_tail(mymbuf_t *buffer,int len)
|
||
|
{
|
||
|
if(buffer->offset+buffer->current_length+len <= buffer->allocated_length) {
|
||
|
char *ret;
|
||
|
ret = buffer->primarydata+buffer->offset + buffer->current_length;
|
||
|
buffer->current_length += len;
|
||
|
return ret;
|
||
|
} else {
|
||
|
return 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int mbuf_copy(mymbuf_t *dest, const mymbuf_t *src)
|
||
|
{
|
||
|
if (dest->allocated_length < src->current_length)
|
||
|
return -1;
|
||
|
|
||
|
dest->offset = 0;
|
||
|
dest->current_length = src->current_length;
|
||
|
memcpy(dest->primarydata, src->primarydata + src->offset, dest->current_length);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int mbuf_getlength(mymbuf_t *buffer)
|
||
|
{
|
||
|
return buffer->current_length;
|
||
|
}
|
||
|
int mbuf_getallocatedlength(mymbuf_t *buffer)
|
||
|
{
|
||
|
return buffer->allocated_length;
|
||
|
}
|
||
|
|
||
|
void mbuf_setlength(mymbuf_t *buffer,int length)
|
||
|
{
|
||
|
buffer->current_length = length;
|
||
|
}
|
||
|
void mbuf_setoffset(mymbuf_t *buffer,int offset)
|
||
|
{
|
||
|
buffer->offset = offset;
|
||
|
}
|
||
|
|
||
|
char *mbuf_getlinear(mymbuf_t *buf)
|
||
|
{
|
||
|
if(buf->first) {
|
||
|
printf("getlinjear: not supported\n");
|
||
|
return 0;
|
||
|
}
|
||
|
return buf->primarydata+buf->offset;
|
||
|
|
||
|
}
|
||
|
void mbuf_destroy(mymbuf_t *buff)
|
||
|
{
|
||
|
if(buff->first) {
|
||
|
printf("Not supported\n");
|
||
|
return;
|
||
|
}
|
||
|
free(buff->primarydata);
|
||
|
free(buff);
|
||
|
}
|