|
Packit |
6c0a39 |
/* bench_scp.c
|
|
Packit |
6c0a39 |
*
|
|
Packit |
6c0a39 |
* This file is part of the SSH Library
|
|
Packit |
6c0a39 |
*
|
|
Packit |
6c0a39 |
* Copyright (c) 2011 by Aris Adamantiadis
|
|
Packit |
6c0a39 |
*
|
|
Packit |
6c0a39 |
* The SSH Library is free software; you can redistribute it and/or modify
|
|
Packit |
6c0a39 |
* it under the terms of the GNU Lesser General Public License as published by
|
|
Packit |
6c0a39 |
* the Free Software Foundation; either version 2.1 of the License, or (at your
|
|
Packit |
6c0a39 |
* option) any later version.
|
|
Packit |
6c0a39 |
*
|
|
Packit |
6c0a39 |
* The SSH Library is distributed in the hope that it will be useful, but
|
|
Packit |
6c0a39 |
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
Packit |
6c0a39 |
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
|
Packit |
6c0a39 |
* License for more details.
|
|
Packit |
6c0a39 |
*
|
|
Packit |
6c0a39 |
* You should have received a copy of the GNU Lesser General Public License
|
|
Packit |
6c0a39 |
* along with the SSH Library; see the file COPYING. If not, write to
|
|
Packit |
6c0a39 |
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
|
Packit |
6c0a39 |
* MA 02111-1307, USA.
|
|
Packit |
6c0a39 |
*/
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
#include "benchmarks.h"
|
|
Packit |
6c0a39 |
#include <libssh/libssh.h>
|
|
Packit |
6c0a39 |
#include <stdio.h>
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
#define SCPDIR "/tmp/"
|
|
Packit |
6c0a39 |
#define SCPFILE "scpbenchmark"
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/** @internal
|
|
Packit |
6c0a39 |
* @brief benchmarks a scp upload using an
|
|
Packit |
6c0a39 |
* existing SSH session.
|
|
Packit |
6c0a39 |
* @param[in] session Open SSH session
|
|
Packit |
6c0a39 |
* @param[in] args Parsed command line arguments
|
|
Packit |
6c0a39 |
* @param[out] bps The calculated bytes per second obtained via benchmark.
|
|
Packit |
6c0a39 |
* @return 0 on success, -1 on error.
|
|
Packit |
6c0a39 |
*/
|
|
Packit |
6c0a39 |
int benchmarks_scp_up (ssh_session session, struct argument_s *args,
|
|
Packit |
6c0a39 |
float *bps){
|
|
Packit |
6c0a39 |
unsigned long bytes;
|
|
Packit |
6c0a39 |
struct timestamp_struct ts;
|
|
Packit |
6c0a39 |
float ms=0.0;
|
|
Packit |
6c0a39 |
unsigned long total=0;
|
|
Packit |
6c0a39 |
ssh_scp scp;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
bytes = args->datasize * 1024 * 1024;
|
|
Packit |
6c0a39 |
scp = ssh_scp_new(session,SSH_SCP_WRITE,SCPDIR);
|
|
Packit |
6c0a39 |
if(scp == NULL)
|
|
Packit |
6c0a39 |
goto error;
|
|
Packit |
6c0a39 |
if(ssh_scp_init(scp)==SSH_ERROR)
|
|
Packit |
6c0a39 |
goto error;
|
|
Packit |
6c0a39 |
if(ssh_scp_push_file(scp,SCPFILE,bytes,0777) != SSH_OK)
|
|
Packit |
6c0a39 |
goto error;
|
|
Packit |
6c0a39 |
if(args->verbose>0)
|
|
Packit |
6c0a39 |
fprintf(stdout,"Starting upload of %lu bytes now\n",bytes);
|
|
Packit |
6c0a39 |
timestamp_init(&ts);
|
|
Packit |
6c0a39 |
while(total < bytes){
|
|
Packit |
6c0a39 |
unsigned long towrite = bytes - total;
|
|
Packit |
6c0a39 |
int w;
|
|
Packit |
6c0a39 |
if(towrite > args->chunksize)
|
|
Packit |
6c0a39 |
towrite = args->chunksize;
|
|
Packit |
6c0a39 |
w=ssh_scp_write(scp,buffer,towrite);
|
|
Packit |
6c0a39 |
if(w == SSH_ERROR)
|
|
Packit |
6c0a39 |
goto error;
|
|
Packit |
6c0a39 |
total += towrite;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
ms=elapsed_time(&ts);
|
|
Packit |
6c0a39 |
*bps=8000 * (float)bytes / ms;
|
|
Packit |
6c0a39 |
if(args->verbose > 0)
|
|
Packit |
6c0a39 |
fprintf(stdout,"Upload took %f ms for %lu bytes, at %f bps\n",ms,
|
|
Packit |
6c0a39 |
bytes,*bps);
|
|
Packit |
6c0a39 |
ssh_scp_close(scp);
|
|
Packit |
6c0a39 |
ssh_scp_free(scp);
|
|
Packit |
6c0a39 |
return 0;
|
|
Packit |
6c0a39 |
error:
|
|
Packit |
6c0a39 |
fprintf(stderr,"Error during scp upload : %s\n",ssh_get_error(session));
|
|
Packit |
6c0a39 |
if(scp){
|
|
Packit |
6c0a39 |
ssh_scp_close(scp);
|
|
Packit |
6c0a39 |
ssh_scp_free(scp);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
return -1;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
/** @internal
|
|
Packit |
6c0a39 |
* @brief benchmarks a scp download using an
|
|
Packit |
6c0a39 |
* existing SSH session.
|
|
Packit |
6c0a39 |
* @param[in] session Open SSH session
|
|
Packit |
6c0a39 |
* @param[in] args Parsed command line arguments
|
|
Packit |
6c0a39 |
* @param[out] bps The calculated bytes per second obtained via benchmark.
|
|
Packit |
6c0a39 |
* @return 0 on success, -1 on error.
|
|
Packit |
6c0a39 |
*/
|
|
Packit |
6c0a39 |
int benchmarks_scp_down (ssh_session session, struct argument_s *args,
|
|
Packit |
6c0a39 |
float *bps){
|
|
Packit |
6c0a39 |
unsigned long bytes;
|
|
Packit |
6c0a39 |
struct timestamp_struct ts;
|
|
Packit |
6c0a39 |
float ms=0.0;
|
|
Packit |
6c0a39 |
unsigned long total=0;
|
|
Packit |
6c0a39 |
ssh_scp scp;
|
|
Packit |
6c0a39 |
int r;
|
|
Packit |
6c0a39 |
size_t size;
|
|
Packit |
6c0a39 |
|
|
Packit |
6c0a39 |
bytes = args->datasize * 1024 * 1024;
|
|
Packit |
6c0a39 |
scp = ssh_scp_new(session,SSH_SCP_READ,SCPDIR SCPFILE);
|
|
Packit |
6c0a39 |
if(scp == NULL)
|
|
Packit |
6c0a39 |
goto error;
|
|
Packit |
6c0a39 |
if(ssh_scp_init(scp)==SSH_ERROR)
|
|
Packit |
6c0a39 |
goto error;
|
|
Packit |
6c0a39 |
r=ssh_scp_pull_request(scp);
|
|
Packit |
6c0a39 |
if(r == SSH_SCP_REQUEST_NEWFILE){
|
|
Packit |
6c0a39 |
size=ssh_scp_request_get_size(scp);
|
|
Packit |
6c0a39 |
if(bytes > size){
|
|
Packit |
6c0a39 |
printf("Only %zd bytes available (on %lu requested).\n",size,bytes);
|
|
Packit |
6c0a39 |
bytes = size;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
if(size > bytes){
|
|
Packit |
6c0a39 |
printf("File is %zd bytes (on %lu requested). Will cut the end\n",size,bytes);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
if(args->verbose>0)
|
|
Packit |
6c0a39 |
fprintf(stdout,"Starting download of %lu bytes now\n",bytes);
|
|
Packit |
6c0a39 |
timestamp_init(&ts);
|
|
Packit |
6c0a39 |
ssh_scp_accept_request(scp);
|
|
Packit |
6c0a39 |
while(total < bytes){
|
|
Packit |
6c0a39 |
unsigned long toread = bytes - total;
|
|
Packit |
6c0a39 |
if(toread > args->chunksize)
|
|
Packit |
6c0a39 |
toread = args->chunksize;
|
|
Packit |
6c0a39 |
r=ssh_scp_read(scp,buffer,toread);
|
|
Packit |
6c0a39 |
if(r == SSH_ERROR || r == 0)
|
|
Packit |
6c0a39 |
goto error;
|
|
Packit |
6c0a39 |
total += r;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
ms=elapsed_time(&ts);
|
|
Packit |
6c0a39 |
*bps=8000 * (float)bytes / ms;
|
|
Packit |
6c0a39 |
if(args->verbose > 0)
|
|
Packit |
6c0a39 |
fprintf(stdout,"download took %f ms for %lu bytes, at %f bps\n",ms,
|
|
Packit |
6c0a39 |
bytes,*bps);
|
|
Packit |
6c0a39 |
} else {
|
|
Packit |
6c0a39 |
fprintf(stderr,"Expected SSH_SCP_REQUEST_NEWFILE, got %d\n",r);
|
|
Packit |
6c0a39 |
goto error;
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
ssh_scp_close(scp);
|
|
Packit |
6c0a39 |
ssh_scp_free(scp);
|
|
Packit |
6c0a39 |
return 0;
|
|
Packit |
6c0a39 |
error:
|
|
Packit |
6c0a39 |
fprintf(stderr,"Error during scp download : %s\n",ssh_get_error(session));
|
|
Packit |
6c0a39 |
if(scp){
|
|
Packit |
6c0a39 |
ssh_scp_close(scp);
|
|
Packit |
6c0a39 |
ssh_scp_free(scp);
|
|
Packit |
6c0a39 |
}
|
|
Packit |
6c0a39 |
return -1;
|
|
Packit |
6c0a39 |
}
|