From c9d4838a87503addf213158522bf179dfa1e2361 Mon Sep 17 00:00:00 2001 From: Philippe Houdoin Date: Wed, 14 Jan 2004 21:38:53 +0000 Subject: [PATCH] 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 --- src/tests/kits/net/new_stack/stack/Jamfile | 14 +++++ .../kits/net/new_stack/stack/attribute.c | 48 +++++++--------- .../kits/net/new_stack/stack/attribute.h | 14 ++--- src/tests/kits/net/new_stack/stack/buffer.c | 14 ++--- src/tests/kits/net/new_stack/stack/buffer.h | 4 +- src/tests/kits/net/new_stack/stack/dump.c | 2 + .../kits/net/new_stack/stack/layers_manager.c | 41 +++++++------- .../kits/net/new_stack/stack/layers_manager.h | 8 +-- src/tests/kits/net/new_stack/stack/stack.c | 52 ++++++++++++++++-- src/tests/kits/net/new_stack/stack/stack.h | 9 +++ .../net/new_stack/stack/stack_module_x86.proj | Bin 14059 -> 0 bytes src/tests/kits/net/new_stack/stack/timer.c | 5 +- src/tests/kits/net/new_stack/stack/timer.h | 4 +- 13 files changed, 137 insertions(+), 78 deletions(-) create mode 100644 src/tests/kits/net/new_stack/stack/Jamfile create mode 100644 src/tests/kits/net/new_stack/stack/stack.h delete mode 100644 src/tests/kits/net/new_stack/stack/stack_module_x86.proj 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 149149c0f444cf79c83b8c29f580de506a352bb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14059 zcmeHOU2Ggz6~2?5CTquu*Nt5}&fhel32n39R)s)G!Cq$_H`I1kUiXL4vYDM7+k@vKj)l#&Np|?9G|%vKa&|@?8M(QS!bHDPNvVQud#R#+K{xGkYF1Z^y5pt_ zI!!i7iQ>W5$3rWZn*1TE4RCjmR~SRMSJ1R_a(m* zW5e;dW*XXDzU(pf$24Pq9qt^R$c^_UrW{q9)17AwePPO;(@P)V<@N*C#tsQ!ck^F~ z?L0j)IoT&W`m}p5hIXKy?+R%0>1;O7JO+tp$K)M_dC#*;F1;j!HM;VSUN)EVmhQTG zX-0SQ(M5KF?%a32R$&L_n=E)m4w2l~@Au84?Gfa9*vMZ|V@hc1CKcU%|jl%n0(p5>bjmxlK)Wax`q6M%1pF8JeV zOUjn$;#uZaDATYmF~(G(2=;Dc@3uw_f-d&mqKnKV2f4z@7`COxpUqMpqc2@9j}#5hcCr-4@py@%#^vSZkJ~XXN%)6Lz$PEkG!3DZEW?~r zwpBJv-8oyPK*nVhASI{EhNdLXK8ALyv=C?^&|C-zH*uh7R^7xH{^(lmB$^A7mbEPe zS_niD5Ftn}rG_vrKV2@Wo}NV-kH-*V`VDJAqm1_}G=cmck53lAe1g+p+?N_nUAP|7 zTv5etzb$lCg0P5nAS@bFOEdH8j2`OAg$lZ)pz998C(AB9t2!m4G{cG4W|#!iu?SO? zyrylyD99fYQ;cWrg!FE=B}4tRz^U3uCe%$5rJdmQ5B) zi-DD2=voV>*io@+LIi8>`l|}_Lh6o;;i~u+YT=8U$i+c^oE9MQg8E1(d(^ZGs)^K_ zO9pTnK?z8nwqL;Ej3j92HDf3&?a1X&?1=|OFXV^{VlE4{`c-ly?+kFrAF z+es&)AzirMPwe$OF@AAh54V|*kpPS{rmPSS)RoY`g7vNcc2{VQ=ql*%!(0XOo_f58 zj}tBDC4NCizwb@#^>eeT^YW|liu@#yeM@F!C#O#!iQTEJ{2p_3@{YzokN(mtwf=MH zKk#@PpARu2UTU+;{XVbghxdlQ-4dQ8FT|GQo)Fvcb&t=V{crX9)TeRc54>gQ zJ=x!^1+$3Zt3k{fapB~RrFd`yiqc|2KYler3V8$ zrM~RQ>4=fHuhIWKhj;`3Qf!P%A}uwcT1Z{dr!$l|zNUpIdo~5gAPPO9*=%|^6tFtY zRlw<-dXMG=5^_kMkw{c>;=D+?TJGz`cYFP-`wriv)6Un92lK`L!#DqA?efbQ|JA=f z=MxRJY4#(`okafav|&C9-;THFwq6V`qtaUoZVb7lI#Y)E%t4ILdL zYb(r8PwP&Nh+aBSyDDradOM2qR=Gyo8e%#Lx7*S! z+gZw&ZQHDgRn|~)GfKKgzC@d=(FKsyG~|$YK$BKIGs7XtlP{*iW#ZyO+kRuif;+)}j*b6k;M9k@jR5me2XAC9*LNq@ecJ}Fmg gEQoMwb@4@aa|;F@3?iZ)4F6%o!GA& 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);