DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T c

⟦c06615e29⟧ TextFile

    Length: 40108 (0x9cac)
    Types: TextFile
    Names: »clnp.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« 
        └─⟦de7628f85⟧ 
            └─⟦this⟧ »isode-6.0/snmp/clnp.c« 

TextFile

/* clnp.c - MIB realization of the experimental CLNP group */

#ifndef	lint
static char *rcsid = "$Header: /f/osi/snmp/RCS/clnp.c,v 7.1 90/01/11 18:33:54 mrose Exp $";
#endif

/* 
 * $Header: /f/osi/snmp/RCS/clnp.c,v 7.1 90/01/11 18:33:54 mrose Exp $
 *
 * Contributed by NYSERNet Inc.  This work was partially supported by the
 * U.S. Defense Advanced Research Projects Agency and the Rome Air Development
 * Center of the U.S. Air Force Systems Command under contract number
 * F30602-88-C-0016.
 *
 *
 * $Log:	clnp.c,v $
 * Revision 7.1  90/01/11  18:33:54  mrose
 * real-sync
 * 
 * Revision 7.0  89/11/23  22:22:55  mrose
 * Release 6.0
 * 
 */

/*
 *				  NOTICE
 *
 *    Acquisition, use, and distribution of this module and related
 *    materials are subject to the restrictions of a license agreement.
 *    Consult the Preface in the User's Manual for the full terms of
 *    this agreement.
 *
 */


#include <stdio.h>
#include "mib.h"
#include "interfaces.h"
#include "routes.h"

#ifdef	BSD44
#include <netiso/iso_map.h>
#include <netiso/iso_snpac.h>
#define	CLNP_ER_CODES
#include <netiso/clnp.h>
#include <netiso/clnp_stat.h>
#include <netiso/esis.h>

/* \f

 */

#define	FORW_IS		1		/* clnpForwarding */
#define	FORW_ES		2
static	int	iso_systype;

static	struct clnp_stat clnp_stat;

/* \f

 */

#define	clnpForwarding	0
#define	clnpDefaultLifeTime 1
#define	clnpInReceives	2
#define	clnpInHdrErrors	3
#define	clnpInAddrErrors 4
#define	clnpForwPDUs	5
#undef	clnpInUnknownNLPs 6		/* NOT IMPLEMENTED */
#define	clnpInUnknownULPs 7
#undef	clnpInDiscards	8		/* NOT IMPLEMENTED */
#define	clnpInDelivers	9
#define	clnpOutRequests	10
#define	clnpOutDiscards	11
#define	clnpOutNoRoutes	12
#define	clnpReasmTimeout 13
#define	clnpReasmReqds	14
#define	clnpReasmOKs	15
#define	clnpReasmFails	16
#define	clnpSegOKs	17
#define	clnpSegFails	18
#define	clnpSegCreates	19

#define	clnpInErrors	(100 + 0)
#define	clnpOutErrors	(100 + 1)
#define	clnpInErrUnspecs (100 + 2)
#define	clnpInErrProcs	(100 + 3)
#define	clnpInErrCksums	(100 + 4)
#define	clnpInErrCongests (100 + 5)
#define	clnpInErrHdrs	(100 + 6)
#define	clnpInErrSegs	(100 + 7)
#define	clnpInErrIncomps (100 + 8)
#define	clnpInErrDups	(100 + 9)
#define	clnpInErrUnreachDsts (100 + 10)
#define	clnpInErrUnknownDsts (100 + 11)
#define	clnpInErrSRUnspecs (100 + 12)
#define	clnpInErrSRSyntaxes (100 + 13)
#define	clnpInErrSRUnkAddrs (100 + 14)
#define	clnpInErrSRBadPaths (100 + 15)
#define	clnpInErrHops	(100 + 16)
#define	clnpInErrHopReassms (100 + 17)
#define	clnpInErrUnsOptions (100 + 18)
#define	clnpInErrUnsVersions (100 + 19)
#define	clnpInErrUnsSecurities (100 + 20)
#define	clnpInErrUnsSRs	(100 + 21)
#define	clnpInErrUnsRRs	(100 + 22)
#define	clnpInErrInterferences (100 + 23)
#define	clnpOutErrUnspecs	(100 + 24)
#define	clnpOutErrProcs	(100 + 25)
#define	clnpOutErrCksums (100 + 26)
#define	clnpOutErrCongests (100 + 27)
#define	clnpOutErrHdrs	(100 + 28)
#define	clnpOutErrSegs	(100 + 29)
#define	clnpOutErrIncomps (100 + 30)
#define	clnpOutErrDups	(100 + 31)
#define	clnpOutErrUnreachDsts (100 + 32)
#define	clnpOutErrUnknownDsts (100 + 33)
#define	clnpOutErrSRUnspecs (100 + 34)
#define	clnpOutErrSRSyntaxes (100 + 35)
#define	clnpOutErrSRUnkAddrs (100 + 36)
#define	clnpOutErrSRBadPaths (100 + 37)
#define	clnpOutErrHops	(100 + 38)
#define	clnpOutErrHopReassms (100 + 39)
#define	clnpOutErrUnsOptions (100 + 40)
#define	clnpOutErrUnsVersions (100 + 41)
#define	clnpOutErrUnsSecurities	(100 + 42)
#define	clnpOutErrUnsSRs (100 + 43)
#define	clnpOutErrUnsRRs (100 + 44)
#define	clnpOutErrInterferences	(100 + 45)


