home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume40 / netramet / part11 < prev    next >
Encoding:
Text File  |  1993-11-07  |  64.0 KB  |  1,905 lines

  1. Newsgroups: comp.sources.misc
  2. From: nevil@ccu1.aukuni.ac.nz (J Nevil Brownlee)
  3. Subject: v40i099:  netramet - Network Traffic Accounting Meter, Part11/25
  4. Message-ID: <1993Nov7.221116.11965@sparky.sterling.com>
  5. X-Md4-Signature: 59d98f88a05b5a9102a0b2152cf5eb19
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Sterling Software
  8. Date: Sun, 7 Nov 1993 22:11:16 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: nevil@ccu1.aukuni.ac.nz (J Nevil Brownlee)
  12. Posting-number: Volume 40, Issue 99
  13. Archive-name: netramet/part11
  14. Environment: INET, UNIX, DOS
  15.  
  16. #! /bin/sh
  17. # This is a shell archive.  Remove anything before this line, then feed it
  18. # into a shell via "sh file" or similar.  To overwrite existing files,
  19. # type "sh file -c".
  20. # Contents:  netramet/src/apps/snmp_vars.c
  21. #   netramet/src/manager/include/nmc.h
  22. #   netramet/src/meter/include/decnet.h
  23. # Wrapped by kent@sparky on Tue Nov  2 18:17:07 1993
  24. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin:$PATH ; export PATH
  25. echo If this archive is complete, you will see the following message:
  26. echo '          "shar: End of archive 11 (of 25)."'
  27. if test -f 'netramet/src/apps/snmp_vars.c' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'netramet/src/apps/snmp_vars.c'\"
  29. else
  30.   echo shar: Extracting \"'netramet/src/apps/snmp_vars.c'\" \(46913 characters\)
  31.   sed "s/^X//" >'netramet/src/apps/snmp_vars.c' <<'END_OF_FILE'
  32. X/*
  33. X * snmp_vars.c - return a pointer to the named variable.
  34. X *
  35. X *
  36. X */
  37. X/***********************************************************
  38. X    Copyright 1988, 1989, 1990 by Carnegie Mellon University
  39. X    Copyright 1989    TGV, Incorporated
  40. X
  41. X              All Rights Reserved
  42. X
  43. XPermission to use, copy, modify, and distribute this software and its
  44. Xdocumentation for any purpose and without fee is hereby granted,
  45. Xprovided that the above copyright notice appear in all copies and that
  46. Xboth that copyright notice and this permission notice appear in
  47. Xsupporting documentation, and that the name of CMU and TGV not be used
  48. Xin advertising or publicity pertaining to distribution of the software
  49. Xwithout specific, written prior permission.
  50. X
  51. XCMU AND TGV DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  52. XINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
  53. XEVENT SHALL CMU OR TGV BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  54. XCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
  55. XUSE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  56. XOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  57. XPERFORMANCE OF THIS SOFTWARE.
  58. X******************************************************************/
  59. X
  60. X#define USE_NAME_AS_DESCRIPTION /*"se0" instead of text */
  61. X#define GATEWAY            /* MultiNet is always configured this way! */
  62. X#include <sys/types.h>
  63. X#include <sys/socket.h>
  64. X/* #include <sys/time.h> */
  65. X#include <sys/param.h>
  66. X#include <sys/dir.h>
  67. X/* #include <sys/user.h>  /* Inconsistencies in this file! */
  68. X/* #include <sys/proc.h>  /* Inconsistencies in this file! */
  69. X/* #include <machine/pte.h>  /* Not in Irix */
  70. X/* #include <sys/vm.h>  /* Not in Irix */
  71. X#include <netinet/in.h>
  72. X#include <syslog.h>
  73. X#include <sys/ioctl.h>
  74. X#include <net/if.h>
  75. X#include <net/route.h>
  76. X#include <netinet/in_pcb.h>
  77. X#include <netinet/if_ether.h>
  78. X#include <netinet/in_systm.h>
  79. X#include <netinet/in_var.h>
  80. X#include <netinet/ip.h>
  81. X#include <netinet/ip_var.h>
  82. X#include <netinet/tcp.h>
  83. X#include <netinet/tcp_timer.h>
  84. X#include <netinet/tcp_var.h>
  85. X#include <netinet/tcp_fsm.h>
  86. X#include <netinet/udp.h>
  87. X#include <netinet/udp_var.h>
  88. X#include <netinet/ip_icmp.h>
  89. X#include <netinet/icmp_var.h>
  90. X#include <nlist.h>
  91. X/* #include <sys/protosw.h> */
  92. X
  93. X#ifndef NULL
  94. X#define NULL 0
  95. X#endif
  96. X
  97. X#include "ausnmp.h"
  98. X#include "asn1.h"
  99. X#include "snmp.h"
  100. X#include "snmpimpl.h"
  101. X#include "mib.h"
  102. X#include "snmp_vars.h"
  103. X
  104. X
  105. X#ifdef vax11c
  106. X#define ioctl socket_ioctl
  107. X#define perror socket_perror
  108. X#endif vax11c
  109. X
  110. Xextern char *Lookup_Device_Annotation();
  111. X
  112. Xstatic struct nlist nl[] = {
  113. X#define N_IPSTAT    0
  114. X    { "_ipstat" },
  115. X#define N_IPFORWARDING    1
  116. X    { "_ipforwarding" },
  117. X#define N_TCP_TTL    2
  118. X    { "_tcp_ttl" },
  119. X#define N_UDPSTAT    3
  120. X    { "_udpstat" },
  121. X#define N_IN_INTERFACES 4
  122. X    { "_in_interfaces" },
  123. X#define N_ICMPSTAT    5
  124. X    { "_icmpstat" },
  125. X#define N_IFNET        6
  126. X    { "_ifnet" },
  127. X#define N_TCPSTAT    7
  128. X    { "_tcpstat" },
  129. X#define N_TCB        8
  130. X    { "_tcb" },
  131. X#define N_ARPTAB_SIZE    9
  132. X    { "_arptab_size" },
  133. X#define N_ARPTAB       10
  134. X    { "_arptab" },
  135. X#define N_IN_IFADDR    11
  136. X    { "_in_ifaddr" },
  137. X#define N_BOOTTIME    12
  138. X    { "_boottime" },
  139. X#ifdef ibm032
  140. X#define N_PROC        13
  141. X    { "_proc" },
  142. X#define N_NPROC        14
  143. X    { "_nproc" },
  144. X#define N_DMMIN        15
  145. X    { "_dmmin" },
  146. X#define N_DMMAX        16
  147. X    { "_dmmax" },
  148. X#define N_NSWAP        17
  149. X    { "_nswap" },
  150. X#define N_USRPTMAP    18
  151. X    { "_Usrptmap" },
  152. X#define N_USRPT        19
  153. X    { "_usrpt" },
  154. X#endif
  155. X#ifdef ibm032
  156. X#define N_USERSIZE    20
  157. X    { "_userSIZE" },
  158. X#endif
  159. X    0,
  160. X};
  161. X
  162. X/*
  163. X *    Each variable name is placed in the variable table, without the terminating
  164. X * substring that determines the instance of the variable.  When a string is found that
  165. X * is lexicographicly preceded by the input string, the function for that entry is
  166. X * called to find the method of access of the instance of the named variable.  If
  167. X * that variable is not found, NULL is returned, and the search through the table
  168. X * continues (it should stop at the next entry).  If it is found, the function returns
  169. X * a character pointer and a length or a function pointer.  The former is the address
  170. X * of the operand, the latter is a write routine for the variable.
  171. X *
  172. X * u_char *
  173. X * findVar(name, length, exact, var_len, write_method)
  174. X * oid        *name;        IN/OUT - input name requested, output name found
  175. X * int        length;        IN/OUT - number of sub-ids in the in and out oid's
  176. X * int        exact;        IN - TRUE if an exact match was requested.
  177. X * int        len;        OUT - length of variable or 0 if function returned.
  178. X * int        write_method;   OUT - 1 if function, 0 if char pointer.
  179. X *
  180. X * writeVar(doSet, var_val, var_val_type, var_val_len, statP)
  181. X * int        doSet;        IN - 0 if only check of validity of operation
  182. X * u_char   *var_val;        IN - input or output buffer space
  183. X * u_char   var_val_type;   IN - type of input buffer
  184. X * int        var_val_len;    IN - input and output buffer len
  185. X * u_char   *statP;        IN - pointer to local statistic
  186. X */
  187. X
  188. Xlong        long_return;
  189. Xu_char        return_buf[256]; /* nee 64 */
  190. X
  191. Xinit_snmp()
  192. X{
  193. X    nlist("/vmunix",nl);
  194. X    init_kmem("/dev/kmem");
  195. X    init_routes();
  196. X
  197. X}
  198. X
  199. Xstruct variable     variables[] = {
  200. X    /* these must be lexicographly ordered by the name field */
  201. X    {{MIB, 1, 1, 0},        9, STRING,  VERSION_DESCR, RWRITE, var_system },
  202. X    {{MIB, 1, 2, 0},        9, OBJID,   VERSION_ID, RONLY, var_system },
  203. X    {{MIB, 1, 3, 0},        9, TIMETICKS, UPTIME, RONLY, var_system },
  204. X    {{MIB, 2, 1, 0},        9, INTEGER, IFNUMBER, RONLY, var_system },
  205. X    {{MIB, 2, 2, 1, 1, 0xFF},  11, INTEGER, IFINDEX, RONLY, var_ifEntry },
  206. X    {{MIB, 2, 2, 1, 2, 0xFF},  11, STRING,  IFDESCR, RONLY, var_ifEntry },
  207. X    {{MIB, 2, 2, 1, 3, 0xFF},  11, INTEGER, IFTYPE, RONLY, var_ifEntry },
  208. X    {{MIB, 2, 2, 1, 4, 0xFF},  11, INTEGER, IFMTU, RONLY, var_ifEntry },
  209. X    {{MIB, 2, 2, 1, 5, 0xFF},  11, GAUGE,   IFSPEED, RONLY, var_ifEntry },
  210. X    {{MIB, 2, 2, 1, 6, 0xFF},  11, STRING,  IFPHYSADDRESS, RONLY, var_ifEntry },
  211. X    {{MIB, 2, 2, 1, 7, 0xFF},  11, INTEGER, IFADMINSTATUS, RWRITE, var_ifEntry },
  212. X    {{MIB, 2, 2, 1, 8, 0xFF},  11, INTEGER, IFOPERSTATUS, RONLY, var_ifEntry },
  213. X    {{MIB, 2, 2, 1, 9, 0xFF},  11, TIMETICKS, IFLASTCHANGE, RONLY, var_ifEntry },
  214. X    {{MIB, 2, 2, 1, 10, 0xFF}, 11, COUNTER, IFINOCTETS, RONLY, var_ifEntry },
  215. X    {{MIB, 2, 2, 1, 11, 0xFF}, 11, COUNTER, IFINUCASTPKTS, RONLY, var_ifEntry },
  216. X    {{MIB, 2, 2, 1, 12, 0xFF}, 11, COUNTER, IFINNUCASTPKTS, RONLY, var_ifEntry },
  217. X    {{MIB, 2, 2, 1, 13, 0xFF}, 11, COUNTER, IFINDISCARDS, RONLY, var_ifEntry },
  218. X    {{MIB, 2, 2, 1, 14, 0xFF}, 11, COUNTER, IFINERRORS, RONLY, var_ifEntry },
  219. X    {{MIB, 2, 2, 1, 15, 0xFF}, 11, COUNTER, IFINUNKNOWNPROTOS, RONLY, var_ifEntry },
  220. X    {{MIB, 2, 2, 1, 16, 0xFF}, 11, COUNTER, IFOUTOCTETS, RONLY, var_ifEntry },
  221. X    {{MIB, 2, 2, 1, 17, 0xFF}, 11, COUNTER, IFOUTUCASTPKTS, RONLY, var_ifEntry },
  222. X    {{MIB, 2, 2, 1, 18, 0xFF}, 11, COUNTER, IFOUTNUCASTPKTS, RONLY, var_ifEntry },
  223. X    {{MIB, 2, 2, 1, 19, 0xFF}, 11, COUNTER, IFOUTDISCARDS, RONLY, var_ifEntry },
  224. X    {{MIB, 2, 2, 1, 20, 0xFF}, 11, COUNTER, IFOUTERRORS, RONLY, var_ifEntry },
  225. X    {{MIB, 2, 2, 1, 21, 0xFF}, 11, GAUGE,   IFOUTQLEN, RONLY, var_ifEntry },
  226. X    {{MIB, 3, 1, 1, 1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 16, INTEGER,    ATIFINDEX, RONLY, var_atEntry },
  227. X    {{MIB, 3, 1, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 16, STRING,     ATPHYSADDRESS, RONLY, var_atEntry },
  228. X    {{MIB, 3, 1, 1, 3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 16, IPADDRESS,  ATNETADDRESS, RONLY, var_atEntry },
  229. X    {{MIB, 4, 1, 0},        9, INTEGER, IPFORWARDING, RONLY, var_ip },
  230. X    {{MIB, 4, 2, 0},        9, INTEGER, IPDEFAULTTTL, RONLY, var_ip },
  231. X    {{MIB, 4, 3, 0},        9, COUNTER, IPINRECEIVES, RONLY, var_ip },
  232. X    {{MIB, 4, 4, 0},        9, COUNTER, IPINHDRERRORS, RONLY, var_ip },
  233. X    {{MIB, 4, 5, 0},        9, COUNTER, IPINADDRERRORS, RONLY, var_ip },
  234. X    {{MIB, 4, 6, 0},        9, COUNTER, IPFORWDATAGRAMS, RONLY, var_ip },
  235. X    {{MIB, 4, 7, 0},        9, COUNTER, IPINUNKNOWNPROTOS, RONLY, var_ip },
  236. X    {{MIB, 4, 8, 0},        9, COUNTER, IPINDISCARDS, RONLY, var_ip },
  237. X    {{MIB, 4, 9, 0},        9, COUNTER, IPINDELIVERS, RONLY, var_ip },
  238. X    {{MIB, 4, 10, 0},        9, COUNTER, IPOUTREQUESTS, RONLY, var_ip },
  239. X    {{MIB, 4, 11, 0},        9, COUNTER, IPOUTDISCARDS, RONLY, var_ip },
  240. X    {{MIB, 4, 12, 0},        9, COUNTER, IPOUTNOROUTES, RONLY, var_ip },
  241. X    {{MIB, 4, 13, 0},        9, INTEGER, IPREASMTIMEOUT, RONLY, var_ip },
  242. X    {{MIB, 4, 14, 0},        9, COUNTER, IPREASMREQDS, RONLY, var_ip },
  243. X    {{MIB, 4, 15, 0},        9, COUNTER, IPREASMOKS, RONLY, var_ip },
  244. X    {{MIB, 4, 16, 0},        9, COUNTER, IPREASMFAILS, RONLY, var_ip },
  245. X    {{MIB, 4, 17, 0},        9, COUNTER, IPFRAGOKS, RONLY, var_ip },
  246. X    {{MIB, 4, 18, 0},        9, COUNTER, IPFRAGFAILS, RONLY, var_ip },
  247. X    {{MIB, 4, 19, 0},        9, COUNTER, IPFRAGCREATES, RONLY, var_ip },
  248. X    {{MIB, 4, 20, 1, 1, 0xFF, 0xFF, 0xFF, 0xFF}, 14, IPADDRESS, IPADADDR, RONLY, var_ipAddrEntry },
  249. X    {{MIB, 4, 20, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER,    IPADIFINDEX, RONLY, var_ipAddrEntry },
  250. X    {{MIB, 4, 20, 1, 3, 0xFF, 0xFF, 0xFF, 0xFF}, 14, IPADDRESS, IPADNETMASK, RONLY, var_ipAddrEntry },
  251. X    {{MIB, 4, 20, 1, 4, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER,    IPADBCASTADDR, RONLY, var_ipAddrEntry },
  252. X    {{MIB, 4, 21, 1, 1, 0xFF, 0xFF, 0xFF, 0xFF}, 14, IPADDRESS, IPROUTEDEST, RONLY, var_ipRouteEntry },
  253. X    {{MIB, 4, 21, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER,    IPROUTEIFINDEX, RONLY, var_ipRouteEntry },
  254. X    {{MIB, 4, 21, 1, 3, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER,    IPROUTEMETRIC1, RONLY, var_ipRouteEntry },
  255. X    {{MIB, 4, 21, 1, 4, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER,    IPROUTEMETRIC2, RONLY, var_ipRouteEntry },
  256. X    {{MIB, 4, 21, 1, 5, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER,    IPROUTEMETRIC3, RONLY, var_ipRouteEntry },
  257. X    {{MIB, 4, 21, 1, 6, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER,    IPROUTEMETRIC4, RONLY, var_ipRouteEntry },
  258. X    {{MIB, 4, 21, 1, 7, 0xFF, 0xFF, 0xFF, 0xFF}, 14, IPADDRESS, IPROUTENEXTHOP, RONLY, var_ipRouteEntry },
  259. X    {{MIB, 4, 21, 1, 8, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER,    IPROUTETYPE, RONLY, var_ipRouteEntry },
  260. X    {{MIB, 4, 21, 1, 9, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER,    IPROUTEPROTO, RONLY, var_ipRouteEntry },
  261. X    {{MIB, 4, 21, 1, 10, 0xFF, 0xFF, 0xFF, 0xFF}, 14, INTEGER,    IPROUTEAGE, RONLY, var_ipRouteEntry },
  262. X    {{MIB, 5, 1, 0},        9, COUNTER, ICMPINMSGS, RONLY, var_icmp },
  263. X    {{MIB, 5, 2, 0},        9, COUNTER, ICMPINERRORS, RONLY, var_icmp },
  264. X    {{MIB, 5, 3, 0},        9, COUNTER, ICMPINDESTUNREACHS, RONLY, var_icmp },
  265. X    {{MIB, 5, 4, 0},        9, COUNTER, ICMPINTIMEEXCDS, RONLY, var_icmp },
  266. X    {{MIB, 5, 5, 0},        9, COUNTER, ICMPINPARMPROBS, RONLY, var_icmp },
  267. X    {{MIB, 5, 6, 0},        9, COUNTER, ICMPINSRCQUENCHS, RONLY, var_icmp },
  268. X    {{MIB, 5, 7, 0},        9, COUNTER, ICMPINREDIRECTS, RONLY, var_icmp },
  269. X    {{MIB, 5, 8, 0},        9, COUNTER, ICMPINECHOS, RONLY, var_icmp },
  270. X    {{MIB, 5, 9, 0},        9, COUNTER, ICMPINECHOREPS, RONLY, var_icmp },
  271. X    {{MIB, 5, 10, 0},        9, COUNTER, ICMPINTIMESTAMPS, RONLY, var_icmp },
  272. X    {{MIB, 5, 11, 0},        9, COUNTER, ICMPINTIMESTAMPREPS, RONLY, var_icmp },
  273. X    {{MIB, 5, 12, 0},        9, COUNTER, ICMPINADDRMASKS, RONLY, var_icmp },
  274. X    {{MIB, 5, 13, 0},        9, COUNTER, ICMPINADDRMASKREPS, RONLY, var_icmp },
  275. X    {{MIB, 5, 14, 0},        9, COUNTER, ICMPOUTMSGS, RONLY, var_icmp },
  276. X    {{MIB, 5, 15, 0},        9, COUNTER, ICMPOUTERRORS, RONLY, var_icmp },
  277. X    {{MIB, 5, 16, 0},        9, COUNTER, ICMPOUTDESTUNREACHS, RONLY, var_icmp },
  278. X    {{MIB, 5, 17, 0},        9, COUNTER, ICMPOUTTIMEEXCDS, RONLY, var_icmp },
  279. X    {{MIB, 5, 18, 0},        9, COUNTER, ICMPOUTPARMPROBS, RONLY, var_icmp },
  280. X    {{MIB, 5, 19, 0},        9, COUNTER, ICMPOUTSRCQUENCHS, RONLY, var_icmp },
  281. X    {{MIB, 5, 20, 0},        9, COUNTER, ICMPOUTREDIRECTS, RONLY, var_icmp },
  282. X    {{MIB, 5, 21, 0},        9, COUNTER, ICMPOUTECHOS, RONLY, var_icmp },
  283. X    {{MIB, 5, 22, 0},        9, COUNTER, ICMPOUTECHOREPS, RONLY, var_icmp },
  284. X    {{MIB, 5, 23, 0},        9, COUNTER, ICMPOUTTIMESTAMPS, RONLY, var_icmp },
  285. X    {{MIB, 5, 24, 0},        9, COUNTER, ICMPOUTTIMESTAMPREPS, RONLY, var_icmp },
  286. X    {{MIB, 5, 25, 0},        9, COUNTER, ICMPOUTADDRMASKS, RONLY, var_icmp },
  287. X    {{MIB, 5, 26, 0},        9, COUNTER, ICMPOUTADDRMASKREPS, RONLY, var_icmp },
  288. X    {{MIB, 6, 1, 0},        9, INTEGER, TCPRTOALGORITHM, RONLY, var_tcp },
  289. X    {{MIB, 6, 2, 0},        9, INTEGER, TCPRTOMIN, RONLY, var_tcp },
  290. X    {{MIB, 6, 3, 0},        9, INTEGER, TCPRTOMAX, RONLY, var_tcp },
  291. X    {{MIB, 6, 4, 0},        9, INTEGER, TCPMAXCONN, RONLY, var_tcp },
  292. X    {{MIB, 6, 5, 0},        9, COUNTER, TCPACTIVEOPENS, RONLY, var_tcp },
  293. X    {{MIB, 6, 6, 0},        9, COUNTER, TCPPASSIVEOPENS, RONLY, var_tcp },
  294. X    {{MIB, 6, 7, 0},        9, COUNTER, TCPATTEMPTFAILS, RONLY, var_tcp },
  295. X    {{MIB, 6, 8, 0},        9, COUNTER, TCPESTABRESETS, RONLY, var_tcp },
  296. X    {{MIB, 6, 9, 0},        9, GAUGE,    TCPCURRESTAB, RONLY, var_tcp },
  297. X    {{MIB, 6,10, 0},        9, COUNTER, TCPINSEGS, RONLY, var_tcp },
  298. X    {{MIB, 6,11, 0},        9, COUNTER, TCPOUTSEGS, RONLY, var_tcp },
  299. X    {{MIB, 6,12, 0},        9, COUNTER, TCPRETRANSSEGS, RONLY, var_tcp },
  300. X    {{MIB, 6,13, 1, 1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},  20, INTEGER, TCPCONNSTATE, RONLY, var_tcp },
  301. X    {{MIB, 6,13, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},  20, IPADDRESS, TCPCONNLOCALADDRESS, RONLY, var_tcp },
  302. X    {{MIB, 6,13, 1, 3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},  20, INTEGER, TCPCONNLOCALPORT, RONLY, var_tcp },
  303. X    {{MIB, 6,13, 1, 4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},  20, IPADDRESS, TCPCONNREMADDRESS, RONLY, var_tcp },
  304. X    {{MIB, 6,13, 1, 5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},  20, INTEGER, TCPCONNREMPORT, RONLY, var_tcp },
  305. X    {{MIB, 7, 1, 0},        9, COUNTER, UDPINDATAGRAMS, RONLY, var_udp },
  306. X    {{MIB, 7, 2, 0},        9, COUNTER, UDPNOPORTS, RONLY, var_udp },
  307. X    {{MIB, 7, 3, 0},        9, COUNTER, UDPINERRORS, RONLY, var_udp },
  308. X    {{MIB, 7, 4, 0},        9, COUNTER, UDPOUTDATAGRAMS, RONLY, var_udp }
  309. X};
  310. X
  311. X
  312. X
  313. X
  314. X/*
  315. X * getStatPtr - return a pointer to the named variable, as well as it's
  316. X * type, length, and access control list.
  317. X *
  318. X * If an exact match for the variable name exists, it is returned.  If not,
  319. X * and exact is false, the next variable lexicographically after the
  320. X * requested one is returned.
  321. X *
  322. X * If no appropriate variable can be found, NULL is returned.
  323. X */
  324. Xu_char    *
  325. XgetStatPtr(name, namelen, type, len, acl, exact, access_method)
  326. X    oid        *name;        /* IN - name of var, OUT - name matched */
  327. X    int        *namelen;   /* IN -number of sub-ids in name, OUT - subid-is in matched name */
  328. X    u_char    *type;        /* OUT - type of matched variable */
  329. X    int        *len;        /* OUT - length of matched variable */
  330. X    u_short    *acl;        /* OUT - access control list */
  331. X    int        exact;        /* IN - TRUE if exact match wanted */
  332. X    int        *access_method; /* OUT - 1 if function, 0 if char * */
  333. X{
  334. X
  335. X    register struct variable    *vp;
  336. X
  337. X    register int    x;
  338. X    register u_char    *access;
  339. X    int            result;
  340. X    register int    minlen;
  341. X    register oid    *name1, *name2;
  342. X
  343. X    for(x = 0, vp = variables; x < sizeof(variables)/sizeof(struct variable); vp++, x++){
  344. X    if (*namelen < (int)vp->namelen)
  345. X        minlen = *namelen;
  346. X    else
  347. X        minlen = (int)vp->namelen;
  348. X    name1 = name; name2 = vp->name;
  349. X    result = 0;
  350. X    while(minlen-- > 0){
  351. X        if (*name1 < *name2){
  352. X        result = -1;
  353. X        break;
  354. X        }
  355. X        if (*name2++ < *name1++){
  356. X        result = 1;
  357. X        break;
  358. X        }
  359. X    }
  360. X    if (result == 0){
  361. X        if (*namelen < (int)vp->namelen)
  362. X        result = -1;    /* name1 shorter so it is "less" */
  363. X        else if ((int)vp->namelen < *namelen)
  364. X        result = 1;
  365. X        else
  366. X        result = 0;
  367. X    }
  368. X/*    result = compare(name, *namelen, vp->name, (int)vp->namelen); */
  369. X    if ((result < 0) || (exact && (result == 0))){
  370. X        access = (*(vp->findVar))(vp, name, namelen, exact, len, access_method);
  371. X        if (access != NULL)
  372. X        break;
  373. X    }
  374. X    }
  375. X    if (x == sizeof(variables)/sizeof(struct variable))
  376. X    return NULL;
  377. X
  378. X    /* vp now points to the approprate struct */
  379. X    *type = vp->type;
  380. X    *acl = vp->acl;
  381. X    return access;
  382. X}
  383. X
  384. X
  385. X
  386. Xint
  387. Xcompare(name1, len1, name2, len2)
  388. X    register oid        *name1, *name2;
  389. X    register int        len1, len2;
  390. X{
  391. X    register int    len;
  392. X
  393. X    /* len = minimum of len1 and len2 */
  394. X    if (len1 < len2)
  395. X    len = len1;
  396. X    else
  397. X    len = len2;
  398. X    /* find first non-matching byte */
  399. X    while(len-- > 0){
  400. X    if (*name1 < *name2)
  401. X        return -1;
  402. X    if (*name2++ < *name1++)
  403. X        return 1;
  404. X    }
  405. X    /* bytes match up to length of shorter string */
  406. X    if (len1 < len2)
  407. X    return -1;  /* name1 shorter, so it is "less" */
  408. X    if (len2 < len1)
  409. X    return 1;
  410. X    return 0;    /* both strings are equal */
  411. X}
  412. X
  413. Xchar version_descr[32] = "Unix 4.3BSD";
  414. Xoid version_id[] = {1, 3, 6, 1, 4, 1, 3, 1, 1};
  415. X
  416. Xu_char *
  417. Xvar_system(vp, name, length, exact, var_len, write_method)
  418. X    register struct variable *vp;   /* IN - pointer to variable entry that points here */
  419. X    register oid    *name;        /* IN/OUT - input name requested, output name found */
  420. X    register int    *length;    /* IN/OUT - length of input and output oid's */
  421. X    int            exact;        /* IN - TRUE if an exact match was requested. */
  422. X    int            *var_len;   /* OUT - length of variable or 0 if function returned. */
  423. X    int            (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
  424. X{
  425. X    struct timeval now, boottime;
  426. X    extern int writeVersion();
  427. X
  428. X    if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))
  429. X    return NULL;
  430. X    bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));
  431. X    *length = vp->namelen;
  432. X    *write_method = 0;
  433. X    *var_len = sizeof(long);    /* default length */
  434. X    switch (vp->magic){
  435. X    case VERSION_DESCR:
  436. X        *var_len = strlen(version_descr);
  437. X        *write_method = writeVersion;
  438. X        return (u_char *)version_descr;
  439. X    case VERSION_ID:
  440. X        *var_len = sizeof(version_id);
  441. X        return (u_char *)version_id;
  442. X    case UPTIME:
  443. X        klseek(nl[N_BOOTTIME].n_value);
  444. X        klread((char *)&boottime, sizeof(boottime));
  445. X        gettimeofday(&now, (struct timezone *)0);
  446. X        long_return = (now.tv_sec - boottime.tv_sec) * 100
  447. X            + (now.tv_usec - boottime.tv_usec) / 10000;
  448. X        return (u_char *) &long_return;
  449. X    case IFNUMBER:
  450. X        long_return = Interface_Scan_Get_Count();
  451. X        return (u_char *) &long_return;
  452. X    default:
  453. X        ERROR("");
  454. X    }
  455. X    return NULL;
  456. X}
  457. X
  458. X#include <ctype.h>
  459. Xint
  460. XwriteVersion(doSet, var_val, var_val_type, var_val_len, statP)
  461. X   int      doSet;
  462. X   u_char   *var_val;
  463. X   u_char   var_val_type;
  464. X   int      var_val_len;
  465. X   u_char   *statP;
  466. X{
  467. X    int bigsize = 1000;
  468. X    u_char buf[sizeof(version_descr)], *cp;
  469. X    int count, size;
  470. X
  471. X    if (var_val_type != STRING){
  472. X    printf("not string\n");
  473. X    return FALSE;
  474. X    }
  475. X    if (var_val_len > sizeof(version_descr)-1){
  476. X    printf("bad length\n");
  477. X    return FALSE;
  478. X    }
  479. X    size = sizeof(buf);
  480. X    asn_parse_string(var_val, &bigsize, &var_val_type, (long *)buf, &size);
  481. X    for(cp = buf, count = 0; count < size; count++, cp++){
  482. X    if (!isprint(*cp)){
  483. X        printf("not print %x\n", *cp);
  484. X        return FALSE;
  485. X    }
  486. X    }
  487. X    buf[size] = 0;
  488. X    if (doSet){
  489. X    strcpy(version_descr, buf);
  490. X    
  491. X    }
  492. X    return TRUE;
  493. X}
  494. X
  495. X
  496. X
  497. Xu_char *
  498. Xvar_ifEntry(vp, name, length, exact, var_len, write_method)
  499. X    register struct variable *vp;   /* IN - pointer to variable entry that points here */
  500. X    register oid    *name;        /* IN/OUT - input name requested, output name found */
  501. X    register int    *length;    /* IN/OUT - length of input and output oid's */
  502. X    int            exact;        /* IN - TRUE if an exact match was requested. */
  503. X    int            *var_len;   /* OUT - length of variable or 0 if function returned. */
  504. X    int            (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
  505. X{
  506. X    oid            newname[MAX_NAME_LEN];
  507. X    register int    interface;
  508. X    int result, count;
  509. X    static struct ifnet ifnet;
  510. X    static struct in_ifaddr in_ifaddr;
  511. X    static char Name[16];
  512. X    register char *cp;
  513. X
  514. X    bcopy((char *)vp->name, (char *)newname, (int)vp->namelen * sizeof(oid));
  515. X    /* find "next" interface */
  516. X    count = Interface_Scan_Get_Count();
  517. X    for(interface = 1; interface <= count; interface++){
  518. X    newname[10] = (oid)interface;
  519. X    result = compare(name, *length, newname, (int)vp->namelen);
  520. X    if ((exact && (result == 0)) || (!exact && (result < 0)))
  521. X        break;
  522. X    }
  523. X    if (interface > count)
  524. X    return NULL;
  525. X
  526. X    bcopy((char *)newname, (char *)name, (int)vp->namelen * sizeof(oid));
  527. X    *length = vp->namelen;
  528. X    *write_method = 0;
  529. X    *var_len = sizeof(long);
  530. X
  531. X    Interface_Scan_By_Index(interface, Name, &ifnet, &in_ifaddr);
  532. X    switch (vp->magic){
  533. X    case IFINDEX:
  534. X        long_return = interface;
  535. X        return (u_char *) &long_return;
  536. X    case IFDESCR:
  537. X#define USE_NAME_AS_DESCRIPTION
  538. X#ifdef USE_NAME_AS_DESCRIPTION
  539. X        cp = Name;
  540. X#else  USE_NAME_AS_DESCRIPTION
  541. X        cp = Lookup_Device_Annotation(Name, "snmp-descr");
  542. X        if (!cp)
  543. X        cp = Lookup_Device_Annotation(Name, 0);
  544. X        if (!cp) cp = Name;
  545. X#endif USE_NAME_AS_DESCRIPTION
  546. X        *var_len = strlen(cp);
  547. X        return (u_char *)cp;
  548. X    case IFTYPE:
  549. X#if 0
  550. X        cp = Lookup_Device_Annotation(Name, "snmp-type");
  551. X        if (cp) long_return = atoi(cp);
  552. X        else
  553. X#endif
  554. X        long_return = 1;    /* OTHER */
  555. X        return (u_char *) &long_return;
  556. X    case IFMTU: {
  557. X        long_return = (long) ifnet.if_mtu;
  558. X        return (u_char *) &long_return;
  559. X    }
  560. X    case IFSPEED:
  561. X#if 0
  562. X        cp = Lookup_Device_Annotation(Name, "snmp-speed");
  563. X        if (cp) long_return = atoi(cp);
  564. X        else
  565. X#endif
  566. X        long_return = 1;    /* OTHER */
  567. X        return (u_char *) &long_return;
  568. X    case IFPHYSADDRESS:
  569. X#if 0
  570. X        if (Lookup_Device_Annotation(Name, "ethernet-device")) {
  571. X        Interface_Get_Ether_By_Index(interface, return_buf);
  572. X        *var_len = 6;
  573. X        return(u_char *) return_buf;
  574. X        } else {
  575. X        long_return = 0;
  576. X        return (u_char *) long_return;
  577. X        }
  578. X#endif
  579. X        *var_len = 6;
  580. X        return (u_char *)return_buf;
  581. X    case IFADMINSTATUS:
  582. X        long_return = ifnet.if_flags & IFF_RUNNING ? 1 : 2;
  583. X        return (u_char *) &long_return;
  584. X    case IFOPERSTATUS:
  585. X        long_return = ifnet.if_flags & IFF_UP ? 1 : 2;
  586. X        return (u_char *) &long_return;
  587. X    case IFLASTCHANGE:
  588. X        long_return = 0; /* XXX */
  589. X        return (u_char *) &long_return;
  590. X    case IFINOCTETS:
  591. X        long_return = ifnet.if_ipackets * (ifnet.if_mtu / 2); /* XXX */
  592. X        return (u_char *) &long_return;
  593. X    case IFINUCASTPKTS:
  594. X        long_return = ifnet.if_ipackets;
  595. X        return (u_char *) &long_return;
  596. X    case IFINNUCASTPKTS:
  597. X        long_return = 0; /* XXX */
  598. X        return (u_char *) &long_return;
  599. X    case IFINDISCARDS:
  600. X        long_return = 0; /* XXX */
  601. X        return (u_char *) &long_return;
  602. X    case IFINERRORS:
  603. X        return (u_char *) &ifnet.if_ierrors;
  604. X    case IFINUNKNOWNPROTOS:
  605. X        long_return = 0; /* XXX */
  606. X        return (u_char *) &long_return;
  607. X    case IFOUTOCTETS:
  608. X        long_return = ifnet.if_opackets * (ifnet.if_mtu / 2); /* XXX */
  609. X        return (u_char *) &long_return;
  610. X    case IFOUTUCASTPKTS:
  611. X        long_return = ifnet.if_opackets;
  612. X        return (u_char *) &long_return;
  613. X    case IFOUTNUCASTPKTS:
  614. X        long_return = 0; /* XXX */
  615. X        return (u_char *) &long_return;
  616. X    case IFOUTDISCARDS:
  617. X        return (u_char *) &ifnet.if_snd.ifq_drops;
  618. X    case IFOUTERRORS:
  619. X        return (u_char *) &ifnet.if_oerrors;
  620. X    case IFOUTQLEN:
  621. X        return (u_char *) &ifnet.if_snd.ifq_len;
  622. X    default:
  623. X        ERROR("");
  624. X    }
  625. X    return NULL;
  626. X}
  627. X
  628. X/*
  629. X * Read the ARP table
  630. X */
  631. X
  632. Xu_char *
  633. Xvar_atEntry(vp, name, length, exact, var_len, write_method)
  634. X    register struct variable *vp;    /* IN - pointer to variable entry that points here */
  635. X    register oid        *name;    /* IN/OUT - input name requested, output name found */
  636. X    register int        *length;    /* IN/OUT - length of input and output oid's */
  637. X    int                exact;    /* IN - TRUE if an exact match was requested. */
  638. X    int                *var_len;    /* OUT - length of variable or 0 if function returned. */
  639. X    int                (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
  640. X{
  641. X    /*
  642. X     * object identifier is of form:
  643. X     * 1.3.6.1.2.1.3.1.1.1.interface.1.A.B.C.D,  where A.B.C.D is IP address.
  644. X     * Interface is at offset 10,
  645. X     * IPADDR starts at offset 12.
  646. X     */
  647. X    u_char            *cp;
  648. X    oid                *op;
  649. X    oid                lowest[16];
  650. X    oid                current[16];
  651. X    static char            PhysAddr[6], LowPhysAddr[6];
  652. X    u_long            Addr, LowAddr;
  653. X
  654. X    /* fill in object part of name for current (less sizeof instance part) */
  655. X
  656. X    bcopy((char *)vp->name, (char *)current, (int)(vp->namelen - 6) * sizeof(oid));
  657. X
  658. X    LowAddr = -1;      /* Don't have one yet */
  659. X    ARP_Scan_Init();
  660. X    for (;;) {
  661. X    if (ARP_Scan_Next(&Addr, PhysAddr) == 0) break;
  662. X    current[10] = 1;    /* IfIndex == 1 (ethernet???) XXX */
  663. X    current[11] = 1;
  664. X    cp = (u_char *)&Addr;
  665. X    op = current + 12;
  666. X    *op++ = *cp++;
  667. X    *op++ = *cp++;
  668. X    *op++ = *cp++;
  669. X    *op++ = *cp++;
  670. X
  671. X    if (exact){
  672. X        if (compare(current, 16, name, *length) == 0){
  673. X        bcopy((char *)current, (char *)lowest, 16 * sizeof(oid));
  674. X        LowAddr = Addr;
  675. X        bcopy(PhysAddr, LowPhysAddr, sizeof(PhysAddr));
  676. X        break;    /* no need to search further */
  677. X        }
  678. X    } else {
  679. X        if ((compare(current, 16, name, *length) > 0) &&
  680. X         ((LowAddr == -1) || (compare(current, 16, lowest, 16) < 0))){
  681. X        /*
  682. X         * if new one is greater than input and closer to input than
  683. X         * previous lowest, save this one as the "next" one.
  684. X         */
  685. X        bcopy((char *)current, (char *)lowest, 16 * sizeof(oid));
  686. X        LowAddr = Addr;
  687. X        bcopy(PhysAddr, LowPhysAddr, sizeof(PhysAddr));
  688. X        }
  689. X    }
  690. X    }
  691. X    if (LowAddr == -1) return(NULL);
  692. X
  693. X    bcopy((char *)lowest, (char *)name, 16 * sizeof(oid));
  694. X    *length = 16;
  695. X    *write_method = 0;
  696. X    switch(vp->magic){
  697. X    case ATIFINDEX:
  698. X        *var_len = sizeof long_return;
  699. X        long_return = 1; /* XXX */
  700. X        return (u_char *)&long_return;
  701. X    case ATPHYSADDRESS:
  702. X        *var_len = sizeof(LowPhysAddr);
  703. X        return (u_char *)LowPhysAddr;
  704. X    case ATNETADDRESS:
  705. X        *var_len = sizeof long_return;
  706. X        long_return = LowAddr;
  707. X        return (u_char *)&long_return;
  708. X    default:
  709. X        ERROR("");
  710. X   }
  711. X   return NULL;
  712. X}
  713. X
  714. Xu_char *
  715. Xvar_ip(vp, name, length, exact, var_len, write_method)
  716. X    register struct variable *vp;   /* IN - pointer to variable entry that points here */
  717. X    oid     *name;        /* IN/OUT - input name requested, output name found */
  718. X    int     *length;        /* IN/OUT - length of input and output oid's */
  719. X    int     exact;        /* IN - TRUE if an exact match was requested. */
  720. X    int     *var_len;        /* OUT - length of variable or 0 if function returned. */
  721. X    int     (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
  722. X{
  723. X    int i;
  724. X    static struct ipstat ipstat;
  725. X
  726. X    if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))
  727. X    return NULL;
  728. X    bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));
  729. X
  730. X    *length = vp->namelen;
  731. X    *write_method = 0;
  732. X    *var_len = sizeof(long);    /* default length */
  733. X    /*
  734. X     *    Get the IP statistics from the kernel...
  735. X     */
  736. X
  737. X    klseek(nl[N_IPSTAT].n_value);
  738. X    klread((char *)&ipstat, sizeof (ipstat));
  739. X
  740. X    switch (vp->magic){
  741. X    case IPFORWARDING:
  742. X        klseek(nl[N_IPFORWARDING].n_value);
  743. X        klread((char *) &i, sizeof(i));
  744. X        if (i) {
  745. X        klseek(nl[N_IN_INTERFACES].n_value);
  746. X        klread((char *) &i, sizeof(i));
  747. X        if (i > 1)
  748. X            long_return = 1;        /* GATEWAY */
  749. X        else
  750. X            long_return = 2;        /* GATEWAY configured as HOST */
  751. X        } else {
  752. X        long_return = 2;        /* HOST    */
  753. X        }
  754. X        return (u_char *) &long_return;
  755. X    case IPDEFAULTTTL:
  756. X        /*
  757. X         *    Allow for a kernel w/o TCP.
  758. X         */
  759. X        if (nl[N_TCP_TTL].n_value) {
  760. X        klseek(nl[N_TCP_TTL].n_value);
  761. X        klread((char *) &long_return, sizeof(long_return));
  762. X        } else long_return = 60;        /* XXX */
  763. X        return (u_char *) &long_return;
  764. X    case IPINRECEIVES:
  765. X        return (u_char *) &ipstat.ips_total;
  766. X    case IPINHDRERRORS:
  767. X        long_return = ipstat.ips_badsum + ipstat.ips_tooshort +
  768. X              ipstat.ips_toosmall + ipstat.ips_badhlen +
  769. X              ipstat.ips_badlen;
  770. X        return (u_char *) &long_return;
  771. X    case IPINADDRERRORS:
  772. X        return (u_char *) &ipstat.ips_cantforward;
  773. X    case IPFORWDATAGRAMS:
  774. X        return (u_char *) &ipstat.ips_forward;
  775. X    case IPINUNKNOWNPROTOS:
  776. X        long_return = 0;
  777. X        return (u_char *) &long_return;
  778. X    case IPINDISCARDS:
  779. X        long_return = 0;
  780. X        return (u_char *) &long_return;
  781. X    case IPINDELIVERS:
  782. X        long_return = ipstat.ips_total -
  783. X             (ipstat.ips_badsum + ipstat.ips_tooshort +
  784. X              ipstat.ips_toosmall + ipstat.ips_badhlen +
  785. X              ipstat.ips_badlen);
  786. X        return (u_char *) &long_return;
  787. X    case IPOUTREQUESTS:
  788. X        long_return = 0;
  789. X        return (u_char *) &long_return;
  790. X    case IPOUTDISCARDS:
  791. X        long_return = 0;
  792. X        return (u_char *) &long_return;
  793. X    case IPOUTNOROUTES:
  794. X        return (u_char *) &ipstat.ips_cantforward;
  795. X    case IPREASMTIMEOUT:
  796. X        long_return = IPFRAGTTL;
  797. X        return (u_char *) &long_return;
  798. X    case IPREASMREQDS:
  799. X        return (u_char *) &ipstat.ips_fragments;
  800. X    case IPREASMOKS:
  801. X        return (u_char *) &ipstat.ips_fragments;
  802. X    case IPREASMFAILS:
  803. X        long_return = ipstat.ips_fragdropped + ipstat.ips_fragtimeout;
  804. X        return (u_char *) &long_return;
  805. X    case IPFRAGOKS:
  806. X        long_return = 0;
  807. X        return (u_char *) &long_return;
  808. X    case IPFRAGFAILS:
  809. X        long_return = 0;
  810. X        return (u_char *) &long_return;
  811. X    case IPFRAGCREATES:
  812. X        long_return = 0;
  813. X        return (u_char *) &long_return;
  814. X    default:
  815. X        ERROR("");
  816. X    }
  817. X    return NULL;
  818. X}
  819. X
  820. Xu_char *
  821. Xvar_ipAddrEntry(vp, name, length, exact, var_len, write_method)
  822. X    register struct variable *vp;    /* IN - pointer to variable entry that points here */
  823. X    register oid    *name;        /* IN/OUT - input name requested, output name found */
  824. X    register int    *length;    /* IN/OUT - length of input and output oid's */
  825. X    int            exact;        /* IN - TRUE if an exact match was requested. */
  826. X    int            *var_len;   /* OUT - length of variable or 0 if function returned. */
  827. X    int            (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
  828. X{
  829. X    /*
  830. X     * object identifier is of form:
  831. X     * 1.3.6.1.2.1.4.20.1.?.A.B.C.D,  where A.B.C.D is IP address.
  832. X     * IPADDR starts at offset 10.
  833. X     */
  834. X    oid                lowest[14];
  835. X    oid                current[14], *op;
  836. X    u_char            *cp;
  837. X    int                interface, lowinterface=0;
  838. X    static struct ifnet ifnet;
  839. X    static struct in_ifaddr in_ifaddr, lowin_ifaddr;
  840. X
  841. X    /* fill in object part of name for current (less sizeof instance part) */
  842. X
  843. X    bcopy((char *)vp->name, (char *)current, (int)(vp->namelen - 4) * sizeof(oid));
  844. X
  845. X    Interface_Scan_Init();
  846. X    for (;;) {
  847. X    if (Interface_Scan_Next(&interface, (char *)0, &ifnet, &in_ifaddr) == 0) break;
  848. X
  849. X    cp = (u_char *)&(((struct sockaddr_in *) &(in_ifaddr.ia_addr))->sin_addr.s_addr);
  850. X    op = current + 10;
  851. X    *op++ = *cp++;
  852. X    *op++ = *cp++;
  853. X    *op++ = *cp++;
  854. X    *op++ = *cp++;
  855. X
  856. X    if (exact){
  857. X        if (compare(current, 14, name, *length) == 0){
  858. X        bcopy((char *)current, (char *)lowest, 14 * sizeof(oid));
  859. X        lowinterface = interface;
  860. X        lowin_ifaddr = in_ifaddr;
  861. X        break;    /* no need to search further */
  862. X        }
  863. X    } else {
  864. X        if ((compare(current, 14, name, *length) > 0) &&
  865. X         (!lowinterface || (compare(current, 14, lowest, 14) < 0))){
  866. X        /*
  867. X         * if new one is greater than input and closer to input than
  868. X         * previous lowest, save this one as the "next" one.
  869. X         */
  870. X        lowinterface = interface;
  871. X        lowin_ifaddr = in_ifaddr;
  872. X        bcopy((char *)current, (char *)lowest, 14 * sizeof(oid));
  873. X        }
  874. X    }
  875. X    }
  876. X    if (!lowinterface) return(NULL);
  877. X    bcopy((char *)lowest, (char *)name, 14 * sizeof(oid));
  878. X    *length = 14;
  879. X    *write_method = 0;
  880. X    *var_len = sizeof(long_return);
  881. X    switch(vp->magic){
  882. X    case IPADADDR:
  883. X        return(u_char *) &((struct sockaddr_in *) &lowin_ifaddr.ia_addr)->sin_addr.s_addr;
  884. X    case IPADIFINDEX:
  885. X        long_return = lowinterface;
  886. X        return(u_char *) &long_return;
  887. X    case IPADNETMASK:
  888. X        long_return = ntohl(lowin_ifaddr.ia_subnetmask);
  889. X        return(u_char *) &long_return;
  890. X    case IPADBCASTADDR:
  891. X        long_return = ntohl(((struct sockaddr_in *) &lowin_ifaddr.ia_addr)->sin_addr.s_addr) & 1;
  892. X        return(u_char *) &long_return;
  893. X    default:
  894. X        ERROR("");
  895. X    }
  896. X    return NULL;
  897. X}
  898. X
  899. X
  900. Xu_char *
  901. Xvar_icmp(vp, name, length, exact, var_len, write_method)
  902. X    register struct variable *vp;    /* IN - pointer to variable entry that points here */
  903. X    oid     *name;        /* IN/OUT - input name requested, output name found */
  904. X    int     *length;        /* IN/OUT - length of input and output oid's */
  905. X    int     exact;        /* IN - TRUE if an exact match was requested. */
  906. X    int     *var_len;        /* OUT - length of variable or 0 if function returned. */
  907. X    int     (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
  908. X{
  909. X    register int i;
  910. X    static struct icmpstat icmpstat;
  911. X
  912. X    if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))
  913. X    return NULL;
  914. X    bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));
  915. X    *length = vp->namelen;
  916. X    *write_method = 0;
  917. X    *var_len = sizeof(long); /* all following variables are sizeof long */
  918. X
  919. X    /*
  920. X     *    Get the UDP statistics from the kernel...
  921. X     */
  922. X
  923. X    klseek(nl[N_ICMPSTAT].n_value);
  924. X    klread((char *)&icmpstat, sizeof (icmpstat));
  925. X
  926. X    switch (vp->magic){
  927. X    case ICMPINMSGS:
  928. X        long_return = icmpstat.icps_badcode + icmpstat.icps_tooshort +
  929. X              icmpstat.icps_checksum + icmpstat.icps_badlen;
  930. X        for (i=0; i <= ICMP_MAXTYPE; i++)
  931. X        long_return += icmpstat.icps_inhist[i];
  932. X        return (u_char *)&long_return;
  933. X    case ICMPINERRORS:
  934. X        long_return = icmpstat.icps_badcode + icmpstat.icps_tooshort +
  935. X              icmpstat.icps_checksum + icmpstat.icps_badlen;
  936. X        return (u_char *)&long_return;
  937. X    case ICMPINDESTUNREACHS:
  938. X        return (u_char *) &icmpstat.icps_inhist[ICMP_UNREACH];
  939. X    case ICMPINTIMEEXCDS:
  940. X        return (u_char *) &icmpstat.icps_inhist[ICMP_TIMXCEED];
  941. X    case ICMPINPARMPROBS:
  942. X        return (u_char *) &icmpstat.icps_inhist[ICMP_PARAMPROB];
  943. X    case ICMPINSRCQUENCHS:
  944. X        return (u_char *) &icmpstat.icps_inhist[ICMP_SOURCEQUENCH];
  945. X    case ICMPINREDIRECTS:
  946. X        return (u_char *) &icmpstat.icps_inhist[ICMP_REDIRECT];
  947. X    case ICMPINECHOS:
  948. X        return (u_char *) &icmpstat.icps_inhist[ICMP_ECHO];
  949. X    case ICMPINECHOREPS:
  950. X        return (u_char *) &icmpstat.icps_inhist[ICMP_ECHOREPLY];
  951. X    case ICMPINTIMESTAMPS:
  952. X        return (u_char *) &icmpstat.icps_inhist[ICMP_TSTAMP];
  953. X    case ICMPINTIMESTAMPREPS:
  954. X        return (u_char *) &icmpstat.icps_inhist[ICMP_TSTAMPREPLY];
  955. X    case ICMPINADDRMASKS:
  956. X        return (u_char *) &icmpstat.icps_inhist[ICMP_MASKREQ];
  957. X    case ICMPINADDRMASKREPS:
  958. X        return (u_char *) &icmpstat.icps_inhist[ICMP_MASKREPLY];
  959. X    case ICMPOUTMSGS:
  960. X        long_return = icmpstat.icps_oldshort + icmpstat.icps_oldicmp;
  961. X        for (i=0; i <= ICMP_MAXTYPE; i++)
  962. X        long_return += icmpstat.icps_outhist[i];
  963. X        return (u_char *)&long_return;
  964. X    case ICMPOUTERRORS:
  965. X        long_return = icmpstat.icps_oldshort + icmpstat.icps_oldicmp;
  966. X        return (u_char *)&long_return;
  967. X    case ICMPOUTDESTUNREACHS:
  968. X        return (u_char *) &icmpstat.icps_outhist[ICMP_UNREACH];
  969. X    case ICMPOUTTIMEEXCDS:
  970. X        return (u_char *) &icmpstat.icps_outhist[ICMP_TIMXCEED];
  971. X    case ICMPOUTPARMPROBS:
  972. X        return (u_char *) &icmpstat.icps_outhist[ICMP_PARAMPROB];
  973. X    case ICMPOUTSRCQUENCHS:
  974. X        return (u_char *) &icmpstat.icps_outhist[ICMP_SOURCEQUENCH];
  975. X    case ICMPOUTREDIRECTS:
  976. X        return (u_char *) &icmpstat.icps_outhist[ICMP_REDIRECT];
  977. X    case ICMPOUTECHOS:
  978. X        return (u_char *) &icmpstat.icps_outhist[ICMP_ECHO];
  979. X    case ICMPOUTECHOREPS:
  980. X        return (u_char *) &icmpstat.icps_outhist[ICMP_ECHOREPLY];
  981. X    case ICMPOUTTIMESTAMPS:
  982. X        return (u_char *) &icmpstat.icps_outhist[ICMP_TSTAMP];
  983. X    case ICMPOUTTIMESTAMPREPS:
  984. X        return (u_char *) &icmpstat.icps_outhist[ICMP_TSTAMPREPLY];
  985. X    case ICMPOUTADDRMASKS:
  986. X        return (u_char *) &icmpstat.icps_outhist[ICMP_MASKREQ];
  987. X    case ICMPOUTADDRMASKREPS:
  988. X        return (u_char *) &icmpstat.icps_outhist[ICMP_MASKREPLY];
  989. X    default:
  990. X        ERROR("");
  991. X    }
  992. X    return NULL;
  993. X}
  994. X
  995. X
  996. Xu_char *
  997. Xvar_udp(vp, name, length, exact, var_len, write_method)
  998. X    register struct variable *vp;    /* IN - pointer to variable entry that points here */
  999. X    oid     *name;        /* IN/OUT - input name requested, output name found */
  1000. X    int     *length;        /* IN/OUT - length of input and output oid's */
  1001. X    int     exact;        /* IN - TRUE if an exact match was requested. */
  1002. X    int     *var_len;        /* OUT - length of variable or 0 if function returned. */
  1003. X    int     (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
  1004. X{
  1005. X    static struct udpstat udpstat;
  1006. X
  1007. X    if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))
  1008. X    return NULL;
  1009. X    bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));
  1010. X
  1011. X    *length = vp->namelen;
  1012. X    *write_method = 0;
  1013. X    *var_len = sizeof(long);    /* default length */
  1014. X    /*
  1015. X     *    Get the IP statistics from the kernel...
  1016. X     */
  1017. X
  1018. X    klseek(nl[N_UDPSTAT].n_value);
  1019. X    klread((char *)&udpstat, sizeof (udpstat));
  1020. X
  1021. X    switch (vp->magic){
  1022. X    case UDPINDATAGRAMS:
  1023. X    case UDPNOPORTS:
  1024. X    case UDPOUTDATAGRAMS:
  1025. X        long_return = 0;
  1026. X        return (u_char *) &long_return;
  1027. X    case UDPINERRORS:
  1028. X        long_return = udpstat.udps_hdrops + udpstat.udps_badsum +
  1029. X              udpstat.udps_badlen;
  1030. X        return (u_char *) &long_return;
  1031. X    default:
  1032. X        ERROR("");
  1033. X    }
  1034. X    return NULL;
  1035. X}
  1036. X
  1037. Xu_char *
  1038. Xvar_tcp(vp, name, length, exact, var_len, write_method)
  1039. X    register struct variable *vp;    /* IN - pointer to variable entry that points here */
  1040. X    oid     *name;        /* IN/OUT - input name requested, output name found */
  1041. X    int     *length;        /* IN/OUT - length of input and output oid's */
  1042. X    int     exact;        /* IN - TRUE if an exact match was requested. */
  1043. X    int     *var_len;        /* OUT - length of variable or 0 if function returned. */
  1044. X    int     (**write_method)(); /* OUT - 1 if function, 0 if char pointer. */
  1045. X{
  1046. X    int i;
  1047. X    static struct tcpstat tcpstat;
  1048. X    oid newname[MAX_NAME_LEN], lowest[MAX_NAME_LEN], *op;
  1049. X    u_char *cp;
  1050. X    int State, LowState;
  1051. X    static struct inpcb inpcb, Lowinpcb;
  1052. X
  1053. X    /*
  1054. X     *    Allow for a kernel w/o TCP
  1055. X     */
  1056. X
  1057. X    if (nl[N_TCPSTAT].n_value == 0) return(NULL);
  1058. X
  1059. X    if (vp->magic < TCPCONNSTATE) {
  1060. X    if (exact && (compare(name, *length, vp->name, (int)vp->namelen) != 0))
  1061. X        return NULL;
  1062. X    bcopy((char *)vp->name, (char *)name, (int)vp->namelen * sizeof(oid));
  1063. X
  1064. X    *length = vp->namelen;
  1065. X    *write_method = 0;
  1066. X    *var_len = sizeof(long);    /* default length */
  1067. X    /*
  1068. X     *  Get the TCP statistics from the kernel...
  1069. X     */
  1070. X
  1071. X    klseek(nl[N_TCPSTAT].n_value);
  1072. X    klread((char *)&tcpstat, sizeof (tcpstat));
  1073. X
  1074. X    switch (vp->magic){
  1075. X        case TCPRTOALGORITHM:
  1076. X        long_return = 4;    /* Van Jacobsen's algorithm */    /* XXX */
  1077. X        return (u_char *) &long_return;
  1078. X        case TCPRTOMIN:
  1079. X        long_return = 0;
  1080. X/* $$$$$        long_return = TCPTV_MIN / PR_SLOWHZ * 1000; */
  1081. X        return (u_char *) &long_return;
  1082. X        case TCPRTOMAX:
  1083. X        long_return = 0;
  1084. X/* $$$$$        long_return = TCPTV_REXMTMAX / PR_SLOWHZ * 1000; */
  1085. X        return (u_char *) &long_return;
  1086. X        case TCPMAXCONN:
  1087. X        long_return = -1;
  1088. X        return (u_char *) &long_return;
  1089. X        case TCPACTIVEOPENS:
  1090. X        return (u_char *) &tcpstat.tcps_connattempt;
  1091. X        case TCPPASSIVEOPENS:
  1092. X        return (u_char *) &tcpstat.tcps_accepts;
  1093. X        case TCPATTEMPTFAILS:
  1094. X        return (u_char *) &tcpstat.tcps_conndrops;
  1095. X        case TCPESTABRESETS:
  1096. X        return (u_char *) &tcpstat.tcps_drops;
  1097. X        case TCPCURRESTAB:
  1098. X        long_return = TCP_Count_Connections();
  1099. X        return (u_char *) &long_return;
  1100. X        case TCPINSEGS:
  1101. X        return (u_char *) &tcpstat.tcps_rcvtotal;
  1102. X        case TCPOUTSEGS:
  1103. X        return (u_char *) &tcpstat.tcps_sndtotal;
  1104. X        case TCPRETRANSSEGS:
  1105. X        return (u_char *) &tcpstat.tcps_sndrexmitpack;
  1106. X        default:
  1107. X        ERROR("");
  1108. X    }
  1109. X    } else {    /* Info about a particular connection */
  1110. X    bcopy((char *)vp->name, (char *)newname, (int)vp->namelen * sizeof(oid));
  1111. X    /* find "next" connection */
  1112. XAgain:
  1113. XLowState = -1;        /* Don't have one yet */
  1114. X    TCP_Scan_Init();
  1115. X    for (;;) {
  1116. X        if ((i = TCP_Scan_Next(&State, &inpcb)) < 0) goto Again;
  1117. X        if (i == 0) break;        /* Done */
  1118. X        cp = (u_char *)&inpcb.inp_laddr.s_addr;
  1119. X        op = newname + 10;
  1120. X        *op++ = *cp++;
  1121. X        *op++ = *cp++;
  1122. X        *op++ = *cp++;
  1123. X        *op++ = *cp++;
  1124. X        
  1125. X        newname[14] = ntohs(inpcb.inp_lport);
  1126. X
  1127. X        cp = (u_char *)&inpcb.inp_faddr.s_addr;
  1128. X        op = newname + 15;
  1129. X        *op++ = *cp++;
  1130. X        *op++ = *cp++;
  1131. X        *op++ = *cp++;
  1132. X        *op++ = *cp++;
  1133. X        
  1134. X        newname[19] = ntohs(inpcb.inp_fport);
  1135. X
  1136. X        if (exact){
  1137. X        if (compare(newname, 20, name, *length) == 0){
  1138. X            bcopy((char *)newname, (char *)lowest, 20 * sizeof(oid));
  1139. X            LowState = State;
  1140. X            Lowinpcb = inpcb;
  1141. X            break;  /* no need to search further */
  1142. X        }
  1143. X        } else {
  1144. X        if ((compare(newname, 20, name, *length) > 0) &&
  1145. X             ((LowState < 0) || (compare(newname, 20, lowest, 20) < 0))){
  1146. X            /*
  1147. X             * if new one is greater than input and closer to input than
  1148. X             * previous lowest, save this one as the "next" one.
  1149. X             */
  1150. X            bcopy((char *)newname, (char *)lowest, 20 * sizeof(oid));
  1151. X            LowState = State;
  1152. X            Lowinpcb = inpcb;
  1153. X        }
  1154. X        }
  1155. X    }
  1156. X    if (LowState < 0) return(NULL);
  1157. X    bcopy((char *)lowest, (char *)name, (int)vp->namelen * sizeof(oid));
  1158. X    *length = vp->namelen;
  1159. X    *write_method = 0;
  1160. X    *var_len = sizeof(long);
  1161. X    switch (vp->magic) {
  1162. X        case TCPCONNSTATE: {
  1163. X        static int StateMap[]={1, 2, 3, 4, 5, 8, 6, 10, 9, 7, 11};
  1164. X        return (u_char *) &StateMap[LowState];
  1165. X        }
  1166. X        case TCPCONNLOCALADDRESS:
  1167. X        return (u_char *) &Lowinpcb.inp_laddr.s_addr;
  1168. X        case TCPCONNLOCALPORT:
  1169. X        long_return = ntohs(Lowinpcb.inp_lport);
  1170. X        return (u_char *) &long_return;
  1171. X        case TCPCONNREMADDRESS:
  1172. X        return (u_char *) &Lowinpcb.inp_faddr.s_addr;
  1173. X        case TCPCONNREMPORT:
  1174. X        long_return = ntohs(Lowinpcb.inp_fport);
  1175. X        return (u_char *) &long_return;
  1176. X    }
  1177. X    }
  1178. X    return NULL;
  1179. X}
  1180. X
  1181. X/*
  1182. X *    Print INTERNET connections
  1183. X */
  1184. X
  1185. Xstatic int TCP_Count_Connections()
  1186. X{
  1187. X    int Established;
  1188. X    struct inpcb cb;
  1189. X    register struct inpcb *prev, *next;
  1190. X    struct inpcb inpcb;
  1191. X    struct tcpcb tcpcb;
  1192. X
  1193. XAgain:    /*
  1194. X     *    Prepare to scan the control blocks
  1195. X     */
  1196. X    Established = 0;
  1197. X    klseek(nl[N_TCB].n_value);
  1198. X    klread((char *)&cb, sizeof(struct inpcb));
  1199. X    inpcb = cb;
  1200. X    prev = (struct inpcb *) nl[N_TCB].n_value;
  1201. X    /*
  1202. X     *    Scan the control blocks
  1203. X     */
  1204. X    while (inpcb.inp_next != (struct inpcb *) nl[N_TCB].n_value) {
  1205. X        next = inpcb.inp_next;
  1206. X        klseek((caddr_t)next);
  1207. X        klread((char *)&inpcb, sizeof (inpcb));
  1208. X        if (inpcb.inp_prev != prev) {        /* ??? */
  1209. X            sleep(1);
  1210. X            goto Again;
  1211. X        }
  1212. X        if (inet_lnaof(inpcb.inp_laddr) == INADDR_ANY) {
  1213. X            prev = next;
  1214. X            continue;
  1215. X        }
  1216. X        klseek((caddr_t)inpcb.inp_ppcb);
  1217. X        klread((char *)&tcpcb, sizeof (tcpcb));
  1218. X        if ((tcpcb.t_state == TCPS_ESTABLISHED) ||
  1219. X            (tcpcb.t_state == TCPS_CLOSE_WAIT))
  1220. X            Established++;
  1221. X        prev = next;
  1222. X    }
  1223. X    return(Established);
  1224. X}
  1225. X
  1226. X
  1227. Xstatic struct inpcb inpcb, *prev;
  1228. X
  1229. Xstatic TCP_Scan_Init()
  1230. X{
  1231. X    klseek(nl[N_TCB].n_value);
  1232. X    klread((char *)&inpcb, sizeof(inpcb));
  1233. X    prev = (struct inpcb *) nl[N_TCB].n_value;
  1234. X}
  1235. X
  1236. Xstatic int TCP_Scan_Next(State, RetInPcb)
  1237. Xint *State;
  1238. Xstruct inpcb *RetInPcb;
  1239. X{
  1240. X    register struct inpcb *next;
  1241. X    struct tcpcb tcpcb;
  1242. X
  1243. X    if (inpcb.inp_next == (struct inpcb *) nl[N_TCB].n_value) {
  1244. X        return(0);        /* "EOF" */
  1245. X    }
  1246. X
  1247. X    next = inpcb.inp_next;
  1248. X    klseek((caddr_t)next);
  1249. X    klread((char *)&inpcb, sizeof (inpcb));
  1250. X    if (inpcb.inp_prev != prev)       /* ??? */
  1251. X        return(-1); /* "FAILURE" */
  1252. X    klseek((caddr_t)inpcb.inp_ppcb);
  1253. X    klread((char *)&tcpcb, sizeof (tcpcb));
  1254. X    *State = tcpcb.t_state;
  1255. X    *RetInPcb = inpcb;
  1256. X    prev = next;
  1257. X    return(1);    /* "OK" */
  1258. X}
  1259. X
  1260. Xstatic int arptab_size, arptab_current;
  1261. Xstatic struct arptab *at=0;
  1262. Xstatic ARP_Scan_Init()
  1263. X{
  1264. X    if (!at) {
  1265. X        klseek(nl[N_ARPTAB_SIZE].n_value);
  1266. X        klread((char *)&arptab_size, sizeof arptab_size);
  1267. X
  1268. X        at = (struct arptab *) malloc(arptab_size * sizeof(struct arptab));
  1269. X    }
  1270. X
  1271. X    klseek(nl[N_ARPTAB].n_value);
  1272. X    klread((char *)at, arptab_size * sizeof(struct arptab));
  1273. X    arptab_current = 0;
  1274. X}
  1275. X
  1276. Xstatic int ARP_Scan_Next(IPAddr, PhysAddr)
  1277. Xu_long *IPAddr;
  1278. Xchar *PhysAddr;
  1279. X{
  1280. X    register struct arptab *atab;
  1281. X
  1282. X    while (arptab_current < arptab_size) {
  1283. X        atab = &at[arptab_current++];
  1284. X        if (!(atab->at_flags & ATF_COM)) continue;
  1285. X        *IPAddr = atab->at_iaddr.s_addr;
  1286. X        bcopy((char *)&atab->at_enaddr, PhysAddr, sizeof(atab->at_enaddr));
  1287. X        return(1);
  1288. X    }
  1289. X    return(0);        /* "EOF" */
  1290. X}
  1291. X
  1292. X
  1293. Xstatic struct ifnet *ifnetaddr, saveifnet, *saveifnetaddr;
  1294. Xstatic struct in_ifaddr savein_ifaddr;
  1295. Xstatic int saveIndex=0;
  1296. Xstatic char saveName[16];
  1297. X
  1298. XInterface_Scan_Init()
  1299. X{
  1300. X    klseek(nl[N_IFNET].n_value);
  1301. X    klread((char *)&ifnetaddr, sizeof ifnetaddr);
  1302. X    saveIndex=0;
  1303. X}
  1304. X
  1305. Xint Interface_Scan_Next(Index, Name, Retifnet, Retin_ifaddr)
  1306. Xint *Index;
  1307. Xchar *Name;
  1308. Xstruct ifnet *Retifnet;
  1309. Xstruct in_ifaddr *Retin_ifaddr;
  1310. X{
  1311. X    struct ifnet ifnet;
  1312. X    struct in_ifaddr *ia, in_ifaddr;
  1313. X    register char *cp;
  1314. X    extern char *index();
  1315. X
  1316. X    while (ifnetaddr) {
  1317. X        /*
  1318. X         *        Get the "ifnet" structure and extract the device name
  1319. X         */
  1320. X        klseek(ifnetaddr);
  1321. X        klread((char *)&ifnet, sizeof ifnet);
  1322. X        klseek((caddr_t)ifnet.if_name);
  1323. X        klread(saveName, 16);
  1324. X        saveName[15] = '\0';
  1325. X        cp = index(saveName, '\0');
  1326. X        *cp++ = ifnet.if_unit + '0';
  1327. X        *cp = '\0';
  1328. X        if (1 || strcmp(saveName,"lo0") != 0) {  /* XXX */
  1329. X        /*
  1330. X         *  Try to find an addres for this interface
  1331. X         */
  1332. X        klseek(nl[N_IN_IFADDR].n_value);
  1333. X        klread((char *) &ia, sizeof(ia));
  1334. X        while (ia) {
  1335. X            klseek(ia);
  1336. X            klread((char *) &in_ifaddr, sizeof(in_ifaddr));
  1337. X            if (in_ifaddr.ia_ifp == ifnetaddr) break;
  1338. X            ia = in_ifaddr.ia_next;
  1339. X        }
  1340. X
  1341. X        ifnet.if_addrlist = (struct ifaddr *)ia;     /* WRONG DATA TYPE; ONLY A FLAG */
  1342. X/*        ifnet.if_addrlist = (struct ifaddr *)&ia->ia_ifa;   */  /* WRONG DATA TYPE; ONLY A FLAG */
  1343. X        if (Index)
  1344. X            *Index = ++saveIndex;
  1345. X        if (Retifnet)
  1346. X            *Retifnet = ifnet;
  1347. X        if (Retin_ifaddr)
  1348. X            *Retin_ifaddr = in_ifaddr;
  1349. X        if (Name)
  1350. X            strcpy(Name, saveName);
  1351. X        saveifnet = ifnet;
  1352. X        saveifnetaddr = ifnetaddr;
  1353. X        savein_ifaddr = in_ifaddr;
  1354. X        ifnetaddr = ifnet.if_next;
  1355. X        return(1);    /* DONE */
  1356. X        }
  1357. X        ifnetaddr = ifnet.if_next;
  1358. X    }
  1359. X    return(0);        /* EOF */
  1360. X}
  1361. X
  1362. Xstatic int Interface_Scan_By_Index(Index, Name, Retifnet, Retin_ifaddr)
  1363. Xint Index;
  1364. Xchar *Name;
  1365. Xstruct ifnet *Retifnet;
  1366. Xstruct in_ifaddr *Retin_ifaddr;
  1367. X{
  1368. X    int i;
  1369. X
  1370. X    if (saveIndex != Index) {    /* Optimization! */
  1371. X        Interface_Scan_Init();
  1372. X        while (Interface_Scan_Next(&i, Name, Retifnet, Retin_ifaddr)) {
  1373. X        if (i == Index) break;
  1374. X        }
  1375. X        if (i != Index) return(-1);     /* Error, doesn't exist */
  1376. X    } else {
  1377. X        if (Retifnet)
  1378. X        *Retifnet = saveifnet;
  1379. X        if (Retin_ifaddr)
  1380. X        *Retin_ifaddr = savein_ifaddr;
  1381. X        if (Name)
  1382. X        strcpy(Name, saveName);
  1383. X    }
  1384. X    return(0);    /* DONE */
  1385. X}
  1386. X
  1387. Xstatic int Interface_Count=0;
  1388. X
  1389. Xstatic int Interface_Scan_Get_Count()
  1390. X{
  1391. X    if (!Interface_Count) {
  1392. X        Interface_Scan_Init();
  1393. X        while (Interface_Scan_Next((int *)0, (char *)0, (struct ifnet *)0, (struct in_ifaddr *)0) != 0)
  1394. X        Interface_Count++;
  1395. X    }
  1396. X    return(Interface_Count);
  1397. X}
  1398. X
  1399. Xstatic int Interface_Get_Ether_By_Index(Index, EtherAddr)
  1400. Xint Index;
  1401. Xchar *EtherAddr;
  1402. X{
  1403. X    int i;
  1404. X    struct arpcom arpcom;
  1405. X
  1406. X    if (saveIndex != Index) {    /* Optimization! */
  1407. X        Interface_Scan_Init();
  1408. X        while (Interface_Scan_Next(&i, (char *)0, (struct ifnet *)0, (struct in_ifaddr *)0)) {
  1409. X        if (i == Index) break;
  1410. X        }
  1411. X        if (i != Index) return(-1);     /* Error, doesn't exist */
  1412. X    }
  1413. X
  1414. X    /*
  1415. X     *  the arpcom structure is an extended ifnet structure which
  1416. X     *  contains the ethernet address.
  1417. X     */
  1418. X    klseek(saveifnetaddr);
  1419. X    klread((char *)&arpcom, sizeof arpcom);
  1420. X    bcopy((char *)&arpcom.ac_enaddr, EtherAddr, sizeof(arpcom.ac_enaddr));
  1421. X    return(0);    /* DONE */
  1422. X}
  1423. X
  1424. END_OF_FILE
  1425.   if test 46913 -ne `wc -c <'netramet/src/apps/snmp_vars.c'`; then
  1426.     echo shar: \"'netramet/src/apps/snmp_vars.c'\" unpacked with wrong size!
  1427.   fi
  1428.   # end of 'netramet/src/apps/snmp_vars.c'
  1429. fi
  1430. if test -f 'netramet/src/manager/include/nmc.h' -a "${1}" != "-c" ; then 
  1431.   echo shar: Will not clobber existing file \"'netramet/src/manager/include/nmc.h'\"
  1432. else
  1433.   echo shar: Extracting \"'netramet/src/manager/include/nmc.h'\" \(11711 characters\)
  1434.   sed "s/^X//" >'netramet/src/manager/include/nmc.h' <<'END_OF_FILE'
  1435. X/* 1635, Mon 11 Oct 93
  1436. X
  1437. X   NMC.H:  Global declarations for the NeTraMet Manager/Collector
  1438. X
  1439. X   Copyright (C) 1992,1993 by Nevil Brownlee,
  1440. X   Computer Centre,  University of Auckland */
  1441. X
  1442. X#ifndef EXTERN
  1443. X#define EXTERN  extern
  1444. X#define DECLARE  0
  1445. X#define INIT(v)
  1446. X#else
  1447. X#define EXTERN
  1448. X#define DECLARE  1
  1449. X#define INIT(v)  = v
  1450. X#endif
  1451. X
  1452. X#define CFGFILE "NeMaC.cfg"
  1453. X#define RULEFILE "rules.txt"
  1454. X#define LOGFILE  "NeMaC.log"
  1455. X
  1456. Xextern int  errno;
  1457. X
  1458. XEXTERN int snmp_dump_packet INIT(0);
  1459. X
  1460. XEXTERN int verbose, testing, listrules, interval;
  1461. X
  1462. X#define MAC_ADDR_LEN     6
  1463. X#define PEER_ADDR_LEN    4
  1464. X#define DETAIL_ADDR_LEN  2
  1465. X
  1466. X#define RULE_ADDR_LEN    6
  1467. X
  1468. Xstruct flow_info {  /* Accounting flow as viewed by NeMaC */
  1469. X   unsigned int FlowIndex;
  1470. X   unsigned char LowInterface, HighInterface;
  1471. X   unsigned char LowAdjType, HighAdjType,
  1472. X      LowAdjAddress[MAC_ADDR_LEN], LowAdjMask[MAC_ADDR_LEN],
  1473. X      HighAdjAddress[MAC_ADDR_LEN], HighAdjMask[MAC_ADDR_LEN];
  1474. X   unsigned char 
  1475. X      LowPeerType,LowPeerTypeMask, HighPeerType,HighPeerTypeMask,
  1476. X      LowPeerAddress[PEER_ADDR_LEN], LowPeerMask[PEER_ADDR_LEN],
  1477. X      HighPeerAddress[PEER_ADDR_LEN], HighPeerMask[PEER_ADDR_LEN];
  1478. X   unsigned char 
  1479. X      LowDetailType,LowDetailTypeMask,  HighDetailType,HighDetailTypeMask,
  1480. X      LowDetailAddress[DETAIL_ADDR_LEN], LowDetailMask[DETAIL_ADDR_LEN],
  1481. X      HighDetailAddress[DETAIL_ADDR_LEN], HighDetailMask[DETAIL_ADDR_LEN];
  1482. X   unsigned char FlowStatus, FlowRuleSet, FlowType;
  1483. X   unsigned long
  1484. X      FwdPackets,FwdBytes,  BackPackets,BackBytes,
  1485. X      FirstTime,LastTime;
  1486. X   };
  1487. X
  1488. Xstruct rule_info {
  1489. X   int RuleSet, RuleNbr;
  1490. X   unsigned char RuleSelector,
  1491. X      RuleMask[RULE_ADDR_LEN], RuleMatchedValue[RULE_ADDR_LEN], 
  1492. X      RuleAction, RuleJumpIndex;
  1493. X   };
  1494. X
  1495. X#define AT_IGNORE     0  /* Addr_type values */
  1496. X#define AT_IP         2
  1497. X#define AT_NOVELL     6
  1498. X#define AT_DECNET     5
  1499. X#define AT_ETHERTALK  7
  1500. X
  1501. X#define PT_ICMP       1  /* IP protocol type values */
  1502. X#define PT_TCP        6
  1503. X#define PT_UDP       17
  1504. X
  1505. X#define WNP_FTPDATA  20  /* Well-known tcp/udp port numbers */
  1506. X#define WNP_FTP      21
  1507. X#define WNP_TELNET   23
  1508. X#define WNP_SMTP     25
  1509. X#define WNP_DOMAIN   53
  1510. X#define WNP_NNTP    119
  1511. X#define WNP_NTP     123
  1512. X#define WNP_SNMP    161
  1513. X
  1514. X#define RA_COUNT      1
  1515. X#define RA_TALLY      2
  1516. X#define RA_AGGREGATE  3
  1517. X#define RA_SUCCEED    4
  1518. X#define RA_FAIL       5
  1519. X#define RA_PUSHTO     6
  1520. X#define RA_POPTO      7
  1521. X#define RA_GOTO       8
  1522. X
  1523. X#define RF_SET       -1
  1524. X#define RF_RULES     -2
  1525. X#define RF_ACTIONS   -3
  1526. X#define RF_FORMAT    -4
  1527. X#define RF_STATS     -5
  1528. X
  1529. X#define FTFLOWINDEX        1  /* Flow table attribute values */
  1530. X#define FTFLOWSTATUS        2
  1531. X
  1532. X#define FTLOWINTERFACE          3
  1533. X#define FTLOWADJACENTTYPE       4
  1534. X#define FTLOWADJACENTADDRESS    5
  1535. X#define FTLOWADJACENTMASK       6
  1536. X#define FTLOWPEERTYPE        7
  1537. X#define FTLOWPEERTYPEMASK    8
  1538. X#define FTLOWPEERADDRESS    9
  1539. X#define FTLOWPEERMASK           10
  1540. X#define FTLOWDETAILTYPE        11
  1541. X#define FTLOWDETAILTYPEMASK    12
  1542. X#define FTLOWDETAILADDRESS     13
  1543. X#define FTLOWDETAILMASK        14
  1544. X#define FTLOWSUBSCRIBERID      15
  1545. X#define FTLOWSUBSCRIBERMASK    16
  1546. X#define FTHIINTERFACE          17
  1547. X#define FTHIADJACENTTYPE       18
  1548. X#define FTHIADJACENTADDRESS    19
  1549. X#define FTHIADJACENTMASK       20
  1550. X#define FTHIPEERTYPE           21
  1551. X#define FTHIPEERTYPEMASK       22
  1552. X#define FTHIPEERADDRESS           23
  1553. X#define FTHIPEERMASK           24
  1554. X#define FTHIDETAILTYPE         25
  1555. X#define FTHIDETAILTYPEMASK     26
  1556. X#define FTHIDETAILADDRESS      27
  1557. X#define FTHIDETAILMASK         28
  1558. X#define FTHISUBSCRIBERID       29
  1559. X#define FTHISUBSCRIBERMASK     30
  1560. X
  1561. X#define FTSUBSCRIBERID         31
  1562. X#define FTSUBSCRIBERMASK       32
  1563. X
  1564. X#define FTPDUSCALE             33
  1565. X#define FTOCTETSCALE           34
  1566. X#define FTRULESET              35
  1567. X#define FTFLOWTYPE             36
  1568. X
  1569. X#define FTUPOCTETS           37
  1570. X#define FTUPPDUS           38
  1571. X#define FTDOWNOCTETS           39
  1572. X#define FTDOWNPDUS           40
  1573. X
  1574. X#define FTFIRSTTIME           41
  1575. X#define FTLASTTIME           42
  1576. X
  1577. X#define NATTRIBS       FTLASTTIME
  1578. X
  1579. Xstruct attrib_info {
  1580. X   char *name;
  1581. X   unsigned char index;
  1582. X   unsigned char len;
  1583. X   };
  1584. X
  1585. XEXTERN struct attrib_info attribs[1+NATTRIBS]
  1586. X#if DECLARE
  1587. X   = {
  1588. X      /* Serial search -> longest names first! */
  1589. X   "null",                   0,                     0,
  1590. X   "flowindex",              FTFLOWINDEX,           2,
  1591. X   "flowstatus",             FTFLOWSTATUS,          1,
  1592. X   "sourceinterface",        FTLOWINTERFACE,        1,
  1593. X   "sourceadjacenttype",     FTLOWADJACENTTYPE,     1,
  1594. X   "sourceadjacentaddress",  FTLOWADJACENTADDRESS,  MAC_ADDR_LEN,
  1595. X   "sourceadjacentmask",     FTLOWADJACENTMASK,     MAC_ADDR_LEN,
  1596. X   "sourcepeertypemask",     FTLOWPEERTYPEMASK,     1,
  1597. X   "sourcepeertype",         FTLOWPEERTYPE,         1,
  1598. X   "sourcepeeraddress",      FTLOWPEERADDRESS,      PEER_ADDR_LEN,
  1599. X   "sourcepeermask",         FTLOWPEERMASK,         PEER_ADDR_LEN,
  1600. X   "sourcedetailtypemask",   FTLOWDETAILTYPEMASK,   1,
  1601. X   "sourcedetailtype",       FTLOWDETAILTYPE,       1,
  1602. X   "sourcedetailaddress",    FTLOWDETAILADDRESS,    DETAIL_ADDR_LEN,
  1603. X   "sourcedetailmask",       FTLOWDETAILMASK,       DETAIL_ADDR_LEN,
  1604. X   "sourcesubscriberid",     FTLOWSUBSCRIBERID,     0,
  1605. X   "sourcesubscribermask",   FTLOWSUBSCRIBERMASK,   0,
  1606. X   "destinterface",          FTHIINTERFACE,         1,
  1607. X   "destadjacenttype",       FTHIADJACENTTYPE,      1,
  1608. X   "destadjacentaddress",    FTHIADJACENTADDRESS,   MAC_ADDR_LEN,
  1609. X   "destadjacentmask",       FTHIADJACENTMASK,      MAC_ADDR_LEN,
  1610. X   "destpeertypemask",       FTHIPEERTYPEMASK,      1,
  1611. X   "destpeertype",           FTHIPEERTYPE,          1,
  1612. X   "destpeeraddress",        FTHIPEERADDRESS,       PEER_ADDR_LEN,
  1613. X   "destpeermask",           FTHIPEERMASK,          PEER_ADDR_LEN,
  1614. X   "destdetailtypemask",     FTHIDETAILTYPEMASK,    1,
  1615. X   "destdetailtype",         FTHIDETAILTYPE,        1,
  1616. X   "destdetailaddress",      FTHIDETAILADDRESS,     DETAIL_ADDR_LEN,
  1617. X   "destdetailmask",         FTHIDETAILMASK,        DETAIL_ADDR_LEN,
  1618. X   "destsubscriberid",       FTHISUBSCRIBERID,      0,
  1619. X   "destsubscribermask",     FTHISUBSCRIBERMASK,    0,
  1620. X   "subscriberid",           FTSUBSCRIBERID,        0,
  1621. X   "subscribermask",         FTSUBSCRIBERMASK,      0,
  1622. X   "pduscale",               FTPDUSCALE,            0,
  1623. X   "octetscale",             FTOCTETSCALE,          0,
  1624. X   "flowruleset",            FTRULESET,             1,
  1625. X   "flowtype",               FTFLOWTYPE,            1,
  1626. X   "tooctets",               FTUPOCTETS,            4,
  1627. X   "topdus",                 FTUPPDUS,              4,
  1628. X   "fromoctets",             FTDOWNOCTETS,          4,
  1629. X   "frompdus",               FTDOWNPDUS,            4,
  1630. X   "firsttime",              FTFIRSTTIME,           4,
  1631. X   "lasttime",               FTLASTTIME,            4 }
  1632. X#endif
  1633. X   ;
  1634. X
  1635. XEXTERN unsigned char col_order[1+NATTRIBS]  /* In descending-length order */
  1636. X#if DECLARE
  1637. X   = {
  1638. X   FTLOWADJACENTADDRESS,FTLOWADJACENTMASK,
  1639. X   FTHIADJACENTADDRESS,FTHIADJACENTMASK,
  1640. X   
  1641. X   FTLOWPEERADDRESS,FTLOWPEERMASK,
  1642. X   FTHIPEERADDRESS,FTHIPEERMASK,
  1643. X   FTUPOCTETS,FTUPPDUS, FTDOWNOCTETS,FTDOWNPDUS,
  1644. X   FTFIRSTTIME,FTLASTTIME,
  1645. X   
  1646. X   FTLOWDETAILADDRESS,FTLOWDETAILMASK,
  1647. X   FTHIDETAILADDRESS,FTHIDETAILMASK,
  1648. X   
  1649. X   FTFLOWSTATUS,
  1650. X   FTLOWINTERFACE,FTLOWADJACENTTYPE,
  1651. X   FTLOWPEERTYPE,FTLOWPEERTYPEMASK,
  1652. X   FTLOWDETAILTYPE,FTLOWDETAILTYPEMASK,
  1653. X   FTHIINTERFACE,FTHIADJACENTTYPE,
  1654. X   FTHIPEERTYPE,FTHIPEERTYPEMASK,
  1655. X   FTHIDETAILTYPE,FTHIDETAILTYPEMASK,
  1656. X   FTRULESET,FTFLOWTYPE,
  1657. X   
  1658. X   NULL,  /* Marks end of implemented attributes */
  1659. X   
  1660. X   FTPDUSCALE,FTOCTETSCALE,
  1661. X   FTLOWSUBSCRIBERID,FTLOWSUBSCRIBERMASK,
  1662. X   FTHISUBSCRIBERID,FTHISUBSCRIBERMASK,
  1663. X   FTSUBSCRIBERID,FTSUBSCRIBERMASK,
  1664. X
  1665. X   FTFLOWINDEX }  /* Never retrieve FlowIndex explicitly! */
  1666. X#endif
  1667. X   ;
  1668. X
  1669. X#define FLOWBLOBSZ  55
  1670. X
  1671. XEXTERN unsigned char column_blob[
  1672. X   (FLOWBLOBSZ+2)*(2+RULE_ADDR_LEN)];
  1673. X
  1674. XEXTERN struct flow_info flows[(FLOWBLOBSZ+2)*MAC_ADDR_LEN/DETAIL_ADDR_LEN];
  1675. X
  1676. X#ifdef AU_MSDOS  /* PC ntoh routines swap the byte order */
  1677. X#define netshort(x)  x
  1678. X#define netlong(x)   x
  1679. X#else            /* SunOS ntoh routines don't */
  1680. X#define netshort(x)  htons(x)
  1681. X#define netlong(x)   htonl(x)
  1682. X#endif
  1683. X
  1684. X#define NAME_LN  64
  1685. X
  1686. Xstruct meter_status {
  1687. X   struct meter_status *next;
  1688. X
  1689. X   char name[NAME_LN];  /* Meter name (DNS name or IP address) */
  1690. X   unsigned char community[NAME_LN];  /* Write-access SNMP community */
  1691. X   char rulefile[NAME_LN];
  1692. X
  1693. X   struct snmp_session *ss;
  1694. X
  1695. X   short status;
  1696. X
  1697. X   char descr[NAME_LN];  /* From meter_info() */
  1698. X   unsigned long uptime;
  1699. X   unsigned long OurLastCollectTime;
  1700. X
  1701. X   int CurrentRuleSet,  /* From meter */
  1702. X      ruleset, nrules, nactions;  /* From rule file */
  1703. X
  1704. X   unsigned char format[1+NATTRIBS];
  1705. X   char *separator[1+NATTRIBS];
  1706. X   unsigned char required[1+NATTRIBS];
  1707. X
  1708. X   unsigned long LastCollectTime;  /* By any collector, not neccessarily us */
  1709. X
  1710. X   unsigned int snmp_delay;  /* ms to wait after snmp requests */
  1711. X
  1712. X   unsigned char statsreqd;
  1713. X
  1714. X   int InactivityTime;  /* Meter control variables */
  1715. X   unsigned char HighWaterMark, GCIntervalReqd;
  1716. X
  1717. X   unsigned char GCInterval;  /* Meter Statistics variables */
  1718. X   unsigned int
  1719. X      MaxPktRate,MaxPktBacklog,
  1720. X      TotalHashSize,NbrHashEntries,
  1721. X      NbrFlows,MaxFlows,
  1722. X      AvIdle1000,MinIdle1000;
  1723. X   unsigned long
  1724. X      StatsTime,NbrPackets,TotPktBacklog,LostPackets,
  1725. X      RuleMatches,HashSearches,HashCompares,
  1726. X      FlowsRecovered;
  1727. X
  1728. X   FILE *flows;
  1729. X   };
  1730. X
  1731. XEXTERN FILE *log;
  1732. X
  1733. XEXTERN struct meter_status *first_meter;
  1734. XEXTERN int nmeters;
  1735. X
  1736. X/* Values for status */
  1737. X
  1738. X#define    MT_MANAGE    0x0001  /* Manage this meter */
  1739. X#define    MT_INFO         0x0002  /* Have basic info */
  1740. X#define    MT_UP         0x0004  /* Meter is running */
  1741. X#define    MT_REPORTED  0x0008  /* Current status reported */
  1742. X
  1743. X
  1744. XEXTERN FILE *rfp;  /* Scanner globals */
  1745. XEXTERN char inbuf[256], *ibp;
  1746. XEXTERN int lic, ic,  /* Last input char, current input char */
  1747. X   iblisted, rule_line, rferrors;
  1748. X
  1749. X
  1750. X/* Forward procedure declarations .. */
  1751. X
  1752. Xunsigned short getshort(unsigned char *ucp);
  1753. Xunsigned long getlong(unsigned char *ucp);
  1754. Xunsigned short get_slice(struct meter_status *ms,
  1755. X   unsigned short first_row, unsigned char col, 
  1756. X   unsigned char first);
  1757. X
  1758. Xvoid write_attrib(FILE *f,
  1759. X   struct flow_info *fp, unsigned char col);
  1760. X
  1761. Xint create_meter(struct meter_status *ms);
  1762. Xvoid monitor(struct meter_status *ms);
  1763. Xvoid print_meters();
  1764. Xvoid meter_print(FILE *f,struct meter_status *ms);
  1765. X
  1766. X/* Functions declared in nmc_pars.c */
  1767. X
  1768. Xvoid mswait(unsigned int ms);
  1769. XFILE *wfopen(char *fn);
  1770. Xchar *gnbr(unsigned int *n, char *s);
  1771. Xchar *gcstring(char *s, int *len);
  1772. X
  1773. Xchar *fmt_time(time_t *t);
  1774. Xchar *uptime_string(unsigned long timeticks, char *buf);
  1775. Xvoid printaddress(FILE *f,unsigned char *a,unsigned char addrsz);
  1776. Xvoid printruleaddress(FILE *f,unsigned char *a,unsigned char addrsz);
  1777. X
  1778. Xint parse_open(char *fn);
  1779. Xint nextchar(void);
  1780. Xvoid getarg(char *arg);
  1781. Xint wordis(char *p,char *w);
  1782. Xint getword(void);
  1783. Xint getnbr(void);
  1784. Xunsigned int getint(unsigned int *base);
  1785. Xvoid getaddress(unsigned char *a,unsigned char len,
  1786. X   unsigned char addrsz);
  1787. Xint getattribute(unsigned char col,struct flow_info *fp);
  1788. X
  1789. Xint scan_rulefile(struct meter_status *ms, int doset, int list);
  1790. Xvoid parse_rulefile(struct meter_status *ms, int list);
  1791. X
  1792. X/* Functions declared in nmc_snmp.c */
  1793. X
  1794. Xint start_snmp_session(struct meter_status *ms);
  1795. Xint set_meter_params(struct meter_status *ms);
  1796. Xint set_collect_time(struct meter_status *ms, int v);
  1797. Xint set_rule_info(struct meter_status *ms, int setset);
  1798. Xint add_rule(struct meter_status *ms, struct rule_info *ri);
  1799. Xint add_action(struct meter_status *ms, struct flow_info *ai,
  1800. X   unsigned char ActionSet,unsigned char ActionNbr,
  1801. X   unsigned char *required);
  1802. Xint same_acct_oid(oid *a, oid *b);
  1803. Xint column_info(struct meter_status *ms, unsigned char *fb,
  1804. X   unsigned char a, unsigned long ft, int *fn);
  1805. Xint meter_info(struct meter_status *ms);
  1806. X   
  1807. X
  1808. X
  1809. END_OF_FILE
  1810.   if test 11711 -ne `wc -c <'netramet/src/manager/include/nmc.h'`; then
  1811.     echo shar: \"'netramet/src/manager/include/nmc.h'\" unpacked with wrong size!
  1812.   fi
  1813.   # end of 'netramet/src/manager/include/nmc.h'
  1814. fi
  1815. if test -f 'netramet/src/meter/include/decnet.h' -a "${1}" != "-c" ; then 
  1816.   echo shar: Will not clobber existing file \"'netramet/src/meter/include/decnet.h'\"
  1817. else
  1818.   echo shar: Extracting \"'netramet/src/meter/include/decnet.h'\" \(1935 characters\)
  1819.   sed "s/^X//" >'netramet/src/meter/include/decnet.h' <<'END_OF_FILE'
  1820. X/* 1555, Wed 30 Sep 92
  1821. X
  1822. X   DECnet packet layouts
  1823. X
  1824. X   Nevil Brownlee,  Computer Centre,  University of Auckland */
  1825. X
  1826. Xstruct level1_routing {  /* Type 07 */
  1827. X   unsigned char
  1828. X      src_dn_addr[2],      /* Router DECnet address */
  1829. X      rsrv1[5],            /* 00 20 00 e0 01 */
  1830. X      rt_info;             /* 2 bytes per entry */
  1831. X   };
  1832. X
  1833. Xstruct level2_routing {  /* Type 09 */
  1834. X   unsigned char
  1835. X      src_dn_addr[2],      /* Router DECnet address */
  1836. X      rsrv1[5],            /* 00 20 00 01 00 */
  1837. X      rt_info;             /* 2 bytes per entry */
  1838. X   };
  1839. X
  1840. Xstruct router_hello {  /* Type 0b, (81 0b ?) */
  1841. X   unsigned char rsrv1,    /* 02 */
  1842. X      en_zero1[2],         /* 00 00 */
  1843. X      dec_en_hdr1[4],      /* aa 00 04 00 */
  1844. X      src_dn_addr[2],      /* Router DECnet address */
  1845. X      rsrv2[17],           /* 02 da 05 00 ... */
  1846. X      dec_en_hdr2[4],      /* aa 00 04 00 Other Router addresses */
  1847. X      rtr_dn_addr[2],      /* DECnet address */
  1848. X      rtr_info;            /* 7 bytes per entry */
  1849. X   };
  1850. X
  1851. Xstruct endnode_hello {  /* Type 0d, 81 0d */
  1852. X   unsigned char rsrv1,    /* 02 */
  1853. X      en_zero1[2],         /* 00 00 */
  1854. X      dec_en_hdr1[4],      /* aa 00 04 00 */
  1855. X      src_dn_addr[2],      /* Host DECnet address */
  1856. X      rsrv2[10],           /* 03 da 05 00 ... */
  1857. X      en_zero2[2],         /* 00 00 */
  1858. X      dec_en_hdr2[4],      /* aa 00 04 00 */
  1859. X      rtr_dn_addr[2];      /* Designated Router DECnet address */
  1860. X   };
  1861. X
  1862. Xstruct data {  /* Type 26, 81 26, 2e, 81 2e */
  1863. X   unsigned char
  1864. X      en_zero1[2],         /* 00 00 */
  1865. X      dec_en_hdr1[4],      /* aa 00 04 00 */
  1866. X      dest_dn_addr[2],     /* Host DECnet address */
  1867. X      en_zero2[2],         /* 00 00 */
  1868. X      dec_en_hdr2[4],      /* aa 00 04 00 */
  1869. X      src_dn_addr[2],      /* Host DECnet address */
  1870. X      data[1];
  1871. X   };
  1872. X
  1873. Xunion decnet {
  1874. X   struct level1_routing l1r;
  1875. X   struct level2_routing l2r;
  1876. X   struct router_hello rh;
  1877. X   struct endnode_hello eh;
  1878. X   struct data d;
  1879. X   };
  1880. X
  1881. X
  1882. END_OF_FILE
  1883.   if test 1935 -ne `wc -c <'netramet/src/meter/include/decnet.h'`; then
  1884.     echo shar: \"'netramet/src/meter/include/decnet.h'\" unpacked with wrong size!
  1885.   fi
  1886.   # end of 'netramet/src/meter/include/decnet.h'
  1887. fi
  1888. echo shar: End of archive 11 \(of 25\).
  1889. cp /dev/null ark11isdone
  1890. MISSING=""
  1891. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ; do
  1892.     if test ! -f ark${I}isdone ; then
  1893.     MISSING="${MISSING} ${I}"
  1894.     fi
  1895. done
  1896. if test "${MISSING}" = "" ; then
  1897.     echo You have unpacked all 25 archives.
  1898.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1899. else
  1900.     echo You still must unpack the following archives:
  1901.     echo "        " ${MISSING}
  1902. fi
  1903. exit 0
  1904. exit 0 # Just in case...
  1905.