net_buffer: preparing for better metadata management

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21210 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Hugo Santos
2007-05-23 03:48:23 +00:00
parent 57f13ad210
commit 79a0d25245
16 changed files with 109 additions and 114 deletions
+32 -26
View File
@@ -62,6 +62,11 @@ struct data_header {
struct net_buffer_private : net_buffer {
struct list buffers;
data_node first_node;
struct {
struct sockaddr_storage source;
struct sockaddr_storage destination;
} storage;
};
@@ -328,8 +333,12 @@ create_buffer(size_t headerSpace)
list_init(&buffer->buffers);
list_add_item(&buffer->buffers, &buffer->first_node);
buffer->source.ss_len = 0;
buffer->destination.ss_len = 0;
buffer->source = (sockaddr *)&buffer->storage.source;
buffer->destination = (sockaddr *)&buffer->storage.destination;
buffer->storage.source.ss_len = 0;
buffer->storage.destination.ss_len = 0;
buffer->interface = NULL;
buffer->offset = 0;
buffer->flags = 0;
@@ -355,6 +364,22 @@ free_buffer(net_buffer *_buffer)
}
static void
copy_metadata(net_buffer *destination, const net_buffer *source)
{
memcpy(destination->source, source->source,
min_c(source->source->sa_len, sizeof(sockaddr_storage)));
memcpy(destination->destination, source->destination,
min_c(source->destination->sa_len, sizeof(sockaddr_storage)));
destination->flags = source->flags;
destination->interface = source->interface;
destination->offset = source->offset;
destination->size = source->size;
destination->protocol = source->protocol;
}
/*! Creates a duplicate of the \a buffer. The new buffer does not share internal
storage; they are completely independent from each other.
*/
@@ -381,18 +406,7 @@ duplicate_buffer(net_buffer *_buffer)
break;
}
// copy meta data from source buffer
memcpy(&duplicate->source, &buffer->source,
min_c(buffer->source.ss_len, sizeof(sockaddr_storage)));
memcpy(&duplicate->destination, &buffer->destination,
min_c(buffer->destination.ss_len, sizeof(sockaddr_storage)));
duplicate->flags = buffer->flags;
duplicate->interface = buffer->interface;
duplicate->offset = buffer->offset;
duplicate->size = buffer->size;
duplicate->protocol = buffer->protocol;
copy_metadata(duplicate, buffer);
return duplicate;
}
@@ -423,6 +437,9 @@ clone_buffer(net_buffer *_buffer, bool shareFreeSpace)
return NULL;
}
clone->source = (sockaddr *)&clone->storage.source;
clone->destination = (sockaddr *)&clone->storage.destination;
list_init(&clone->buffers);
// grab reference to this buffer - all additional nodes will get
@@ -465,18 +482,7 @@ clone_buffer(net_buffer *_buffer, bool shareFreeSpace)
}
}
// copy meta data from source buffer
memcpy(&clone->source, &buffer->source,
min_c(buffer->source.ss_len, sizeof(sockaddr_storage)));
memcpy(&clone->destination, &buffer->destination,
min_c(buffer->destination.ss_len, sizeof(sockaddr_storage)));
clone->flags = buffer->flags;
clone->interface = buffer->interface;
clone->offset = buffer->offset;
clone->size = buffer->size;
clone->protocol = buffer->protocol;
copy_metadata(clone, buffer);
return clone;
}