static int  o_clnp (oi, v, offset)
OI	oi;
register struct type_SNMP_VarBind *v;
int	offset;
{
    register int   *dp,
		   *ep,
		    j;
    int	    ifvar;
    register struct clnp_stat *cns = &clnp_stat;
    register OID    oid = oi -> oi_name;
    register OT	    ot = oi -> oi_type;
    static   int lastq = -1;

    ifvar = (int) ot -> ot_info;
    switch (offset) {
	case type_SNMP_PDUs_get__request:
	    if (oid -> oid_nelem != ot -> ot_name -> oid_nelem + 1
		    || oid -> oid_elements[oid -> oid_nelem - 1] != 0)
		return int_SNMP_error__status_noSuchName;
	    break;

	case type_SNMP_PDUs_get__next__request:
	    if (oid -> oid_nelem > ot -> ot_name -> oid_nelem + 1)
		return int_SNMP_error__status_noSuchName;
	    if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) {
		OID	new;

		if ((new = oid_extend (oid, 1)) == NULLOID)
		    return int_SNMP_error__status_genErr;
		new -> oid_elements[new -> oid_nelem - 1] = 0;

		if (v -> name)
		    free_SNMP_ObjectName (v -> name);
		v -> name = new;
	    }
	    else
		return NOTOK;
	    break;

	default:
	    return int_SNMP_error__status_genErr;
    }

    switch (ifvar) {
	case clnpDefaultLifeTime:
	case clnpReasmTimeout:
	    break;
	    
	default:
	    if (quantum != lastq) {
		lastq = quantum;

		if (getkmem (nl + N_ISO_SYSTYPE, (caddr_t) &iso_systype,
			     sizeof iso_systype) == NOTOK
		        || getkmem (nl + N_CLNP_STAT, (caddr_t) cns,
				    sizeof *cns) == NOTOK)
		    return int_SNMP_error__status_genErr;
	    }
	    break;
    }

    switch (ifvar) {
	case clnpForwarding:
	    return o_integer (oi, v,
			      iso_systype & SNPA_ES ? FORW_ES : FORW_IS);

	case clnpDefaultLifeTime:
	    return o_integer (oi, v, CLNP_TTL);

	case clnpInReceives:
	    return o_integer (oi, v, cns -> cns_total);

	case clnpInHdrErrors:
	    return o_integer (oi, v, cns -> cns_toosmall
			           + cns -> cns_badhlen
				   + cns -> cns_badcsum
			           + cns -> cns_noseg
				   + cns -> cns_badvers);

	case clnpInAddrErrors:
	    return o_integer (oi, v, cns -> cns_badaddr);

	case clnpForwPDUs:
	    return o_integer (oi, v, cns -> cns_forward);

	case clnpInUnknownULPs:
	    return o_integer (oi, v, cns -> cns_noproto);

	case clnpInDelivers:
	    return o_integer (oi, v, cns -> cns_delivered);

	case clnpOutRequests:
	    return o_integer (oi, v, cns -> cns_sent - cns -> cns_forward);

	case clnpOutDiscards:
	    return o_integer (oi, v, cns -> cns_odropped);

	case clnpOutNoRoutes:
	    return o_integer (oi, v, cns -> cns_cantforward);

	case clnpReasmTimeout:
	    return o_integer (oi, v, CLNP_TTL);

	case clnpReasmReqds:
	    return o_integer (oi, v, cns -> cns_fragments);

	case clnpReasmOKs:
	    return o_integer (oi, v, cns -> cns_reassembled);

	case clnpReasmFails:
	    return o_integer (oi, v, cns -> cns_fragdropped
				   + cns -> cns_fragtimeout);

	case clnpSegOKs:
	    return o_integer (oi, v, cns -> cns_fragmented);

	case clnpSegFails:
	    return o_integer (oi, v, cns -> cns_cantfrag);

	case clnpSegCreates:
	    return o_integer (oi, v, cns -> cns_ofragments);

	case clnpInErrors:
	    j = 0;
	    for (ep = (dp = cns -> cns_er_inhist) + CLNP_ERRORS; dp <= ep; )
		j += *dp++;
	    return o_integer (oi, v, j);

	case clnpOutErrors:
	    j = 0;
	    for (ep = (dp = cns -> cns_er_outhist) + CLNP_ERRORS; dp <= ep; )
		j += *dp++;
	    return o_integer (oi, v, j);

#define	clnpInputError(r)	cns -> cns_er_inhist[clnp_er_index (r)]

	case clnpInErrUnspecs:
	    return o_integer (oi, v, clnpInputError (GEN_NOREAS));

	case clnpInErrProcs:
	    return o_integer (oi, v, clnpInputError (GEN_PROTOERR));

	case clnpInErrCksums:
	    return o_integer (oi, v, clnpInputError (GEN_BADCSUM));

	case clnpInErrCongests:
	    return o_integer (oi, v, clnpInputError (GEN_CONGEST));

	case clnpInErrHdrs:
	    return o_integer (oi, v, clnpInputError (GEN_HDRSYNTAX));

	case clnpInErrSegs:
	    return o_integer (oi, v, clnpInputError (GEN_SEGNEEDED));

	case clnpInErrIncomps:
	    return o_integer (oi, v, clnpInputError (GEN_INCOMPLETE));

	case clnpInErrDups:
	    return o_integer (oi, v, clnpInputError (GEN_DUPOPT));

	case clnpInErrUnreachDsts:
	    return o_integer (oi, v, clnpInputError (ADDR_DESTUNREACH));

	case clnpInErrUnknownDsts:
	    return o_integer (oi, v, clnpInputError (ADDR_DESTUNKNOWN));

	case clnpInErrSRUnspecs:
	    return o_integer (oi, v, clnpInputError (SRCRT_UNSPECERR));

	case clnpInErrSRSyntaxes:
	    return o_integer (oi, v, clnpInputError (SRCRT_SYNTAX));

	case clnpInErrSRUnkAddrs:
	    return o_integer (oi, v, clnpInputError (SRCRT_UNKNOWNADDR));

	case clnpInErrSRBadPaths:
	    return o_integer (oi, v, clnpInputError (SRCRT_BADPATH));

	case clnpInErrHops:
	    return o_integer (oi, v, clnpInputError (TTL_EXPTRANSIT));

	case clnpInErrHopReassms:
	    return o_integer (oi, v, clnpInputError (TTL_EXPREASS));

	case clnpInErrUnsOptions:
	    return o_integer (oi, v, clnpInputError (DISC_UNSUPPOPT));

	case clnpInErrUnsVersions:
	    return o_integer (oi, v, clnpInputError (DISC_UNSUPPVERS));

	case clnpInErrUnsSecurities:
	    return o_integer (oi, v, clnpInputError (DISC_UNSUPPSECURE));

	case clnpInErrUnsSRs:
	    return o_integer (oi, v, clnpInputError (DISC_UNSUPPSRCRT));

	case clnpInErrUnsRRs:
	    return o_integer (oi, v, clnpInputError (DISC_UNSUPPRECRT));

	case clnpInErrInterferences:
	    return o_integer (oi, v, clnpInputError (REASS_INTERFERE));

#undef	clnpInputError
#define	clnpOutputError(r)	cns -> cns_er_outhist[clnp_er_index (r)]

	case clnpOutErrUnspecs:
	    return o_integer (oi, v, clnpOutputError (GEN_NOREAS));

	case clnpOutErrProcs:
	    return o_integer (oi, v, clnpOutputError (GEN_PROTOERR));

	case clnpOutErrCksums:
	    return o_integer (oi, v, clnpOutputError (GEN_BADCSUM));

	case clnpOutErrCongests:
	    return o_integer (oi, v, clnpOutputError (GEN_CONGEST));

	case clnpOutErrHdrs:
	    return o_integer (oi, v, clnpOutputError (GEN_HDRSYNTAX));

	case clnpOutErrSegs:
	    return o_integer (oi, v, clnpOutputError (GEN_SEGNEEDED));

	case clnpOutErrIncomps:
	    return o_integer (oi, v, clnpOutputError (GEN_INCOMPLETE));

	case clnpOutErrDups:
	    return o_integer (oi, v, clnpOutputError (GEN_DUPOPT));

	case clnpOutErrUnreachDsts:
	    return o_integer (oi, v, clnpOutputError (ADDR_DESTUNREACH));

	case clnpOutErrUnknownDsts:
	    return o_integer (oi, v, clnpOutputError (ADDR_DESTUNKNOWN));

	case clnpOutErrSRUnspecs:
	    return o_integer (oi, v, clnpOutputError (SRCRT_UNSPECERR));

	case clnpOutErrSRSyntaxes:
	    return o_integer (oi, v, clnpOutputError (SRCRT_SYNTAX));

	case clnpOutErrSRUnkAddrs:
	    return o_integer (oi, v, clnpOutputError (SRCRT_UNKNOWNADDR));

	case clnpOutErrSRBadPaths:
	    return o_integer (oi, v, clnpOutputError (SRCRT_BADPATH));

	case clnpOutErrHops:
	    return o_integer (oi, v, clnpOutputError (TTL_EXPTRANSIT));

	case clnpOutErrHopReassms:
	    return o_integer (oi, v, clnpOutputError (TTL_EXPREASS));

	case clnpOutErrUnsOptions:
	    return o_integer (oi, v, clnpOutputError (DISC_UNSUPPOPT));

	case clnpOutErrUnsVersions:
	    return o_integer (oi, v, clnpOutputError (DISC_UNSUPPVERS));

	case clnpOutErrUnsSecurities:
	    return o_integer (oi, v, clnpOutputError (DISC_UNSUPPSECURE));

	case clnpOutErrUnsSRs:
	    return o_integer (oi, v, clnpOutputError (DISC_UNSUPPSRCRT));

	case clnpOutErrUnsRRs:
	    return o_integer (oi, v, clnpOutputError (DISC_UNSUPPRECRT));

	case clnpOutErrInterferences:
	    return o_integer (oi, v, clnpOutputError (REASS_INTERFERE));

#undef	clnpOutputError

	default:
	    return int_SNMP_error__status_noSuchName;
    }
}

