mirror of
https://git.libssh.org/projects/libssh.git
synced 2025-07-29 13:01:13 +03:00
benchmarks: added raw_download test
This commit is contained in:
@ -109,13 +109,12 @@ int benchmarks_raw_up (ssh_session session, struct argument_s *args,
|
||||
unsigned long bytes=0x1000000;
|
||||
char *script=get_python_eater(bytes);
|
||||
char cmd[128];
|
||||
char buffer[1024];
|
||||
static char buffer[0x10000];
|
||||
int err;
|
||||
ssh_channel channel;
|
||||
struct timestamp_struct ts;
|
||||
float ms=0.0;
|
||||
unsigned long total=0;
|
||||
(void)bps;
|
||||
|
||||
err=upload_script(session,"/tmp/eater.py",script);
|
||||
free(script);
|
||||
@ -144,8 +143,8 @@ int benchmarks_raw_up (ssh_session session, struct argument_s *args,
|
||||
while(total < bytes){
|
||||
unsigned long towrite = bytes - total;
|
||||
int w;
|
||||
if(towrite > 0x1000)
|
||||
towrite = 0x1000;
|
||||
if(towrite > 0x10000)
|
||||
towrite = 32758;
|
||||
w=ssh_channel_write(channel,buffer,towrite);
|
||||
if(w == SSH_ERROR)
|
||||
goto error;
|
||||
@ -180,3 +179,100 @@ error:
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
const char python_giver[] =
|
||||
"#!/usr/bin/python\n"
|
||||
"import sys\n"
|
||||
"r=sys.stdin.read(2)\n"
|
||||
"towrite=XXXXXXXXXX\n"
|
||||
"wrote=0\n"
|
||||
"while(wrote < towrite):\n"
|
||||
" buffersize=towrite-wrote\n"
|
||||
" if(buffersize > 4096):\n"
|
||||
" buffersize=4096\n"
|
||||
" sys.stdout.write('A'*buffersize)\n"
|
||||
" wrote+=buffersize\n"
|
||||
"sys.stdout.flush()\n";
|
||||
|
||||
static char *get_python_giver(unsigned long bytes){
|
||||
char *giver=malloc(sizeof(python_giver));
|
||||
char *ptr;
|
||||
char buffer[12];
|
||||
|
||||
memcpy(giver,python_giver,sizeof(python_giver));
|
||||
ptr=strstr(giver,"XXXXXXXXXX");
|
||||
if(!ptr){
|
||||
free(giver);
|
||||
return NULL;
|
||||
}
|
||||
sprintf(buffer,"0x%.8lx",bytes);
|
||||
memcpy(ptr,buffer,10);
|
||||
return giver;
|
||||
}
|
||||
|
||||
/** @internal
|
||||
* @brief benchmarks a raw download (simple upload in a SSH channel) using an
|
||||
* existing SSH session.
|
||||
* @param[in] session Open SSH session
|
||||
* @param[in] args Parsed command line arguments
|
||||
* @param[out] bps The calculated bytes per second obtained via benchmark.
|
||||
* @return 0 on success, -1 on error.
|
||||
*/
|
||||
int benchmarks_raw_down (ssh_session session, struct argument_s *args,
|
||||
float *bps){
|
||||
unsigned long bytes=0x1000000;
|
||||
char *script=get_python_giver(bytes);
|
||||
char cmd[128];
|
||||
static char buffer[0x10000];
|
||||
int err;
|
||||
ssh_channel channel;
|
||||
struct timestamp_struct ts;
|
||||
float ms=0.0;
|
||||
unsigned long total=0;
|
||||
|
||||
err=upload_script(session,"/tmp/giver.py",script);
|
||||
free(script);
|
||||
if(err<0)
|
||||
return err;
|
||||
channel=ssh_channel_new(session);
|
||||
if(channel == NULL)
|
||||
goto error;
|
||||
if(ssh_channel_open_session(channel)==SSH_ERROR)
|
||||
goto error;
|
||||
snprintf(cmd,sizeof(cmd),"%s /tmp/giver.py", PYTHON_PATH);
|
||||
if(ssh_channel_request_exec(channel,cmd)==SSH_ERROR)
|
||||
goto error;
|
||||
if((err=ssh_channel_write(channel,"go",2))==SSH_ERROR)
|
||||
goto error;
|
||||
if(args->verbose>0)
|
||||
fprintf(stdout,"Starting download of %lu bytes now\n",bytes);
|
||||
timestamp_init(&ts);
|
||||
while(total < bytes){
|
||||
unsigned long toread = bytes - total;
|
||||
int r;
|
||||
if(toread > sizeof(buffer))
|
||||
toread = sizeof(buffer);
|
||||
r=ssh_channel_read(channel,buffer,toread,0);
|
||||
if(r == SSH_ERROR)
|
||||
goto error;
|
||||
total += r;
|
||||
}
|
||||
|
||||
if(args->verbose>0)
|
||||
fprintf(stdout,"Finished download\n");
|
||||
ms=elapsed_time(&ts);
|
||||
*bps=8000 * (float)bytes / ms;
|
||||
if(args->verbose > 0)
|
||||
fprintf(stdout,"Download took %f ms for %lu bytes, at %f bps\n",ms,
|
||||
bytes,*bps);
|
||||
ssh_channel_close(channel);
|
||||
ssh_channel_free(channel);
|
||||
return 0;
|
||||
error:
|
||||
fprintf(stderr,"Error during raw upload : %s\n",ssh_get_error(session));
|
||||
if(channel){
|
||||
ssh_channel_close(channel);
|
||||
ssh_channel_free(channel);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user