1,5 → 1,5 |
/* |
* Copyright (c) 2008 Lukas Mejdrech |
* Copyright (c) 2009 Lukas Mejdrech |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
26,11 → 26,12 |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
|
/** @addtogroup net |
/** @addtogroup packet |
* @{ |
*/ |
|
/** @file |
* Packet client implementation. |
*/ |
|
#include <async.h> |
50,6 → 51,16 |
#include "packet_header.h" |
#include "packet_client.h" |
|
/** Obtains the packet from the packet server as the shared memory block. |
* Creates the local packet mapping as well. |
* @param phone The packet server module phone. Input parameter. |
* @param packet The packet reference pointer to store the received packet reference. Output parameter. |
* @param packet_id The packet identifier. Input parameter. |
* @param size The packet total size in bytes. Input parameter. |
* @returns EOK on success. |
* \todo ipc_share_in_start() error? |
* @returns Other error codes as defined for the pm_add() function. |
*/ |
int packet_return( int phone, packet_ref packet, packet_id_t packet_id, size_t size ); |
|
packet_t packet_copy( int phone, services_t owner, const packet_t packet ){ |
74,31 → 85,33 |
return EOK; |
} |
|
void * packet_prepend( packet_t packet, size_t length ){ |
void * packet_prefix( packet_t packet, size_t length ){ |
if(( ! packet_is_valid( packet )) || ( packet->data_start - sizeof( struct packet ) - 2 * packet->addr_len < length )) return NULL; |
packet->data_start -= length; |
return ( void * ) packet + packet->data_start; |
} |
|
void * packet_append( packet_t packet, size_t length ){ |
void * packet_suffix( packet_t packet, size_t length ){ |
if(( ! packet_is_valid( packet )) || ( packet->data_end + length >= packet->length )) return NULL; |
packet->data_end += length; |
return ( void * ) packet + packet->data_end - length; |
} |
|
int packet_trim( packet_t packet, size_t prefix, size_t sufix ){ |
if(( ! packet_is_valid( packet )) || ( prefix + sufix > packet->data_end - packet->data_start )) return EINVAL; |
int packet_trim( packet_t packet, size_t prefix, size_t suffix ){ |
if( ! packet_is_valid( packet )) return EINVAL; |
if( prefix + suffix > packet->data_end - packet->data_start ) return ENOMEM; |
packet->data_start += prefix; |
packet->data_end -= sufix; |
packet->data_end -= suffix; |
return EOK; |
} |
|
packet_id_t packet_get_id( packet_t packet ){ |
packet_id_t packet_get_id( const packet_t packet ){ |
return packet_is_valid( packet ) ? packet->packet_id : 0; |
} |
|
int packet_get_addr( const packet_t packet, uint8_t ** src, uint8_t ** dest ){ |
if( !( packet_is_valid( packet ) && src && dest )) return 0; |
if( !( packet_is_valid( packet ) && src && dest )) return EINVAL; |
if( ! packet->addr_len ) return 0; |
* src = ( void * ) packet + packet->src_addr; |
* dest = ( void * ) packet + packet->dest_addr; |
return packet->addr_len; |
116,13 → 129,14 |
|
packet_mode_t packet_get_mode( const packet_t packet ){ |
if( packet_is_valid( packet )) return packet->mode; |
return PM_ONEWAY; |
return PM_ONE_WAY; |
} |
|
int packet_set_addr( packet_t packet, const uint8_t * src, const uint8_t * dest, size_t addr_len ){ |
size_t padding; |
|
if( !( packet_is_valid( packet ) && ( packet->addr_len >= addr_len ))) return EINVAL; |
if( ! packet_is_valid( packet )) return EINVAL; |
if( packet->addr_len >= addr_len ) return ENOMEM; |
padding = packet->addr_len - addr_len; |
if( src ){ |
memcpy(( void * ) packet + packet->src_addr, src, addr_len ); |
168,20 → 182,21 |
|
aid_t message; |
ipc_call_t answer; |
ipcarg_t result; |
|
message = async_send_1( phone, NET_PACKET_GET, packet_id, & answer ); |
* packet = ( packet_t ) as_get_mappable_page( size ); |
if( ERROR_OCCURED( ipc_share_in_start_0_0( phone, * packet, size )) |
|| ERROR_OCCURED( pm_add( * packet ))){ |
if( ERROR_OCCURRED( ipc_share_in_start_0_0( phone, * packet, size )) |
|| ERROR_OCCURRED( pm_add( * packet ))){ |
munmap( * packet, size ); |
async_wait_for( message, NULL ); |
return ERROR_CODE; |
} |
async_wait_for( message, NULL ); |
return EOK; |
async_wait_for( message, & result ); |
return result; |
} |
|
packet_t packet_get_5( int phone, services_t owner, size_t max_content, size_t addr_len, size_t max_prefix, size_t max_sufix ){ |
packet_t packet_get_5( int phone, services_t owner, size_t max_content, size_t addr_len, size_t max_prefix, size_t max_suffix ){ |
ERROR_DECLARE; |
|
packet_id_t packet_id; |
188,8 → 203,8 |
unsigned int size; |
packet_t packet; |
|
if( ERROR_OCCURED( async_req_5_2( phone, NET_PACKET_CREATE_5, owner, max_content, addr_len, max_prefix, max_sufix, & packet_id, & size )) |
|| ERROR_OCCURED( packet_return( phone, & packet, packet_id, size ))){ |
if( ERROR_OCCURRED( async_req_5_2( phone, NET_PACKET_CREATE_5, owner, max_content, addr_len, max_prefix, max_suffix, & packet_id, & size )) |
|| ERROR_OCCURRED( packet_return( phone, & packet, packet_id, size ))){ |
return NULL; |
} |
return packet; |
202,8 → 217,8 |
unsigned int size; |
packet_t packet; |
|
if( ERROR_OCCURED( async_req_2_2( phone, NET_PACKET_CREATE_1, owner, content, & packet_id, & size )) |
|| ERROR_OCCURED( packet_return( phone, & packet, packet_id, size ))){ |
if( ERROR_OCCURRED( async_req_2_2( phone, NET_PACKET_CREATE_1, owner, content, & packet_id, & size )) |
|| ERROR_OCCURRED( packet_return( phone, & packet, packet_id, size ))){ |
return NULL; |
} |
return packet; |