/* \f

 */

static int  clnp_er_index (p)
u_char p;
{
    register u_char *cp = clnp_er_codes + CLNP_ERRORS;

    while (cp-- > clnp_er_codes)
	if (*cp == p)
	    return (cp - clnp_er_codes);

    return (CLNP_ERRORS + 1);
}

/* \f

 */

#define	CLNP_MAXPACKET	65535		/* clnpAdEntReasmMaxSize */
					/* equivalent of IP_MAXPACKET */


#define	clnpAdEntAddr	0
#define	clnpAdEntIfIndex 1
#define	clnpAdEntNetMask 2
#define	clnpAdEntReasmMaxSize 3


static int  o_clnp_addr (oi, v, offset)
OI	oi;
register struct type_SNMP_VarBind *v;
int	offset;
{
    register int   i;
    int	    ifvar;
    register unsigned int *ip,
			  *jp;
    register struct address   *as;
    register OID    oid = oi -> oi_name;
    register OT	    ot = oi -> oi_type;

    if (sort_interfaces () == NOTOK)
	return int_SNMP_error__status_genErr;

    ifvar = (int) ot -> ot_info;
    switch (offset) {
	case type_SNMP_PDUs_get__request:
	    if (oid -> oid_nelem <= ot -> ot_name -> oid_nelem)
		return int_SNMP_error__status_noSuchName;
	    if ((as = get_addrent (oid -> oid_elements
				   	+ ot -> ot_name -> oid_nelem,
				   oid -> oid_nelem
				   	- ot -> ot_name -> oid_nelem,
				   afs_iso, 0)) == NULL)
		return int_SNMP_error__status_noSuchName;
	    break;

	case type_SNMP_PDUs_get__next__request:
	    if (oid -> oid_nelem < ot -> ot_name -> oid_nelem)
		return int_SNMP_error__status_noSuchName;
	    if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) {
		OID	new;

		if ((as = afs_iso) == NULL)
		    return NOTOK;

		if ((new = oid_extend (oid, as -> adr_insize)) == NULLOID)
		    return int_SNMP_error__status_genErr;
		ip = new -> oid_elements + new -> oid_nelem - as -> adr_insize;
		jp = as -> adr_instance;
		for (i = as -> adr_insize; i > 0; i--)
		    *ip++ = *jp++;
		
		if (v -> name)
		    free_SNMP_ObjectName (v -> name);
		v -> name = new;
	    }
	    else {
		int	j;
		
		if ((as = get_addrent (oid -> oid_elements
				           + ot -> ot_name -> oid_nelem,
				       j = oid -> oid_nelem
				               - ot -> ot_name -> oid_nelem,
				       afs_iso, 1)) == NULL)
		    return NOTOK;

		if ((i = j - as -> adr_insize) < 0) {
		    OID	    new;

		    if ((new = oid_extend (oid, -i)) == NULLOID)
			return int_SNMP_error__status_genErr;
		    if (v -> name)
			free_SNMP_ObjectName (v -> name);
		    v -> name = new;

		    oid = new;
		}
		else
		    if (i > 0)
			oid -> oid_nelem -= i;

		ip = oid -> oid_elements + ot -> ot_name -> oid_nelem;
		jp = as -> adr_instance;
		for (i = as -> adr_insize; i > 0; i--)
		    *ip++ = *jp++;
	    }
	    break;

	default:
	    return int_SNMP_error__status_genErr;
    }

    switch (ifvar) {
	case clnpAdEntAddr:
	    return o_clnpaddr (oi, v,
			       (struct sockaddr_iso *) &as -> adr_address);

	case clnpAdEntIfIndex:
	    return o_integer (oi, v, ffs (as -> adr_indexmask));

	case clnpAdEntNetMask:
	    return o_clnpaddr (oi, v,
			       (struct sockaddr_iso *) &as -> adr_netmask);

	case clnpAdEntReasmMaxSize:
	    return o_integer (oi, v, CLNP_MAXPACKET);

	default:
	    return int_SNMP_error__status_noSuchName;
    }
}

