2005-05-01 14:18:19 +04:00
/*
Unix SMB / CIFS implementation .
simple RPC benchmark
Copyright ( C ) Andrew Tridgell 2005
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2005-05-01 14:18:19 +04:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2007-07-10 06:07:03 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2005-05-01 14:18:19 +04:00
*/
# include "includes.h"
2006-03-15 02:35:30 +03:00
# include "librpc/gen_ndr/ndr_srvsvc_c.h"
2010-04-14 00:06:51 +04:00
# include "torture/rpc/torture_rpc.h"
2005-05-01 14:18:19 +04:00
/**************************/
/* srvsvc_NetShare */
/**************************/
2007-10-07 02:28:14 +04:00
static bool test_NetShareEnumAll ( struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx )
2005-05-01 14:18:19 +04:00
{
NTSTATUS status ;
struct srvsvc_NetShareEnumAll r ;
2008-10-30 20:02:40 +03:00
struct srvsvc_NetShareInfoCtr info_ctr ;
2005-05-01 14:18:19 +04:00
struct srvsvc_NetShareCtr0 c0 ;
2008-10-30 20:02:40 +03:00
struct srvsvc_NetShareCtr1 c1 ;
struct srvsvc_NetShareCtr2 c2 ;
struct srvsvc_NetShareCtr501 c501 ;
struct srvsvc_NetShareCtr502 c502 ;
uint32_t totalentries = 0 ;
2005-05-01 14:18:19 +04:00
uint32_t levels [ ] = { 0 , 1 , 2 , 501 , 502 } ;
int i ;
2007-10-07 02:28:14 +04:00
bool ret = true ;
2005-05-01 14:18:19 +04:00
uint32_t resume_handle ;
2010-03-17 14:05:42 +03:00
struct dcerpc_binding_handle * b = p - > binding_handle ;
2005-05-01 14:18:19 +04:00
2008-10-30 20:02:40 +03:00
ZERO_STRUCT ( info_ctr ) ;
2005-05-01 14:18:19 +04:00
r . in . server_unc = talloc_asprintf ( mem_ctx , " \\ \\ %s " , dcerpc_server_name ( p ) ) ;
2008-10-30 20:02:40 +03:00
r . in . info_ctr = & info_ctr ;
2005-05-01 14:18:19 +04:00
r . in . max_buffer = ( uint32_t ) - 1 ;
r . in . resume_handle = & resume_handle ;
r . out . resume_handle = & resume_handle ;
2008-10-30 20:02:40 +03:00
r . out . totalentries = & totalentries ;
r . out . info_ctr = & info_ctr ;
2005-05-01 14:18:19 +04:00
for ( i = 0 ; i < ARRAY_SIZE ( levels ) ; i + + ) {
resume_handle = 0 ;
2008-10-30 20:02:40 +03:00
info_ctr . level = levels [ i ] ;
switch ( info_ctr . level ) {
case 0 :
ZERO_STRUCT ( c0 ) ;
info_ctr . ctr . ctr0 = & c0 ;
break ;
case 1 :
ZERO_STRUCT ( c1 ) ;
info_ctr . ctr . ctr1 = & c1 ;
break ;
case 2 :
ZERO_STRUCT ( c2 ) ;
info_ctr . ctr . ctr2 = & c2 ;
break ;
case 501 :
ZERO_STRUCT ( c501 ) ;
info_ctr . ctr . ctr501 = & c501 ;
break ;
case 502 :
ZERO_STRUCT ( c502 ) ;
info_ctr . ctr . ctr502 = & c502 ;
break ;
}
2010-03-17 14:05:42 +03:00
status = dcerpc_srvsvc_NetShareEnumAll_r ( b , mem_ctx , & r ) ;
2005-05-01 14:18:19 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
2008-10-30 20:02:40 +03:00
printf ( " NetShareEnumAll level %u failed - %s \n " , info_ctr . level , nt_errstr ( status ) ) ;
2007-10-07 02:28:14 +04:00
ret = false ;
2005-05-01 14:18:19 +04:00
continue ;
}
if ( ! W_ERROR_IS_OK ( r . out . result ) ) {
2008-10-30 20:02:40 +03:00
printf ( " NetShareEnumAll level %u failed - %s \n " , info_ctr . level , win_errstr ( r . out . result ) ) ;
2005-05-01 14:18:19 +04:00
continue ;
}
}
return ret ;
}
/*
benchmark srvsvc netshareenumall queries
*/
2007-12-03 02:28:22 +03:00
static bool bench_NetShareEnumAll ( struct torture_context * tctx , struct dcerpc_pipe * p , TALLOC_CTX * mem_ctx )
2005-05-01 14:18:19 +04:00
{
struct timeval tv = timeval_current ( ) ;
2007-10-07 02:28:14 +04:00
bool ret = true ;
2007-12-03 02:28:22 +03:00
int timelimit = torture_setting_int ( tctx , " timelimit " , 10 ) ;
2005-05-01 14:18:19 +04:00
int count = 0 ;
printf ( " Running for %d seconds \n " , timelimit ) ;
while ( timeval_elapsed ( & tv ) < timelimit ) {
TALLOC_CTX * tmp_ctx = talloc_new ( mem_ctx ) ;
if ( ! test_NetShareEnumAll ( p , tmp_ctx ) ) break ;
talloc_free ( tmp_ctx ) ;
count + + ;
if ( count % 50 = = 0 ) {
2007-12-03 02:28:22 +03:00
if ( torture_setting_bool ( tctx , " progress " , true ) ) {
2007-04-30 01:37:29 +04:00
printf ( " %.1f queries per second \r " ,
count / timeval_elapsed ( & tv ) ) ;
}
2005-05-01 14:18:19 +04:00
}
}
printf ( " %.1f queries per second \n " , count / timeval_elapsed ( & tv ) ) ;
return ret ;
}
2007-10-07 02:28:14 +04:00
bool torture_bench_rpc ( struct torture_context * torture )
2005-05-01 14:18:19 +04:00
{
NTSTATUS status ;
struct dcerpc_pipe * p ;
TALLOC_CTX * mem_ctx ;
2007-10-07 02:28:14 +04:00
bool ret = true ;
2005-05-01 14:18:19 +04:00
mem_ctx = talloc_init ( " torture_rpc_srvsvc " ) ;
2007-08-28 16:54:27 +04:00
status = torture_rpc_connection ( torture ,
2005-05-01 14:18:19 +04:00
& p ,
2007-08-20 01:23:03 +04:00
& ndr_table_srvsvc ) ;
2005-05-01 14:18:19 +04:00
if ( ! NT_STATUS_IS_OK ( status ) ) {
talloc_free ( mem_ctx ) ;
2007-10-07 02:28:14 +04:00
return false ;
2005-05-01 14:18:19 +04:00
}
2007-12-03 02:28:22 +03:00
if ( ! bench_NetShareEnumAll ( torture , p , mem_ctx ) ) {
2007-10-07 02:28:14 +04:00
ret = false ;
2005-05-01 14:18:19 +04:00
}
talloc_free ( mem_ctx ) ;
return ret ;
}