[PATCH v1 2/4] rtemsbsd:Updated TTCP code with network demo code
Gedare Bloom
gedare at rtems.org
Tue Jun 8 17:12:27 UTC 2021
Are these updates from OAR? Do you want to scope them with #ifdef
#endif for RTEMS? Or this is clone-and-own software now?
Why not import from network-demos?
On Tue, Jun 8, 2021 at 10:12 AM Stephen Clark <stephen.clark at oarcorp.com> wrote:
>
> Updated the TTCP code to match the ttcp.c in RTEMS network-demos
> repository (https://git.rtems.org/network-demos/).
> ---
> rtemsbsd/ttcp/ttcp.c | 91 +++++++++++++++++++++++++++++++-------------
> 1 file changed, 65 insertions(+), 26 deletions(-)
>
> diff --git a/rtemsbsd/ttcp/ttcp.c b/rtemsbsd/ttcp/ttcp.c
> index 305a7c7d..dc62c64b 100644
> --- a/rtemsbsd/ttcp/ttcp.c
> +++ b/rtemsbsd/ttcp/ttcp.c
> @@ -35,8 +35,9 @@
> * Distribution Status -
> * Public Domain. Distribution Unlimited.
> */
> +
> #ifndef lint
> -static char RCSid[] = "ttcp.c $Revision$";
> +/* static char RCSid[] = "ttcp.c $Revision$"; */
> #endif
>
> #define BSD43
> @@ -44,6 +45,8 @@ static char RCSid[] = "ttcp.c $Revision$";
> /* #define BSD41a */
> /* #define SYSV */ /* required on SGI IRIX releases before 3.3 */
>
> +#define ENABLE_NANOSLEEP_DELAY
> +
> #include <stdio.h>
> #include <signal.h>
> #include <ctype.h>
> @@ -54,8 +57,12 @@ static char RCSid[] = "ttcp.c $Revision$";
> #include <netinet/tcp.h>
> #include <arpa/inet.h>
> #include <netdb.h>
> +#include <string.h>
> #include <sys/time.h> /* struct timeval */
>
> +#include <unistd.h>
> +#include <stdlib.h>
> +
> #if defined(SYSV)
> #include <sys/times.h>
> #include <sys/param.h>
> @@ -71,7 +78,13 @@ struct sockaddr_in sinme;
> struct sockaddr_in sinhim;
> struct sockaddr_in frominet;
>
> -int domain, fromlen;
> +/* these make it easier to avoid warnings */
> +struct sockaddr *sinhim_p = (struct sockaddr *) &sinhim;
> +struct sockaddr *sinme_p = (struct sockaddr *) &sinme;
> +struct sockaddr *frominet_p = (struct sockaddr *) &frominet;
> +
> +int domain;
> +socklen_t fromlen;
> int fd; /* fd of network socket */
>
> int buflen = 8 * 1024; /* length of buffer */
> @@ -97,6 +110,7 @@ char fmt = 'K'; /* output format: k = kilobits, K = kilobytes,
> * m = megabits, M = megabytes,
> * g = gigabits, G = gigabytes */
> int touchdata = 0; /* access data after reading */
> +long milliseconds = 0; /* delay in milliseconds */
>
> struct hostent *addr;
> extern int errno;
> @@ -124,6 +138,7 @@ Options specific to -t:\n\
> Options specific to -r:\n\
> -B for -s, only output full blocks as specified by -l (for TAR)\n\
> -T \"touch\": access each byte as it's read\n\
> + -m ## delay for specified milliseconds between each write\n\
> ";
>
> char stats[128];
> @@ -133,7 +148,7 @@ double cput, realt; /* user, real time (seconds) */
>
> void err();
> void mes();
> -int pattern();
> +void pattern();
> void prep_timer();
> double read_timer();
> int Nread();
> @@ -147,7 +162,18 @@ sigpipe()
> {
> }
>
> -main(argc,argv)
> +void millisleep(long msec)
> +{
> +#if defined(ENABLE_NANOSLEEP_DELAY)
> + struct timespec req;
> +
> + req.tv_sec = msec / 1000;
> + req.tv_nsec = (msec % 1000) * 1000000;
> +
> + nanosleep( &req, NULL );
> +#endif
> +}
> +int main(argc,argv)
> int argc;
> char **argv;
> {
> @@ -156,7 +182,7 @@ char **argv;
>
> if (argc < 2) goto usage;
>
> - while ((c = getopt(argc, argv, "drstuvBDTb:f:l:n:p:A:O:")) != -1) {
> + while ((c = getopt(argc, argv, "drstuvBDTb:f:l:m:n:p:A:O:")) != -1) {
> switch (c) {
>
> case 'B':
> @@ -179,6 +205,12 @@ char **argv;
> "ttcp: -D option ignored: TCP_NODELAY socket option not supported\n");
> #endif
> break;
> + case 'm':
> + milliseconds = atoi(optarg);
> + #if !defined(ENABLE_NANOSLEEP_DELAY)
> + fprintf(stderr, "millisecond delay disabled\n");
> + #endif
> + break;
> case 'n':
> nbuf = atoi(optarg);
> break;
> @@ -285,7 +317,7 @@ char **argv;
> err("socket");
> mes("socket");
>
> - if (bind(fd, &sinme, sizeof(sinme)) < 0)
> + if (bind(fd, sinme_p, sizeof(sinme)) < 0)
> err("bind");
>
> #if defined(SO_SNDBUF) || defined(SO_RCVBUF)
> @@ -305,7 +337,9 @@ char **argv;
> #endif
>
> if (!udp) {
> +#if !defined(__rtems__)
> signal(SIGPIPE, sigpipe);
> +#endif
> if (trans) {
> /* We are the client if transmitting */
> if (options) {
> @@ -326,7 +360,7 @@ char **argv;
> mes("nodelay");
> }
> #endif
> - if(connect(fd, &sinhim, sizeof(sinhim) ) < 0)
> + if(connect(fd, sinhim_p, sizeof(sinhim) ) < 0)
> err("connect");
> mes("connect");
> } else {
> @@ -348,11 +382,11 @@ char **argv;
> }
> fromlen = sizeof(frominet);
> domain = AF_INET;
> - if((fd=accept(fd, &frominet, &fromlen) ) < 0)
> + if((fd=accept(fd, frominet_p, &fromlen) ) < 0)
> err("accept");
> { struct sockaddr_in peer;
> - int peerlen = sizeof(peer);
> - if (getpeername(fd, (struct sockaddr_in *) &peer,
> + socklen_t peerlen = sizeof(peer);
> + if (getpeername(fd, (struct sockaddr *) &peer,
> &peerlen) < 0) {
> err("getpeername");
> }
> @@ -368,8 +402,10 @@ char **argv;
> if (trans) {
> pattern( buf, buflen );
> if(udp) (void)Nwrite( fd, buf, 4 ); /* rcvr start */
> - while (nbuf-- && Nwrite(fd,buf,buflen) == buflen)
> + while (nbuf-- && Nwrite(fd,buf,buflen) == buflen) {
> nbytes += buflen;
> + millisleep( milliseconds );
> + }
> if(udp) (void)Nwrite( fd, buf, 4 ); /* rcvr end */
> } else {
> if (udp) {
> @@ -423,7 +459,7 @@ char **argv;
> nbytes, cput, outfmt(nbytes/cput));
> }
> fprintf(stdout,
> - "ttcp%s: %d I/O calls, msec/call = %.2f, calls/sec = %.2f\n",
> + "ttcp%s: %ld I/O calls, msec/call = %.2f, calls/sec = %.2f\n",
> trans?"-t":"-r",
> numCalls,
> 1024.0 * realt/((double)numCalls),
> @@ -431,7 +467,7 @@ char **argv;
> fprintf(stdout,"ttcp%s: %s\n", trans?"-t":"-r", stats);
> if (verbose) {
> fprintf(stdout,
> - "ttcp%s: buffer address %#x\n",
> + "ttcp%s: buffer address %p\n",
> trans?"-t":"-r",
> buf);
> }
> @@ -440,6 +476,7 @@ char **argv;
> usage:
> fprintf(stderr,Usage);
> exit(1);
> + return 0;
> }
>
> void
> @@ -459,7 +496,7 @@ char *s;
> fprintf(stderr,"ttcp%s: %s\n", trans?"-t":"-r", s);
> }
>
> -pattern( cp, cnt )
> +void pattern( cp, cnt )
> register char *cp;
> register int cnt;
> {
> @@ -554,6 +591,7 @@ prep_timer()
> double
> read_timer(str,len)
> char *str;
> +int len;
> {
> struct timeval timedol;
> struct rusage ru1;
> @@ -614,13 +652,13 @@ prusage(r0, r1, e, b, outp)
>
> case 'U':
> tvsub(&tdiff, &r1->ru_utime, &r0->ru_utime);
> - sprintf(outp,"%d.%01d", tdiff.tv_sec, tdiff.tv_usec/100000);
> + sprintf(outp,"%ld.%01ld", tdiff.tv_sec, tdiff.tv_usec/100000);
> END(outp);
> break;
>
> case 'S':
> tvsub(&tdiff, &r1->ru_stime, &r0->ru_stime);
> - sprintf(outp,"%d.%01d", tdiff.tv_sec, tdiff.tv_usec/100000);
> + sprintf(outp,"%ld.%01ld", tdiff.tv_sec, tdiff.tv_usec/100000);
> END(outp);
> break;
>
> @@ -642,18 +680,18 @@ prusage(r0, r1, e, b, outp)
> break;
>
> case 'X':
> - sprintf(outp,"%d", t == 0 ? 0 : (r1->ru_ixrss-r0->ru_ixrss)/t);
> + sprintf(outp,"%ld", t == 0 ? 0 : (r1->ru_ixrss-r0->ru_ixrss)/t);
> END(outp);
> break;
>
> case 'D':
> - sprintf(outp,"%d", t == 0 ? 0 :
> + sprintf(outp,"%ld", t == 0 ? 0 :
> (r1->ru_idrss+r1->ru_isrss-(r0->ru_idrss+r0->ru_isrss))/t);
> END(outp);
> break;
>
> case 'K':
> - sprintf(outp,"%d", t == 0 ? 0 :
> + sprintf(outp,"%ld", t == 0 ? 0 :
> ((r1->ru_ixrss+r1->ru_isrss+r1->ru_idrss) -
> (r0->ru_ixrss+r0->ru_idrss+r0->ru_isrss))/t);
> END(outp);
> @@ -743,16 +781,16 @@ register char *cp;
> /*
> * N R E A D
> */
> -Nread( fd, buf, count )
> +int Nread( fd, buf, count )
> int fd;
> void *buf;
> int count;
> {
> struct sockaddr_in from;
> - int len = sizeof(from);
> + socklen_t len = sizeof(from);
> register int cnt;
> if( udp ) {
> - cnt = recvfrom( fd, buf, count, 0, &from, &len );
> + cnt = recvfrom( fd, buf, count, 0, (struct sockaddr *)&from, &len );
> numCalls++;
> } else {
> if( b_flag )
> @@ -774,7 +812,7 @@ int count;
> /*
> * N W R I T E
> */
> -Nwrite( fd, buf, count )
> +int Nwrite( fd, buf, count )
> int fd;
> void *buf;
> int count;
> @@ -782,9 +820,10 @@ int count;
> register int cnt;
> if( udp ) {
> again:
> - cnt = sendto( fd, buf, count, 0, &sinhim, sizeof(sinhim) );
> + cnt = sendto( fd, buf, count, 0, sinhim_p, sizeof(sinhim) );
> numCalls++;
> if( cnt<0 && errno == ENOBUFS ) {
> + printf("ttcp: out of buffers -- delaying\n"); /*JRS*/
> delay(18000);
> errno = 0;
> goto again;
> @@ -797,13 +836,13 @@ again:
> }
>
> void
> -delay(us)
> +delay(int us)
> {
> struct timeval tv;
>
> tv.tv_sec = 0;
> tv.tv_usec = us;
> - (void)select( 1, (char *)0, (char *)0, (char *)0, &tv );
> + (void)select( 1, (fd_set *)0, (fd_set *)0, (fd_set *)0, &tv );
> }
>
> /*
> --
> 2.27.0
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list