/* \f

 */

#define	clnpRouteDest	0
#define	clnpRouteIfIndex 1
#define	clnpRouteMetric1 2
#define	clnpRouteMetric2 3
#define	clnpRouteMetric3 4
#define	clnpRouteMetric4 5
#define	clnpRouteNextHop 6
#define	clnpRouteType	7
#define	clnpRouteProto	8
#define	clnpRouteAge	9


static int  o_clnp_route (oi, v, offset)
OI	oi;
register struct type_SNMP_VarBind *v;
int	offset;
{
    int	    ifvar;
    register int    i;
    register unsigned int *ip,
			  *jp;
    register struct rtetab *rt;
    register OID    oid = oi -> oi_name;
    register OT	    ot = oi -> oi_type;

    if (get_routes () == NOTOK)
	return int_SNMP_error__status_genErr;

    ifvar = (int) ot -> ot_info;
    switch (offset) {
	case type_SNMP_PDUs_get__request:
	    if (oid -> oid_nelem <= ot -> ot_name -> oid_nelem)
		return int_SNMP_error__status_noSuchName;
	    if ((rt = get_rtent (oid -> oid_elements
				     + ot -> ot_name -> oid_nelem,
				 oid -> oid_nelem
				     - ot -> ot_name -> oid_nelem,
				 rts_iso, 0)) == NULL)
		return int_SNMP_error__status_noSuchName;
	    break;

	case type_SNMP_PDUs_get__next__request:
	    if (oid -> oid_nelem < ot -> ot_name -> oid_nelem)
		return int_SNMP_error__status_noSuchName;
	    if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) {
		OID	new;

		if ((rt = rts_iso) == NULL)
		    return NOTOK;

		if ((new = oid_extend (oid, rt -> rt_insize)) == NULLOID)
		    return int_SNMP_error__status_genErr;
		ip = new -> oid_elements + new -> oid_nelem - rt -> rt_insize;
		jp = rt -> rt_instance;
		for (i = rt -> rt_insize; i> 0; i--)
		    *ip++ = *jp++;
		
		if (v -> name)
		    free_SNMP_ObjectName (v -> name);
		v -> name = new;
	    }
	    else {
		int	j;

		if ((rt = get_rtent (oid -> oid_elements
				         + ot -> ot_name -> oid_nelem,
				     j = oid -> oid_nelem
				             - ot -> ot_name -> oid_nelem,
				     rts_iso, 1)) == NULL)
		    return NOTOK;

		if ((i = j - rt -> rt_insize) < 0) {
		    OID	    new;

		    if ((new = oid_extend (oid, -i)) == NULLOID)
			return int_SNMP_error__status_genErr;
		    if (v -> name)
			free_SNMP_ObjectName (v -> name);
		    v -> name = new;

		    oid = new;
		}
		else
		    if (i > 0)
			oid -> oid_nelem -= i;

		ip = oid -> oid_elements + ot -> ot_name -> oid_nelem;
		jp = rt -> rt_instance;
		for (i = rt -> rt_insize; i > 0; i--)
		    *ip++ = *jp++;
	    }
	    break;

	default:
	    return int_SNMP_error__status_genErr;
    }

    switch (ifvar) {
	case clnpRouteDest:
	    return o_clnpaddr (oi, v,
			     (struct sockaddr_iso *) &rt -> rt_dst);

	case clnpRouteIfIndex:
	    {
		register struct interface *is;

		for (is = ifs; is; is = is -> ifn_next)
		    if ((caddr_t) is -> ifn_offset
			        == (caddr_t) rt -> rt_rt.rt_ifp) {
			if (is -> ifn_ready)
			    return o_integer (oi, v, is -> ifn_index);
			break;
		    }

		if (offset == type_SNMP_PDUs_get__next__request)
		    return NOTOK;
		return int_SNMP_error__status_noSuchName;
	    }
	    
	case clnpRouteMetric1:
	case clnpRouteMetric2:
	case clnpRouteMetric3:
	case clnpRouteMetric4:
	    return o_integer (oi, v, METRIC_NONE);

	case clnpRouteNextHop:
	    return o_clnpaddr (oi, v,
			       (struct sockaddr_iso *) &rt -> rt_gateway);

	case clnpRouteType:
	    switch (rt -> rt_rt.rt_flags & (RTF_GATEWAY | RTF_HOST)) {
		case RTF_GATEWAY:
		case RTF_HOST:
		    return o_integer (oi, v, TYPE_REMOTE);

		case 0:
		    return o_integer (oi, v, TYPE_DIRECT);

		default:
		    return o_integer (oi, v, TYPE_OTHER);
	    }

	case clnpRouteProto:
	    if (rt -> rt_rt.rt_flags & (RTF_DYNAMIC | RTF_MODIFIED))
		return o_integer (oi, v, PROTO_ESIS);
	    else
		return o_integer (oi, v, PROTO_OTHER);

	case clnpRouteAge:
	    return o_integer (oi, v, 0);

	default:
	    return int_SNMP_error__status_noSuchName;
    }
}

/* \f

 */

