Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 3684 → Rev 3685

/branches/network/uspace/srv/net/ip/ip.c
41,6 → 41,7
//#include <sys/mman.h>
 
#include "../err.h"
#include "../measured_strings.h"
#include "../messages.h"
#include "../modules.h"
#include "../netif/netif_device_id_type.h"
47,10 → 48,14
 
#include "ip.h"
 
#define DEFAULT_IPV 4
 
ip_globals_t ip_globals;
 
DEVICE_MAP_IMPLEMENT( ip_netifs, ip_netif_t )
 
int parse_address( char * value, address_ref address );
 
/** Initializes the module.
*/
int ip_initialize( void ){
62,15 → 67,35
return EOK;
}
 
int parse_address( char * value, address_ref address ){
char * next;
int index;
 
if( ! value ){
( * address )[ 0 ] = ( * address )[ 1 ] = ( * address )[ 2 ] = ( * address )[ 3 ] = 0;
return ENOENT;
}
next = value;
for( index = 0; index < 4; ++ index ){
if(( ! next ) || ( ! * next )) return EINVAL;
if( index ) ++ next;
( * address )[ index ] = strtoul( next, & next, 0 );
}
return EOK;
}
 
int ip_message( ipc_callid_t callid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, ipcarg_t arg3, ipcarg_t * result1, ipcarg_t * result2, ipcarg_t * result3 ){
ERROR_DECLARE;
 
ip_netif_ref ip_netif;
ip_netif_ref ip_netif;
aid_t message;
ipc_call_t answer;
measured_string_t configuration[ 9 ] = {{ "IPV", 3 }, { "IP_CONFIG", 9 }, { "IP_ADDR", 7 }, { "NETMASK", 7 }, { "GATEWAY", 7 }, { "BROADCAST", 9 }, { "DNS1", 4 }, { "DNS2", 4 }, { "ARP", 3 }};
int count = 9;
measured_string_ref settings;
char * data;
 
// printf( "\nIP message %d", method );
switch( method ){
// case IPC_M_CONNECT_ME_TO:
// case IPC_M_CONNECT_TO_ME:
case IPC_M_PHONE_HUNGUP:
return EOK;
case NET_IP_ECHO:
82,18 → 107,72
ip_netif = ( ip_netif_ref ) malloc( sizeof( ip_netif_t ));
if( ! ip_netif ) return ENOMEM;
ip_netif->device_id = arg1;
ip_netif->phone = connect_to_service( arg2 );
if( ERROR_OCCURED( ipc_call_sync_1_0( ip_netif->phone, NET_LL_REGISTER, arg1 ))){
free( ip_netif );
// get configuration
message = async_send_2( ip_globals.networking_phone, NET_NETWORKING_GET_DEVICE_CONFIGURATION, ip_netif->device_id, count, & answer );
// send names and get settings
if( ERROR_OCCURED( measured_strings_send( ip_globals.networking_phone, configuration, count ))
|| ERROR_OCCURED( measured_strings_return( ip_globals.networking_phone, & settings, & data, count ))){
async_wait_for( message, NULL );
return ERROR_CODE;
}
if( ERROR_OCCURED( ip_netifs_add( & ip_globals.netifs, ip_netif->device_id, ip_netif ))){
if( settings ){
if( settings[ 0 ].value ){
ip_netif->ipv = strtol( settings[ 0 ].value, NULL, 0 );
}else{
ip_netif->ipv = DEFAULT_IPV;
}
ip_netif->dhcp = ! strcmp( settings[ 1 ].value, "DHCP" );
if( ip_netif->dhcp ){
// TODO dhcp
free( ip_netif );
return ENOTSUP;
}else if( ip_netif->ipv == 4 ){
if( ERROR_OCCURED( parse_address( settings[ 2 ].value, & ip_netif->address ))
|| ERROR_OCCURED( parse_address( settings[ 3 ].value, & ip_netif->netmask ))
|| ( parse_address( settings[ 4 ].value, & ip_netif->gateway ) == EINVAL )
|| ( parse_address( settings[ 5 ].value, & ip_netif->broadcast ) == EINVAL )
|| ( parse_address( settings[ 6 ].value, & ip_netif->dns1 ) == EINVAL )
|| ( parse_address( settings[ 7 ].value, & ip_netif->dns2 ) == EINVAL )){
free( ip_netif );
return EINVAL;
}
}else{
// TODO ipv6
free( ip_netif );
return ENOTSUP;
}
// TODO ARP module
}
// print the settings
printf( "\n -IPV=%d", ip_netif->ipv );
printf( "\n -configuration=%s", ip_netif->dhcp ? "dhcp" : "static" );
// TODO ipv6
printf( "\n -address=%d.%d.%d.%d", ip_netif->address[ 0 ], ip_netif->address[ 1 ], ip_netif->address[ 2 ], ip_netif->address[ 3 ] );
printf( "\n -netmask=%d.%d.%d.%d", ip_netif->netmask[ 0 ], ip_netif->netmask[ 1 ], ip_netif->netmask[ 2 ], ip_netif->netmask[ 3 ] );
printf( "\n -gateway=%d.%d.%d.%d", ip_netif->gateway[ 0 ], ip_netif->gateway[ 1 ], ip_netif->gateway[ 2 ], ip_netif->gateway[ 3 ] );
printf( "\n -broadcast=%d.%d.%d.%d", ip_netif->broadcast[ 0 ], ip_netif->broadcast[ 1 ], ip_netif->broadcast[ 2 ], ip_netif->broadcast[ 3 ] );
printf( "\n -dns1=%d.%d.%d.%d", ip_netif->dns1[ 0 ], ip_netif->dns1[ 1 ], ip_netif->dns1[ 2 ], ip_netif->dns1[ 3 ] );
printf( "\n -dns2=%d.%d.%d.%d", ip_netif->dns2[ 0 ], ip_netif->dns2[ 1 ], ip_netif->dns2[ 2 ], ip_netif->dns2[ 3 ] );
// TODO arp module
free( settings );
free( data );
// end request
async_wait_for( message, NULL );
ip_netif->phone = connect_to_service( arg2 );
if( ERROR_OCCURED( async_req_2_0( ip_netif->phone, NET_LL_REGISTER, arg1, SERVICE_IP ))
|| ERROR_OCCURED( ip_netifs_add( & ip_globals.netifs, ip_netif->device_id, ip_netif ))){
free( ip_netif );
return ERROR_CODE;
}
return EOK;
case NET_IL_DEVICE_STATE_CHANGED:
case NET_LL_DEVICE_STATE_CHANGED:
// arg1 device id
// arg2 state
// TODO state
printf( "\nip - device %d changed state to %d\n", arg1, arg2 );
case NET_IP_TCP_REGISTER:
ip_globals.tcp_phone = ipc_connect_to_me( callid, 0, 0, 0, 0 );
ip_globals.tcp_phone = connect_to_service( arg1 );
return EOK;
}
return ENOTSUP;
/branches/network/uspace/srv/net/ip/Makefile
44,6 → 44,7
SOURCES = \
$(NAME)_module.c \
$(NAME).c \
../measured_strings.c \
../module.c \
../modules.c
 
/branches/network/uspace/srv/net/ip/ip.h
41,6 → 41,11
 
#include "../netif/netif_device_id_type.h"
 
#define IP_MAX_ADDRESS_LENGTH 4
 
typedef int address_t[ IP_MAX_ADDRESS_LENGTH ];
typedef address_t * address_ref;
 
typedef struct ip_netif ip_netif_t;
typedef ip_netif_t * ip_netif_ref;
 
48,13 → 53,21
 
DEVICE_MAP_DECLARE( ip_netifs, ip_netif_t )
 
struct ip_netif{
struct ip_netif{
netif_device_id_t device_id;
int phone;
// TODO configuration
int ipv;
int dhcp;
address_t address;
address_t netmask;
address_t gateway;
address_t broadcast;
address_t dns1;
address_t dns2;
// TODO modules
};
 
struct ip_globals{
struct ip_globals{
int networking_phone;
int tcp_phone;
ip_netifs_t netifs;