Move to Jamfile build system.

Fix warnings that now show up,
Define a new string_token type, used stack-wide, and make net_attribute_id a string_token.
Store layers packets type/subtype as string_tokens, improving performance in
send_up()/send_down() matching layers lookup process.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6078 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Philippe Houdoin
2004-01-14 21:38:53 +00:00
parent b6accc1d54
commit c9d4838a87
13 changed files with 137 additions and 78 deletions
@@ -0,0 +1,14 @@
SubDir OBOS_TOP src tests kits net new_stack stack ;
UseHeaders [ FDirName $(OBOS_TOP) src tests kits net new_stack headers ] ;
Addon <userland>stack : userland network_v2 :
stack.c
attribute.c
layers_manager.c
buffer.c
timer.c
dump.c
;
LinkSharedOSLibs <userland>stack : <installed>stack_tester be ;
+20 -28
View File
@@ -8,7 +8,6 @@
#include "net_stack.h"
#include "memory_pool.h"
#include "atomizer.h"
#include "attribute.h"
#define DPRINTF printf
@@ -18,8 +17,6 @@
static memory_pool *g_attributes_pool = NULL;
extern memory_pool_module_info *g_memory_pool;
#define DEFAULT_ATOMIZER (const void *) (-1)
atomizer_module_info *g_atomizer = NULL;
// Privates prototypes
// -------------------
@@ -27,25 +24,6 @@ atomizer_module_info *g_atomizer = NULL;
// LET'S GO FOR IMPLEMENTATION
// ------------------------------------
const void * register_attribute_id(const char *name)
{
status_t status;
if (g_atomizer == NULL) {
status = get_module(B_ATOMIZER_MODULE_NAME, (module_info **) &g_atomizer);
if (status != B_OK) {
dprintf("register_attribute_id(%s): Can't load " B_ATOMIZER_MODULE_NAME " module!\n", name);
g_atomizer = (atomizer_module_info *) -1;
};
};
if (g_atomizer == (atomizer_module_info *) -1)
return NULL;
return g_atomizer->atomize(DEFAULT_ATOMIZER, name, true);
}
net_attribute * new_attribute(net_attribute **in_list, const void *id)
{
net_attribute *attr;
@@ -122,11 +100,25 @@ net_attribute * find_attribute(net_attribute *list, const void *id, int *type,
if (size) *size = attr->size;
if (value) {
switch (attr->type & NET_ATTRIBUTE_TYPE_MASK) {
case NET_ATTRIBUTE_BOOL: *value = &attr->u.boolean; break;
case NET_ATTRIBUTE_BYTE: *value = &attr->u.byte; break;
case NET_ATTRIBUTE_INT16: *value = &attr->u.word; break;
case NET_ATTRIBUTE_INT32: *value = &attr->u.dword; break;
case NET_ATTRIBUTE_INT64: *value = &attr->u.ddword; break;
case NET_ATTRIBUTE_BOOL:
*value = &attr->u.boolean;
break;
case NET_ATTRIBUTE_BYTE:
*value = &attr->u.byte;
break;
case NET_ATTRIBUTE_INT16:
*value = &attr->u.word;
break;
case NET_ATTRIBUTE_INT32:
*value = &attr->u.dword;
break;
case NET_ATTRIBUTE_INT64:
*value = &attr->u.ddword;
break;
case NET_ATTRIBUTE_DATA:
case NET_ATTRIBUTE_STRING:
@@ -134,7 +126,7 @@ net_attribute * find_attribute(net_attribute *list, const void *id, int *type,
break;
case NET_ATTRIBUTE_POINTER:
*value = attr->u.vec[0].iov_base;
*value = attr->u.ptr;
break;
case NET_ATTRIBUTE_IOVEC:
@@ -5,18 +5,18 @@
#ifndef OBOS_NET_STACK_ATTRIBUTE_H
#define OBOS_NET_STACK_ATTRIBUTE_H
#include <SupportDefs.h>
#include <iovec.h>
#include <SupportDefs.h>
#include "net_stack.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct net_attribute
{
typedef struct net_attribute {
struct net_attribute *next;
const void *id;
string_token id;
uint32 type;
uint32 size;
union {
@@ -31,10 +31,10 @@ typedef struct net_attribute
} u;
} net_attribute;
extern const void * register_attribute_id(const char *name);
extern net_attribute * new_attribute(net_attribute **in_list, const void *id);
extern net_attribute * new_attribute(net_attribute **in_list, string_token id);
extern status_t delete_attribute(net_attribute *attribut, net_attribute **from_list);
extern net_attribute * find_attribute(net_attribute *list, const void *id, int *type, void **value, size_t *size);
extern net_attribute * find_attribute(net_attribute *list, string_token id, int *type, void **value, size_t *size);
#ifdef __cplusplus
}
+6 -8
View File
@@ -13,8 +13,7 @@
#include "buffer.h"
#include "attribute.h"
typedef struct net_buffer_chunk
{
typedef struct net_buffer_chunk {
struct net_buffer_chunk *next;
struct net_buffer_chunk *next_data;
uint32 ref_count; // this data is referenced by 'ref_count' net_buffer_chunk(s)
@@ -35,8 +34,7 @@ struct net_buffer {
net_attribute *attributes; // buffer attributes
};
struct net_buffer_queue
{
struct net_buffer_queue {
benaphore lock;
sem_id sync;
volatile int32 waiting;
@@ -291,7 +289,7 @@ net_buffer * split_buffer(net_buffer *buffer, uint32 offset)
}
// --------------------------------------------------
status_t concatenate_buffers(net_buffer *begin_buffer, net_buffer *end_buffer)
status_t merge_buffers(net_buffer *begin_buffer, net_buffer *end_buffer)
{
return B_ERROR;
}
@@ -563,9 +561,9 @@ status_t add_buffer_attribute(net_buffer *buffer, const void *id, int type, ...)
if (type & FROM_BUFFER) {
va_list args;
net_buffer_chunk *chunk;
int offset;
uint32 offset_in_chunk;
int size;
uint32 offset;
uint32 offset_in_chunk;
uint32 size;
uint8 *ptr;
type = (type & NET_ATTRIBUTE_FLAGS_MASK);
+2 -2
View File
@@ -13,8 +13,8 @@
extern "C" {
#endif
extern status_t start_buffers_service();
extern status_t stop_buffers_service();
extern status_t start_buffers_service(void);
extern status_t stop_buffers_service(void);
// Network buffer(s)
extern net_buffer * new_buffer(void);
@@ -3,6 +3,8 @@
#include <drivers/module.h>
#include <drivers/KernelExport.h>
#include "dump.h"
// --------------------------------------------------
void dump_memory
(
@@ -13,6 +13,7 @@
#include "memory_pool.h"
#include "layers_manager.h"
#include "buffer.h"
#include "stack.h" // for string_{to|for}_token()
struct layers_list {
struct net_layer *first;
@@ -30,18 +31,19 @@ static status_t delete_layer(net_layer *layer);
extern memory_pool_module_info *g_memory_pool;
char joker_type[] = "*";
string_token g_joker_token = 0;
// #pragma mark [Start/Stop functions]
// --------------------------------------------------
status_t start_layers_manager()
status_t start_layers_manager(void)
{
void *module_list;
net_layer *layer;
g_joker_token = string_to_token("*");
g_layers.first = NULL;
g_layers.lock = create_sem(1, "net_layers list lock");
@@ -54,7 +56,7 @@ status_t start_layers_manager()
// Load all network/interfaces/* modules and let them
// register any layer they may support by calling init()
module_list = open_module_list(NET_LAYER_MODULES_ROOT);
module_list = open_module_list(NET_MODULES_ROOT);
if (module_list) {
size_t sz;
char module_name[256];
@@ -92,7 +94,7 @@ status_t start_layers_manager()
}
// --------------------------------------------------
status_t stop_layers_manager()
status_t stop_layers_manager(void)
{
net_layer *layer, *next;
const char *module_name;
@@ -160,7 +162,8 @@ status_t register_layer(const char *name, const char *type, int priority,
release_sem(g_layers.lock);
dprintf("layers_manager: '%s' layer, registering %s/%s type\n", layer->name, layer->type, layer->sub_type);
dprintf("layers_manager: '%s' layer, registering %s/%s type\n", layer->name,
string_for_token(layer->type), string_for_token(layer->sub_type));
if (_layer)
*_layer = layer;
@@ -274,7 +277,7 @@ status_t find_layer_attribute(net_layer *layer, const void *id, int *type,
// --------------------------------------------------
status_t send_up(net_layer *layer, net_buffer *buffer)
status_t send_layers_up(net_layer *layer, net_buffer *buffer)
{
net_layer *above;
status_t status;
@@ -291,7 +294,7 @@ status_t send_up(net_layer *layer, net_buffer *buffer)
// TODO: lookup thru a previoulsy (at each layer [un]registration time) built list of
// "above" layers of caller layer.
// dprintf("layers_manager: send_up(): layer %s (%s/%s), searching a matching upper layer...\n",
// dprintf("layers_manager: send_layers_up(): layer %s (%x/%x), searching a matching upper layer...\n",
// layer->name, layer->type, layer->sub_type);
// HACK: today, we lookup thru ALL :-( registered layers.
@@ -299,21 +302,21 @@ status_t send_up(net_layer *layer, net_buffer *buffer)
// it never change until layers list change herself...
above = g_layers.first;
while (above) {
// dprintf("layers_manager: send_up: Matching against layer %s (%s/%s) ?\n",
// dprintf("layers_manager: send_layers_up: Matching against layer %s (%x/%x) ?\n",
// above->name, above->type, above->sub_type);
if ( above->module->process_input &&
(strcmp(above->type, joker_type) == 0 ||
(strcmp(above->type, layer->sub_type) == 0)) ) {
( (above->type == g_joker_token) || (above->type == layer->sub_type) ) ) {
/*
dprintf("layers_manager: send_up: handing buffer from %s/%s (%s) to %s/%s (%s)...\n",
dprintf("layers_manager: send_layers_up: handing buffer from %x/%x (%s) to %x/%x (%s)...\n",
layer->type, layer->sub_type, layer->name,
above->type, above->sub_type, above->name);
*/
release_sem(g_layers.lock);
status = above->module->process_input(above, buffer);
if (status == B_OK) {
atomic_add(&above->use_count, 1);
atomic_add(&above->use_count, 1);
// TODO: resort this layer with previous one, if required.
return status;
};
@@ -329,7 +332,7 @@ status_t send_up(net_layer *layer, net_buffer *buffer)
// --------------------------------------------------
status_t send_down(net_layer *layer, net_buffer *buffer)
status_t send_layers_down(net_layer *layer, net_buffer *buffer)
{
net_layer *below;
status_t status;
@@ -385,12 +388,12 @@ static net_layer * new_layer(const char *name, const char *type, int priority,
tmp = strdup(type);
t = strtok_r(tmp, "/", &n);
layer->type = (t ? strdup(t) : joker_type);
layer->type = (t ? string_to_token(t) : g_joker_token);
t = strtok_r(NULL, " ", &n);
layer->sub_type = (t ? strdup(t) : joker_type);
layer->sub_type = (t ? string_to_token(t) : g_joker_token);
free(tmp);
} else
layer->type = layer->sub_type = NULL;
layer->type = layer->sub_type = 0;
layer->priority = priority;
@@ -416,10 +419,6 @@ static status_t delete_layer(net_layer *layer)
if (layer->name)
free(layer->name);
if (layer->type && layer->type != joker_type)
free(layer->type);
if (layer->sub_type && layer->type != joker_type)
free(layer->sub_type);
if (layer->layers_above)
free(layer->layers_above);
@@ -11,8 +11,8 @@
extern "C" {
#endif
extern status_t start_layers_manager();
extern status_t stop_layers_manager();
extern status_t start_layers_manager(void);
extern status_t stop_layers_manager(void);
extern status_t register_layer(const char *name, const char *type, int priority,
net_layer_module_info *module, void *cookie, net_layer **layer);
@@ -24,8 +24,8 @@ extern status_t remove_layer_attribute(net_layer *layer, const void *id);
extern status_t find_layer_attribute(net_layer *layer, const void *id,
int *type, void **attribute, size_t *size);
extern status_t send_up(net_layer *me, struct net_buffer *buffer);
extern status_t send_down(net_layer *me, struct net_buffer *buffer);
extern status_t send_layers_up(net_layer *me, struct net_buffer *buffer);
extern status_t send_layers_down(net_layer *me, struct net_buffer *buffer);
#ifdef __cplusplus
+48 -4
View File
@@ -10,7 +10,9 @@
#include "net_stack.h"
#include "memory_pool.h"
#include "atomizer.h"
#include "stack.h"
#include "attribute.h"
#include "layers_manager.h"
#include "buffer.h"
@@ -18,6 +20,8 @@
#include "dump.h"
memory_pool_module_info *g_memory_pool = NULL;
atomizer_module_info *g_atomizer = NULL;
#define DEFAULT_ATOMIZER (const void *) (-1)
static bool g_started = false;
@@ -62,6 +66,45 @@ static status_t stop(void)
}
string_token string_to_token(const char *name)
{
status_t status;
if (g_atomizer == NULL) {
status = get_module(B_ATOMIZER_MODULE_NAME, (module_info **) &g_atomizer);
if (status != B_OK) {
dprintf("string_to_token(%s): Can't load " B_ATOMIZER_MODULE_NAME " module!\n", name);
g_atomizer = (atomizer_module_info *) -1;
};
};
if (g_atomizer == (atomizer_module_info *) -1)
return NULL;
return g_atomizer->atomize(DEFAULT_ATOMIZER, name, true);
}
const char * string_for_token(string_token token)
{
status_t status;
if (g_atomizer == NULL) {
status = get_module(B_ATOMIZER_MODULE_NAME, (module_info **) &g_atomizer);
if (status != B_OK) {
dprintf("string_for_token(%x): Can't load " B_ATOMIZER_MODULE_NAME " module!\n", (int) token);
g_atomizer = (atomizer_module_info *) -1;
};
};
if (g_atomizer == (atomizer_module_info *) -1)
return NULL;
return g_atomizer->string_for_token(DEFAULT_ATOMIZER, token);
}
// #pragma mark -
struct net_stack_module_info nsmi = {
@@ -75,8 +118,9 @@ struct net_stack_module_info nsmi = {
start,
stop,
// Attributs IDs
register_attribute_id,
// String tokens
string_to_token,
string_for_token,
// Layers handling
register_layer,
@@ -86,8 +130,8 @@ struct net_stack_module_info nsmi = {
remove_layer_attribute,
find_layer_attribute,
send_up,
send_down,
send_layers_up,
send_layers_down,
// net_buffer support
new_buffer,
@@ -0,0 +1,9 @@
#ifndef STACK_H
#define STACK_H
#include "net_stack.h"
extern string_token string_to_token(const char *name);
extern const char * string_for_token(string_token token);
#endif
+3 -2
View File
@@ -13,6 +13,7 @@
#include <OS.h>
#include "net_stack.h"
#include "timer.h"
struct net_timer {
struct net_timer *next;
@@ -40,7 +41,7 @@ static int32 timers_thread(void *data);
// --------------------------------------------------
status_t start_timers_service()
status_t start_timers_service(void)
{
memset(&g_timers, 0, sizeof(g_timers));
@@ -68,7 +69,7 @@ status_t start_timers_service()
// --------------------------------------------------
status_t stop_timers_service()
status_t stop_timers_service(void)
{
net_timer *nt, *next;
int32 tries = 20;
+2 -2
View File
@@ -21,8 +21,8 @@
extern "C" {
#endif
extern status_t start_timers_service();
extern status_t stop_timers_service();
extern status_t start_timers_service(void);
extern status_t stop_timers_service(void);
extern net_timer * new_net_timer(void);
extern status_t delete_net_timer(net_timer *nt);