struct adrtab {
#define	ADN_SIZE	ADR_SIZE		/* ClnpAddress instance */
    unsigned int    adn_instance[ADN_SIZE];	
    int	    adn_insize;				

    struct iso_addr adn_address;		/* ClnpAddress */


#define	ADM_SIZE	ADR_SIZE		/* PhysAddress instance */
    unsigned int    adm_instance[ADM_SIZE];	
    int	    adm_insize;				

    u_char	adm_address[ADM_SIZE];		/* PhysAddress */
    u_char	adm_addrlen;			/*   .. */


    int	    adr_index;				/* ifIndex */

    int	    adr_type;				/* clnpNetToMediaType */
						/* clnpMediaToNetType */
#define	DYNAMIC_MAPPING	3
#define	STATIC_MAPPING	4


    struct adrtab *adn_next;			/* next ClnpAddress */
    struct adrtab *adm_next;    		/* next PhysAddress */
};

static	struct adrtab *adn = NULL;
static	struct adrtab *adm = NULL;


static struct adrtab *get_arpent ();

/* \f

 */

#define	clnpNetToMediaIfIndex 0
#define	clnpNetToMediaPhysAddress 1
#define	clnpNetToMediaNetAddress 2
#define	clnpNetToMediaType 3

#define	clnpMediaToNetIfIndex 4
#define	clnpMediaToNetNetAddress 5
#define	clnpMediaToNetPhysAddress 6
#define	clnpMediaToNetType 7

static int  o_address (oi, v, offset)
OI	oi;
register struct type_SNMP_VarBind *v;
int	offset;
{
    register int    i;
    int	    ifvar,
	    isnpa;
    register unsigned int *ip,
			  *jp;
    register struct adrtab *at;
    struct sockaddr_iso netaddr;
    register OID    oid = oi -> oi_name;
    register OT	    ot = oi -> oi_type;

    if (get_arptab () == NOTOK)
	return int_SNMP_error__status_genErr;

    switch (ifvar = (int) ot -> ot_info) {
	case clnpNetToMediaIfIndex:
	case clnpNetToMediaPhysAddress:
	case clnpNetToMediaNetAddress:
	case clnpNetToMediaType:
	    isnpa = 0;
	    break;

	case clnpMediaToNetIfIndex:
	case clnpMediaToNetNetAddress:
	case clnpMediaToNetPhysAddress:
	case clnpMediaToNetType:
	    isnpa = 1;
	    break;
    }
    
    switch (offset) {
	case type_SNMP_PDUs_get__request:
	    if (oid -> oid_nelem <= ot -> ot_name -> oid_nelem)
		return int_SNMP_error__status_noSuchName;
	    if ((at = get_arpent (oid -> oid_elements
				  	+ ot -> ot_name -> oid_nelem,
				  oid -> oid_nelem
				  	- ot -> ot_name -> oid_nelem,
				  isnpa, 0)) == NULL)
		return int_SNMP_error__status_noSuchName;
	    break;

	case type_SNMP_PDUs_get__next__request:
	    if (oid -> oid_nelem < ot -> ot_name -> oid_nelem)
		return int_SNMP_error__status_noSuchName;
	    if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) {
		OID	new;

		if ((at = isnpa ? adm : adn) == NULL)
		    return NOTOK;
		if (isnpa)
		    jp = at -> adm_instance, i = at -> adm_insize;
		else
		    jp = at -> adn_instance, i = at -> adn_insize;

		if ((new = oid_extend (oid, i)) == NULLOID)
		    return int_SNMP_error__status_genErr;
		ip = new -> oid_elements + new -> oid_nelem - i;
		for (; i > 0; i--)
		    *ip++ = *jp++;

		if (v -> name)
		    free_SNMP_ObjectName (v -> name);
		v -> name = new;
	    }
	    else {
		int	j;

		if ((at = get_arpent (oid -> oid_elements
				          + ot -> ot_name -> oid_nelem,
				      j = oid -> oid_nelem
				      	      - ot -> ot_name -> oid_nelem,
				      isnpa, 1)) == NULL)
		    return NOTOK;
		i = isnpa ? at -> adm_insize : at -> adn_insize;

		if ((i = j - i) < 0) {
		    OID	    new;

		    if ((new = oid_extend (oid, -i)) == NULLOID)
			return int_SNMP_error__status_genErr;
		    if (v -> name)
			free_SNMP_ObjectName (v -> name);
		    v -> name = new;

		    oid = new;
		}
		else
		    if (i > 0)
			oid -> oid_nelem -= i;

		ip = oid -> oid_elements + ot -> ot_name -> oid_nelem;
		if (isnpa)
		    jp = at -> adm_instance, i = at -> adm_insize;
		else
		    jp = at -> adn_instance, i = at -> adn_insize;
		for (; i > 0; i--)
		    *ip++ = *jp++;
	    }
	    break;

	default:
	    return int_SNMP_error__status_genErr;
    }

    switch (ifvar) {
	case clnpNetToMediaIfIndex:
	case clnpMediaToNetIfIndex:
	    return o_integer (oi, v, at -> adr_index);

	case clnpNetToMediaPhysAddress:
	case clnpMediaToNetPhysAddress:
	    return o_string (oi, v, (char *) at -> adm_address,
			     (int) at -> adm_addrlen);

	case clnpNetToMediaNetAddress:
	case clnpMediaToNetNetAddress:
	    netaddr.siso_addr = at -> adn_address;	/* struct copy */
	    return o_clnpaddr (oi, v, &netaddr);

	case clnpNetToMediaType:
	case clnpMediaToNetType:
	    return o_integer (oi, v, at -> adr_type);

	default:
	    return int_SNMP_error__status_noSuchName;
    }
}

/* \f

 */

static int  adn_compar (a, b)
register struct adrtab **a,
		       **b;
{
    return elem_cmp ((*a) -> adn_instance, (*a) -> adn_insize,
		     (*b) -> adn_instance, (*b) -> adn_insize);
}


static int  adm_compar (a, b)
register struct adrtab **a,
		       **b;
{
    return elem_cmp ((*a) -> adm_instance, (*a) -> adm_insize,
		     (*b) -> adm_instance, (*b) -> adm_insize);
}


