[PATCH v1 2/4] rtemsbsd:Updated TTCP code with network demo code
Joel Sherrill
joel at rtems.org
Tue Jun 8 17:40:50 UTC 2021
On Tue, Jun 8, 2021, 12:12 PM Gedare Bloom <gedare at rtems.org> wrote:
> Are these updates from OAR? Do you want to scope them with #ifdef
> #endif for RTEMS? Or this is clone-and-own software now?
>
Yes. The code is old a s has warnings which need to be fixed.
Because this program gets compiled natively when running benchmarks. It
takes a Tx and Rx side to run. One is on your host.
I have no idea how to mark things like this
The old version was clone and own. This may just be a newer version of that
but it needs to run on various hosts and RTEMS.
>
> Why not import from network-demos?
I thought it would be best to do a fresh port using that as guidance so
there was less chance of picking up cruft along the way.
--joel
>
>
> 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
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20210608/d34a1020/attachment-0001.html>
More information about the devel
mailing list