@ -170,41 +170,41 @@ static uint32_t *rpc_add_credentials(uint32_t *p)
/**************************************************************************
RPC_LOOKUP - Lookup RPC Port numbers
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static struct rpc_t * rpc_req_prep ( void )
{
return ( struct rpc_t * ) ( net_tx_packet + net_eth_hdr_size ( ) +
IP_UDP_HDR_SIZE ) ;
}
static void rpc_req ( int rpc_prog , int rpc_proc , struct rpc_t * rpc_pkt ,
int datalen )
static void rpc_req ( int rpc_prog , int rpc_proc , uint32_t * data , int datalen )
{
struct rpc_t rpc_pkt ;
unsigned long id ;
uint32_t * p ;
int pktlen ;
int sport ;
id = + + rpc_id ;
rpc_pkt - > u . call . id = htonl ( id ) ;
rpc_pkt - > u . call . type = htonl ( MSG_CALL ) ;
rpc_pkt - > u . call . rpcvers = htonl ( 2 ) ; /* use RPC version 2 */
rpc_pkt - > u . call . prog = htonl ( rpc_prog ) ;
rpc_pkt . u . call . id = htonl ( id ) ;
rpc_pkt . u . call . type = htonl ( MSG_CALL ) ;
rpc_pkt . u . call . rpcvers = htonl ( 2 ) ; /* use RPC version 2 */
rpc_pkt . u . call . prog = htonl ( rpc_prog ) ;
switch ( rpc_prog ) {
case PROG_NFS :
if ( supported_nfs_versions & NFSV2_FLAG )
rpc_pkt - > u . call . vers = htonl ( 2 ) ; /* NFS v2 */
rpc_pkt . u . call . vers = htonl ( 2 ) ; /* NFS v2 */
else /* NFSV3_FLAG */
rpc_pkt - > u . call . vers = htonl ( 3 ) ; /* NFS v3 */
rpc_pkt . u . call . vers = htonl ( 3 ) ; /* NFS v3 */
break ;
case PROG_PORTMAP :
case PROG_MOUNT :
default :
/* portmapper is version 2 */
rpc_pkt - > u . call . vers = htonl ( 2 ) ;
rpc_pkt . u . call . vers = htonl ( 2 ) ; /* portmapper is version 2 */
}
rpc_pkt - > u . call . proc = htonl ( rpc_proc ) ;
rpc_pkt . u . call . proc = htonl ( rpc_proc ) ;
p = ( uint32_t * ) & ( rpc_pkt . u . call . data ) ;
if ( datalen )
memcpy ( ( char * ) p , ( char * ) data , datalen * sizeof ( uint32_t ) ) ;
pktlen = ( char * ) p + datalen * sizeof ( uint32_t ) - ( char * ) & rpc_pkt ;
pktlen = ( ( char * ) & rpc_pkt - > u . call . data - ( char * ) & rpc_pkt ) +
datalen * sizeof ( uint32_t ) ;
memcpy ( ( char * ) net_tx_packet + net_eth_hdr_size ( ) + IP_UDP_HDR_SIZE ,
& rpc_pkt . u . data [ 0 ] , pktlen ) ;
if ( rpc_prog = = PROG_PORTMAP )
sport = SUNRPC_PORT ;
@ -222,17 +222,15 @@ RPC_LOOKUP - Lookup RPC Port numbers
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void rpc_lookup_req ( int prog , int ver )
{
uint32_t * data ;
struct rpc_t * rpc_pkt = rpc_req_prep ( ) ;
uint32_t data [ 16 ] ;
data = rpc_pkt - > u . call . data ;
data [ 0 ] = 0 ; data [ 1 ] = 0 ; /* auth credential */
data [ 2 ] = 0 ; data [ 3 ] = 0 ; /* auth verifier */
data [ 4 ] = htonl ( prog ) ;
data [ 5 ] = htonl ( ver ) ;
data [ 6 ] = htonl ( 17 ) ; /* IP_UDP */
data [ 7 ] = 0 ;
rpc_req ( PROG_PORTMAP , PORTMAP_GETPORT , rpc_pkt , 8 ) ;
rpc_req ( PROG_PORTMAP , PORTMAP_GETPORT , data , 8 ) ;
}
/**************************************************************************
@ -240,14 +238,14 @@ NFS_MOUNT - Mount an NFS Filesystem
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void nfs_mount_req ( char * path )
{
uint32_t data [ 1024 ] ;
uint32_t * p ;
int len ;
int pathlen ;
struct rpc_t * rpc_pkt = rpc_req_prep ( ) ;
pathlen = strlen ( path ) ;
p = rpc_pkt - > u . call . data ;
p = & ( data [ 0 ] ) ;
p = rpc_add_credentials ( p ) ;
* p + + = htonl ( pathlen ) ;
@ -256,9 +254,9 @@ static void nfs_mount_req(char *path)
memcpy ( p , path , pathlen ) ;
p + = ( pathlen + 3 ) / 4 ;
len = ( uint32_t * ) p - ( uint32_t * ) & ( rpc_pkt - > u . call . data ) ;
len = ( uint32_t * ) p - ( uint32_t * ) & ( data [ 0 ] ) ;
rpc_req ( PROG_MOUNT , MOUNT_ADDENTRY , rpc_pkt , len ) ;
rpc_req ( PROG_MOUNT , MOUNT_ADDENTRY , data , len ) ;
}
/**************************************************************************
@ -266,20 +264,20 @@ NFS_UMOUNTALL - Unmount all our NFS Filesystems on the Server
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void nfs_umountall_req ( void )
{
uint32_t data [ 1024 ] ;
uint32_t * p ;
int len ;
struct rpc_t * rpc_pkt = rpc_req_prep ( ) ;
if ( ( nfs_server_mount_port = = - 1 ) | | ( ! fs_mounted ) )
/* Nothing mounted, nothing to umount */
return ;
p = rpc_pkt - > u . call . data ;
p = & ( data [ 0 ] ) ;
p = rpc_add_credentials ( p ) ;
len = ( uint32_t * ) p - ( uint32_t * ) & ( rpc_pkt - > u . call . data ) ;
len = ( uint32_t * ) p - ( uint32_t * ) & ( data [ 0 ] ) ;
rpc_req ( PROG_MOUNT , MOUNT_UMOUNTALL , rpc_pkt , len ) ;
rpc_req ( PROG_MOUNT , MOUNT_UMOUNTALL , data , len ) ;
}
/***************************************************************************
@ -291,11 +289,11 @@ static void nfs_umountall_req(void)
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void nfs_readlink_req ( void )
{
uint32_t data [ 1024 ] ;
uint32_t * p ;
int len ;
struct rpc_t * rpc_pkt = rpc_req_prep ( ) ;
p = rpc_pkt - > u . call . data ;
p = & ( data [ 0 ] ) ;
p = rpc_add_credentials ( p ) ;
if ( supported_nfs_versions & NFSV2_FLAG ) {
@ -307,9 +305,9 @@ static void nfs_readlink_req(void)
p + = ( filefh3_length / 4 ) ;
}
len = ( uint32_t * ) p - ( uint32_t * ) & ( rpc_pkt - > u . call . data ) ;
len = ( uint32_t * ) p - ( uint32_t * ) & ( data [ 0 ] ) ;
rpc_req ( PROG_NFS , NFS_READLINK , rpc_pkt , len ) ;
rpc_req ( PROG_NFS , NFS_READLINK , data , len ) ;
}
/**************************************************************************
@ -317,14 +315,14 @@ NFS_LOOKUP - Lookup Pathname
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void nfs_lookup_req ( char * fname )
{
uint32_t data [ 1024 ] ;
uint32_t * p ;
int len ;
int fnamelen ;
struct rpc_t * rpc_pkt = rpc_req_prep ( ) ;
fnamelen = strlen ( fname ) ;
p = rpc_pkt - > u . call . data ;
p = & ( data [ 0 ] ) ;
p = rpc_add_credentials ( p ) ;
if ( supported_nfs_versions & NFSV2_FLAG ) {
@ -336,9 +334,9 @@ static void nfs_lookup_req(char *fname)
memcpy ( p , fname , fnamelen ) ;
p + = ( fnamelen + 3 ) / 4 ;
len = ( uint32_t * ) p - ( uint32_t * ) & ( rpc_pkt - > u . call . data ) ;
len = ( uint32_t * ) p - ( uint32_t * ) & ( data [ 0 ] ) ;
rpc_req ( PROG_NFS , NFS_LOOKUP , rpc_pkt , len ) ;
rpc_req ( PROG_NFS , NFS_LOOKUP , data , len ) ;
} else { /* NFSV3_FLAG */
* p + + = htonl ( NFS_FHSIZE ) ; /* Dir handle length */
memcpy ( p , dirfh , NFS_FHSIZE ) ;
@ -349,9 +347,9 @@ static void nfs_lookup_req(char *fname)
memcpy ( p , fname , fnamelen ) ;
p + = ( fnamelen + 3 ) / 4 ;
len = ( uint32_t * ) p - ( uint32_t * ) & ( rpc_pkt - > u . call . data ) ;
len = ( uint32_t * ) p - ( uint32_t * ) & ( data [ 0 ] ) ;
rpc_req ( PROG_NFS , NFS3PROC_LOOKUP , rpc_pkt , len ) ;
rpc_req ( PROG_NFS , NFS3PROC_LOOKUP , data , len ) ;
}
}
@ -360,11 +358,11 @@ NFS_READ - Read File on NFS Server
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void nfs_read_req ( int offset , int readlen )
{
uint32_t data [ 1024 ] ;
uint32_t * p ;
int len ;
struct rpc_t * rpc_pkt = rpc_req_prep ( ) ;
p = rpc_pkt - > u . call . data ;
p = & ( data [ 0 ] ) ;
p = rpc_add_credentials ( p ) ;
if ( supported_nfs_versions & NFSV2_FLAG ) {
@ -383,9 +381,9 @@ static void nfs_read_req(int offset, int readlen)
* p + + = 0 ;
}
len = ( uint32_t * ) p - ( uint32_t * ) & ( rpc_pkt - > u . call . data ) ;
len = ( uint32_t * ) p - ( uint32_t * ) & ( data [ 0 ] ) ;
rpc_req ( PROG_NFS , NFS_READ , rpc_pkt , len ) ;
rpc_req ( PROG_NFS , NFS_READ , data , len ) ;
}
/**************************************************************************