home *** CD-ROM | disk | FTP | other *** search
- /*
- * minimal NetBIOS test program
- * Copyright (C) 1987 Micro-Matic Research
- */
-
- #include <stdio.h>
- #include <string.h>
- #include <dos.h>
- #include "nbtest.h"
-
- #define FALSE 0
- #define TRUE 1
-
- #define SENDNAME "NBTEST-S"
- #define RECEIVENAME "NBTEST-R"
- #define MAXBLKSIZE 16384
- #define MAXNCBS 20
-
- NCB ncb;
- char sbuffer[MAXBLKSIZE+1];
- char rbuffer[MAXBLKSIZE+1];
-
- int nrblocks = 200;
- int blksize = 1024;
- int bflag = 0;
- int iflag = FALSE;
- int vflag = FALSE;
- int wflag = FALSE;
-
- /* Ascii error code table */
-
- char *nb_err_tab[] =
- {
- "GOOD RETURN",
- "ILLEGAL BUFFER LENGTH",
- "UNDEFINED",
- "INVALID COMMAND CODE",
- "UNDEFINED",
- "COMMAND TIMED OUT",
- "MESSAGE INCOMPLETE (NOT ERR)",
- "UNDEFINED",
- "ILLEGAL LOCAL SESSION NUMBER",
- "NO RESOURCE AVAILABLE",
- "SESSION CLOSED",
- "COMMAND CANCELLED",
- "UNDEFINED",
- "DUPLICATE NAME IN LOCAL NAME TABLE",
- "NAME TABLE FULL",
- "NAME HAS ACTIVE SESSION",
- "UNDEFINED",
- "LOCAL SESSION TABLE FULL",
- "SESSION OPEN REJECTED",
- "ILLEGAL NAMES NUMBER",
- "COULDN'T FIND CALLED NAME",
- "NAME NOT FOUND OR INVALID",
- "NAME IN USE",
- "NAME DELETED",
- "SESSION ENDED ABNORMALLY",
- "NAME CONFLICT DETECTED",
- "INCOMPATIBLE REMOTE DEVICE",
- "UNDEFINED",
- "UNDEFINED",
- "UNDEFINED",
- "UNDEFINED",
- "UNDEFINED",
- "UNDEFINED",
- "INTERFACE BUSY",
- "TOO MANY COMMANDS OUTSTANDING",
- "INVALID LANA_NUM VALUE",
- "COMMAND NOT CANCELLED",
- "RESERVED NAME SPECIFIED",
- "COMMAND NOT VALID TO CANCEL"
- };
-
- void receive (void), send (void);
- void err (int);
- int nbexec (NCB *), nbsubmit (NCB *);
-
- main (argc, argv)
- int argc;
- char *argv[];
- {
- int errcode;
- int i;
-
- for (i = 1; i < argc; i++)
- {
- if (*argv[i] != '-')
- goto usage;
-
- switch (*++argv[i])
- {
- case 'b':
- /* increment nr of simultaneous NCBs in background for TX/RX */
- if (++i >= argc)
- goto usage;
- bflag = atoi (argv[i]);
- break;
- case 'n':
- /* specify number of blocks to send */
- if (++i >= argc)
- goto usage;
- nrblocks = atoi (argv[i]);
- break;
- case 's':
- /* specify size of blocks to send */
- if (++i >= argc)
- goto usage;
- blksize = atoi (argv[i]);
- break;
- case 'i':
- /* information about bytes transferred displayed */
- iflag = TRUE;
- break;
- case 'w':
- /* wait for key before sending */
- wflag = iflag = TRUE;
- break;
- case 'v':
- /* verify received data */
- vflag = TRUE;
- break;
- default:
- goto usage;
- }
- }
-
- if (nrblocks < 1 || nrblocks > 10000 ||
- blksize < 1 || blksize > MAXBLKSIZE ||
- bflag < 0 || bflag > MAXNCBS)
- goto usage;
-
- /* prime send buffer with cyclic bytes 0..255 */
- for (i = 0; i < blksize; i++)
- sbuffer[i] = i;
-
- printf ("\nNo-Wait option: %s\n", bflag ? "ON" : "OFF");
- if (bflag)
- printf ("%d NCB%s issued simultaneously\n", bflag,
- (bflag == 1) ? " is" : "s are");
-
- /* try to act as the receiver first */
-
- printf ("\nTrying to register name '%s'\n", RECEIVENAME);
- memset (&ncb, 0, sizeof (ncb));
- ncb.ncb_command = N_ADDNAME;
- strncpy (ncb.ncb_name, RECEIVENAME, 16);
-
- if ((errcode = nbexec (&ncb)) == 0)
- {
- receive();
- exit (0);
- }
-
- if (errcode == 0x16)
- printf ("--> NAME IN USE\n");
- else
- err (errcode);
-
- /* if we cannot be receiver we'll have to be sender */
-
- printf ("\nTrying to register name '%s'\n", SENDNAME);
- memset (&ncb, 0, sizeof (ncb));
- ncb.ncb_command = N_ADDNAME;
- strncpy (ncb.ncb_name, SENDNAME, 16);
-
- if ((errcode = nbexec (&ncb)) == 0)
- {
- send();
- exit (0);
- }
-
- err (errcode);
- exit (0);
-
- usage:
- printf ("Usage:\n");
- printf ("nbtest [-i] [-b oc] [-n nr_blocks] [-s size_blocks]\n");
- printf (" -i interactive; updates bytes exchanged\n");
- printf (" -w wait for key before sending each packet\n");
- printf (" -v verify received data length and data\n");
- printf (" -b nnn number of commands sent in NO-WAIT mode (0..%d)\n",
- MAXNCBS);
- printf (" -n nnn number of blocks exchanged (1..10000)\n");
- printf (" -s nnn size of blocks (1..16384)\n",
- MAXBLKSIZE);
- printf ("Default: -b 0 -n 200 -s 1024\n");
- exit (1);
- }
-
-
- void send (void)
- {
- int errcode;
- long starttime, endtime;
- unsigned long byte = 0;
- unsigned long kbyte = 0;
- int etime;
- int i;
- BYTE lsn;
-
- call:
- printf ("\nCalling '%s'\n", RECEIVENAME);
- fflush (stdout);
-
- memset (&ncb, 0, sizeof (ncb));
- ncb.ncb_command = N_CALL;
- strncpy (ncb.ncb_name, SENDNAME, 16);
- strncpy (ncb.ncb_callname, RECEIVENAME, 16);
- ncb.ncb_rto = 20;
- ncb.ncb_sto = 20;
-
- if ((errcode = nbexec (&ncb)) != 0)
- {
- err (errcode);
- goto deregister;
- }
-
- printf ("-> Session established with '%s' as #%d\n",
- RECEIVENAME, ncb.ncb_lsn);
- fflush (stdout);
-
- lsn = ncb.ncb_lsn;
-
- transfer:
- printf ("\nStarting transfer of %d blocks of %d bytes\n",
- nrblocks, blksize);
- printf ("-> KB transferred: ");
- fflush (stdout);
-
- time (&starttime);
-
-
- for (i = 0; i < nrblocks; i += (bflag ? bflag : 1))
- {
- if (wflag)
- getch ();
-
- memset (&ncb, 0, sizeof (ncb));
-
- ncb.ncb_command = N_SEND;
- ncb.ncb_lsn = lsn;
- ncb.ncb_buffer = (BYTE _far *) sbuffer;
- ncb.ncb_length = blksize;
-
- if ((errcode = nbsubmit (&ncb)) != 0)
- break;
-
- byte += bflag ? (long)blksize*bflag : blksize;
-
- if (byte > kbyte * 1024L)
- {
- while (byte > kbyte * 1024L)
- kbyte++;
-
- if (iflag)
- {
- printf ("\b\b\b\b\b\b%-6ld", kbyte);
- fflush (stdout);
- }
- }
- }
-
- printf ("\b\b\b\b\b\b%-6ld\n", kbyte);
- fflush (stdout);
-
- time (&endtime);
- etime = endtime - starttime;
-
- if (errcode != 0)
- err (errcode);
-
- printf ("-> Data transfer completed.\n");
- printf ("-> Time elapsed: %d seconds\n", etime);
- printf ("-> Blocks transferred: %d\n", i);
-
- if (etime >= 3 && kbyte > 0 && (kbyte / etime) > 0)
- printf ("-> Transfer rate: %d KB/sec\n", (int)(kbyte / etime));
- else
- printf ("-> Transfer rate not determined\n");
-
- hangup:
- printf ("\nHanging up\n");
- fflush (stdout);
-
- memset (&ncb, 0, sizeof (ncb));
- ncb.ncb_command = N_HANGUP;
- ncb.ncb_lsn = lsn;
- if ((errcode = nbexec (&ncb)) != 0 && errcode != E_SES_CLOSE)
- {
- err (errcode);
- goto deregister;
- }
-
- printf ("-> Session with '%s' closed\n", RECEIVENAME);
-
- deregister:
- printf ("\nDeregistering name '%s'\n", SENDNAME);
- fflush (stdout);
-
- memset (&ncb, 0, sizeof (ncb));
- ncb.ncb_command = N_DELETENAME;
- strncpy (ncb.ncb_name, SENDNAME, 16);
- if ((errcode = nbexec (&ncb)) != 0)
- {
- err (errcode);
- return;
- }
-
- printf ("-> Name deregistered\n");
- return;
- }
-
-
- void receive (void)
- {
- int errcode;
- long starttime, endtime;
- unsigned long kbyte = 0;
- unsigned long byte = 0;
- int etime;
- int i;
- BYTE lsn;
-
- listen:
- printf ("\nWaiting for a call from '%s'\n", SENDNAME);
- fflush (stdout);
-
- memset (&ncb, 0, sizeof (ncb));
- ncb.ncb_command = N_LISTEN;
- strncpy (ncb.ncb_name, RECEIVENAME, 16);
- strncpy (ncb.ncb_callname, SENDNAME, 16);
- ncb.ncb_rto = 20;
- ncb.ncb_sto = 20;
-
- if ((errcode = nbexec (&ncb)) != 0)
- {
- err (errcode);
- goto deregister;
- }
-
- printf ("-> Session established with '%s' as #%d\n",
- SENDNAME, ncb.ncb_lsn);
- fflush (stdout);
-
- lsn = ncb.ncb_lsn;
-
- transfer:
- printf ("\nReception of %d blocks of %d bytes in progress\n",
- nrblocks, blksize);
- printf ("-> KB transferred: ");
- fflush (stdout);
-
- time (&starttime);
-
-
- for (i = 0; i < nrblocks; i += (bflag ? bflag : 1))
- {
- memset (&ncb, 0, sizeof (ncb));
-
- ncb.ncb_command = N_RECEIVE;
- ncb.ncb_lsn = lsn;
- ncb.ncb_buffer = (BYTE _far *) rbuffer;
- ncb.ncb_length = blksize;
-
- if ((errcode = nbsubmit (&ncb)) != 0)
- break;
-
- if (vflag)
- {
- if (ncb.ncb_length != blksize)
- {
- printf ("\n-> Received length mismatch; expected=%d actual=%d\n",
- blksize, ncb.ncb_length);
- fflush (stdout);
- break;
- }
- if (memcmp (sbuffer, rbuffer, blksize) != 0)
- {
- printf ("\n-> Received data miscompare\n");
- fflush (stdout);
- break;
- }
- }
-
- byte += bflag ? (long)blksize*bflag : blksize;
-
- if (byte > kbyte * 1024L)
- {
- while (byte > kbyte * 1024L)
- kbyte++;
-
- if (iflag)
- {
- printf ("\b\b\b\b\b\b%-6ld", kbyte);
- fflush (stdout);
- }
- }
- }
-
- printf ("\b\b\b\b\b\b%-6ld\n", kbyte);
- fflush (stdout);
-
- time (&endtime);
- etime = endtime - starttime;
-
- if (errcode != 0)
- err (errcode);
-
- printf ("-> Data transfer completed.\n");
- printf ("-> Time elapsed: %d seconds\n", etime);
- printf ("-> Blocks transferred: %d\n", i);
-
- if (etime >= 3 && kbyte > 0 && (kbyte / etime) > 0)
- printf ("-> Transfer rate: %d KB/sec\n", (int)(kbyte / etime));
- else
- printf ("-> Transfer rate not determined\n");
-
- hangup:
- printf ("\nHanging up\n");
- fflush (stdout);
-
- memset (&ncb, 0, sizeof (ncb));
- ncb.ncb_command = N_HANGUP;
- ncb.ncb_lsn = lsn;
- if ((errcode = nbexec (&ncb)) != 0 && errcode != E_SES_CLOSE)
- {
- err (errcode);
- goto deregister;
- }
-
- printf ("-> Session with '%s' closed\n", RECEIVENAME);
-
- deregister:
- printf ("\nDeregistering name '%s'\n", RECEIVENAME);
- fflush (stdout);
-
- ncb.ncb_command = N_DELETENAME;
- strncpy (ncb.ncb_name, RECEIVENAME, 16);
- if ((errcode = nbexec (&ncb)) != 0)
- {
- err (errcode);
- return;
- }
-
- printf ("-> Name deregistered\n");
-
- return;
- }
-
-
- void err (code)
- int code;
- {
- printf ("-> ERROR: code = 0x%x", code);
- if (code < (sizeof (nb_err_tab) / sizeof (*nb_err_tab)))
- printf (" (%s)", nb_err_tab[code]);
- printf ("\n");
- }
-
- static volatile int bg_nberr;
- static volatile int bg_num;
- static NCB bg_ncbs[MAXNCBS+1];
-
- #pragma check_stack-
-
- void _interrupt _far nbpost (es, ds, di, si, bp, sp, bx)
- unsigned short es, ds, di, si, bp, sp, bx;
- {
- NCB _far *pncb;
-
- FP_OFF (pncb) = bx;
- FP_SEG (pncb) = es;
-
- --bg_num;
- bg_nberr = pncb->ncb_cmd_cplt;
- }
-
- #pragma check_stack+
-
- int nbexec (NCB *pncb)
- {
- union REGS regs;
- struct SREGS sregs;
- char far *fptr = (char far *) pncb;
-
- regs.x.bx = FP_OFF (fptr);
- sregs.es = FP_SEG (fptr);
- int86x (0x5C, ®s, ®s, &sregs);
- return (pncb->ncb_retcode);
- }
-
- /* execute the ncb in foreground or background */
-
- int nbsubmit (pncb)
- NCB *pncb;
- {
- int errcode;
- int i;
-
- /* execute directly if wait mode */
- if (bflag == 0)
- {
- pncb->ncb_post = NULL;
- return (nbexec (pncb));
- }
-
- bg_nberr = -1;
- bg_num = bflag;
-
- pncb->ncb_command |= N_NOWAIT;
- pncb->ncb_post = nbpost;
-
- /* issue bflag copies of the NCB in nowait mode */
- for (i = 0; i < bflag; ++i)
- {
- bg_ncbs[i] = *pncb;
- if ((errcode = nbexec (&bg_ncbs[i])) != 0 && errcode != 0xFF)
- return (errcode);
- }
-
- /* wait till all completed */
- while (bg_num > 0)
- if (bg_nberr != -1 && bg_nberr != 0)
- return (bg_nberr);
-
- return (0);
- }
-