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:
@@ -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 ;
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
Binary file not shown.
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user