Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 4260 → Rev 4261

/branches/network/uspace/srv/net/il/arp/arp.c
50,6 → 50,7
 
#include "../../include/byteorder.h"
#include "../../include/device.h"
#include "../../include/nil_messages.h"
#include "../../include/protocol_map.h"
 
#include "../../structures/measured_strings.h"
62,22 → 63,10
//#include "arp_messages.h"
#include "arp_module.h"
 
/** Returns the device identifier message parameter.
*/
#define IPC_GET_DEVICE( call ) ( device_id_t ) IPC_GET_ARG1( * call )
 
/** Returns the packet identifier message parameter.
*/
#define IPC_GET_PACKET( call ) ( packet_id_t ) IPC_GET_ARG2( * call )
 
/** Returns the protocol service message parameter.
*/
#define IPC_GET_PROTO( call ) ( services_t ) IPC_GET_ARG2( * call )
#define ARP_GET_PROTO( call ) ( services_t ) IPC_GET_ARG2( * call )
 
/** Returns the device driver service message parameter.
*/
#define IPC_GET_SERVICE( call ) ( services_t ) IPC_GET_ARG3( * call )
 
/** ARP global data.
*/
arp_globals_t arp_globals;
189,9 → 178,6
ERROR_DECLARE;
 
arp_device_ref device;
aid_t message;
ipc_call_t answer;
ipcarg_t result;
arp_proto_ref proto;
int index;
 
219,7 → 205,7
if( index < 0 ){
rwlock_write_unlock( & arp_globals.lock );
free( proto );
return result;
return index;
}
}
printf( "\nCache of the existing device %d cleaned", device->device_id );
257,7 → 243,7
return EREFUSED;
}
// get packet dimensions
if( ERROR_OCCURRED( async_req_1_4( device->phone, NET_NIL_PACKET_SPACE, device_id, & device->addr_len, & device->prefix, & device->content, & device->suffix ))){
if( ERROR_OCCURRED( nil_packet_size_req( device->phone, device_id, & device->addr_len, & device->prefix, & device->content, & device->suffix ))){
rwlock_write_unlock( & arp_globals.lock );
arp_protos_destroy( & device->protos );
free( device );
264,38 → 250,22
return ERROR_CODE;
}
// get hardware address
message = async_send_1( device->phone, NET_NIL_ADDR, device->device_id, & answer );
if( ERROR_OCCURRED( measured_strings_return( device->phone, & device->addr, & device->addr_data, 1 ))){
if( ERROR_OCCURRED( nil_get_addr( device->phone, device_id, & device->addr, & device->addr_data ))){
rwlock_write_unlock( & arp_globals.lock );
arp_protos_destroy( & device->protos );
free( device );
async_wait_for( message, NULL );
return ERROR_CODE;
}
async_wait_for( message, & result );
if( ERROR_OCCURRED( result )){
rwlock_write_unlock( & arp_globals.lock );
free( device->addr );
free( device->addr_data );
arp_protos_destroy( & device->protos );
free( device );
return ERROR_CODE;
}
// get broadcast address
message = async_send_1( device->phone, NET_NIL_BROADCAST_ADDR, device->device_id, & answer );
if( ERROR_OCCURRED( measured_strings_return( device->phone, & device->broadcast_addr, & device->broadcast_data, 1 ))){
if( ERROR_OCCURRED( nil_get_broadcast_addr( device->phone, device_id, & device->broadcast_addr, & device->broadcast_data ))){
rwlock_write_unlock( & arp_globals.lock );
free( device->addr );
free( device->addr_data );
arp_protos_destroy( & device->protos );
free( device );
async_wait_for( message, NULL );
return ERROR_CODE;
}
async_wait_for( message, & result );
// add to the cache
if( ERROR_OCCURRED( result )
|| ERROR_OCCURRED( arp_cache_add( & arp_globals.cache, device->device_id, device ))){
if( ERROR_OCCURRED( arp_cache_add( & arp_globals.cache, device->device_id, device ))){
rwlock_write_unlock( & arp_globals.lock );
free( device->addr );
free( device->addr_data );
346,7 → 316,7
length += device->addr->length;
memcpy((( uint8_t * ) header ) + length, target->value, target->length );
packet_set_addr( packet, ( uint8_t * ) device->addr->value, ( uint8_t * ) device->broadcast_addr->value, CONVERT_SIZE( char, uint8_t, device->addr->length ));
async_msg_3( device->phone, NET_NIL_SEND, device_id, packet_get_id( packet ), SERVICE_ARP );
nil_send_msg( device->phone, device_id, packet, SERVICE_ARP );
return NULL;
}
 
404,7 → 374,7
memcpy( src_hw, des_hw, header->hardware_length );
memcpy( des_hw, hw_source->value, header->hardware_length );
packet_set_addr( packet, src_hw, des_hw, header->hardware_length );
async_msg_3( device->phone, NET_NIL_SEND, device_id, packet_get_id( packet ), SERVICE_ARP );
nil_send_msg( device->phone, device_id, packet, SERVICE_ARP );
}else{
pq_release( arp_globals.networking_phone, packet_get_id( packet ));
}
475,7 → 445,7
return EOK;
case NET_ARP_DEVICE:
ERROR_PROPAGATE( measured_strings_receive( & address, & data, 1 ));
if( ERROR_OCCURRED( arp_device_message( IPC_GET_DEVICE( call ), IPC_GET_SERVICE( call ), IPC_GET_PROTO( call ), address ))){
if( ERROR_OCCURRED( arp_device_message( IPC_GET_DEVICE( call ), IPC_GET_SERVICE( call ), ARP_GET_PROTO( call ), address ))){
free( address );
free( data );
}
483,7 → 453,7
case NET_ARP_TRANSLATE:
ERROR_PROPAGATE( measured_strings_receive( & address, & data, 1 ));
rwlock_read_lock( & arp_globals.lock );
translation = arp_translate_message( IPC_GET_DEVICE( call ), IPC_GET_PROTO( call ), address );
translation = arp_translate_message( IPC_GET_DEVICE( call ), ARP_GET_PROTO( call ), address );
free( address );
free( data );
if( ! translation ){