|
|
1.1 ! root 1: /* ip.c - MIB realization of the IP (and Address Translation) group */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/snmp/RCS/ip.c,v 7.12 90/07/09 14:48:44 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/snmp/RCS/ip.c,v 7.12 90/07/09 14:48:44 mrose Exp $ ! 9: * ! 10: * Contributed by NYSERNet Inc. This work was partially supported by the ! 11: * U.S. Defense Advanced Research Projects Agency and the Rome Air Development ! 12: * Center of the U.S. Air Force Systems Command under contract number ! 13: * F30602-88-C-0016. ! 14: * ! 15: * ! 16: * $Log: ip.c,v $ ! 17: * Revision 7.12 90/07/09 14:48:44 mrose ! 18: * sync ! 19: * ! 20: * Revision 7.11 90/05/22 20:30:26 mrose ! 21: * cache ! 22: * ! 23: * Revision 7.10 90/05/12 17:02:02 mrose ! 24: * sync ! 25: * ! 26: * Revision 7.9 90/04/18 08:51:47 mrose ! 27: * oid_normalize ! 28: * ! 29: * Revision 7.8 90/03/24 10:54:09 mrose ! 30: * update ! 31: * ! 32: * Revision 7.7 90/03/06 13:50:55 mrose ! 33: * jch ! 34: * ! 35: * Revision 7.6 90/02/27 18:52:11 mrose ! 36: * unix stuff ! 37: * ! 38: * Revision 7.5 90/02/27 18:49:40 mrose ! 39: * unix stuff ! 40: * ! 41: * Revision 7.4 90/02/23 17:47:43 mrose ! 42: * update ! 43: * ! 44: * Revision 7.3 90/02/17 10:38:14 mrose ! 45: * smux ! 46: * ! 47: * Revision 7.2 90/01/27 08:21:52 mrose ! 48: * touch-up ! 49: * ! 50: * Revision 7.1 90/01/11 18:34:10 mrose ! 51: * real-sync ! 52: * ! 53: * Revision 7.0 89/11/23 22:23:06 mrose ! 54: * Release 6.0 ! 55: * ! 56: */ ! 57: ! 58: /* ! 59: * NOTICE ! 60: * ! 61: * Acquisition, use, and distribution of this module and related ! 62: * materials are subject to the restrictions of a license agreement. ! 63: * Consult the Preface in the User's Manual for the full terms of ! 64: * this agreement. ! 65: * ! 66: */ ! 67: ! 68: ! 69: #include <stdio.h> ! 70: #include "mib.h" ! 71: #include "interfaces.h" ! 72: #include "routes.h" ! 73: ! 74: #include <netinet/in_systm.h> ! 75: #include <netinet/ip.h> ! 76: #include <netinet/ip_var.h> ! 77: #include <sys/ioctl.h> ! 78: ! 79: /* */ ! 80: ! 81: #define FORW_GATEWAY 1 /* ipForwarding */ ! 82: #define FORW_HOST 2 ! 83: static int ipforwarding; ! 84: ! 85: static struct ipstat ipstat; ! 86: ! 87: /* */ ! 88: ! 89: #define ipForwarding 0 ! 90: #define ipDefaultTTL 1 ! 91: #ifdef BSD43 ! 92: #define ipInReceives 2 ! 93: #endif ! 94: #define ipInHdrErrors 3 ! 95: #undef ipInAddrErrors 4 /* NOT IMPLEMENTED */ ! 96: #ifdef BSD43 ! 97: #define ipForwDatagrams 5 ! 98: #endif ! 99: #ifdef BSD44 ! 100: #define ipInUnknownProtos 6 ! 101: #endif ! 102: #undef ipInDiscards 7 /* NOT IMPLEMENTED */ ! 103: #ifdef BSD44 ! 104: #define ipInDelivers 8 ! 105: #define ipOutRequests 9 ! 106: #define ipOutDiscards 10 ! 107: #endif ! 108: #ifdef BSD43 ! 109: #define ipOutNoRoutes 11 ! 110: #endif ! 111: #define ipReasmTimeout 12 ! 112: #ifdef BSD43 ! 113: #define ipReasmReqds 13 ! 114: #endif ! 115: #ifdef BSD44 ! 116: #define ipReasmOKs 14 ! 117: #endif ! 118: #ifdef BSD43 ! 119: #define ipReasmFails 15 ! 120: #endif ! 121: #ifdef BSD44 ! 122: #undef ipFragOKs 16 ! 123: #undef ipFragFails 17 ! 124: #undef ipFragCreates 18 ! 125: #endif ! 126: ! 127: ! 128: static int o_ip (oi, v, offset) ! 129: OI oi; ! 130: register struct type_SNMP_VarBind *v; ! 131: int offset; ! 132: { ! 133: int ifvar; ! 134: register struct ipstat *ips = &ipstat; ! 135: register OID oid = oi -> oi_name; ! 136: register OT ot = oi -> oi_type; ! 137: static int lastq = -1; ! 138: ! 139: ifvar = (int) ot -> ot_info; ! 140: switch (offset) { ! 141: case type_SNMP_PDUs_get__request: ! 142: if (oid -> oid_nelem != ot -> ot_name -> oid_nelem + 1 ! 143: || oid -> oid_elements[oid -> oid_nelem - 1] != 0) ! 144: return int_SNMP_error__status_noSuchName; ! 145: break; ! 146: ! 147: case type_SNMP_PDUs_get__next__request: ! 148: if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) { ! 149: OID new; ! 150: ! 151: if ((new = oid_extend (oid, 1)) == NULLOID) ! 152: return int_SNMP_error__status_genErr; ! 153: new -> oid_elements[new -> oid_nelem - 1] = 0; ! 154: ! 155: if (v -> name) ! 156: free_SNMP_ObjectName (v -> name); ! 157: v -> name = new; ! 158: } ! 159: else ! 160: return NOTOK; ! 161: break; ! 162: ! 163: default: ! 164: return int_SNMP_error__status_genErr; ! 165: } ! 166: ! 167: switch (ifvar) { ! 168: case ipDefaultTTL: ! 169: case ipReasmTimeout: ! 170: break; ! 171: ! 172: default: ! 173: if (quantum != lastq) { ! 174: lastq = quantum; ! 175: ! 176: if (getkmem (nl + N_IPFORWARDING, (caddr_t) &ipforwarding, ! 177: sizeof ipforwarding) == NOTOK ! 178: || getkmem (nl + N_IPSTAT, (caddr_t) ips, sizeof *ips) ! 179: == NOTOK) ! 180: return int_SNMP_error__status_genErr; ! 181: } ! 182: break; ! 183: } ! 184: ! 185: switch (ifvar) { ! 186: case ipForwarding: ! 187: return o_integer (oi, v, ipforwarding ? FORW_GATEWAY : FORW_HOST); ! 188: ! 189: case ipDefaultTTL: ! 190: return o_integer (oi, v, MAXTTL); ! 191: ! 192: #ifdef ipInReceives ! 193: case ipInReceives: ! 194: return o_integer (oi, v, ips -> ips_total); ! 195: #endif ! 196: ! 197: case ipInHdrErrors: ! 198: return o_integer (oi, v, ips -> ips_badsum ! 199: + ips -> ips_tooshort ! 200: + ips -> ips_toosmall ! 201: + ips -> ips_badhlen ! 202: + ips -> ips_badlen); ! 203: ! 204: #ifdef ipForwDatagrams ! 205: case ipForwDatagrams: ! 206: return o_integer (oi, v, ips -> ips_forward); ! 207: #endif ! 208: ! 209: #ifdef ipInUnknownProtos ! 210: case ipInUnknownProtos: ! 211: return o_integer (oi, v, ips -> ips_noproto); ! 212: #endif ! 213: ! 214: #ifdef ipInDelivers ! 215: case ipInDelivers: ! 216: return o_integer (oi, v, ips -> ips_delivered); ! 217: #endif ! 218: ! 219: #ifdef ipOutRequests ! 220: case ipOutRequests: ! 221: return o_integer (oi, v, ips -> ips_localout); ! 222: #endif ! 223: ! 224: #ifdef ipOutDiscards ! 225: case ipOutDiscards: ! 226: return o_integer (oi, v, ips -> ips_odropped); ! 227: #endif ! 228: ! 229: #ifdef ipOutNoRoutes ! 230: case ipOutNoRoutes: ! 231: return o_integer (oi, v, ips -> ips_cantforward); ! 232: #endif ! 233: ! 234: case ipReasmTimeout: ! 235: return o_integer (oi, v, IPFRAGTTL); ! 236: ! 237: #ifdef ipReasmReqds ! 238: case ipReasmReqds: ! 239: return o_integer (oi, v, ips -> ips_fragments); ! 240: #endif ! 241: ! 242: #ifdef ipReasmOKs ! 243: case ipReasmOKs: ! 244: return o_integer (oi, v, ips -> ips_reassembled); ! 245: #endif ! 246: ! 247: #ifdef ipReasmFails ! 248: case ipReasmFails: ! 249: return o_integer (oi, v, ips -> ips_fragdropped ! 250: + ips -> ips_fragtimeout); ! 251: #endif ! 252: ! 253: #ifdef ipFragOKs ! 254: case ipFragOKs: ! 255: return o_integer (oi, v, ips -> ips_fragmented); ! 256: #endif ! 257: ! 258: #ifdef ipFragFails ! 259: case ipFragFails: ! 260: return o_integer (oi, v, ips -> ips_cantfrag); ! 261: #endif ! 262: ! 263: #ifdef ipFragCreates ! 264: case ipFragCreates: ! 265: return o_integer (oi, v, ips -> ips_ofragments); ! 266: #endif ! 267: ! 268: default: ! 269: return int_SNMP_error__status_noSuchName; ! 270: } ! 271: } ! 272: ! 273: /* */ ! 274: ! 275: #ifndef IP_MAXPACKET ! 276: #define IP_MAXPACKET 65535 /* ipAdEntReasmMaxSize */ ! 277: #endif ! 278: ! 279: ! 280: #define IFN_SIZE 4 ! 281: ! 282: /* */ ! 283: ! 284: #define ipAdEntAddr 0 ! 285: #define ipAdEntIfIndex 1 ! 286: #define ipAdEntNetMask 2 ! 287: #define ipAdEntBcastAddr 3 ! 288: #define ipAdEntReasmMaxSize 4 ! 289: ! 290: ! 291: static int o_ip_addr (oi, v, offset) ! 292: OI oi; ! 293: register struct type_SNMP_VarBind *v; ! 294: int offset; ! 295: { ! 296: register int i; ! 297: int ifvar; ! 298: register unsigned int *ip, ! 299: *jp; ! 300: register struct address *as; ! 301: register OID oid = oi -> oi_name; ! 302: OID new; ! 303: register OT ot = oi -> oi_type; ! 304: ! 305: if (sort_interfaces () == NOTOK) ! 306: return int_SNMP_error__status_genErr; ! 307: ! 308: ifvar = (int) ot -> ot_info; ! 309: switch (offset) { ! 310: case type_SNMP_PDUs_get__request: ! 311: if (oid -> oid_nelem != ot -> ot_name -> oid_nelem + IFN_SIZE) ! 312: return int_SNMP_error__status_noSuchName; ! 313: if ((as = get_addrent (oid -> oid_elements + oid -> oid_nelem ! 314: - IFN_SIZE, IFN_SIZE, afs_inet, 0)) == NULL) ! 315: return int_SNMP_error__status_noSuchName; ! 316: break; ! 317: ! 318: case type_SNMP_PDUs_get__next__request: ! 319: if ((i = oid -> oid_nelem - ot -> ot_name -> oid_nelem) != 0 ! 320: && i < IFN_SIZE) { ! 321: for (jp = (ip = oid -> oid_elements + ot -> ot_name -> oid_nelem - 1) + i; ! 322: jp > ip; ! 323: jp--) ! 324: if (*jp != 0) ! 325: break; ! 326: if (jp == ip) ! 327: oid -> oid_nelem = ot -> ot_name -> oid_nelem; ! 328: else { ! 329: if ((new = oid_normalize (oid, IFN_SIZE - i, 256)) ! 330: == NULLOID) ! 331: return int_SNMP_error__status_genErr; ! 332: if (v -> name) ! 333: free_SNMP_ObjectName (v -> name); ! 334: v -> name = oid = new; ! 335: } ! 336: } ! 337: ! 338: if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) { ! 339: if ((as = afs_inet) == NULL) ! 340: return NOTOK; ! 341: ! 342: if ((new = oid_extend (oid, IFN_SIZE)) == NULLOID) ! 343: return int_SNMP_error__status_genErr; ! 344: ip = new -> oid_elements + new -> oid_nelem - IFN_SIZE; ! 345: jp = as -> adr_instance; ! 346: for (i = IFN_SIZE; i> 0; i--) ! 347: *ip++ = *jp++; ! 348: ! 349: if (v -> name) ! 350: free_SNMP_ObjectName (v -> name); ! 351: v -> name = new; ! 352: } ! 353: else { ! 354: if ((as = get_addrent (ip = oid -> oid_elements ! 355: + oid -> oid_nelem - IFN_SIZE, ! 356: IFN_SIZE, afs_inet, 1)) == NULL) ! 357: return NOTOK; ! 358: ! 359: jp = as -> adr_instance; ! 360: for (i = IFN_SIZE; i > 0; i--) ! 361: *ip++ = *jp++; ! 362: } ! 363: break; ! 364: ! 365: default: ! 366: return int_SNMP_error__status_genErr; ! 367: } ! 368: ! 369: switch (ifvar) { ! 370: case ipAdEntAddr: ! 371: return o_ipaddr (oi, v, (struct sockaddr_in *) &as -> adr_address); ! 372: ! 373: case ipAdEntIfIndex: ! 374: return o_integer (oi, v, ffs (as -> adr_indexmask)); ! 375: ! 376: case ipAdEntNetMask: ! 377: return o_ipaddr (oi, v, (struct sockaddr_in *) &as -> adr_netmask); ! 378: ! 379: case ipAdEntBcastAddr: /* beyond belief! */ ! 380: { ! 381: u_long a = (((struct sockaddr_in *) &as -> adr_netmask) ! 382: -> sin_addr.s_addr) ! 383: & ~(((struct sockaddr_in *) &as ! 384: -> adr_broadaddr) -> sin_addr.s_addr); ! 385: ! 386: return o_integer (oi, v, a ? 1 : 0); ! 387: } ! 388: ! 389: case ipAdEntReasmMaxSize: ! 390: return o_integer (oi, v, IP_MAXPACKET); ! 391: ! 392: default: ! 393: return int_SNMP_error__status_noSuchName; ! 394: } ! 395: } ! 396: ! 397: /* */ ! 398: ! 399: #define ipRouteDest 0 ! 400: #define ipRouteIfIndex 1 ! 401: #define ipRouteMetric1 2 ! 402: #define ipRouteMetric2 3 ! 403: #define ipRouteMetric3 4 ! 404: #define ipRouteMetric4 5 ! 405: #define ipRouteNextHop 6 ! 406: #define ipRouteType 7 ! 407: #define ipRouteProto 8 ! 408: #define ipRouteAge 9 ! 409: #define ipRouteMask 10 ! 410: #define unixIpRouteFlags 11 ! 411: #define unixIpRouteRefCnt 12 ! 412: #define unixIpRouteUses 13 ! 413: ! 414: ! 415: static int o_ip_route (oi, v, offset) ! 416: OI oi; ! 417: register struct type_SNMP_VarBind *v; ! 418: int offset; ! 419: { ! 420: int ifvar; ! 421: register int i; ! 422: register unsigned int *ip, ! 423: *jp; ! 424: register struct rtetab *rt; ! 425: register OID oid = oi -> oi_name; ! 426: OID new; ! 427: register OT ot = oi -> oi_type; ! 428: ! 429: if (get_routes (offset) == NOTOK) ! 430: return int_SNMP_error__status_genErr; ! 431: ! 432: ifvar = (int) ot -> ot_info; ! 433: switch (offset) { ! 434: case type_SNMP_PDUs_get__request: ! 435: if (oid -> oid_nelem != ot -> ot_name -> oid_nelem + IFN_SIZE) ! 436: return int_SNMP_error__status_noSuchName; ! 437: if ((rt = get_rtent (oid -> oid_elements + oid -> oid_nelem ! 438: - IFN_SIZE, IFN_SIZE, rts_inet, 0)) ! 439: == NULL) ! 440: return int_SNMP_error__status_noSuchName; ! 441: break; ! 442: ! 443: case type_SNMP_PDUs_get__next__request: ! 444: if ((i = oid -> oid_nelem - ot -> ot_name -> oid_nelem) != 0 ! 445: && i < IFN_SIZE) { ! 446: for (jp = (ip = oid -> oid_elements + ot -> ot_name -> oid_nelem - 1) + i; ! 447: jp > ip; ! 448: jp--) ! 449: if (*jp != 0) ! 450: break; ! 451: if (jp == ip) ! 452: oid -> oid_nelem = ot -> ot_name -> oid_nelem; ! 453: else { ! 454: if ((new = oid_normalize (oid, IFN_SIZE - i, 256)) ! 455: == NULLOID) ! 456: return int_SNMP_error__status_genErr; ! 457: if (v -> name) ! 458: free_SNMP_ObjectName (v -> name); ! 459: v -> name = oid = new; ! 460: } ! 461: } ! 462: ! 463: if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) { ! 464: if ((rt = rts_inet) == NULL) ! 465: return NOTOK; ! 466: ! 467: if ((new = oid_extend (oid, IFN_SIZE)) == NULLOID) ! 468: return int_SNMP_error__status_genErr; ! 469: ip = new -> oid_elements + new -> oid_nelem - IFN_SIZE; ! 470: ! 471: if (v -> name) ! 472: free_SNMP_ObjectName (v -> name); ! 473: v -> name = new; ! 474: } ! 475: else ! 476: if ((rt = get_rtent (ip = oid -> oid_elements ! 477: + oid -> oid_nelem - IFN_SIZE, ! 478: IFN_SIZE, rts_inet, 1)) == NULL) ! 479: return NOTOK; ! 480: jp = rt -> rt_instance; ! 481: for (i = IFN_SIZE; i> 0; i--) ! 482: *ip++ = *jp++; ! 483: ! 484: break; ! 485: ! 486: default: ! 487: return int_SNMP_error__status_genErr; ! 488: } ! 489: ! 490: switch (ifvar) { ! 491: case ipRouteDest: ! 492: return o_ipaddr (oi, v, (struct sockaddr_in *) &rt -> rt_dst); ! 493: ! 494: case ipRouteIfIndex: ! 495: { ! 496: register struct interface *is; ! 497: ! 498: if (sort_interfaces () == NOTOK) ! 499: return int_SNMP_error__status_genErr; ! 500: ! 501: for (is = ifs; is; is = is -> ifn_next) ! 502: if ((caddr_t) is -> ifn_offset ! 503: == (caddr_t) rt -> rt_rt.rt_ifp) { ! 504: if (is -> ifn_ready) ! 505: return o_integer (oi, v, is -> ifn_index); ! 506: break; ! 507: } ! 508: ! 509: if (offset == type_SNMP_PDUs_get__next__request) ! 510: return NOTOK; ! 511: return int_SNMP_error__status_noSuchName; ! 512: } ! 513: ! 514: case ipRouteMetric1: ! 515: case ipRouteMetric2: ! 516: case ipRouteMetric3: ! 517: case ipRouteMetric4: ! 518: return o_integer (oi, v, METRIC_NONE); ! 519: ! 520: case ipRouteNextHop: ! 521: return o_ipaddr (oi, v, (struct sockaddr_in *) &rt -> rt_gateway); ! 522: ! 523: case ipRouteType: ! 524: switch (rt -> rt_rt.rt_flags & (RTF_GATEWAY | RTF_HOST)) { ! 525: case RTF_GATEWAY: ! 526: case RTF_HOST: ! 527: return o_integer (oi, v, TYPE_REMOTE); ! 528: ! 529: case 0: ! 530: return o_integer (oi, v, TYPE_DIRECT); ! 531: ! 532: default: ! 533: return o_integer (oi, v, TYPE_OTHER); ! 534: } ! 535: ! 536: case ipRouteProto: ! 537: #ifdef RTF_DYNAMIC ! 538: #ifndef RTF_MODIFIED ! 539: if (rt -> rt_rt.rt_flags & RTF_DYNAMIC) ! 540: #else ! 541: if (rt -> rt_rt.rt_flags & (RTF_DYNAMIC | RTF_MODIFIED)) ! 542: #endif ! 543: return o_integer (oi, v, PROTO_ICMP); ! 544: else ! 545: #endif ! 546: return o_integer (oi, v, PROTO_OTHER); ! 547: ! 548: case ipRouteAge: ! 549: return o_integer (oi, v, 0); ! 550: ! 551: case ipRouteMask: ! 552: { ! 553: struct sockaddr_in mask; ! 554: struct sockaddr_in *sin = (struct sockaddr_in *) &rt -> rt_dst; ! 555: #ifndef BSD44 ! 556: register struct interface *is; ! 557: register struct address *as; ! 558: #endif ! 559: ! 560: bzero ((char *) &mask, sizeof mask); ! 561: ! 562: if (rt->rt_rt.rt_flags & RTF_HOST) ! 563: mask.sin_addr.s_addr = (u_long) 0xffffffff; ! 564: else ! 565: if (sin -> sin_addr.s_addr != 0L) { ! 566: #ifndef BSD44 ! 567: /* XXX - BSD44 shouldn't use this code, it has a */ ! 568: /* mask associated with each route, but I don't */ ! 569: /* know how to locate it at the moment (jch) */ ! 570: ! 571: if (sort_interfaces () == NOTOK) ! 572: return int_SNMP_error__status_genErr; ! 573: ! 574: for (is = ifs; is; is = is -> ifn_next) ! 575: if ((caddr_t) is -> ifn_offset ! 576: == (caddr_t) rt -> rt_rt.rt_ifp) ! 577: break; ! 578: ! 579: if (!is || !is -> ifn_ready) ! 580: return int_SNMP_error__status_noSuchName; ! 581: ! 582: for (as = afs_inet; as; as = as -> adr_next) ! 583: if (is -> ifn_indexmask & as -> adr_indexmask) ! 584: break; ! 585: ! 586: if (!as) ! 587: return int_SNMP_error__status_noSuchName; ! 588: ! 589: mask.sin_addr.s_addr = as -> adr_netmask.un_in.sin_addr.s_addr; ! 590: #else ! 591: if (IN_CLASSA (sin -> sin_addr.s_addr)) ! 592: mask.sin_addr.s_addr = IN_CLASSA_NET; ! 593: else ! 594: if (IN_CLASSB (sin -> sin_addr.s_addr)) ! 595: mask.sin_addr.s_addr = IN_CLASSB_NET; ! 596: else ! 597: mask.sin_addr.s_addr = IN_CLASSC_NET; ! 598: #endif ! 599: } ! 600: ! 601: return o_ipaddr (oi, v, &mask); ! 602: } ! 603: ! 604: case unixIpRouteFlags: ! 605: return o_integer (oi, v, rt -> rt_rt.rt_flags & 0xffff); ! 606: ! 607: case unixIpRouteRefCnt: ! 608: return o_integer (oi, v, rt -> rt_rt.rt_refcnt & 0xffff); ! 609: ! 610: case unixIpRouteUses: ! 611: return o_integer (oi, v, rt -> rt_rt.rt_use); ! 612: ! 613: default: ! 614: return int_SNMP_error__status_noSuchName; ! 615: } ! 616: } ! 617: ! 618: /* */ ! 619: ! 620: static struct rtstat rtstat; ! 621: ! 622: /* */ ! 623: ! 624: #define unixRouteBadRedirects 0 ! 625: #define unixRouteCreatedByRedirects 1 ! 626: #define unixRouteModifiedByRedirects 2 ! 627: #define unixRouteLookupFails 3 ! 628: #define unixRouteWildcardUses 4 ! 629: ! 630: ! 631: static int o_ip_routing_stats (oi, v, offset) ! 632: OI oi; ! 633: register struct type_SNMP_VarBind *v; ! 634: int offset; ! 635: { ! 636: int ifvar; ! 637: register struct rtstat *rts = &rtstat; ! 638: register OID oid = oi -> oi_name; ! 639: register OT ot = oi -> oi_type; ! 640: static int lastq = -1; ! 641: ! 642: ifvar = (int) ot -> ot_info; ! 643: switch (offset) { ! 644: case type_SNMP_PDUs_get__request: ! 645: if (oid -> oid_nelem != ot -> ot_name -> oid_nelem + 1 ! 646: || oid -> oid_elements[oid -> oid_nelem - 1] != 0) ! 647: return int_SNMP_error__status_noSuchName; ! 648: break; ! 649: ! 650: case type_SNMP_PDUs_get__next__request: ! 651: if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) { ! 652: OID new; ! 653: ! 654: if ((new = oid_extend (oid, 1)) == NULLOID) ! 655: return int_SNMP_error__status_genErr; ! 656: new -> oid_elements[new -> oid_nelem - 1] = 0; ! 657: ! 658: if (v -> name) ! 659: free_SNMP_ObjectName (v -> name); ! 660: v -> name = new; ! 661: } ! 662: else ! 663: return NOTOK; ! 664: break; ! 665: ! 666: default: ! 667: return int_SNMP_error__status_genErr; ! 668: } ! 669: ! 670: if (quantum != lastq) { ! 671: lastq = quantum; ! 672: ! 673: if (getkmem (nl + N_RTSTAT, (caddr_t) rts, sizeof *rts) == NOTOK) ! 674: return int_SNMP_error__status_genErr; ! 675: } ! 676: ! 677: switch (ifvar) { ! 678: case unixRouteBadRedirects: ! 679: return o_integer (oi, v, rts -> rts_badredirect & 0xffff); ! 680: ! 681: case unixRouteCreatedByRedirects: ! 682: return o_integer (oi, v, rts -> rts_dynamic & 0xffff); ! 683: ! 684: case unixRouteModifiedByRedirects: ! 685: return o_integer (oi, v, rts -> rts_newgateway & 0xffff); ! 686: ! 687: case unixRouteLookupFails: ! 688: return o_integer (oi, v, rts -> rts_unreach & 0xffff); ! 689: ! 690: case unixRouteWildcardUses: ! 691: return o_integer (oi, v, rts -> rts_wildcard & 0xffff); ! 692: ! 693: default: ! 694: return int_SNMP_error__status_noSuchName; ! 695: } ! 696: } ! 697: ! 698: /* */ ! 699: ! 700: struct adrtab { ! 701: #define ADN_SIZE (IFN_SIZE + 1) /* IpAddress instance */ ! 702: unsigned int adn_instance[ADN_SIZE]; ! 703: int adn_insize; ! 704: ! 705: struct in_addr adn_address; /* IpAddress */ ! 706: ! 707: ! 708: #define ADM_SIZE ADR_SIZE /* PhysAddress instance */ ! 709: unsigned int adm_instance[ADM_SIZE]; ! 710: int adm_insize; ! 711: ! 712: u_char adm_address[ADM_SIZE]; /* PhysAddress */ ! 713: u_char adm_addrlen; /* .. */ ! 714: ! 715: ! 716: #define ADA_SIZE (IFN_SIZE + 2) /* AtEntry instance */ ! 717: unsigned int ada_instance[ADA_SIZE]; ! 718: int ada_insize; ! 719: ! 720: ! 721: int adr_index; /* ifIndex */ ! 722: ! 723: int adr_type; /* ipNetToMediaType */ ! 724: #define OTHER_MAPPING 1 ! 725: #define DYNAMIC_MAPPING 3 ! 726: #define STATIC_MAPPING 4 ! 727: ! 728: struct adrtab *adn_next; /* next IpAddress */ ! 729: struct adrtab *adm_next; /* next PhysAddress */ ! 730: struct adrtab *ada_next; /* next AtEntry */ ! 731: }; ! 732: ! 733: static struct adrtab *ada = NULL; ! 734: static struct adrtab *adn = NULL; ! 735: static struct adrtab *adm = NULL; ! 736: ! 737: ! 738: static struct adrtab *get_arpent (); ! 739: ! 740: /* */ ! 741: ! 742: #define atIfIndex 0 ! 743: #define atPhysAddress 1 ! 744: #define atNetAddress 2 ! 745: ! 746: #define ipNetToMediaIfIndex 3 ! 747: #define ipNetToMediaPhysAddress 4 ! 748: #define ipNetToMediaNetAddress 5 ! 749: #define ipNetToMediaType 6 ! 750: ! 751: ! 752: static int o_address (oi, v, offset) ! 753: OI oi; ! 754: register struct type_SNMP_VarBind *v; ! 755: int offset; ! 756: { ! 757: register int i; ! 758: int ifvar, ! 759: isnpa; ! 760: register unsigned int *ip, ! 761: *jp; ! 762: register struct adrtab *at; ! 763: struct sockaddr_in netaddr; ! 764: register OID oid = oi -> oi_name; ! 765: register OT ot = oi -> oi_type; ! 766: ! 767: if (get_arptab () == NOTOK) ! 768: return int_SNMP_error__status_genErr; ! 769: ! 770: switch (ifvar = (int) ot -> ot_info) { ! 771: case ipNetToMediaIfIndex: ! 772: case ipNetToMediaPhysAddress: ! 773: case ipNetToMediaNetAddress: ! 774: case ipNetToMediaType: ! 775: isnpa = 0; ! 776: break; ! 777: ! 778: case atIfIndex: ! 779: case atPhysAddress: ! 780: case atNetAddress: ! 781: isnpa = -1; ! 782: } ! 783: ! 784: switch (offset) { ! 785: case type_SNMP_PDUs_get__request: ! 786: if (oid -> oid_nelem <= ot -> ot_name -> oid_nelem) ! 787: return int_SNMP_error__status_noSuchName; ! 788: if ((at = get_arpent (oid -> oid_elements ! 789: + ot -> ot_name -> oid_nelem, ! 790: oid -> oid_nelem ! 791: - ot -> ot_name -> oid_nelem, ! 792: isnpa, 0)) == NULL) ! 793: return int_SNMP_error__status_noSuchName; ! 794: break; ! 795: ! 796: case type_SNMP_PDUs_get__next__request: ! 797: if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) { ! 798: OID new; ! 799: ! 800: switch (isnpa) { ! 801: case 0: ! 802: if (at = adn) ! 803: jp = at -> adn_instance, i = at -> adn_insize; ! 804: break; ! 805: ! 806: case 1: ! 807: if (at = adm) ! 808: jp = at -> adm_instance, i = at -> adm_insize; ! 809: break; ! 810: ! 811: case -1: ! 812: if (at = ada) ! 813: jp = at -> ada_instance, i = at -> ada_insize; ! 814: break; ! 815: } ! 816: if (at == NULL) ! 817: return NOTOK; ! 818: ! 819: if ((new = oid_extend (oid, i)) == NULLOID) ! 820: return int_SNMP_error__status_genErr; ! 821: ip = new -> oid_elements + new -> oid_nelem - i; ! 822: for (; i > 0; i--) ! 823: *ip++ = *jp++; ! 824: ! 825: if (v -> name) ! 826: free_SNMP_ObjectName (v -> name); ! 827: v -> name = new; ! 828: } ! 829: else { ! 830: int j; ! 831: ! 832: if ((at = get_arpent (oid -> oid_elements ! 833: + ot -> ot_name -> oid_nelem, ! 834: j = oid -> oid_nelem ! 835: - ot -> ot_name -> oid_nelem, ! 836: isnpa, 1)) == NULL) ! 837: return NOTOK; ! 838: i = isnpa > 0 ? at -> adm_insize ! 839: : isnpa == 0 ? at -> adn_insize ! 840: : at -> ada_insize; ! 841: ! 842: if ((i = j - i) < 0) { ! 843: OID new; ! 844: ! 845: if ((new = oid_extend (oid, -i)) == NULLOID) ! 846: return int_SNMP_error__status_genErr; ! 847: if (v -> name) ! 848: free_SNMP_ObjectName (v -> name); ! 849: v -> name = new; ! 850: ! 851: oid = new; ! 852: } ! 853: else ! 854: if (i > 0) ! 855: oid -> oid_nelem -= i; ! 856: ! 857: ip = oid -> oid_elements + ot -> ot_name -> oid_nelem; ! 858: switch (isnpa) { ! 859: case 0: ! 860: jp = at -> adn_instance, i = at -> adn_insize; ! 861: break; ! 862: ! 863: case 1: ! 864: jp = at -> adm_instance, i = at -> adm_insize; ! 865: break; ! 866: ! 867: case -1: ! 868: jp = at -> ada_instance, i = at -> ada_insize; ! 869: break; ! 870: ! 871: } ! 872: for (; i > 0; i--) ! 873: *ip++ = *jp++; ! 874: } ! 875: break; ! 876: ! 877: default: ! 878: return int_SNMP_error__status_genErr; ! 879: } ! 880: ! 881: switch (ifvar) { ! 882: case atIfIndex: ! 883: case ipNetToMediaIfIndex: ! 884: return o_integer (oi, v, at -> adr_index); ! 885: ! 886: case atPhysAddress: ! 887: case ipNetToMediaPhysAddress: ! 888: return o_string (oi, v, (char *) at -> adm_address, ! 889: (int) at -> adm_addrlen); ! 890: ! 891: case atNetAddress: ! 892: case ipNetToMediaNetAddress: ! 893: netaddr.sin_addr = at -> adn_address; /* struct copy */ ! 894: return o_ipaddr (oi, v, &netaddr); ! 895: ! 896: case ipNetToMediaType: ! 897: return o_integer (oi, v, at -> adr_type); ! 898: ! 899: default: ! 900: return int_SNMP_error__status_noSuchName; ! 901: } ! 902: } ! 903: ! 904: /* */ ! 905: ! 906: static int adn_compar (a, b) ! 907: register struct adrtab **a, ! 908: **b; ! 909: { ! 910: return elem_cmp ((*a) -> adn_instance, (*a) -> adn_insize, ! 911: (*b) -> adn_instance, (*b) -> adn_insize); ! 912: } ! 913: ! 914: ! 915: static int adm_compar (a, b) ! 916: register struct adrtab **a, ! 917: **b; ! 918: { ! 919: return elem_cmp ((*a) -> adm_instance, (*a) -> adm_insize, ! 920: (*b) -> adm_instance, (*b) -> adm_insize); ! 921: } ! 922: ! 923: static int ada_compar (a, b) ! 924: register struct adrtab **a, ! 925: **b; ! 926: { ! 927: return elem_cmp ((*a) -> ada_instance, (*a) -> ada_insize, ! 928: (*b) -> ada_instance, (*b) -> ada_insize); ! 929: } ! 930: ! 931: ! 932: ! 933: static int get_arptab () { ! 934: int adrNumber = 0, ! 935: arptab_size, ! 936: tblsize; ! 937: register struct arptab *ac, ! 938: *ae; ! 939: struct arptab *arptab; ! 940: register struct adrtab *at, ! 941: *ap, ! 942: **base, ! 943: **afe, ! 944: **afp; ! 945: register struct interface *is; ! 946: static int first_time = 1; ! 947: static int lastq = -1; ! 948: ! 949: if (quantum == lastq) ! 950: return OK; ! 951: lastq = quantum; ! 952: ! 953: for (at = adn; at; at = ap) { ! 954: ap = at -> adn_next; ! 955: ! 956: free ((char *) at); ! 957: } ! 958: adn = adm = ada = NULL; ! 959: ! 960: if (getkmem (nl + N_ARPTAB_SIZE, (caddr_t) &arptab_size, ! 961: sizeof arptab_size) == NOTOK) ! 962: return NOTOK; ! 963: tblsize = arptab_size * sizeof *arptab; ! 964: if ((arptab = (struct arptab *) malloc ((unsigned) (tblsize))) == NULL) ! 965: adios (NULLCP, "out of memory"); ! 966: if (getkmem (nl + N_ARPTAB, (caddr_t) arptab, tblsize) == NOTOK) { ! 967: free ((char *) arptab); ! 968: return NOTOK; ! 969: } ! 970: ! 971: afp = &adn; ! 972: for (ae = (ac = arptab) + arptab_size; ac < ae; ac++) { ! 973: int type; ! 974: ! 975: if (!(ac -> at_iaddr.s_addr) || !(ac -> at_flags & ATF_COM)) ! 976: continue; ! 977: type = ac -> at_flags & ATF_PERM ? OTHER_MAPPING ! 978: : ac -> at_flags & ATF_PUBL ? STATIC_MAPPING ! 979: : DYNAMIC_MAPPING; ! 980: ! 981: /* there appears to be no way to gather per-interface address translation ! 982: tables, so we simply duplicate the arptable for each interface... */ ! 983: for (is = ifs; is; is = is -> ifn_next) { ! 984: if (!is -> ifn_ready) ! 985: continue; ! 986: ! 987: if ((at = (struct adrtab *) calloc (1, sizeof *at)) == NULL) ! 988: adios (NULLCP, "out of memory"); ! 989: *afp = at, afp = &at -> adn_next, adrNumber++; ! 990: ! 991: at -> adr_index = is -> ifn_index; ! 992: at -> adr_type = type; ! 993: ! 994: at -> adn_address = ac -> at_iaddr; /* struct copy */ ! 995: at -> adn_instance[0] = at -> adr_index, at -> adn_insize = 1; ! 996: at -> adn_insize += ipaddr2oid (at -> adn_instance + 1, ! 997: &at -> adn_address); ! 998: ! 999: #ifdef NEW_AT ! 1000: bcopy ((char *) ac -> at_enaddr, ! 1001: (char *) at -> adm_address, ! 1002: (int) (at -> adm_addrlen = sizeof ac -> at_enaddr)); ! 1003: #else ! 1004: bcopy ((char *) ac -> at_enaddr.ether_addr_octet, ! 1005: (char *) at -> adm_address, ! 1006: (int) (at -> adm_addrlen = ! 1007: sizeof ac -> at_enaddr.ether_addr_octet)); ! 1008: #endif ! 1009: at -> adm_instance[0] = at -> adr_index, at -> adm_insize = 1; ! 1010: at -> adm_insize += mediaddr2oid (at -> adm_instance + 1, ! 1011: at -> adm_address, ! 1012: (int) at -> adm_addrlen, 0); ! 1013: ! 1014: at -> ada_instance[0] = at -> adr_index; ! 1015: at -> ada_instance[1] = 1; ! 1016: at -> ada_insize = 2; ! 1017: at -> ada_insize += ipaddr2oid (at -> ada_instance + 2, ! 1018: &at -> adn_address); ! 1019: ! 1020: if (debug && first_time) { ! 1021: char buffer[BUFSIZ]; ! 1022: OIDentifier oids; ! 1023: ! 1024: oids.oid_elements = at -> adn_instance; ! 1025: oids.oid_nelem = at -> adn_insize; ! 1026: (void) strcpy (buffer, sprintoid (&oids)); ! 1027: oids.oid_elements = at -> adm_instance; ! 1028: oids.oid_nelem = at -> adm_insize; ! 1029: advise (LLOG_DEBUG, NULLCP, ! 1030: "add mapping on %d: %s -> %s", ! 1031: at -> adr_index, buffer, sprintoid (&oids)); ! 1032: } ! 1033: } ! 1034: } ! 1035: first_time = 0; ! 1036: free ((char *) arptab); ! 1037: ! 1038: if (adrNumber <= 1) { ! 1039: adm = ada = adn; ! 1040: return OK; ! 1041: } ! 1042: ! 1043: if ((base = (struct adrtab **) ! 1044: malloc ((unsigned) (adrNumber * sizeof *base))) == NULL) ! 1045: adios (NULLCP, "out of memory"); ! 1046: ! 1047: afe = base; ! 1048: for (at = adn; at; at = at -> adn_next) ! 1049: *afe++ = at; ! 1050: ! 1051: qsort ((char *) base, adrNumber, sizeof *base, adn_compar); ! 1052: ! 1053: afp = base; ! 1054: at = adn = *afp++; ! 1055: while (afp < afe) { ! 1056: at -> adn_next = *afp; ! 1057: at = *afp++; ! 1058: } ! 1059: at -> adn_next = NULL; ! 1060: ! 1061: qsort ((char *) base, adrNumber, sizeof *base, adm_compar); ! 1062: ! 1063: afp = base; ! 1064: at = adm = *afp++; ! 1065: while (afp < afe) { ! 1066: at -> adm_next = *afp; ! 1067: at = *afp++; ! 1068: } ! 1069: at -> adm_next = NULL; ! 1070: ! 1071: qsort ((char *) base, adrNumber, sizeof *base, ada_compar); ! 1072: ! 1073: afp = base; ! 1074: at = ada = *afp++; ! 1075: while (afp < afe) { ! 1076: at -> ada_next = *afp; ! 1077: at = *afp++; ! 1078: } ! 1079: at -> ada_next = NULL; ! 1080: ! 1081: free ((char *) base); ! 1082: ! 1083: return OK; ! 1084: } ! 1085: ! 1086: /* */ ! 1087: ! 1088: static struct adrtab *get_arpent (ip, len, isnpa, isnext) ! 1089: register unsigned int *ip; ! 1090: int len; ! 1091: int isnpa, ! 1092: isnext; ! 1093: { ! 1094: register struct adrtab *at; ! 1095: ! 1096: switch (isnpa) { ! 1097: case 0: ! 1098: for (at = adn; at; at = at -> adn_next) ! 1099: switch (elem_cmp (at -> adn_instance, at -> adn_insize, ! 1100: ip, len)) { ! 1101: case 0: ! 1102: return (isnext ? at -> adn_next : at); ! 1103: ! 1104: case 1: ! 1105: return (isnext ? at : NULL); ! 1106: } ! 1107: break; ! 1108: ! 1109: case 1: ! 1110: for (at = adm; at; at = at -> adm_next) ! 1111: switch (elem_cmp (at -> adm_instance, at -> adm_insize, ! 1112: ip, len)) { ! 1113: case 0: ! 1114: return (isnext ? at -> adm_next : at); ! 1115: ! 1116: case 1: ! 1117: return (isnext ? at : NULL); ! 1118: } ! 1119: break; ! 1120: ! 1121: case -1: ! 1122: for (at = ada; at; at = at -> ada_next) ! 1123: switch (elem_cmp (at -> ada_instance, at -> ada_insize, ! 1124: ip, len)) { ! 1125: case 0: ! 1126: return (isnext ? at -> ada_next : at); ! 1127: ! 1128: case 1: ! 1129: return (isnext ? at : NULL); ! 1130: } ! 1131: break; ! 1132: } ! 1133: ! 1134: return NULL; ! 1135: } ! 1136: ! 1137: /* */ ! 1138: ! 1139: init_ip () { ! 1140: register OT ot; ! 1141: ! 1142: if (ot = text2obj ("ipForwarding")) ! 1143: ot -> ot_getfnx = o_ip, ! 1144: ot -> ot_info = (caddr_t) ipForwarding; ! 1145: if (ot = text2obj ("ipDefaultTTL")) ! 1146: ot -> ot_getfnx = o_ip, ! 1147: ot -> ot_info = (caddr_t) ipDefaultTTL; ! 1148: #ifdef ipInReceives ! 1149: if (ot = text2obj ("ipInReceives")) ! 1150: ot -> ot_getfnx = o_ip, ! 1151: ot -> ot_info = (caddr_t) ipInReceives; ! 1152: #endif ! 1153: if (ot = text2obj ("ipInHdrErrors")) ! 1154: ot -> ot_getfnx = o_ip, ! 1155: ot -> ot_info = (caddr_t) ipInHdrErrors; ! 1156: #ifdef ipInAddrErrors ! 1157: if (ot = text2obj ("ipInAddrErrors")) ! 1158: ot -> ot_getfnx = o_ip, ! 1159: ot -> ot_info = (caddr_t) ipInAddrErrors; ! 1160: #endif ! 1161: #ifdef ipForwDatagrams ! 1162: if (ot = text2obj ("ipForwDatagrams")) ! 1163: ot -> ot_getfnx = o_ip, ! 1164: ot -> ot_info = (caddr_t) ipForwDatagrams; ! 1165: #endif ! 1166: #ifdef ipInUnknownProtos ! 1167: if (ot = text2obj ("ipInUnknownProtos")) ! 1168: ot -> ot_getfnx = o_ip, ! 1169: ot -> ot_info = (caddr_t) ipInUnknownProtos; ! 1170: #endif ! 1171: #ifdef ipInDiscards ! 1172: if (ot = text2obj ("ipInDiscards")) ! 1173: ot -> ot_getfnx = o_ip, ! 1174: ot -> ot_info = (caddr_t) ipInDiscards; ! 1175: #endif ! 1176: #ifdef ipInDelivers ! 1177: if (ot = text2obj ("ipInDelivers")) ! 1178: ot -> ot_getfnx = o_ip, ! 1179: ot -> ot_info = (caddr_t) ipInDelivers; ! 1180: #endif ! 1181: #ifdef ipOutRequests ! 1182: if (ot = text2obj ("ipOutRequests")) ! 1183: ot -> ot_getfnx = o_ip, ! 1184: ot -> ot_info = (caddr_t) ipOutRequests; ! 1185: #endif ! 1186: #ifdef ipOutDiscards ! 1187: if (ot = text2obj ("ipOutDiscards")) ! 1188: ot -> ot_getfnx = o_ip, ! 1189: ot -> ot_info = (caddr_t) ipOutDiscards; ! 1190: #endif ! 1191: #ifdef ipOutNoRoutes ! 1192: if (ot = text2obj ("ipOutNoRoutes")) ! 1193: ot -> ot_getfnx = o_ip, ! 1194: ot -> ot_info = (caddr_t) ipOutNoRoutes; ! 1195: #endif ! 1196: if (ot = text2obj ("ipReasmTimeout")) ! 1197: ot -> ot_getfnx = o_ip, ! 1198: ot -> ot_info = (caddr_t) ipReasmTimeout; ! 1199: #ifdef ipReasmReqds ! 1200: if (ot = text2obj ("ipReasmReqds")) ! 1201: ot -> ot_getfnx = o_ip, ! 1202: ot -> ot_info = (caddr_t) ipReasmReqds; ! 1203: #endif ! 1204: #ifdef ipReasmOKs ! 1205: if (ot = text2obj ("ipReasmOKs")) ! 1206: ot -> ot_getfnx = o_ip, ! 1207: ot -> ot_info = (caddr_t) ipReasmOKs; ! 1208: #endif ! 1209: #ifdef ipReasmFails ! 1210: if (ot = text2obj ("ipReasmFails")) ! 1211: ot -> ot_getfnx = o_ip, ! 1212: ot -> ot_info = (caddr_t) ipReasmFails; ! 1213: #endif ! 1214: #ifdef ipFragOKs ! 1215: if (ot = text2obj ("ipFragOKs")) ! 1216: ot -> ot_getfnx = o_ip, ! 1217: ot -> ot_info = (caddr_t) ipFragOKs; ! 1218: #endif ! 1219: #ifdef ipFragFails ! 1220: if (ot = text2obj ("ipFragFails")) ! 1221: ot -> ot_getfnx = o_ip, ! 1222: ot -> ot_info = (caddr_t) ipFragFails; ! 1223: #endif ! 1224: #ifdef ipFragCreates ! 1225: if (ot = text2obj ("ipFragCreates")) ! 1226: ot -> ot_getfnx = o_ip, ! 1227: ot -> ot_info = (caddr_t) ipFragCreates; ! 1228: #endif ! 1229: ! 1230: if (ot = text2obj ("ipAdEntAddr")) ! 1231: ot -> ot_getfnx = o_ip_addr, ! 1232: ot -> ot_info = (caddr_t) ipAdEntAddr; ! 1233: if (ot = text2obj ("ipAdEntIfIndex")) ! 1234: ot -> ot_getfnx = o_ip_addr, ! 1235: ot -> ot_info = (caddr_t) ipAdEntIfIndex; ! 1236: if (ot = text2obj ("ipAdEntNetMask")) ! 1237: ot -> ot_getfnx = o_ip_addr, ! 1238: ot -> ot_info = (caddr_t) ipAdEntNetMask; ! 1239: if (ot = text2obj ("ipAdEntBcastAddr")) ! 1240: ot -> ot_getfnx = o_ip_addr, ! 1241: ot -> ot_info = (caddr_t) ipAdEntBcastAddr; ! 1242: if (ot = text2obj ("ipAdEntReasmMaxSize")) ! 1243: ot -> ot_getfnx = o_ip_addr, ! 1244: ot -> ot_info = (caddr_t) ipAdEntReasmMaxSize; ! 1245: ! 1246: if (ot = text2obj ("ipRouteDest")) ! 1247: ot -> ot_getfnx = o_ip_route, ! 1248: ot -> ot_info = (caddr_t) ipRouteDest; ! 1249: if (ot = text2obj ("ipRouteIfIndex")) ! 1250: ot -> ot_getfnx = o_ip_route, ! 1251: ot -> ot_info = (caddr_t) ipRouteIfIndex; ! 1252: if (ot = text2obj ("ipRouteMetric1")) ! 1253: ot -> ot_getfnx = o_ip_route, ! 1254: ot -> ot_info = (caddr_t) ipRouteMetric1; ! 1255: if (ot = text2obj ("ipRouteMetric2")) ! 1256: ot -> ot_getfnx = o_ip_route, ! 1257: ot -> ot_info = (caddr_t) ipRouteMetric2; ! 1258: if (ot = text2obj ("ipRouteMetric3")) ! 1259: ot -> ot_getfnx = o_ip_route, ! 1260: ot -> ot_info = (caddr_t) ipRouteMetric3; ! 1261: if (ot = text2obj ("ipRouteMetric4")) ! 1262: ot -> ot_getfnx = o_ip_route, ! 1263: ot -> ot_info = (caddr_t) ipRouteMetric4; ! 1264: if (ot = text2obj ("ipRouteNextHop")) ! 1265: ot -> ot_getfnx = o_ip_route, ! 1266: ot -> ot_info = (caddr_t) ipRouteNextHop; ! 1267: if (ot = text2obj ("ipRouteType")) ! 1268: ot -> ot_getfnx = o_ip_route, ! 1269: ot -> ot_info = (caddr_t) ipRouteType; ! 1270: if (ot = text2obj ("ipRouteProto")) ! 1271: ot -> ot_getfnx = o_ip_route, ! 1272: ot -> ot_info = (caddr_t) ipRouteProto; ! 1273: if (ot = text2obj ("ipRouteAge")) ! 1274: ot -> ot_getfnx = o_ip_route, ! 1275: ot -> ot_info = (caddr_t) ipRouteAge; ! 1276: if (ot = text2obj ("ipRouteMask")) ! 1277: ot -> ot_getfnx = o_ip_route, ! 1278: ot -> ot_info = (caddr_t) ipRouteMask; ! 1279: ! 1280: if (ot = text2obj ("unixIpRouteFlags")) ! 1281: ot -> ot_getfnx = o_ip_route, ! 1282: ot -> ot_info = (caddr_t) unixIpRouteFlags; ! 1283: if (ot = text2obj ("unixIpRouteRefCnt")) ! 1284: ot -> ot_getfnx = o_ip_route, ! 1285: ot -> ot_info = (caddr_t) unixIpRouteRefCnt; ! 1286: if (ot = text2obj ("unixIpRouteUses")) ! 1287: ot -> ot_getfnx = o_ip_route, ! 1288: ot -> ot_info = (caddr_t) unixIpRouteUses; ! 1289: ! 1290: if (ot = text2obj ("unixRouteBadRedirects")) ! 1291: ot -> ot_getfnx = o_ip_routing_stats, ! 1292: ot -> ot_info = (caddr_t) unixRouteBadRedirects; ! 1293: if (ot = text2obj ("unixRouteCreatedByRedirects")) ! 1294: ot -> ot_getfnx = o_ip_routing_stats, ! 1295: ot -> ot_info = (caddr_t) unixRouteCreatedByRedirects; ! 1296: if (ot = text2obj ("unixRouteModifiedByRedirects")) ! 1297: ot -> ot_getfnx = o_ip_routing_stats, ! 1298: ot -> ot_info = (caddr_t) unixRouteModifiedByRedirects; ! 1299: if (ot = text2obj ("unixRouteLookupFails")) ! 1300: ot -> ot_getfnx = o_ip_routing_stats, ! 1301: ot -> ot_info = (caddr_t) unixRouteLookupFails; ! 1302: if (ot = text2obj ("unixRouteWildcardUses")) ! 1303: ot -> ot_getfnx = o_ip_routing_stats, ! 1304: ot -> ot_info = (caddr_t) unixRouteWildcardUses; ! 1305: ! 1306: if (ot = text2obj ("atIfIndex")) ! 1307: ot -> ot_getfnx = o_address, ! 1308: ot -> ot_info = (caddr_t) atIfIndex; ! 1309: if (ot = text2obj ("atPhysAddress")) ! 1310: ot -> ot_getfnx = o_address, ! 1311: ot -> ot_info = (caddr_t) atPhysAddress; ! 1312: if (ot = text2obj ("atNetAddress")) ! 1313: ot -> ot_getfnx = o_address, ! 1314: ot -> ot_info = (caddr_t) atNetAddress; ! 1315: ! 1316: if (ot = text2obj ("ipNetToMediaIfIndex")) ! 1317: ot -> ot_getfnx = o_address, ! 1318: ot -> ot_info = (caddr_t) ipNetToMediaIfIndex; ! 1319: if (ot = text2obj ("ipNetToMediaPhysAddress")) ! 1320: ot -> ot_getfnx = o_address, ! 1321: ot -> ot_info = (caddr_t) ipNetToMediaPhysAddress; ! 1322: if (ot = text2obj ("ipNetToMediaNetAddress")) ! 1323: ot -> ot_getfnx = o_address, ! 1324: ot -> ot_info = (caddr_t) ipNetToMediaNetAddress; ! 1325: if (ot = text2obj ("ipNetToMediaType")) ! 1326: ot -> ot_getfnx = o_address, ! 1327: ot -> ot_info = (caddr_t) ipNetToMediaType; ! 1328: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.