42,7 → 42,6 |
#include <unistd.h> |
|
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <sys/mman.h> |
|
#include "../../err.h" |
56,25 → 55,21 |
*/ |
#define IPC_GET_ID( call ) ( packet_id_t ) IPC_GET_ARG1( * call ) |
|
/** Returns the owner message parameter. |
*/ |
#define IPC_GET_OWNER( call ) ( services_t ) IPC_GET_ARG1( * call ) |
|
/** Returns the maximal content length message parameter. |
*/ |
#define IPC_GET_CONTENT( call ) ( size_t ) IPC_GET_ARG2( * call ) |
#define IPC_GET_CONTENT( call ) ( size_t ) IPC_GET_ARG1( * call ) |
|
/** Returns the maximal address length message parameter. |
*/ |
#define IPC_GET_ADDR_LEN( call ) ( size_t ) IPC_GET_ARG3( * call ) |
#define IPC_GET_ADDR_LEN( call ) ( size_t ) IPC_GET_ARG2( * call ) |
|
/** Returns the maximal prefix length message parameter. |
*/ |
#define IPC_GET_PREFIX( call ) ( size_t ) IPC_GET_ARG4( * call ) |
#define IPC_GET_PREFIX( call ) ( size_t ) IPC_GET_ARG3( * call ) |
|
/** Returns the maximal suffix length message parameter. |
*/ |
#define IPC_GET_SUFIX( call ) ( size_t ) IPC_GET_ARG5( * call ) |
#define IPC_GET_SUFIX( call ) ( size_t ) IPC_GET_ARG4( * call ) |
|
#define FREE_QUEUES_COUNT 7 |
|
112,7 → 107,6 |
* Tries to reuse free packets first. |
* Creates a new packet aligned to the memory page size if none available. |
* Locks the global data during its processing. |
* @param owner The new owner of the packet. Input parameter. |
* @param addr_len The source and destination addresses maximal length in bytes. Input parameter. |
* @param max_prefix The maximal prefix length in bytes. Input parameter. |
* @param max_content The maximal content length in bytes. Input parameter. |
120,12 → 114,11 |
* @returns The packet of dimensions at least as given. |
* @returns NULL if there is not enough memory left. |
*/ |
packet_t packet_get( services_t owner, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ); |
packet_t packet_get( size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ); |
|
/** Creates a new packet of dimensions at least as given. |
* Should be used only when the global data are locked. |
* @param length The total length of the packet, including the header, the addresses and the data of the packet. Input parameter. |
* @param owner The new owner of the packet. Input parameter. |
* @param addr_len The source and destination addresses maximal length in bytes. Input parameter. |
* @param max_prefix The maximal prefix length in bytes. Input parameter. |
* @param max_content The maximal content length in bytes. Input parameter. |
133,17 → 126,16 |
* @returns The packet of dimensions at least as given. |
* @returns NULL if there is not enough memory left. |
*/ |
packet_t packet_create( size_t length, services_t owner, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ); |
packet_t packet_create( size_t length, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ); |
|
/** Initializes the packet according to the given dimensions. |
* @param packet The packet to be initialized. Input parameter. |
* @param owner The new owner of the packet. Input parameter. |
* @param addr_len The source and destination addresses maximal length in bytes. Input parameter. |
* @param max_prefix The maximal prefix length in bytes. Input parameter. |
* @param max_content The maximal content length in bytes. Input parameter. |
* @param max_suffix The maximal suffix length in bytes. Input parameter. |
*/ |
void packet_init( packet_t packet, services_t owner, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ); |
void packet_init( packet_t packet, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ); |
|
/** Shares the packet memory block. |
* @param packet The packet to be shared. |
163,14 → 155,14 |
case IPC_M_PHONE_HUNGUP: |
return EOK; |
case NET_PACKET_CREATE_1: |
packet = packet_get( IPC_GET_OWNER( call ), 0, 0, IPC_GET_CONTENT( call ), 0 ); |
packet = packet_get( 0, 0, IPC_GET_CONTENT( call ), 0 ); |
if( ! packet ) return ENOMEM; |
* answer_count = 2; |
IPC_SET_ARG1( * answer, packet->packet_id ); |
IPC_SET_ARG2( * answer, packet->length ); |
return EOK; |
case NET_PACKET_CREATE_5: |
packet = packet_get( IPC_GET_OWNER( call ), IPC_GET_ADDR_LEN( call ), IPC_GET_PREFIX( call ), IPC_GET_CONTENT( call ), IPC_GET_SUFIX( call )); |
case NET_PACKET_CREATE_4: |
packet = packet_get( IPC_GET_ADDR_LEN( call ), IPC_GET_PREFIX( call ), IPC_GET_CONTENT( call ), IPC_GET_SUFIX( call )); |
if( ! packet ) return ENOMEM; |
* answer_count = 2; |
IPC_SET_ARG1( * answer, packet->packet_id ); |
204,7 → 196,7 |
ps_globals.free[ index ] = pq_add( ps_globals.free[ index ], packet, packet->length, packet->length ); |
} |
|
packet_t packet_get( services_t owner, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ){ |
packet_t packet_get( size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ){ |
int index; |
packet_t packet; |
size_t length; |
218,18 → 210,18 |
packet = pm_find( packet->next ); |
} |
if( packet ){ |
packet_init( packet, owner, addr_len, max_prefix, max_content, max_suffix ); |
packet_init( packet, addr_len, max_prefix, max_content, max_suffix ); |
futex_up( & ps_globals.lock ); |
return packet; |
} |
} |
} |
packet = packet_create( length, owner, addr_len, max_prefix, max_content, max_suffix ); |
packet = packet_create( length, addr_len, max_prefix, max_content, max_suffix ); |
futex_up( & ps_globals.lock ); |
return packet; |
} |
|
packet_t packet_create( size_t length, services_t owner, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ){ |
packet_t packet_create( size_t length, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ){ |
ERROR_DECLARE; |
|
packet_t packet; |
239,9 → 231,8 |
if( packet == MAP_FAILED ) return NULL; |
++ ps_globals.count; |
packet->packet_id = ps_globals.count; |
packet->mode = PM_ONE_WAY; |
packet->length = length; |
packet_init( packet, owner, addr_len, max_prefix, max_content, max_suffix ); |
packet_init( packet, addr_len, max_prefix, max_content, max_suffix ); |
packet->magic_value = PACKET_MAGIC_VALUE; |
if( ERROR_OCCURRED( pm_add( packet ))){ |
munmap( packet, packet->length ); |
251,8 → 242,7 |
return packet; |
} |
|
void packet_init( packet_t packet, services_t owner, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ){ |
packet->owner = owner; |
void packet_init( packet_t packet, size_t addr_len, size_t max_prefix, size_t max_content, size_t max_suffix ){ |
packet->order = 0; |
packet->metric = 0; |
packet->previous = 0; |