static int  get_arptab () {
    int	    adrNumber = 0,
	    iso_snpac_size,
	    tblsize;
    register struct snpa_cache *sc,
			       *se;
    struct snpa_cache *iso_snpac;
    register struct adrtab *at,
			   *ap,
			  **base,
			  **afe,
			  **afp;
    register struct interface *is;
    static  int first_time = 1;
    static  int lastq = -1;

    if (quantum == lastq)
	return OK;
    lastq = quantum;

    for (at = adn; at; at = ap) {
	ap = at -> adn_next;

	free ((char *) at);
    }
    adn = adm = NULL;

    if (getkmem (nl + N_ISO_SNPAC_SIZE, (caddr_t) &iso_snpac_size,
		 sizeof iso_snpac_size) == NOTOK)
	return NOTOK;
    tblsize = iso_snpac_size * sizeof *iso_snpac;
    if ((iso_snpac = (struct snpa_cache *) malloc ((unsigned) (tblsize)))
	    == NULL)
	adios (NULLCP, "out of memory");
    if (getkmem (nl + N_ISO_SNPAC, (caddr_t) iso_snpac, tblsize) == NOTOK) {
	free ((char *) iso_snpac);
	return NOTOK;
    }

    afp = &adn;
    for (se = (sc = iso_snpac) + iso_snpac_size; sc < se; sc++) {
	if (!(sc -> sc_flags & SNPA_VALID))
	    continue;

	for (is = ifs; is; is = is -> ifn_next)
	    if ((caddr_t) is -> ifn_offset == (caddr_t) sc -> sc_ifp)
		break;
	if (!is) {
	    if (first_time)
		advise (LLOG_EXCEPTIONS, NULLCP,
			"unable to find interface for SNPA in cache");
	    free ((char *) at);
	    continue;
	}

	if ((at = (struct adrtab *) calloc (1, sizeof *at)) == NULL)
	    adios (NULLCP, "out of memory");
	*afp = at, afp = &at -> adn_next, adrNumber++;

	at -> adr_index = is -> ifn_index;

	at -> adr_type = sc -> sc_flags & SNPA_PERM ? STATIC_MAPPING
						     : DYNAMIC_MAPPING;

	at -> adn_address = sc -> sc_nsap;	/* struct copy */
	at -> adn_instance[0] = at -> adr_index, at -> adn_insize = 1;
	at -> adn_insize += clnpaddr2oid (at -> adn_instance + 1,
					 &at -> adn_address);

	bcopy ((char *) sc -> sc_sr.sr_snpa,
	       (char *) at -> adm_address,
	       (int) (at -> adm_addrlen = sc -> sc_sr.sr_len));
	at -> adm_instance[0] = at -> adr_index, at -> adm_insize = 1;
	at -> adm_insize += mediaddr2oid (at -> adm_instance + 1,
					  at -> adm_address,
					  (int) at -> adm_addrlen, 0);

	if (debug && first_time) {
	    char    buffer[BUFSIZ];
	    OIDentifier	oids;

	    oids.oid_elements = at -> adn_instance;
	    oids.oid_nelem = at -> adn_insize;
	    (void) strcpy (buffer, sprintoid (&oids));
	    oids.oid_elements = at -> adm_instance;
	    oids.oid_nelem = at -> adm_insize;
	    advise (LLOG_DEBUG, NULLCP,
		    "add mapping: %s -> %s", buffer, sprintoid (&oids));
	}
    }
    first_time = 0;
    free ((char *) iso_snpac);

    if (adrNumber <= 1) {
	adm = adn;
	return OK;
    }

    if ((base = (struct adrtab **)
		    malloc ((unsigned) (adrNumber * sizeof *base))) == NULL)
	adios (NULLCP, "out of memory");

    afe = base;
    for (at = adn; at; at = at -> adn_next)
	*afe++ = at;

    qsort ((char *) base, adrNumber, sizeof *base, adn_compar);

    afp = base;
    at = adn = *afp++;
    while (afp < afe) {
	at -> adn_next = *afp;
	at = *afp++;
    }
    at -> adn_next = NULL;

    qsort ((char *) base, adrNumber, sizeof *base, adm_compar);

    afp = base;
    at = adm = *afp++;
    while (afp < afe) {
	at -> adm_next = *afp;
	at = *afp++;
    }
    at -> adm_next = NULL;

    free ((char *) base);

    return OK;
}

/* \f

 */

static struct adrtab *get_arpent (ip, len, isnpa, isnext)
register unsigned int *ip;
int	len;
int	isnpa,
	isnext;
{
    register struct adrtab *at;

    if (isnpa)
	for (at = adm; at; at = at -> adm_next)
	    switch (elem_cmp (at -> adm_instance, at -> adm_insize, ip, len)) {
		case 0:
		    return (isnext ? at -> adm_next : at);

		case 1:
		    return (isnext ? at : NULL);
	    }
    else
	for (at = adn; at; at = at -> adn_next)
	    switch (elem_cmp (at -> adn_instance, at -> adn_insize, ip, len)) {
		case 0:
		    return (isnext ? at -> adn_next : at);

		case 1:
		    return (isnext ? at : NULL);
	    }

    return NULL;
}

/* \f

 */

static	struct esis_stat esis_stat;

/* \f

 */

#define	esisESHins	0
#define	esisESHouts	1
#define	esisISHins	2
#define	esisISHouts	3
#define	esisRDUins	4
#define	esisRDUouts	5


