|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 27519 (0x6b7f) Types: TextFile Names: »ip.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/snmp/ip.c«
/* ip.c - MIB realization of the IP (and Address Translation) group */ #ifndef lint static char *rcsid = "$Header: /f/osi/snmp/RCS/ip.c,v 7.1 90/01/11 18:34:10 mrose Exp $"; #endif /* * $Header: /f/osi/snmp/RCS/ip.c,v 7.1 90/01/11 18:34:10 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: ip.c,v $ * Revision 7.1 90/01/11 18:34:10 mrose * real-sync * * Revision 7.0 89/11/23 22:23:06 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" #include <netinet/in_systm.h> #include <netinet/ip.h> #include <netinet/ip_var.h> /* \f */ #define FORW_GATEWAY 1 /* ipForwarding */ #define FORW_HOST 2 static int ipforwarding; static struct ipstat ipstat; /* \f */ #define ipForwarding 0 #define ipDefaultTTL 1 #ifdef BSD43 #define ipInReceives 2 #endif #define ipInHdrErrors 3 #undef ipInAddrErrors 4 /* NOT IMPLEMENTED */ #ifdef BSD43 #define ipForwDatagrams 5 #endif #ifdef BSD44 #define ipInUnknownProtos 6 #endif #undef ipInDiscards 7 /* NOT IMPLEMENTED */ #ifdef BSD44 #define ipInDelivers 8 #define ipOutRequests 9 #define ipOutDiscards 10 #endif #ifdef BSD43 #define ipOutNoRoutes 11 #endif #define ipReasmTimeout 12 #ifdef BSD43 #define ipReasmReqds 13 #endif #ifdef BSD44 #define ipReasmOKs 14 #endif #ifdef BSD43 #define ipReasmFails 15 #endif #ifdef BSD44 #undef ipFragOKs 16 #undef ipFragFails 17 #undef ipFragCreates 18 #endif static int o_ip (oi, v, offset) OI oi; register struct type_SNMP_VarBind *v; int offset; { int ifvar; register struct ipstat *ips = &ipstat; 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 ipDefaultTTL: case ipReasmTimeout: break; default: if (quantum != lastq) { lastq = quantum; if (getkmem (nl + N_IPFORWARDING, (caddr_t) &ipforwarding, sizeof ipforwarding) == NOTOK || getkmem (nl + N_IPSTAT, (caddr_t) ips, sizeof *ips) == NOTOK) return int_SNMP_error__status_genErr; } break; } switch (ifvar) { case ipForwarding: return o_integer (oi, v, ipforwarding ? FORW_GATEWAY : FORW_HOST); case ipDefaultTTL: return o_integer (oi, v, MAXTTL); #ifdef ipInReceives case ipInReceives: return o_integer (oi, v, ips -> ips_total); #endif case ipInHdrErrors: return o_integer (oi, v, ips -> ips_badsum + ips -> ips_tooshort + ips -> ips_toosmall + ips -> ips_badhlen + ips -> ips_badlen); #ifdef ipForwDatagrams case ipForwDatagrams: return o_integer (oi, v, ips -> ips_forward); #endif #ifdef ipInUnknownProtos case ipInUnknownProtos: return o_integer (oi, v, ips -> ips_noproto); #endif #ifdef ipInDelivers case ipInDelivers: return o_integer (oi, v, ips -> ips_delivered); #endif #ifdef ipOutRequests case ipOutRequests: return o_integer (oi, v, ips -> ips_localout); #endif #ifdef ipOutDiscards case ipOutDiscards: return o_integer (oi, v, ips -> ips_odropped); #endif #ifdef ipOutNoRoutes case ipOutNoRoutes: return o_integer (oi, v, ips -> ips_cantforward); #endif case ipReasmTimeout: return o_integer (oi, v, IPFRAGTTL); #ifdef ipReasmReqds case ipReasmReqds: return o_integer (oi, v, ips -> ips_fragments); #endif #ifdef ipReasmOKs case ipReasmOKs: return o_integer (oi, v, ips -> ips_reassembled); #endif #ifdef ipReasmFails case ipReasmFails: return o_integer (oi, v, ips -> ips_fragdropped + ips -> ips_fragtimeout); #endif #ifdef ipFragOKs case ipFragOKs: return o_integer (oi, v, ips -> ips_fragmented); #endif #ifdef ipFragFails case ipFragFails: return o_integer (oi, v, ips -> ips_cantfrag); #endif #ifdef ipFragCreates case ipFragCreates: return o_integer (oi, v, ips -> ips_ofragments); #endif default: return int_SNMP_error__status_noSuchName; } } /* \f */ #ifndef IP_MAXPACKET #define IP_MAXPACKET 65535 /* ipAdEntReasmMaxSize */ #endif #define IFN_SIZE 4 /* \f */ #define ipAdEntAddr 0 #define ipAdEntIfIndex 1 #define ipAdEntNetMask 2 #define ipAdEntBcastAddr 3 #define ipAdEntReasmMaxSize 4 static int o_ip_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 + IFN_SIZE) return int_SNMP_error__status_noSuchName; if ((as = get_addrent (oid -> oid_elements + oid -> oid_nelem - IFN_SIZE, IFN_SIZE, afs_inet, 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 + IFN_SIZE && 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_inet) == NULL) return NOTOK; if ((new = oid_extend (oid, IFN_SIZE)) == NULLOID) return int_SNMP_error__status_genErr; ip = new -> oid_elements + new -> oid_nelem - IFN_SIZE; jp = as -> adr_instance; for (i = IFN_SIZE; i> 0; i--) *ip++ = *jp++; if (v -> name) free_SNMP_ObjectName (v -> name); v -> name = new; } else { if ((as = get_addrent (ip = oid -> oid_elements + oid -> oid_nelem - IFN_SIZE, IFN_SIZE, afs_inet, 1)) == NULL) return NOTOK; jp = as -> adr_instance; for (i = IFN_SIZE; i > 0; i--) *ip++ = *jp++; } break; default: return int_SNMP_error__status_genErr; } switch (ifvar) { case ipAdEntAddr: return o_ipaddr (oi, v, (struct sockaddr_in *) &as -> adr_address); case ipAdEntIfIndex: return o_integer (oi, v, ffs (as -> adr_indexmask)); case ipAdEntNetMask: return o_ipaddr (oi, v, (struct sockaddr_in *) &as -> adr_netmask); case ipAdEntBcastAddr: /* beyond belief! */ { u_long a = (((struct sockaddr_in *) &as -> adr_netmask) -> sin_addr.s_addr) & ~(((struct sockaddr_in *) &as -> adr_broadaddr) -> sin_addr.s_addr); return o_integer (oi, v, a ? 0 : 1); } case ipAdEntReasmMaxSize: return o_integer (oi, v, IP_MAXPACKET); default: return int_SNMP_error__status_noSuchName; } } /* \f */ #define ipRouteDest 0 #define ipRouteIfIndex 1 #define ipRouteMetric1 2 #define ipRouteMetric2 3 #define ipRouteMetric3 4 #define ipRouteMetric4 5 #define ipRouteNextHop 6 #define ipRouteType 7 #define ipRouteProto 8 #define ipRouteAge 9 #define ipRouteMask 10 static int o_ip_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 + IFN_SIZE) return int_SNMP_error__status_noSuchName; if ((rt = get_rtent (oid -> oid_elements + oid -> oid_nelem - IFN_SIZE, IFN_SIZE, rts_inet, 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 + IFN_SIZE && 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_inet) == NULL) return NOTOK; if ((new = oid_extend (oid, IFN_SIZE)) == NULLOID) return int_SNMP_error__status_genErr; ip = new -> oid_elements + new -> oid_nelem - IFN_SIZE; jp = rt -> rt_instance; for (i = IFN_SIZE; i> 0; i--) *ip++ = *jp++; if (v -> name) free_SNMP_ObjectName (v -> name); v -> name = new; } else { if ((rt = get_rtent (ip = oid -> oid_elements + oid -> oid_nelem - IFN_SIZE, IFN_SIZE, rts_inet, 1)) == NULL) return NOTOK; jp = rt -> rt_instance; for (i = IFN_SIZE; i > 0; i--) *ip++ = *jp++; } break; default: return int_SNMP_error__status_genErr; } switch (ifvar) { case ipRouteDest: return o_ipaddr (oi, v, (struct sockaddr_in *) &rt -> rt_dst); case ipRouteIfIndex: { 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 ipRouteMetric1: case ipRouteMetric2: case ipRouteMetric3: case ipRouteMetric4: return o_integer (oi, v, METRIC_NONE); case ipRouteNextHop: return o_ipaddr (oi, v, (struct sockaddr_in *) &rt -> rt_gateway); case ipRouteType: 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 ipRouteProto: #ifdef RTF_DYNAMIC #ifndef RTF_MODIFIED if (rt -> rt_rt.rt_flags & RTF_DYNAMIC) #else if (rt -> rt_rt.rt_flags & (RTF_DYNAMIC | RTF_MODIFIED)) #endif return o_integer (oi, v, PROTO_ICMP); else #endif return o_integer (oi, v, PROTO_OTHER); case ipRouteAge: return o_integer (oi, v, 0); case ipRouteMask: { struct sockaddr_in mask; struct sockaddr_in *sin = (struct sockaddr_in *) &rt -> rt_dst; bzero ((char *) &mask, sizeof mask); if (sin -> sin_addr.s_addr != 0L) { if (IN_CLASSA (sin -> sin_addr.s_addr)) mask.sin_addr.s_addr = IN_CLASSA_NET; else if (IN_CLASSB (sin -> sin_addr.s_addr)) mask.sin_addr.s_addr = IN_CLASSB_NET; else mask.sin_addr.s_addr = IN_CLASSC_NET; } return o_ipaddr (oi, v, &mask); } default: return int_SNMP_error__status_noSuchName; } } /* \f */ struct adrtab { #define ADN_SIZE (IFN_SIZE + 1) /* IpAddress instance */ unsigned int adn_instance[ADN_SIZE]; int adn_insize; struct in_addr adn_address; /* IpAddress */ #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; /* .. */ #define ADA_SIZE (IFN_SIZE + 2) /* AtEntry instance */ unsigned int ada_instance[ADA_SIZE]; int ada_insize; int adr_index; /* ifIndex */ int adr_type; /* ipNetToMediaType */ #define OTHER_MAPPING 1 #define DYNAMIC_MAPPING 3 #define STATIC_MAPPING 4 struct adrtab *adn_next; /* next IpAddress */ struct adrtab *adm_next; /* next PhysAddress */ struct adrtab *ada_next; /* next AtEntry */ }; static struct adrtab *ada = NULL; static struct adrtab *adn = NULL; static struct adrtab *adm = NULL; static struct adrtab *get_arpent (); /* \f */ #define atIfIndex 0 #define atPhysAddress 1 #define atNetAddress 2 #define ipNetToMediaIfIndex 3 #define ipNetToMediaPhysAddress 4 #define ipNetToMediaNetAddress 5 #define ipNetToMediaType 6 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_in 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 ipNetToMediaIfIndex: case ipNetToMediaPhysAddress: case ipNetToMediaNetAddress: case ipNetToMediaType: isnpa = 0; break; case atIfIndex: case atPhysAddress: case atNetAddress: isnpa = -1; } 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; switch (isnpa) { case 0: if (at = adn) jp = at -> adn_instance, i = at -> adn_insize; break; case 1: if (at = adm) jp = at -> adm_instance, i = at -> adm_insize; break; case -1: if (at = ada) jp = at -> ada_instance, i = at -> ada_insize; break; } if (at == NULL) return NOTOK; 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 > 0 ? at -> adm_insize : isnpa == 0 ? at -> adn_insize : at -> ada_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; switch (isnpa) { case 0: jp = at -> adn_instance, i = at -> adn_insize; break; case 1: jp = at -> adm_instance, i = at -> adm_insize; break; case -1: jp = at -> ada_instance, i = at -> ada_insize; break; } for (; i > 0; i--) *ip++ = *jp++; } break; default: return int_SNMP_error__status_genErr; } switch (ifvar) { case atIfIndex: case ipNetToMediaIfIndex: return o_integer (oi, v, at -> adr_index); case atPhysAddress: case ipNetToMediaPhysAddress: return o_string (oi, v, (char *) at -> adm_address, (int) at -> adm_addrlen); case atNetAddress: case ipNetToMediaNetAddress: netaddr.sin_addr = at -> adn_address; /* struct copy */ return o_ipaddr (oi, v, &netaddr); case ipNetToMediaType: 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 ada_compar (a, b) register struct adrtab **a, **b; { return elem_cmp ((*a) -> ada_instance, (*a) -> ada_insize, (*b) -> ada_instance, (*b) -> ada_insize); } static int get_arptab () { int adrNumber = 0, arptab_size, tblsize; register struct arptab *ac, *ae; struct arptab *arptab; 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 = ada = NULL; if (getkmem (nl + N_ARPTAB_SIZE, (caddr_t) &arptab_size, sizeof arptab_size) == NOTOK) return NOTOK; tblsize = arptab_size * sizeof *arptab; if ((arptab = (struct arptab *) malloc ((unsigned) (tblsize))) == NULL) adios (NULLCP, "out of memory"); if (getkmem (nl + N_ARPTAB, (caddr_t) arptab, tblsize) == NOTOK) { free ((char *) arptab); return NOTOK; } afp = &adn; for (ae = (ac = arptab) + arptab_size; ac < ae; ac++) { int type; if (!(ac -> at_iaddr.s_addr) || !(ac -> at_flags & ATF_COM)) continue; type = ac -> at_flags & ATF_PERM ? OTHER_MAPPING : ac -> at_flags & ATF_PUBL ? STATIC_MAPPING : DYNAMIC_MAPPING; /* there appears to be no way to gather per-interface address translation tables, so we simply duplicate the arptable for each interface... */ for (is = ifs; is; is = is -> ifn_next) { if (!is -> ifn_ready) 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 = type; at -> adn_address = ac -> at_iaddr; /* struct copy */ at -> adn_instance[0] = at -> adr_index, at -> adn_insize = 1; at -> adn_insize += ipaddr2oid (at -> adn_instance + 1, &at -> adn_address); #if defined(BSD44) || defined(BSD43_Tahoe) bcopy ((char *) ac -> at_enaddr, (char *) at -> adm_address, (int) (at -> adm_addrlen = sizeof ac -> at_enaddr)); #else bcopy ((char *) ac -> at_enaddr.ether_addr_octet, (char *) at -> adm_address, (int) (at -> adm_addrlen = sizeof ac -> at_enaddr.ether_addr_octet)); #endif 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); at -> ada_instance[0] = at -> adr_index; at -> ada_instance[1] = 1; at -> ada_insize = 2; at -> ada_insize += ipaddr2oid (at -> ada_instance + 2, &at -> adn_address); 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 *) arptab); if (adrNumber <= 1) { adm = ada = 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; qsort ((char *) base, adrNumber, sizeof *base, ada_compar); afp = base; at = ada = *afp++; while (afp < afe) { at -> ada_next = *afp; at = *afp++; } at -> ada_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; switch (isnpa) { case 0: 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); } break; case 1: 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); } break; case -1: for (at = ada; at; at = at -> ada_next) switch (elem_cmp (at -> ada_instance, at -> ada_insize, ip, len)) { case 0: return (isnext ? at -> ada_next : at); case 1: return (isnext ? at : NULL); } break; } return NULL; } /* \f */ init_ip () { register OT ot; if (ot = text2obj ("ipForwarding")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipForwarding; if (ot = text2obj ("ipDefaultTTL")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipDefaultTTL; #ifdef ipInReceives if (ot = text2obj ("ipInReceives")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipInReceives; #endif if (ot = text2obj ("ipInHdrErrors")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipInHdrErrors; #ifdef ipInAddrErrors if (ot = text2obj ("ipInAddrErrors")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipInAddrErrors; #endif #ifdef ipForwDatagrams if (ot = text2obj ("ipForwDatagrams")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipForwDatagrams; #endif #ifdef ipInUnknownProtos if (ot = text2obj ("ipInUnknownProtos")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipInUnknownProtos; #endif #ifdef ipInDiscards if (ot = text2obj ("ipInDiscards")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipInDiscards; #endif #ifdef ipInDelivers if (ot = text2obj ("ipInDelivers")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipInDelivers; #endif #ifdef ipOutRequests if (ot = text2obj ("ipOutRequests")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipOutRequests; #endif #ifdef ipOutDiscards if (ot = text2obj ("ipOutDiscards")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipOutDiscards; #endif #ifdef ipOutNoRoutes if (ot = text2obj ("ipOutNoRoutes")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipOutNoRoutes; #endif if (ot = text2obj ("ipReasmTimeout")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipReasmTimeout; #ifdef ipReasmReqds if (ot = text2obj ("ipReasmReqds")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipReasmReqds; #endif #ifdef ipReasmOKs if (ot = text2obj ("ipReasmOKs")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipReasmOKs; #endif #ifdef ipReasmFails if (ot = text2obj ("ipReasmFails")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipReasmFails; #endif #ifdef ipFragOKs if (ot = text2obj ("ipFragOKs")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipFragOKs; #endif #ifdef ipFragFails if (ot = text2obj ("ipFragFails")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipFragFails; #endif #ifdef ipFragCreates if (ot = text2obj ("ipFragCreates")) ot -> ot_getfnx = o_ip, ot -> ot_info = (caddr_t) ipFragCreates; #endif if (ot = text2obj ("ipAdEntAddr")) ot -> ot_getfnx = o_ip_addr, ot -> ot_info = (caddr_t) ipAdEntAddr; if (ot = text2obj ("ipAdEntIfIndex")) ot -> ot_getfnx = o_ip_addr, ot -> ot_info = (caddr_t) ipAdEntIfIndex; if (ot = text2obj ("ipAdEntNetMask")) ot -> ot_getfnx = o_ip_addr, ot -> ot_info = (caddr_t) ipAdEntNetMask; if (ot = text2obj ("ipAdEntBcastAddr")) ot -> ot_getfnx = o_ip_addr, ot -> ot_info = (caddr_t) ipAdEntBcastAddr; if (ot = text2obj ("ipAdEntReasmMaxSize")) ot -> ot_getfnx = o_ip_addr, ot -> ot_info = (caddr_t) ipAdEntReasmMaxSize; if (ot = text2obj ("ipRouteDest")) ot -> ot_getfnx = o_ip_route, ot -> ot_info = (caddr_t) ipRouteDest; if (ot = text2obj ("ipRouteIfIndex")) ot -> ot_getfnx = o_ip_route, ot -> ot_info = (caddr_t) ipRouteIfIndex; if (ot = text2obj ("ipRouteMetric1")) ot -> ot_getfnx = o_ip_route, ot -> ot_info = (caddr_t) ipRouteMetric1; if (ot = text2obj ("ipRouteMetric2")) ot -> ot_getfnx = o_ip_route, ot -> ot_info = (caddr_t) ipRouteMetric2; if (ot = text2obj ("ipRouteMetric3")) ot -> ot_getfnx = o_ip_route, ot -> ot_info = (caddr_t) ipRouteMetric3; if (ot = text2obj ("ipRouteMetric4")) ot -> ot_getfnx = o_ip_route, ot -> ot_info = (caddr_t) ipRouteMetric4; if (ot = text2obj ("ipRouteNextHop")) ot -> ot_getfnx = o_ip_route, ot -> ot_info = (caddr_t) ipRouteNextHop; if (ot = text2obj ("ipRouteType")) ot -> ot_getfnx = o_ip_route, ot -> ot_info = (caddr_t) ipRouteType; if (ot = text2obj ("ipRouteProto")) ot -> ot_getfnx = o_ip_route, ot -> ot_info = (caddr_t) ipRouteProto; if (ot = text2obj ("ipRouteAge")) ot -> ot_getfnx = o_ip_route, ot -> ot_info = (caddr_t) ipRouteAge; if (ot = text2obj ("ipRouteMask")) ot -> ot_getfnx = o_ip_route, ot -> ot_info = (caddr_t) ipRouteMask; if (ot = text2obj ("atIfIndex")) ot -> ot_getfnx = o_address, ot -> ot_info = (caddr_t) atIfIndex; if (ot = text2obj ("atPhysAddress")) ot -> ot_getfnx = o_address, ot -> ot_info = (caddr_t) atPhysAddress; if (ot = text2obj ("atNetAddress")) ot -> ot_getfnx = o_address, ot -> ot_info = (caddr_t) atNetAddress; if (ot = text2obj ("ipNetToMediaIfIndex")) ot -> ot_getfnx = o_address, ot -> ot_info = (caddr_t) ipNetToMediaIfIndex; if (ot = text2obj ("ipNetToMediaPhysAddress")) ot -> ot_getfnx = o_address, ot -> ot_info = (caddr_t) ipNetToMediaPhysAddress; if (ot = text2obj ("ipNetToMediaNetAddress")) ot -> ot_getfnx = o_address, ot -> ot_info = (caddr_t) ipNetToMediaNetAddress; if (ot = text2obj ("ipNetToMediaType")) ot -> ot_getfnx = o_address, ot -> ot_info = (caddr_t) ipNetToMediaType; } /* \f */ int ipaddr2oid (ip, addr) register unsigned int *ip; struct in_addr *addr; { register int i; register char *dp = (char *) addr; for (i = sizeof *addr; i > 0; i--) *ip++ = *dp++ & 0xff; return (sizeof *addr); }