On Mon, Mar 04, 2019 at 09:17:00PM +1000, David Gwynne wrote: > this combines errors and qdrops into fails, and shows them by default. > if you want to look at drops or errors, you can use d or f to switch to > that view. > > this also changes netstat so it shows fails by default which is a > combination of errors and qdrops too, but -d and -e force drops or > errors respectively. > > it is really frustrating at the moment that i can't see qdrops anywhere, > which makes it hard to judge the effectiveness of some changes im > working on. > > for example, this is before and after with netstat: > > dlg@ix netstat$ netstat -I ix1 > Name Mtu Network Address Ipkts Ierrs Opkts Oerrs > Colls > ix1 1500 <Link> b8:ca:3a:66:e2:72 193968251 0 172754300 0 > ix1 1500 192.168.1.3 192.168.1.3 193968251 0 172754300 0 > ix1 1500 192.168.1.1 192.168.1.19 193968251 0 172754300 0 > dlg@ix netstat$ ./obj/netstat -I ix1 > Name Mtu Network Address Ipkts Ifail Opkts Ofail > Colls > ix1 1500 <Link> b8:ca:3a:66:e2:72 193968251 1789065 172754300 0 > ix1 1500 192.168.1.3 192.168.1.3 193968251 1789065 172754300 0 > ix1 1500 192.168.1.1 192.168.1.19 193968251 1789065 172754300 0 > dlg@ix netstat$ ./obj/netstat -dI ix1 > Name Mtu Network Address Ipkts Idrop Opkts Odrop > Colls > ix1 1500 <Link> b8:ca:3a:66:e2:72 193968251 1789065 172754300 0 > ix1 1500 192.168.1.3 192.168.1.3 193968251 1789065 172754300 0 > ix1 1500 192.168.1.1 192.168.1.19 193968251 1789065 172754300 0 > dlg@ix netstat$ ./obj/netstat -eI ix1 > Name Mtu Network Address Ipkts Ierrs Opkts Oerrs > Colls > ix1 1500 <Link> b8:ca:3a:66:e2:72 193968251 0 172754300 0 > ix1 1500 192.168.1.3 192.168.1.3 193968251 0 172754300 0 > ix1 1500 192.168.1.1 192.168.1.19 193968251 0 172754300 0 > > thoughts?
I'm all for this. Having a way to see every place where packets are dropped is important. > Index: systat/if.c > =================================================================== > RCS file: /cvs/src/usr.bin/systat/if.c,v > retrieving revision 1.23 > diff -u -p -r1.23 if.c > --- systat/if.c 16 Jan 2015 00:03:37 -0000 1.23 > +++ systat/if.c 4 Mar 2019 11:13:40 -0000 > @@ -56,6 +56,49 @@ static void showifstat(struct ifstat *); > static void showtotal(void); > static void rt_getaddrinfo(struct sockaddr *, int, struct sockaddr **); > > +const char ifails[] = "IFAILS"; > +const char ofails[] = "OFAILS"; > + > +#define IF_ERR_SUM 0 > +#define IF_ERR_ERRORS 1 > +#define IF_ERR_QDROPS 2 > + > +struct if_err_view { > + const char *iname; > + const char *oname; > + uint64_t (*icount)(const struct ifcount *); > + uint64_t (*ocount)(const struct ifcount *); > +}; > + > +static uint64_t if_err_ifails(const struct ifcount *); > +static uint64_t if_err_ofails(const struct ifcount *); > +static uint64_t if_err_ierrors(const struct ifcount *); > +static uint64_t if_err_oerrors(const struct ifcount *); > +static uint64_t if_err_iqdrops(const struct ifcount *); > +static uint64_t if_err_oqdrops(const struct ifcount *); > + > +static const struct if_err_view if_err_views[] = { > + [IF_ERR_SUM] = { > + .iname = ifails, > + .oname = ofails, > + .icount = if_err_ifails, > + .ocount = if_err_ofails, > + }, > + [IF_ERR_ERRORS] = { > + .iname = "IERRS", > + .oname = "OERRS", > + .icount = if_err_ierrors, > + .ocount = if_err_oerrors, > + }, > + [IF_ERR_QDROPS] = { > + .iname = "IQDROPS", > + .oname = "OQDROPS", > + .icount = if_err_iqdrops, > + .ocount = if_err_oqdrops, > + }, > +}; > + > +static const struct if_err_view *if_err_view = &if_err_views[IF_ERR_SUM]; > > /* Define fields */ > field_def fields_if[] = { > @@ -63,10 +106,10 @@ field_def fields_if[] = { > {"STATE", 4, 6, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0}, > {"IPKTS", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, > {"IBYTES", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, > - {"IERRS", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, > + {ifails, 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, > {"OPKTS", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, > {"OBYTES", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, > - {"OERRS", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, > + {ofails, 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, > {"COLLS", 5, 8, 1, FLD_ALIGN_RIGHT, -1, 0, 0, 0}, > {"DESC", 14, 64, 1, FLD_ALIGN_LEFT, -1, 0, 0, 0}, > }; > @@ -264,9 +307,11 @@ fetchifstat(void) > UPDATE(ifc_ip, ifm_data.ifi_ipackets); > UPDATE(ifc_ib, ifm_data.ifi_ibytes); > UPDATE(ifc_ie, ifm_data.ifi_ierrors); > + UPDATE(ifc_iq, ifm_data.ifi_iqdrops); > UPDATE(ifc_op, ifm_data.ifi_opackets); > UPDATE(ifc_ob, ifm_data.ifi_obytes); > UPDATE(ifc_oe, ifm_data.ifi_oerrors); > + UPDATE(ifc_oq, ifm_data.ifi_oqdrops); > UPDATE(ifc_co, ifm_data.ifi_collisions); > ifs->ifs_cur.ifc_flags = ifm.ifm_flags; > ifs->ifs_cur.ifc_state = ifm.ifm_data.ifi_link_state; > @@ -315,11 +360,11 @@ showifstat(struct ifstat *ifs) > > print_fld_sdiv(FLD_IF_IBYTES, ifs->ifs_cur.ifc_ib * conv, div); > print_fld_size(FLD_IF_IPKTS, ifs->ifs_cur.ifc_ip); > - print_fld_size(FLD_IF_IERRS, ifs->ifs_cur.ifc_ie); > + print_fld_size(FLD_IF_IERRS, if_err_view->icount(&ifs->ifs_cur)); > > print_fld_sdiv(FLD_IF_OBYTES, ifs->ifs_cur.ifc_ob * conv, div); > print_fld_size(FLD_IF_OPKTS, ifs->ifs_cur.ifc_op); > - print_fld_size(FLD_IF_OERRS, ifs->ifs_cur.ifc_oe); > + print_fld_size(FLD_IF_OERRS, if_err_view->ocount(&ifs->ifs_cur)); > > print_fld_size(FLD_IF_COLLS, ifs->ifs_cur.ifc_co); > > @@ -336,11 +381,11 @@ showtotal(void) > > print_fld_sdiv(FLD_IF_IBYTES, sum.ifc_ib * conv, div); > print_fld_size(FLD_IF_IPKTS, sum.ifc_ip); > - print_fld_size(FLD_IF_IERRS, sum.ifc_ie); > + print_fld_size(FLD_IF_IERRS, if_err_view->icount(&sum)); > > print_fld_sdiv(FLD_IF_OBYTES, sum.ifc_ob * conv, div); > print_fld_size(FLD_IF_OPKTS, sum.ifc_op); > - print_fld_size(FLD_IF_OERRS, sum.ifc_oe); > + print_fld_size(FLD_IF_OERRS, if_err_view->ocount(&sum)); > > print_fld_size(FLD_IF_COLLS, sum.ifc_co); > > @@ -348,12 +393,67 @@ showtotal(void) > > } > > +static uint64_t > +if_err_ifails(const struct ifcount *ifc) > +{ > + return (ifc->ifc_ie + ifc->ifc_iq); > +} > + > +static uint64_t > +if_err_ofails(const struct ifcount *ifc) > +{ > + return (ifc->ifc_oe + ifc->ifc_oq); > +} > + > +static uint64_t > +if_err_ierrors(const struct ifcount *ifc) > +{ > + return (ifc->ifc_ie); > +} > + > +static uint64_t > +if_err_oerrors(const struct ifcount *ifc) > +{ > + return (ifc->ifc_oe); > +} > + > +static uint64_t > +if_err_iqdrops(const struct ifcount *ifc) > +{ > + return (ifc->ifc_iq); > +} > + > +static uint64_t > +if_err_oqdrops(const struct ifcount *ifc) > +{ > + return (ifc->ifc_oq); > +} > + > +static void > +if_set_errs(unsigned int v) > +{ > + if_err_view = &if_err_views[v]; > + FLD_IF_IERRS->title = if_err_view->iname; > + FLD_IF_IERRS->title = if_err_view->oname; > + gotsig_alarm = 1; > +} > + > int > if_keyboard_callback(int ch) > { > struct ifstat *ifs; > > switch (ch) { > + case 'd': > + if_set_errs(IF_ERR_QDROPS); > + break; > + case 'e': > + if_set_errs(IF_ERR_ERRORS); > + break; > + case 'f': > + if_set_errs(IF_ERR_SUM); > + break; > + > case 'r': > for (ifs = ifstats; ifs < ifstats + nifs; ifs++) > ifs->ifs_old = ifs->ifs_now; > Index: systat/systat.1 > =================================================================== > RCS file: /cvs/src/usr.bin/systat/systat.1,v > retrieving revision 1.110 > diff -u -p -r1.110 systat.1 > --- systat/systat.1 25 Jul 2018 17:24:14 -0000 1.110 > +++ systat/systat.1 4 Mar 2019 11:13:40 -0000 > @@ -290,6 +290,13 @@ between display refreshes. > changes the counters to show the average per second over > the display refresh interval; > this is the default. > +.Ic d > +displays input and output queue drops. > +.Ic e > +displays input and output errors. > +.Ic f > +displays input and output queue drops plus errors. > +This is the default view. > .It Ic iostat > Display statistics about disk throughput. > Statistics > Index: systat/systat.h > =================================================================== > RCS file: /cvs/src/usr.bin/systat/systat.h,v > retrieving revision 1.22 > diff -u -p -r1.22 systat.h > --- systat/systat.h 30 May 2018 13:43:51 -0000 1.22 > +++ systat/systat.h 4 Mar 2019 11:13:40 -0000 > @@ -104,9 +104,11 @@ struct ifcount { > u_int64_t ifc_ib; /* input bytes */ > u_int64_t ifc_ip; /* input packets */ > u_int64_t ifc_ie; /* input errors */ > + u_int64_t ifc_iq; /* input qdrops */ > u_int64_t ifc_ob; /* output bytes */ > u_int64_t ifc_op; /* output packets */ > u_int64_t ifc_oe; /* output errors */ > + u_int64_t ifc_oq; /* output qdrops */ > u_int64_t ifc_co; /* collisions */ > int ifc_flags; /* up / down */ > int ifc_state; /* link state */ > Index: netstat/if.c > =================================================================== > RCS file: /cvs/src/usr.bin/netstat/if.c,v > retrieving revision 1.74 > diff -u -p -r1.74 if.c > --- netstat/if.c 5 Oct 2015 15:40:39 -0000 1.74 > +++ netstat/if.c 4 Mar 2019 11:13:40 -0000 > @@ -63,6 +63,26 @@ static void catchalarm(int); > static void get_rtaddrs(int, struct sockaddr *, struct sockaddr **); > static void fetchifs(void); > > +struct iftot; > + > +struct if_show_err { > + const char *name; > + const char *iname; > + const char *oname; > + uint64_t (*count)(uint64_t, uint64_t); > +}; > + > +static uint64_t if_show_fails(uint64_t, uint64_t); > +static uint64_t if_show_errors(uint64_t, uint64_t); > +static uint64_t if_show_qdrops(uint64_t, uint64_t); > + > +static const struct if_show_err if_show_errs[] = { > + { "fail", "Ifail", "Ofail", if_show_fails }, > + { "errs", "Ierrs", "Oerrs", if_show_errors }, > + { "drop", "Idrop", "Odrop", if_show_qdrops }, > +}; > +static const struct if_show_err *if_errs = if_show_errs; > + > /* > * Print a description of the network interfaces. > * NOTE: ifnetaddr is the location of the kernel global "ifnet", > @@ -83,6 +103,8 @@ intpr(int interval, int repeatcount) > u_int64_t total = 0; > size_t len; > > + if_errs = &if_show_errs[dflag]; > + > if (interval) { > sidewaysintpr((unsigned)interval, repeatcount); > return; > @@ -94,13 +116,13 @@ intpr(int interval, int repeatcount) > "Name", "Mtu", "Network", "Address"); > if (bflag) > printf("%10.10s %10.10s", "Ibytes", "Obytes"); > - else > + else { > printf("%8.8s %5.5s %8.8s %5.5s %5.5s", > - "Ipkts", "Ierrs", "Opkts", "Oerrs", "Colls"); > + "Ipkts", if_errs->iname, > + "Opkts", if_errs->oname, "Colls"); > + } > if (tflag) > printf(" %s", "Time"); > - if (dflag) > - printf(" %s", "Drop"); > putchar('\n'); > > lim = buf + len; > @@ -137,13 +159,15 @@ intpr(int interval, int repeatcount) > > if (qflag) { > total = ifd->ifi_ibytes + ifd->ifi_obytes + > - ifd->ifi_ipackets + ifd->ifi_ierrors + > - ifd->ifi_opackets + ifd->ifi_oerrors + > + ifd->ifi_ipackets + > + ifd->ifi_opackets + > ifd->ifi_collisions; > + total += if_errs->count(ifd->ifi_ierrors, > + ifd->ifi_iqdrops); > + total += if_errs->count(ifd->ifi_oerrors, > + ifd->ifi_oqdrops); > if (tflag) > total += 0; // XXX ifnet.if_timer; > - if (dflag) > - total += ifd->ifi_oqdrops; > if (total == 0) > continue; > } > @@ -271,13 +295,13 @@ hexprint: > ifd->ifi_ibytes, ifd->ifi_obytes); > } else > printf("%8llu %5llu %8llu %5llu %5llu", > - ifd->ifi_ipackets, ifd->ifi_ierrors, > - ifd->ifi_opackets, ifd->ifi_oerrors, > + ifd->ifi_ipackets, > + if_errs->count(ifd->ifi_ierrors, ifd->ifi_iqdrops), > + ifd->ifi_opackets, > + if_errs->count(ifd->ifi_oerrors, ifd->ifi_oqdrops), > ifd->ifi_collisions); > if (tflag) > printf(" %4d", 0 /* XXX ifnet.if_timer */); > - if (dflag) > - printf(" %5llu", ifd->ifi_oqdrops); > putchar('\n'); > } > > @@ -286,11 +310,12 @@ struct iftot { > u_int64_t ift_ip; /* input packets */ > u_int64_t ift_ib; /* input bytes */ > u_int64_t ift_ie; /* input errors */ > + u_int64_t ift_iq; /* input qdrops */ > u_int64_t ift_op; /* output packets */ > u_int64_t ift_ob; /* output bytes */ > u_int64_t ift_oe; /* output errors */ > + u_int64_t ift_oq; /* output qdrops */ > u_int64_t ift_co; /* collisions */ > - u_int64_t ift_dr; /* drops */ > } ip_cur, ip_old, sum_cur, sum_old; > > volatile sig_atomic_t signalled; /* set if alarm goes off "early" */ > @@ -328,8 +353,6 @@ banner: > printf("%5.5s in %5.5s%5.5s out %5.5s %5.5s", > ip_cur.ift_name, " ", > ip_cur.ift_name, " ", " "); > - if (dflag) > - printf(" %5.5s", " "); > > if (bflag) > printf(" %7.7s in %8.8s %6.6s out %5.5s", > @@ -337,17 +360,14 @@ banner: > else > printf(" %5.5s in %5.5s%5.5s out %5.5s %5.5s", > "total", " ", "total", " ", " "); > - if (dflag) > - printf(" %5.5s", " "); > putchar('\n'); > if (bflag) > printf("%10.10s %8.8s %10.10s %5.5s", > "bytes", " ", "bytes", " "); > else > printf("%8.8s %5.5s %8.8s %5.5s %5.5s", > - "packets", "errs", "packets", "errs", "colls"); > - if (dflag) > - printf(" %5.5s", "drops"); > + "packets", if_errs->name, > + "packets", if_errs->name, "colls"); > > if (bflag) > printf("%10.10s %8.8s %10.10s %5.5s", > @@ -355,8 +375,6 @@ banner: > else > printf(" %8.8s %5.5s %8.8s %5.5s %5.5s", > "packets", "errs", "packets", "errs", "colls"); > - if (dflag) > - printf(" %5.5s", "drops"); > putchar('\n'); > fflush(stdout); > line = 0; > @@ -380,13 +398,12 @@ loop: > } else > printf("%8llu %5llu %8llu %5llu %5llu", > ip_cur.ift_ip - ip_old.ift_ip, > - ip_cur.ift_ie - ip_old.ift_ie, > + if_errs->count(ip_cur.ift_ie - ip_old.ift_ie, > + ip_cur.ift_iq - ip_old.ift_iq), > ip_cur.ift_op - ip_old.ift_op, > - ip_cur.ift_oe - ip_old.ift_oe, > + if_errs->count(ip_cur.ift_oe - ip_old.ift_oe, > + ip_cur.ift_oq - ip_old.ift_oq), > ip_cur.ift_co - ip_old.ift_co); > - if (dflag) > - printf(" %5llu", > - ip_cur.ift_dr - ip_old.ift_dr); > > ip_old = ip_cur; > > @@ -394,21 +411,21 @@ loop: > if (hflag) { > fmt_scaled(sum_cur.ift_ib - sum_old.ift_ib, ibytes); > fmt_scaled(sum_cur.ift_ob - sum_old.ift_ob, obytes); > - printf(" %10s %8.8s %10s %5.5s", > + printf("%10s %8.8s %10s %5.5s", > ibytes, " ", obytes, " "); > } else > - printf(" %10llu %8.8s %10llu %5.5s", > + printf("%10llu %8.8s %10llu %5.5s", > sum_cur.ift_ib - sum_old.ift_ib, " ", > sum_cur.ift_ob - sum_old.ift_ob, " "); > } else > - printf(" %8llu %5llu %8llu %5llu %5llu", > + printf("%8llu %5llu %8llu %5llu %5llu", > sum_cur.ift_ip - sum_old.ift_ip, > - sum_cur.ift_ie - sum_old.ift_ie, > + if_errs->count(sum_cur.ift_ie - sum_old.ift_ie, > + sum_cur.ift_iq - sum_old.ift_iq), > sum_cur.ift_op - sum_old.ift_op, > - sum_cur.ift_oe - sum_old.ift_oe, > + if_errs->count(sum_cur.ift_oe - sum_old.ift_oe, > + sum_cur.ift_oq - sum_old.ift_oq), > sum_cur.ift_co - sum_old.ift_co); > - if (dflag) > - printf(" %5llu", sum_cur.ift_dr - sum_old.ift_dr); > > sum_old = sum_cur; > > @@ -547,21 +564,23 @@ fetchifs(void) > ip_cur.ift_ip = ifd->ifi_ipackets; > ip_cur.ift_ib = ifd->ifi_ibytes; > ip_cur.ift_ie = ifd->ifi_ierrors; > + ip_cur.ift_iq = ifd->ifi_iqdrops; > ip_cur.ift_op = ifd->ifi_opackets; > ip_cur.ift_ob = ifd->ifi_obytes; > ip_cur.ift_oe = ifd->ifi_oerrors; > + ip_cur.ift_oq = ifd->ifi_oqdrops; > ip_cur.ift_co = ifd->ifi_collisions; > - ip_cur.ift_dr = ifd->ifi_oqdrops; > } > > sum_cur.ift_ip += ifd->ifi_ipackets; > sum_cur.ift_ib += ifd->ifi_ibytes; > sum_cur.ift_ie += ifd->ifi_ierrors; > + sum_cur.ift_iq += ifd->ifi_iqdrops; > sum_cur.ift_op += ifd->ifi_opackets; > sum_cur.ift_ob += ifd->ifi_obytes; > sum_cur.ift_oe += ifd->ifi_oerrors; > + sum_cur.ift_oq += ifd->ifi_oqdrops; > sum_cur.ift_co += ifd->ifi_collisions; > - sum_cur.ift_dr += ifd->ifi_oqdrops; > break; > } > } > @@ -571,11 +590,30 @@ fetchifs(void) > ip_cur.ift_ip = ifd->ifi_ipackets; > ip_cur.ift_ib = ifd->ifi_ibytes; > ip_cur.ift_ie = ifd->ifi_ierrors; > + ip_cur.ift_iq = ifd->ifi_iqdrops; > ip_cur.ift_op = ifd->ifi_opackets; > ip_cur.ift_ob = ifd->ifi_obytes; > ip_cur.ift_oe = ifd->ifi_oerrors; > + ip_cur.ift_oq = ifd->ifi_oqdrops; > ip_cur.ift_co = ifd->ifi_collisions; > - ip_cur.ift_dr = ifd->ifi_oqdrops; > } > free(buf); > +} > + > +static uint64_t > +if_show_fails(uint64_t errors, uint64_t qdrops) > +{ > + return (errors + qdrops); > +} > + > +static uint64_t > +if_show_errors(uint64_t errors, uint64_t qdrops) > +{ > + return (errors); > +} > + > +static uint64_t > +if_show_qdrops(uint64_t errors, uint64_t qdrops) > +{ > + return (qdrops); > } > Index: netstat/main.c > =================================================================== > RCS file: /cvs/src/usr.bin/netstat/main.c,v > retrieving revision 1.113 > diff -u -p -r1.113 main.c > --- netstat/main.c 13 Aug 2018 14:36:54 -0000 1.113 > +++ netstat/main.c 4 Mar 2019 11:13:40 -0000 > @@ -129,7 +129,7 @@ main(int argc, char *argv[]) > tableid = getrtable(); > > while ((ch = getopt(argc, argv, > - "AaBbc:dFf:ghI:iLlM:mN:np:P:qrsT:tuvW:w:")) != -1) > + "AaBbc:deFf:ghI:iLlM:mN:np:P:qrsT:tuvW:w:")) != -1) > switch (ch) { > case 'A': > Aflag = 1; > @@ -149,7 +149,10 @@ main(int argc, char *argv[]) > errx(1, "count is %s", errstr); > break; > case 'd': > - dflag = 1; > + dflag = IF_SHOW_DROP; > + break; > + case 'e': > + dflag = IF_SHOW_ERRS; > break; > case 'F': > Fflag = 1; > Index: netstat/netstat.1 > =================================================================== > RCS file: /cvs/src/usr.bin/netstat/netstat.1,v > retrieving revision 1.83 > diff -u -p -r1.83 netstat.1 > --- netstat/netstat.1 13 Jul 2018 09:06:58 -0000 1.83 > +++ netstat/netstat.1 4 Mar 2019 11:13:40 -0000 > @@ -45,7 +45,7 @@ > .Op Fl N Ar system > .Nm netstat > .Bk -words > -.Op Fl bdFgilmnqrstu > +.Op Fl bdeFgilmnqrstu > .Op Fl f Ar address_family > .Op Fl p Ar protocol > .Op Fl M Ar core > @@ -53,7 +53,7 @@ > .Op Fl T Ar rtable > .Ek > .Nm netstat > -.Op Fl bdhn > +.Op Fl bdehn > .Op Fl c Ar count > .Op Fl I Ar interface > .Op Fl M Ar core > Index: netstat/netstat.h > =================================================================== > RCS file: /cvs/src/usr.bin/netstat/netstat.h,v > retrieving revision 1.72 > diff -u -p -r1.72 netstat.h > --- netstat/netstat.h 13 Aug 2018 14:36:54 -0000 1.72 > +++ netstat/netstat.h 4 Mar 2019 11:13:40 -0000 > @@ -142,6 +142,10 @@ void routepr(u_long, u_long, u_long, u_l > > void nsprotopr(u_long, char *); > > +#define IF_SHOW_FAIL 0 > +#define IF_SHOW_ERRS 1 > +#define IF_SHOW_DROP 2 > + > void intpr(int, int); > > void mroutepr(void); > -- :wq Claudio