static int  o_esis (oi, v, offset)
OI	oi;
register struct type_SNMP_VarBind *v;
int	offset;
{
    int	    ifvar;
    register struct esis_stat *es = &esis_stat;
    register OID    oid = oi -> oi_name;
    register OT	    ot = oi -> oi_type;
    static   int lastq = -1;

    ifvar = (int) ot -> ot_info;
    switch (offset) {
	case type_SNMP_PDUs_get__request:
	    if (oid -> oid_nelem != ot -> ot_name -> oid_nelem + 1
		    || oid -> oid_elements[oid -> oid_nelem - 1] != 0)
		return int_SNMP_error__status_noSuchName;
	    break;

	case type_SNMP_PDUs_get__next__request:
	    if (oid -> oid_nelem > ot -> ot_name -> oid_nelem + 1)
		return int_SNMP_error__status_noSuchName;
	    if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) {
		OID	new;

		if ((new = oid_extend (oid, 1)) == NULLOID)
		    return int_SNMP_error__status_genErr;
		new -> oid_elements[new -> oid_nelem - 1] = 0;

		if (v -> name)
		    free_SNMP_ObjectName (v -> name);
		v -> name = new;
	    }
	    else
		return NOTOK;
	    break;

	default:
	    return int_SNMP_error__status_genErr;
    }

    if (quantum != lastq) {
	lastq = quantum;

	if (getkmem (nl + N_ESIS_STAT, (caddr_t) &esis_stat, sizeof esis_stat)
	        == NOTOK)
	    return int_SNMP_error__status_genErr;
    }

    switch (ifvar) {
	case esisESHins:
	    return o_integer (oi, v, es -> es_eshrcvd);

	case esisESHouts:
	    return o_integer (oi, v, es -> es_eshsent);

	case esisISHins:
	    return o_integer (oi, v, es -> es_ishrcvd);

	case esisISHouts:
	    return o_integer (oi, v, es -> es_ishsent);

	case esisRDUins:
	    return o_integer (oi, v, es -> es_rdrcvd);

	case esisRDUouts:
	    return o_integer (oi, v, es -> es_rdsent);

	default:
	    return int_SNMP_error__status_noSuchName;
    }
}

/* \f

 */

