diff --git a/src/tests/kits/net/new_stack/stack/Jamfile b/src/tests/kits/net/new_stack/stack/Jamfile new file mode 100644 index 0000000000..599ec5f8e9 --- /dev/null +++ b/src/tests/kits/net/new_stack/stack/Jamfile @@ -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 stack : userland network_v2 : + stack.c + attribute.c + layers_manager.c + buffer.c + timer.c + dump.c +; + +LinkSharedOSLibs stack : stack_tester be ; diff --git a/src/tests/kits/net/new_stack/stack/attribute.c b/src/tests/kits/net/new_stack/stack/attribute.c index b0f0c193b7..0f4e6bdd27 100644 --- a/src/tests/kits/net/new_stack/stack/attribute.c +++ b/src/tests/kits/net/new_stack/stack/attribute.c @@ -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: diff --git a/src/tests/kits/net/new_stack/stack/attribute.h b/src/tests/kits/net/new_stack/stack/attribute.h index 0962e99159..ce3ce1d77e 100644 --- a/src/tests/kits/net/new_stack/stack/attribute.h +++ b/src/tests/kits/net/new_stack/stack/attribute.h @@ -5,18 +5,18 @@ #ifndef OBOS_NET_STACK_ATTRIBUTE_H #define OBOS_NET_STACK_ATTRIBUTE_H +#include #include -#include +#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 } diff --git a/src/tests/kits/net/new_stack/stack/buffer.c b/src/tests/kits/net/new_stack/stack/buffer.c index 92049c8042..ddea63bb53 100644 --- a/src/tests/kits/net/new_stack/stack/buffer.c +++ b/src/tests/kits/net/new_stack/stack/buffer.c @@ -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); diff --git a/src/tests/kits/net/new_stack/stack/buffer.h b/src/tests/kits/net/new_stack/stack/buffer.h index 8ae1ac7e1f..28e75f4aff 100644 --- a/src/tests/kits/net/new_stack/stack/buffer.h +++ b/src/tests/kits/net/new_stack/stack/buffer.h @@ -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); diff --git a/src/tests/kits/net/new_stack/stack/dump.c b/src/tests/kits/net/new_stack/stack/dump.c index b7fc4c51a5..66efafa5e4 100644 --- a/src/tests/kits/net/new_stack/stack/dump.c +++ b/src/tests/kits/net/new_stack/stack/dump.c @@ -3,6 +3,8 @@ #include #include +#include "dump.h" + // -------------------------------------------------- void dump_memory ( diff --git a/src/tests/kits/net/new_stack/stack/layers_manager.c b/src/tests/kits/net/new_stack/stack/layers_manager.c index 3a6cd808fc..f529c6896d 100644 --- a/src/tests/kits/net/new_stack/stack/layers_manager.c +++ b/src/tests/kits/net/new_stack/stack/layers_manager.c @@ -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); diff --git a/src/tests/kits/net/new_stack/stack/layers_manager.h b/src/tests/kits/net/new_stack/stack/layers_manager.h index 0933863c44..b9a4c71a67 100644 --- a/src/tests/kits/net/new_stack/stack/layers_manager.h +++ b/src/tests/kits/net/new_stack/stack/layers_manager.h @@ -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 diff --git a/src/tests/kits/net/new_stack/stack/stack.c b/src/tests/kits/net/new_stack/stack/stack.c index f2f699468e..6ca4d9ce26 100644 --- a/src/tests/kits/net/new_stack/stack/stack.c +++ b/src/tests/kits/net/new_stack/stack/stack.c @@ -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, diff --git a/src/tests/kits/net/new_stack/stack/stack.h b/src/tests/kits/net/new_stack/stack/stack.h new file mode 100644 index 0000000000..5714d75464 --- /dev/null +++ b/src/tests/kits/net/new_stack/stack/stack.h @@ -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 diff --git a/src/tests/kits/net/new_stack/stack/stack_module_x86.proj b/src/tests/kits/net/new_stack/stack/stack_module_x86.proj deleted file mode 100644 index 149149c0f4..0000000000 Binary files a/src/tests/kits/net/new_stack/stack/stack_module_x86.proj and /dev/null differ diff --git a/src/tests/kits/net/new_stack/stack/timer.c b/src/tests/kits/net/new_stack/stack/timer.c index ac53f4fce2..02737b5805 100644 --- a/src/tests/kits/net/new_stack/stack/timer.c +++ b/src/tests/kits/net/new_stack/stack/timer.c @@ -13,6 +13,7 @@ #include #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; diff --git a/src/tests/kits/net/new_stack/stack/timer.h b/src/tests/kits/net/new_stack/stack/timer.h index 5bc178c8da..984f8784e0 100644 --- a/src/tests/kits/net/new_stack/stack/timer.h +++ b/src/tests/kits/net/new_stack/stack/timer.h @@ -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);