init_clnp () {
    register OT	    ot;

    if (nl[N_ISO_SYSTYPE].n_value == 0)
	return;

    if (ot = text2obj ("clnpForwarding"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpForwarding;
    if (ot = text2obj ("clnpDefaultLifeTime"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpDefaultLifeTime;
    if (ot = text2obj ("clnpInReceives"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInReceives;
    if (ot = text2obj ("clnpInHdrErrors"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInHdrErrors;
    if (ot = text2obj ("clnpInAddrErrors"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInAddrErrors;
    if (ot = text2obj ("clnpForwPDUs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpForwPDUs;
#ifdef	clnpInUnknownNLPs
    if (ot = text2obj ("clnpInUnknownNLPs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInUnknownNLPs;
#endif
    if (ot = text2obj ("clnpInUnknownULPs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInUnknownULPs;
#ifdef	clnpInDiscards
    if (ot = text2obj ("clnpInDiscards"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInDiscards;
#endif
    if (ot = text2obj ("clnpInDelivers"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInDelivers;
    if (ot = text2obj ("clnpOutRequests"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutRequests;
    if (ot = text2obj ("clnpOutDiscards"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutDiscards;
    if (ot = text2obj ("clnpOutNoRoutes"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutNoRoutes;
    if (ot = text2obj ("clnpReasmTimeout"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpReasmTimeout;
    if (ot = text2obj ("clnpReasmReqds"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpReasmReqds;
    if (ot = text2obj ("clnpReasmOKs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpReasmOKs;
    if (ot = text2obj ("clnpReasmFails"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpReasmFails;
    if (ot = text2obj ("clnpSegOKs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpSegOKs;
    if (ot = text2obj ("clnpSegFails"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpSegFails;
    if (ot = text2obj ("clnpSegCreates"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpSegCreates;

    if (ot = text2obj ("clnpAdEntAddr"))
	ot -> ot_getfnx = o_clnp_addr,
	ot -> ot_info = (caddr_t) clnpAdEntAddr;
    if (ot = text2obj ("clnpAdEntIfIndex"))
	ot -> ot_getfnx = o_clnp_addr,
	ot -> ot_info = (caddr_t) clnpAdEntIfIndex;
    if (ot = text2obj ("clnpAdEntNetMask"))
	ot -> ot_getfnx = o_clnp_addr,
	ot -> ot_info = (caddr_t) clnpAdEntNetMask;
    if (ot = text2obj ("clnpAdEntReasmMaxSize"))
	ot -> ot_getfnx = o_clnp_addr,
	ot -> ot_info = (caddr_t) clnpAdEntReasmMaxSize;

    if (ot = text2obj ("clnpRouteDest"))
	ot -> ot_getfnx = o_clnp_route,
	ot -> ot_info = (caddr_t) clnpRouteDest;
    if (ot = text2obj ("clnpRouteIfIndex"))
	ot -> ot_getfnx = o_clnp_route,
	ot -> ot_info = (caddr_t) clnpRouteIfIndex;
    if (ot = text2obj ("clnpRouteMetric1"))
	ot -> ot_getfnx = o_clnp_route,
	ot -> ot_info = (caddr_t) clnpRouteMetric1;
    if (ot = text2obj ("clnpRouteMetric2"))
	ot -> ot_getfnx = o_clnp_route,
	ot -> ot_info = (caddr_t) clnpRouteMetric2;
    if (ot = text2obj ("clnpRouteMetric3"))
	ot -> ot_getfnx = o_clnp_route,
	ot -> ot_info = (caddr_t) clnpRouteMetric3;
    if (ot = text2obj ("clnpRouteMetric4"))
	ot -> ot_getfnx = o_clnp_route,
	ot -> ot_info = (caddr_t) clnpRouteMetric4;
    if (ot = text2obj ("clnpRouteNextHop"))
	ot -> ot_getfnx = o_clnp_route,
	ot -> ot_info = (caddr_t) clnpRouteNextHop;
    if (ot = text2obj ("clnpRouteType"))
	ot -> ot_getfnx = o_clnp_route,
	ot -> ot_info = (caddr_t) clnpRouteType;
    if (ot = text2obj ("clnpRouteProto"))
	ot -> ot_getfnx = o_clnp_route,
	ot -> ot_info = (caddr_t) clnpRouteProto;
    if (ot = text2obj ("clnpRouteAge"))
	ot -> ot_getfnx = o_clnp_route,
	ot -> ot_info = (caddr_t) clnpRouteAge;

    if (ot = text2obj ("clnpNetToMediaIfIndex"))
	ot -> ot_getfnx = o_address,
	ot -> ot_info = (caddr_t) clnpNetToMediaIfIndex;
    if (ot = text2obj ("clnpNetToMediaPhysAddress"))
	ot -> ot_getfnx = o_address,
	ot -> ot_info = (caddr_t) clnpNetToMediaPhysAddress;
    if (ot = text2obj ("clnpNetToMediaNetAddress"))
	ot -> ot_getfnx = o_address,
	ot -> ot_info = (caddr_t) clnpNetToMediaNetAddress;
    if (ot = text2obj ("clnpNetToMediaType"))
	ot -> ot_getfnx = o_address,
	ot -> ot_info = (caddr_t) clnpNetToMediaType;
    if (ot = text2obj ("clnpMediaToNetIfIndex"))
	ot -> ot_getfnx = o_address,
	ot -> ot_info = (caddr_t) clnpMediaToNetIfIndex;
    if (ot = text2obj ("clnpMediaToNetNetAddress"))
	ot -> ot_getfnx = o_address,
	ot -> ot_info = (caddr_t) clnpMediaToNetNetAddress;
    if (ot = text2obj ("clnpMediaToNetPhysAddress"))
	ot -> ot_getfnx = o_address,
	ot -> ot_info = (caddr_t) clnpMediaToNetPhysAddress;
    if (ot = text2obj ("clnpMediaToNetType"))
	ot -> ot_getfnx = o_address,
	ot -> ot_info = (caddr_t) clnpMediaToNetType;

    if (ot = text2obj ("clnpInErrors"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrors;
    if (ot = text2obj ("clnpOutErrors"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrors;
    if (ot = text2obj ("clnpInErrUnspecs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrUnspecs;
    if (ot = text2obj ("clnpInErrProcs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrProcs;
    if (ot = text2obj ("clnpInErrCksums"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrCksums;
    if (ot = text2obj ("clnpInErrCongests"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrCongests;
    if (ot = text2obj ("clnpInErrHdrs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrHdrs;
    if (ot = text2obj ("clnpInErrSegs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrSegs;
    if (ot = text2obj ("clnpInErrIncomps"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrIncomps;
    if (ot = text2obj ("clnpInErrDups"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrDups;
    if (ot = text2obj ("clnpInErrUnreachDsts"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrUnreachDsts;
    if (ot = text2obj ("clnpInErrUnknownDsts"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrUnknownDsts;
    if (ot = text2obj ("clnpInErrSRUnspecs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrSRUnspecs;
    if (ot = text2obj ("clnpInErrSRSyntaxes"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrSRSyntaxes;
    if (ot = text2obj ("clnpInErrSRUnkAddrs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrSRUnkAddrs;
    if (ot = text2obj ("clnpInErrSRBadPaths"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrSRBadPaths;
    if (ot = text2obj ("clnpInErrHops"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrHops;
    if (ot = text2obj ("clnpInErrHopReassms"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrHopReassms;
    if (ot = text2obj ("clnpInErrUnsOptions"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrUnsOptions;
    if (ot = text2obj ("clnpInErrUnsVersions"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrUnsVersions;
    if (ot = text2obj ("clnpInErrUnsSecurities"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrUnsSecurities;
    if (ot = text2obj ("clnpInErrUnsSRs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrUnsSRs;
    if (ot = text2obj ("clnpInErrUnsRRs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrUnsRRs;
    if (ot = text2obj ("clnpInErrInterferences"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpInErrInterferences;
    if (ot = text2obj ("clnpOutErrUnspecs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrUnspecs;
    if (ot = text2obj ("clnpOutErrProcs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrProcs;
    if (ot = text2obj ("clnpOutErrCksums"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrCksums;
    if (ot = text2obj ("clnpOutErrCongests"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrCongests;
    if (ot = text2obj ("clnpOutErrHdrs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrHdrs;
    if (ot = text2obj ("clnpOutErrSegs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrSegs;
    if (ot = text2obj ("clnpOutErrIncomps"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrIncomps;
    if (ot = text2obj ("clnpOutErrDups"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrDups;
    if (ot = text2obj ("clnpOutErrUnreachDsts"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrUnreachDsts;
    if (ot = text2obj ("clnpOutErrUnknownDsts"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrUnknownDsts;
    if (ot = text2obj ("clnpOutErrSRUnspecs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrSRUnspecs;
    if (ot = text2obj ("clnpOutErrSRSyntaxes"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrSRSyntaxes;
    if (ot = text2obj ("clnpOutErrSRUnkAddrs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrSRUnkAddrs;
    if (ot = text2obj ("clnpOutErrSRBadPaths"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrSRBadPaths;
    if (ot = text2obj ("clnpOutErrHops"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrHops;
    if (ot = text2obj ("clnpOutErrHopReassms"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrHopReassms;
    if (ot = text2obj ("clnpOutErrUnsOptions"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrUnsOptions;
    if (ot = text2obj ("clnpOutErrUnsVersions"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrUnsVersions;
    if (ot = text2obj ("clnpOutErrUnsSecurities"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrUnsSecurities;
    if (ot = text2obj ("clnpOutErrUnsSRs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrUnsSRs;
    if (ot = text2obj ("clnpOutErrUnsRRs"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrUnsRRs;
    if (ot = text2obj ("clnpOutErrInterferences"))
	ot -> ot_getfnx = o_clnp,
	ot -> ot_info = (caddr_t) clnpOutErrInterferences;

    if (ot = text2obj ("esisESHins"))
	ot -> ot_getfnx = o_esis,
	ot -> ot_info = (caddr_t) esisESHins;
    if (ot = text2obj ("esisESHouts"))
	ot -> ot_getfnx = o_esis,
	ot -> ot_info = (caddr_t) esisESHouts;
    if (ot = text2obj ("esisISHins"))
	ot -> ot_getfnx = o_esis,
	ot -> ot_info = (caddr_t) esisISHins;
    if (ot = text2obj ("esisISHouts"))
	ot -> ot_getfnx = o_esis,
	ot -> ot_info = (caddr_t) esisISHouts;
    if (ot = text2obj ("esisRDUins"))
	ot -> ot_getfnx = o_esis,
	ot -> ot_info = (caddr_t) esisRDUins;
    if (ot = text2obj ("esisRDUouts"))
	ot -> ot_getfnx = o_esis,
	ot -> ot_info = (caddr_t) esisRDUouts;
}
#else

init_clnp () {}

#endif