Annotation of embedaddon/quagga/ospfd/ospf_snmp.c, revision 1.1
1.1 ! misho 1: /* OSPFv2 SNMP support
! 2: * Copyright (C) 2005 6WIND <alain.ritoux@6wind.com>
! 3: * Copyright (C) 2000 IP Infusion Inc.
! 4: *
! 5: * Written by Kunihiro Ishiguro <kunihiro@zebra.org>
! 6: *
! 7: * This file is part of GNU Zebra.
! 8: *
! 9: * GNU Zebra is free software; you can redistribute it and/or modify it
! 10: * under the terms of the GNU General Public License as published by the
! 11: * Free Software Foundation; either version 2, or (at your option) any
! 12: * later version.
! 13: *
! 14: * GNU Zebra is distributed in the hope that it will be useful, but
! 15: * WITHOUT ANY WARRANTY; without even the implied warranty of
! 16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 17: * General Public License for more details.
! 18: *
! 19: * You should have received a copy of the GNU General Public License
! 20: * along with GNU Zebra; see the file COPYING. If not, write to the Free
! 21: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 22: * 02111-1307, USA.
! 23: */
! 24:
! 25: #include <zebra.h>
! 26:
! 27: #ifdef HAVE_SNMP
! 28: #ifdef HAVE_NETSNMP
! 29: #include <net-snmp/net-snmp-config.h>
! 30: #include <net-snmp/net-snmp-includes.h>
! 31: #else
! 32: #include <asn1.h>
! 33: #include <snmp.h>
! 34: #include <snmp_impl.h>
! 35: #endif
! 36:
! 37: #include "if.h"
! 38: #include "log.h"
! 39: #include "prefix.h"
! 40: #include "table.h"
! 41: #include "command.h"
! 42: #include "memory.h"
! 43: #include "smux.h"
! 44:
! 45: #include "ospfd/ospfd.h"
! 46: #include "ospfd/ospf_interface.h"
! 47: #include "ospfd/ospf_asbr.h"
! 48: #include "ospfd/ospf_lsa.h"
! 49: #include "ospfd/ospf_lsdb.h"
! 50: #include "ospfd/ospf_abr.h"
! 51: #include "ospfd/ospf_neighbor.h"
! 52: #include "ospfd/ospf_nsm.h"
! 53: #include "ospfd/ospf_flood.h"
! 54: #include "ospfd/ospf_ism.h"
! 55: #include "ospfd/ospf_dump.h"
! 56: #include "ospfd/ospf_snmp.h"
! 57:
! 58: /* OSPF2-MIB. */
! 59: #define OSPF2MIB 1,3,6,1,2,1,14
! 60:
! 61: /* OSPF MIB General Group values. */
! 62: #define OSPFROUTERID 1
! 63: #define OSPFADMINSTAT 2
! 64: #define OSPFVERSIONNUMBER 3
! 65: #define OSPFAREABDRRTRSTATUS 4
! 66: #define OSPFASBDRRTRSTATUS 5
! 67: #define OSPFEXTERNLSACOUNT 6
! 68: #define OSPFEXTERNLSACKSUMSUM 7
! 69: #define OSPFTOSSUPPORT 8
! 70: #define OSPFORIGINATENEWLSAS 9
! 71: #define OSPFRXNEWLSAS 10
! 72: #define OSPFEXTLSDBLIMIT 11
! 73: #define OSPFMULTICASTEXTENSIONS 12
! 74: #define OSPFEXITOVERFLOWINTERVAL 13
! 75: #define OSPFDEMANDEXTENSIONS 14
! 76:
! 77: /* OSPF MIB ospfAreaTable. */
! 78: #define OSPFAREAID 1
! 79: #define OSPFAUTHTYPE 2
! 80: #define OSPFIMPORTASEXTERN 3
! 81: #define OSPFSPFRUNS 4
! 82: #define OSPFAREABDRRTRCOUNT 5
! 83: #define OSPFASBDRRTRCOUNT 6
! 84: #define OSPFAREALSACOUNT 7
! 85: #define OSPFAREALSACKSUMSUM 8
! 86: #define OSPFAREASUMMARY 9
! 87: #define OSPFAREASTATUS 10
! 88:
! 89: /* OSPF MIB ospfStubAreaTable. */
! 90: #define OSPFSTUBAREAID 1
! 91: #define OSPFSTUBTOS 2
! 92: #define OSPFSTUBMETRIC 3
! 93: #define OSPFSTUBSTATUS 4
! 94: #define OSPFSTUBMETRICTYPE 5
! 95:
! 96: /* OSPF MIB ospfLsdbTable. */
! 97: #define OSPFLSDBAREAID 1
! 98: #define OSPFLSDBTYPE 2
! 99: #define OSPFLSDBLSID 3
! 100: #define OSPFLSDBROUTERID 4
! 101: #define OSPFLSDBSEQUENCE 5
! 102: #define OSPFLSDBAGE 6
! 103: #define OSPFLSDBCHECKSUM 7
! 104: #define OSPFLSDBADVERTISEMENT 8
! 105:
! 106: /* OSPF MIB ospfAreaRangeTable. */
! 107: #define OSPFAREARANGEAREAID 1
! 108: #define OSPFAREARANGENET 2
! 109: #define OSPFAREARANGEMASK 3
! 110: #define OSPFAREARANGESTATUS 4
! 111: #define OSPFAREARANGEEFFECT 5
! 112:
! 113: /* OSPF MIB ospfHostTable. */
! 114: #define OSPFHOSTIPADDRESS 1
! 115: #define OSPFHOSTTOS 2
! 116: #define OSPFHOSTMETRIC 3
! 117: #define OSPFHOSTSTATUS 4
! 118: #define OSPFHOSTAREAID 5
! 119:
! 120: /* OSPF MIB ospfIfTable. */
! 121: #define OSPFIFIPADDRESS 1
! 122: #define OSPFADDRESSLESSIF 2
! 123: #define OSPFIFAREAID 3
! 124: #define OSPFIFTYPE 4
! 125: #define OSPFIFADMINSTAT 5
! 126: #define OSPFIFRTRPRIORITY 6
! 127: #define OSPFIFTRANSITDELAY 7
! 128: #define OSPFIFRETRANSINTERVAL 8
! 129: #define OSPFIFHELLOINTERVAL 9
! 130: #define OSPFIFRTRDEADINTERVAL 10
! 131: #define OSPFIFPOLLINTERVAL 11
! 132: #define OSPFIFSTATE 12
! 133: #define OSPFIFDESIGNATEDROUTER 13
! 134: #define OSPFIFBACKUPDESIGNATEDROUTER 14
! 135: #define OSPFIFEVENTS 15
! 136: #define OSPFIFAUTHKEY 16
! 137: #define OSPFIFSTATUS 17
! 138: #define OSPFIFMULTICASTFORWARDING 18
! 139: #define OSPFIFDEMAND 19
! 140: #define OSPFIFAUTHTYPE 20
! 141:
! 142: /* OSPF MIB ospfIfMetricTable. */
! 143: #define OSPFIFMETRICIPADDRESS 1
! 144: #define OSPFIFMETRICADDRESSLESSIF 2
! 145: #define OSPFIFMETRICTOS 3
! 146: #define OSPFIFMETRICVALUE 4
! 147: #define OSPFIFMETRICSTATUS 5
! 148:
! 149: /* OSPF MIB ospfVirtIfTable. */
! 150: #define OSPFVIRTIFAREAID 1
! 151: #define OSPFVIRTIFNEIGHBOR 2
! 152: #define OSPFVIRTIFTRANSITDELAY 3
! 153: #define OSPFVIRTIFRETRANSINTERVAL 4
! 154: #define OSPFVIRTIFHELLOINTERVAL 5
! 155: #define OSPFVIRTIFRTRDEADINTERVAL 6
! 156: #define OSPFVIRTIFSTATE 7
! 157: #define OSPFVIRTIFEVENTS 8
! 158: #define OSPFVIRTIFAUTHKEY 9
! 159: #define OSPFVIRTIFSTATUS 10
! 160: #define OSPFVIRTIFAUTHTYPE 11
! 161:
! 162: /* OSPF MIB ospfNbrTable. */
! 163: #define OSPFNBRIPADDR 1
! 164: #define OSPFNBRADDRESSLESSINDEX 2
! 165: #define OSPFNBRRTRID 3
! 166: #define OSPFNBROPTIONS 4
! 167: #define OSPFNBRPRIORITY 5
! 168: #define OSPFNBRSTATE 6
! 169: #define OSPFNBREVENTS 7
! 170: #define OSPFNBRLSRETRANSQLEN 8
! 171: #define OSPFNBMANBRSTATUS 9
! 172: #define OSPFNBMANBRPERMANENCE 10
! 173: #define OSPFNBRHELLOSUPPRESSED 11
! 174:
! 175: /* OSPF MIB ospfVirtNbrTable. */
! 176: #define OSPFVIRTNBRAREA 1
! 177: #define OSPFVIRTNBRRTRID 2
! 178: #define OSPFVIRTNBRIPADDR 3
! 179: #define OSPFVIRTNBROPTIONS 4
! 180: #define OSPFVIRTNBRSTATE 5
! 181: #define OSPFVIRTNBREVENTS 6
! 182: #define OSPFVIRTNBRLSRETRANSQLEN 7
! 183: #define OSPFVIRTNBRHELLOSUPPRESSED 8
! 184:
! 185: /* OSPF MIB ospfExtLsdbTable. */
! 186: #define OSPFEXTLSDBTYPE 1
! 187: #define OSPFEXTLSDBLSID 2
! 188: #define OSPFEXTLSDBROUTERID 3
! 189: #define OSPFEXTLSDBSEQUENCE 4
! 190: #define OSPFEXTLSDBAGE 5
! 191: #define OSPFEXTLSDBCHECKSUM 6
! 192: #define OSPFEXTLSDBADVERTISEMENT 7
! 193:
! 194: /* OSPF MIB ospfAreaAggregateTable. */
! 195: #define OSPFAREAAGGREGATEAREAID 1
! 196: #define OSPFAREAAGGREGATELSDBTYPE 2
! 197: #define OSPFAREAAGGREGATENET 3
! 198: #define OSPFAREAAGGREGATEMASK 4
! 199: #define OSPFAREAAGGREGATESTATUS 5
! 200: #define OSPFAREAAGGREGATEEFFECT 6
! 201:
! 202: /* SYNTAX Status from OSPF-MIB. */
! 203: #define OSPF_STATUS_ENABLED 1
! 204: #define OSPF_STATUS_DISABLED 2
! 205:
! 206: /* SNMP value hack. */
! 207: #define COUNTER ASN_COUNTER
! 208: #define INTEGER ASN_INTEGER
! 209: #define GAUGE ASN_GAUGE
! 210: #define TIMETICKS ASN_TIMETICKS
! 211: #define IPADDRESS ASN_IPADDRESS
! 212: #define STRING ASN_OCTET_STR
! 213:
! 214: /* Declare static local variables for convenience. */
! 215: SNMP_LOCAL_VARIABLES
! 216:
! 217: /* OSPF-MIB instances. */
! 218: oid ospf_oid [] = { OSPF2MIB };
! 219:
! 220: /* IP address 0.0.0.0. */
! 221: static struct in_addr ospf_empty_addr = {0};
! 222:
! 223: /* Hook functions. */
! 224: static u_char *ospfGeneralGroup (struct variable *, oid *, size_t *,
! 225: int, size_t *, WriteMethod **);
! 226: static u_char *ospfAreaEntry (struct variable *, oid *, size_t *, int,
! 227: size_t *, WriteMethod **);
! 228: static u_char *ospfStubAreaEntry (struct variable *, oid *, size_t *,
! 229: int, size_t *, WriteMethod **);
! 230: static u_char *ospfLsdbEntry (struct variable *, oid *, size_t *, int,
! 231: size_t *, WriteMethod **);
! 232: static u_char *ospfAreaRangeEntry (struct variable *, oid *, size_t *, int,
! 233: size_t *, WriteMethod **);
! 234: static u_char *ospfHostEntry (struct variable *, oid *, size_t *, int,
! 235: size_t *, WriteMethod **);
! 236: static u_char *ospfIfEntry (struct variable *, oid *, size_t *, int,
! 237: size_t *, WriteMethod **);
! 238: static u_char *ospfIfMetricEntry (struct variable *, oid *, size_t *, int,
! 239: size_t *, WriteMethod **);
! 240: static u_char *ospfVirtIfEntry (struct variable *, oid *, size_t *, int,
! 241: size_t *, WriteMethod **);
! 242: static u_char *ospfNbrEntry (struct variable *, oid *, size_t *, int,
! 243: size_t *, WriteMethod **);
! 244: static u_char *ospfVirtNbrEntry (struct variable *, oid *, size_t *, int,
! 245: size_t *, WriteMethod **);
! 246: static u_char *ospfExtLsdbEntry (struct variable *, oid *, size_t *, int,
! 247: size_t *, WriteMethod **);
! 248: static u_char *ospfAreaAggregateEntry (struct variable *, oid *, size_t *,
! 249: int, size_t *, WriteMethod **);
! 250:
! 251: struct variable ospf_variables[] =
! 252: {
! 253: /* OSPF general variables */
! 254: {OSPFROUTERID, IPADDRESS, RWRITE, ospfGeneralGroup,
! 255: 2, {1, 1}},
! 256: {OSPFADMINSTAT, INTEGER, RWRITE, ospfGeneralGroup,
! 257: 2, {1, 2}},
! 258: {OSPFVERSIONNUMBER, INTEGER, RONLY, ospfGeneralGroup,
! 259: 2, {1, 3}},
! 260: {OSPFAREABDRRTRSTATUS, INTEGER, RONLY, ospfGeneralGroup,
! 261: 2, {1, 4}},
! 262: {OSPFASBDRRTRSTATUS, INTEGER, RWRITE, ospfGeneralGroup,
! 263: 2, {1, 5}},
! 264: {OSPFEXTERNLSACOUNT, GAUGE, RONLY, ospfGeneralGroup,
! 265: 2, {1, 6}},
! 266: {OSPFEXTERNLSACKSUMSUM, INTEGER, RONLY, ospfGeneralGroup,
! 267: 2, {1, 7}},
! 268: {OSPFTOSSUPPORT, INTEGER, RWRITE, ospfGeneralGroup,
! 269: 2, {1, 8}},
! 270: {OSPFORIGINATENEWLSAS, COUNTER, RONLY, ospfGeneralGroup,
! 271: 2, {1, 9}},
! 272: {OSPFRXNEWLSAS, COUNTER, RONLY, ospfGeneralGroup,
! 273: 2, {1, 10}},
! 274: {OSPFEXTLSDBLIMIT, INTEGER, RWRITE, ospfGeneralGroup,
! 275: 2, {1, 11}},
! 276: {OSPFMULTICASTEXTENSIONS, INTEGER, RWRITE, ospfGeneralGroup,
! 277: 2, {1, 12}},
! 278: {OSPFEXITOVERFLOWINTERVAL, INTEGER, RWRITE, ospfGeneralGroup,
! 279: 2, {1, 13}},
! 280: {OSPFDEMANDEXTENSIONS, INTEGER, RWRITE, ospfGeneralGroup,
! 281: 2, {1, 14}},
! 282:
! 283: /* OSPF area data structure. */
! 284: {OSPFAREAID, IPADDRESS, RONLY, ospfAreaEntry,
! 285: 3, {2, 1, 1}},
! 286: {OSPFAUTHTYPE, INTEGER, RWRITE, ospfAreaEntry,
! 287: 3, {2, 1, 2}},
! 288: {OSPFIMPORTASEXTERN, INTEGER, RWRITE, ospfAreaEntry,
! 289: 3, {2, 1, 3}},
! 290: {OSPFSPFRUNS, COUNTER, RONLY, ospfAreaEntry,
! 291: 3, {2, 1, 4}},
! 292: {OSPFAREABDRRTRCOUNT, GAUGE, RONLY, ospfAreaEntry,
! 293: 3, {2, 1, 5}},
! 294: {OSPFASBDRRTRCOUNT, GAUGE, RONLY, ospfAreaEntry,
! 295: 3, {2, 1, 6}},
! 296: {OSPFAREALSACOUNT, GAUGE, RONLY, ospfAreaEntry,
! 297: 3, {2, 1, 7}},
! 298: {OSPFAREALSACKSUMSUM, INTEGER, RONLY, ospfAreaEntry,
! 299: 3, {2, 1, 8}},
! 300: {OSPFAREASUMMARY, INTEGER, RWRITE, ospfAreaEntry,
! 301: 3, {2, 1, 9}},
! 302: {OSPFAREASTATUS, INTEGER, RWRITE, ospfAreaEntry,
! 303: 3, {2, 1, 10}},
! 304:
! 305: /* OSPF stub area information. */
! 306: {OSPFSTUBAREAID, IPADDRESS, RONLY, ospfStubAreaEntry,
! 307: 3, {3, 1, 1}},
! 308: {OSPFSTUBTOS, INTEGER, RONLY, ospfStubAreaEntry,
! 309: 3, {3, 1, 2}},
! 310: {OSPFSTUBMETRIC, INTEGER, RWRITE, ospfStubAreaEntry,
! 311: 3, {3, 1, 3}},
! 312: {OSPFSTUBSTATUS, INTEGER, RWRITE, ospfStubAreaEntry,
! 313: 3, {3, 1, 4}},
! 314: {OSPFSTUBMETRICTYPE, INTEGER, RWRITE, ospfStubAreaEntry,
! 315: 3, {3, 1, 5}},
! 316:
! 317: /* OSPF link state database. */
! 318: {OSPFLSDBAREAID, IPADDRESS, RONLY, ospfLsdbEntry,
! 319: 3, {4, 1, 1}},
! 320: {OSPFLSDBTYPE, INTEGER, RONLY, ospfLsdbEntry,
! 321: 3, {4, 1, 2}},
! 322: {OSPFLSDBLSID, IPADDRESS, RONLY, ospfLsdbEntry,
! 323: 3, {4, 1, 3}},
! 324: {OSPFLSDBROUTERID, IPADDRESS, RONLY, ospfLsdbEntry,
! 325: 3, {4, 1, 4}},
! 326: {OSPFLSDBSEQUENCE, INTEGER, RONLY, ospfLsdbEntry,
! 327: 3, {4, 1, 5}},
! 328: {OSPFLSDBAGE, INTEGER, RONLY, ospfLsdbEntry,
! 329: 3, {4, 1, 6}},
! 330: {OSPFLSDBCHECKSUM, INTEGER, RONLY, ospfLsdbEntry,
! 331: 3, {4, 1, 7}},
! 332: {OSPFLSDBADVERTISEMENT, STRING, RONLY, ospfLsdbEntry,
! 333: 3, {4, 1, 8}},
! 334:
! 335: /* Area range table. */
! 336: {OSPFAREARANGEAREAID, IPADDRESS, RONLY, ospfAreaRangeEntry,
! 337: 3, {5, 1, 1}},
! 338: {OSPFAREARANGENET, IPADDRESS, RONLY, ospfAreaRangeEntry,
! 339: 3, {5, 1, 2}},
! 340: {OSPFAREARANGEMASK, IPADDRESS, RWRITE, ospfAreaRangeEntry,
! 341: 3, {5, 1, 3}},
! 342: {OSPFAREARANGESTATUS, INTEGER, RWRITE, ospfAreaRangeEntry,
! 343: 3, {5, 1, 4}},
! 344: {OSPFAREARANGEEFFECT, INTEGER, RWRITE, ospfAreaRangeEntry,
! 345: 3, {5, 1, 5}},
! 346:
! 347: /* OSPF host table. */
! 348: {OSPFHOSTIPADDRESS, IPADDRESS, RONLY, ospfHostEntry,
! 349: 3, {6, 1, 1}},
! 350: {OSPFHOSTTOS, INTEGER, RONLY, ospfHostEntry,
! 351: 3, {6, 1, 2}},
! 352: {OSPFHOSTMETRIC, INTEGER, RWRITE, ospfHostEntry,
! 353: 3, {6, 1, 3}},
! 354: {OSPFHOSTSTATUS, INTEGER, RWRITE, ospfHostEntry,
! 355: 3, {6, 1, 4}},
! 356: {OSPFHOSTAREAID, IPADDRESS, RONLY, ospfHostEntry,
! 357: 3, {6, 1, 5}},
! 358:
! 359: /* OSPF interface table. */
! 360: {OSPFIFIPADDRESS, IPADDRESS, RONLY, ospfIfEntry,
! 361: 3, {7, 1, 1}},
! 362: {OSPFADDRESSLESSIF, INTEGER, RONLY, ospfIfEntry,
! 363: 3, {7, 1, 2}},
! 364: {OSPFIFAREAID, IPADDRESS, RWRITE, ospfIfEntry,
! 365: 3, {7, 1, 3}},
! 366: {OSPFIFTYPE, INTEGER, RWRITE, ospfIfEntry,
! 367: 3, {7, 1, 4}},
! 368: {OSPFIFADMINSTAT, INTEGER, RWRITE, ospfIfEntry,
! 369: 3, {7, 1, 5}},
! 370: {OSPFIFRTRPRIORITY, INTEGER, RWRITE, ospfIfEntry,
! 371: 3, {7, 1, 6}},
! 372: {OSPFIFTRANSITDELAY, INTEGER, RWRITE, ospfIfEntry,
! 373: 3, {7, 1, 7}},
! 374: {OSPFIFRETRANSINTERVAL, INTEGER, RWRITE, ospfIfEntry,
! 375: 3, {7, 1, 8}},
! 376: {OSPFIFHELLOINTERVAL, INTEGER, RWRITE, ospfIfEntry,
! 377: 3, {7, 1, 9}},
! 378: {OSPFIFRTRDEADINTERVAL, INTEGER, RWRITE, ospfIfEntry,
! 379: 3, {7, 1, 10}},
! 380: {OSPFIFPOLLINTERVAL, INTEGER, RWRITE, ospfIfEntry,
! 381: 3, {7, 1, 11}},
! 382: {OSPFIFSTATE, INTEGER, RONLY, ospfIfEntry,
! 383: 3, {7, 1, 12}},
! 384: {OSPFIFDESIGNATEDROUTER, IPADDRESS, RONLY, ospfIfEntry,
! 385: 3, {7, 1, 13}},
! 386: {OSPFIFBACKUPDESIGNATEDROUTER, IPADDRESS, RONLY, ospfIfEntry,
! 387: 3, {7, 1, 14}},
! 388: {OSPFIFEVENTS, COUNTER, RONLY, ospfIfEntry,
! 389: 3, {7, 1, 15}},
! 390: {OSPFIFAUTHKEY, STRING, RWRITE, ospfIfEntry,
! 391: 3, {7, 1, 16}},
! 392: {OSPFIFSTATUS, INTEGER, RWRITE, ospfIfEntry,
! 393: 3, {7, 1, 17}},
! 394: {OSPFIFMULTICASTFORWARDING, INTEGER, RWRITE, ospfIfEntry,
! 395: 3, {7, 1, 18}},
! 396: {OSPFIFDEMAND, INTEGER, RWRITE, ospfIfEntry,
! 397: 3, {7, 1, 19}},
! 398: {OSPFIFAUTHTYPE, INTEGER, RWRITE, ospfIfEntry,
! 399: 3, {7, 1, 20}},
! 400:
! 401: /* OSPF interface metric table. */
! 402: {OSPFIFMETRICIPADDRESS, IPADDRESS, RONLY, ospfIfMetricEntry,
! 403: 3, {8, 1, 1}},
! 404: {OSPFIFMETRICADDRESSLESSIF, INTEGER, RONLY, ospfIfMetricEntry,
! 405: 3, {8, 1, 2}},
! 406: {OSPFIFMETRICTOS, INTEGER, RONLY, ospfIfMetricEntry,
! 407: 3, {8, 1, 3}},
! 408: {OSPFIFMETRICVALUE, INTEGER, RWRITE, ospfIfMetricEntry,
! 409: 3, {8, 1, 4}},
! 410: {OSPFIFMETRICSTATUS, INTEGER, RWRITE, ospfIfMetricEntry,
! 411: 3, {8, 1, 5}},
! 412:
! 413: /* OSPF virtual interface table. */
! 414: {OSPFVIRTIFAREAID, IPADDRESS, RONLY, ospfVirtIfEntry,
! 415: 3, {9, 1, 1}},
! 416: {OSPFVIRTIFNEIGHBOR, IPADDRESS, RONLY, ospfVirtIfEntry,
! 417: 3, {9, 1, 2}},
! 418: {OSPFVIRTIFTRANSITDELAY, INTEGER, RWRITE, ospfVirtIfEntry,
! 419: 3, {9, 1, 3}},
! 420: {OSPFVIRTIFRETRANSINTERVAL, INTEGER, RWRITE, ospfVirtIfEntry,
! 421: 3, {9, 1, 4}},
! 422: {OSPFVIRTIFHELLOINTERVAL, INTEGER, RWRITE, ospfVirtIfEntry,
! 423: 3, {9, 1, 5}},
! 424: {OSPFVIRTIFRTRDEADINTERVAL, INTEGER, RWRITE, ospfVirtIfEntry,
! 425: 3, {9, 1, 6}},
! 426: {OSPFVIRTIFSTATE, INTEGER, RONLY, ospfVirtIfEntry,
! 427: 3, {9, 1, 7}},
! 428: {OSPFVIRTIFEVENTS, COUNTER, RONLY, ospfVirtIfEntry,
! 429: 3, {9, 1, 8}},
! 430: {OSPFVIRTIFAUTHKEY, STRING, RWRITE, ospfVirtIfEntry,
! 431: 3, {9, 1, 9}},
! 432: {OSPFVIRTIFSTATUS, INTEGER, RWRITE, ospfVirtIfEntry,
! 433: 3, {9, 1, 10}},
! 434: {OSPFVIRTIFAUTHTYPE, INTEGER, RWRITE, ospfVirtIfEntry,
! 435: 3, {9, 1, 11}},
! 436:
! 437: /* OSPF neighbor table. */
! 438: {OSPFNBRIPADDR, IPADDRESS, RONLY, ospfNbrEntry,
! 439: 3, {10, 1, 1}},
! 440: {OSPFNBRADDRESSLESSINDEX, INTEGER, RONLY, ospfNbrEntry,
! 441: 3, {10, 1, 2}},
! 442: {OSPFNBRRTRID, IPADDRESS, RONLY, ospfNbrEntry,
! 443: 3, {10, 1, 3}},
! 444: {OSPFNBROPTIONS, INTEGER, RONLY, ospfNbrEntry,
! 445: 3, {10, 1, 4}},
! 446: {OSPFNBRPRIORITY, INTEGER, RWRITE, ospfNbrEntry,
! 447: 3, {10, 1, 5}},
! 448: {OSPFNBRSTATE, INTEGER, RONLY, ospfNbrEntry,
! 449: 3, {10, 1, 6}},
! 450: {OSPFNBREVENTS, COUNTER, RONLY, ospfNbrEntry,
! 451: 3, {10, 1, 7}},
! 452: {OSPFNBRLSRETRANSQLEN, GAUGE, RONLY, ospfNbrEntry,
! 453: 3, {10, 1, 8}},
! 454: {OSPFNBMANBRSTATUS, INTEGER, RWRITE, ospfNbrEntry,
! 455: 3, {10, 1, 9}},
! 456: {OSPFNBMANBRPERMANENCE, INTEGER, RONLY, ospfNbrEntry,
! 457: 3, {10, 1, 10}},
! 458: {OSPFNBRHELLOSUPPRESSED, INTEGER, RONLY, ospfNbrEntry,
! 459: 3, {10, 1, 11}},
! 460:
! 461: /* OSPF virtual neighbor table. */
! 462: {OSPFVIRTNBRAREA, IPADDRESS, RONLY, ospfVirtNbrEntry,
! 463: 3, {11, 1, 1}},
! 464: {OSPFVIRTNBRRTRID, IPADDRESS, RONLY, ospfVirtNbrEntry,
! 465: 3, {11, 1, 2}},
! 466: {OSPFVIRTNBRIPADDR, IPADDRESS, RONLY, ospfVirtNbrEntry,
! 467: 3, {11, 1, 3}},
! 468: {OSPFVIRTNBROPTIONS, INTEGER, RONLY, ospfVirtNbrEntry,
! 469: 3, {11, 1, 4}},
! 470: {OSPFVIRTNBRSTATE, INTEGER, RONLY, ospfVirtNbrEntry,
! 471: 3, {11, 1, 5}},
! 472: {OSPFVIRTNBREVENTS, COUNTER, RONLY, ospfVirtNbrEntry,
! 473: 3, {11, 1, 6}},
! 474: {OSPFVIRTNBRLSRETRANSQLEN, INTEGER, RONLY, ospfVirtNbrEntry,
! 475: 3, {11, 1, 7}},
! 476: {OSPFVIRTNBRHELLOSUPPRESSED, INTEGER, RONLY, ospfVirtNbrEntry,
! 477: 3, {11, 1, 8}},
! 478:
! 479: /* OSPF link state database, external. */
! 480: {OSPFEXTLSDBTYPE, INTEGER, RONLY, ospfExtLsdbEntry,
! 481: 3, {12, 1, 1}},
! 482: {OSPFEXTLSDBLSID, IPADDRESS, RONLY, ospfExtLsdbEntry,
! 483: 3, {12, 1, 2}},
! 484: {OSPFEXTLSDBROUTERID, IPADDRESS, RONLY, ospfExtLsdbEntry,
! 485: 3, {12, 1, 3}},
! 486: {OSPFEXTLSDBSEQUENCE, INTEGER, RONLY, ospfExtLsdbEntry,
! 487: 3, {12, 1, 4}},
! 488: {OSPFEXTLSDBAGE, INTEGER, RONLY, ospfExtLsdbEntry,
! 489: 3, {12, 1, 5}},
! 490: {OSPFEXTLSDBCHECKSUM, INTEGER, RONLY, ospfExtLsdbEntry,
! 491: 3, {12, 1, 6}},
! 492: {OSPFEXTLSDBADVERTISEMENT, STRING, RONLY, ospfExtLsdbEntry,
! 493: 3, {12, 1, 7}},
! 494:
! 495: /* OSPF area aggregate table. */
! 496: {OSPFAREAAGGREGATEAREAID, IPADDRESS, RONLY, ospfAreaAggregateEntry,
! 497: 3, {14, 1, 1}},
! 498: {OSPFAREAAGGREGATELSDBTYPE, INTEGER, RONLY, ospfAreaAggregateEntry,
! 499: 3, {14, 1, 2}},
! 500: {OSPFAREAAGGREGATENET, IPADDRESS, RONLY, ospfAreaAggregateEntry,
! 501: 3, {14, 1, 3}},
! 502: {OSPFAREAAGGREGATEMASK, IPADDRESS, RONLY, ospfAreaAggregateEntry,
! 503: 3, {14, 1, 4}},
! 504: {OSPFAREAAGGREGATESTATUS, INTEGER, RWRITE, ospfAreaAggregateEntry,
! 505: 3, {14, 1, 5}},
! 506: {OSPFAREAAGGREGATEEFFECT, INTEGER, RWRITE, ospfAreaAggregateEntry,
! 507: 3, {14, 1, 6}}
! 508: };
! 509:
! 510: /* The administrative status of OSPF. When OSPF is enbled on at least
! 511: one interface return 1. */
! 512: static int
! 513: ospf_admin_stat (struct ospf *ospf)
! 514: {
! 515: struct listnode *node;
! 516: struct ospf_interface *oi;
! 517:
! 518: if (ospf == NULL)
! 519: return 0;
! 520:
! 521: for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, node, oi))
! 522: if (oi && oi->address)
! 523: return 1;
! 524:
! 525: return 0;
! 526: }
! 527:
! 528: static u_char *
! 529: ospfGeneralGroup (struct variable *v, oid *name, size_t *length,
! 530: int exact, size_t *var_len, WriteMethod **write_method)
! 531: {
! 532: struct ospf *ospf;
! 533:
! 534: ospf = ospf_lookup ();
! 535:
! 536: /* Check whether the instance identifier is valid */
! 537: if (smux_header_generic (v, name, length, exact, var_len, write_method)
! 538: == MATCH_FAILED)
! 539: return NULL;
! 540:
! 541: /* Return the current value of the variable */
! 542: switch (v->magic)
! 543: {
! 544: case OSPFROUTERID: /* 1 */
! 545: /* Router-ID of this OSPF instance. */
! 546: if (ospf)
! 547: return SNMP_IPADDRESS (ospf->router_id);
! 548: else
! 549: return SNMP_IPADDRESS (ospf_empty_addr);
! 550: break;
! 551: case OSPFADMINSTAT: /* 2 */
! 552: /* The administrative status of OSPF in the router. */
! 553: if (ospf_admin_stat (ospf))
! 554: return SNMP_INTEGER (OSPF_STATUS_ENABLED);
! 555: else
! 556: return SNMP_INTEGER (OSPF_STATUS_DISABLED);
! 557: break;
! 558: case OSPFVERSIONNUMBER: /* 3 */
! 559: /* OSPF version 2. */
! 560: return SNMP_INTEGER (OSPF_VERSION);
! 561: break;
! 562: case OSPFAREABDRRTRSTATUS: /* 4 */
! 563: /* Area Border router status. */
! 564: if (ospf && CHECK_FLAG (ospf->flags, OSPF_FLAG_ABR))
! 565: return SNMP_INTEGER (SNMP_TRUE);
! 566: else
! 567: return SNMP_INTEGER (SNMP_FALSE);
! 568: break;
! 569: case OSPFASBDRRTRSTATUS: /* 5 */
! 570: /* AS Border router status. */
! 571: if (ospf && CHECK_FLAG (ospf->flags, OSPF_FLAG_ASBR))
! 572: return SNMP_INTEGER (SNMP_TRUE);
! 573: else
! 574: return SNMP_INTEGER (SNMP_FALSE);
! 575: break;
! 576: case OSPFEXTERNLSACOUNT: /* 6 */
! 577: /* External LSA counts. */
! 578: if (ospf)
! 579: return SNMP_INTEGER (ospf_lsdb_count_all (ospf->lsdb));
! 580: else
! 581: return SNMP_INTEGER (0);
! 582: break;
! 583: case OSPFEXTERNLSACKSUMSUM: /* 7 */
! 584: /* External LSA checksum. */
! 585: return SNMP_INTEGER (0);
! 586: break;
! 587: case OSPFTOSSUPPORT: /* 8 */
! 588: /* TOS is not supported. */
! 589: return SNMP_INTEGER (SNMP_FALSE);
! 590: break;
! 591: case OSPFORIGINATENEWLSAS: /* 9 */
! 592: /* The number of new link-state advertisements. */
! 593: if (ospf)
! 594: return SNMP_INTEGER (ospf->lsa_originate_count);
! 595: else
! 596: return SNMP_INTEGER (0);
! 597: break;
! 598: case OSPFRXNEWLSAS: /* 10 */
! 599: /* The number of link-state advertisements received determined
! 600: to be new instantiations. */
! 601: if (ospf)
! 602: return SNMP_INTEGER (ospf->rx_lsa_count);
! 603: else
! 604: return SNMP_INTEGER (0);
! 605: break;
! 606: case OSPFEXTLSDBLIMIT: /* 11 */
! 607: /* There is no limit for the number of non-default
! 608: AS-external-LSAs. */
! 609: return SNMP_INTEGER (-1);
! 610: break;
! 611: case OSPFMULTICASTEXTENSIONS: /* 12 */
! 612: /* Multicast Extensions to OSPF is not supported. */
! 613: return SNMP_INTEGER (0);
! 614: break;
! 615: case OSPFEXITOVERFLOWINTERVAL: /* 13 */
! 616: /* Overflow is not supported. */
! 617: return SNMP_INTEGER (0);
! 618: break;
! 619: case OSPFDEMANDEXTENSIONS: /* 14 */
! 620: /* Demand routing is not supported. */
! 621: return SNMP_INTEGER (SNMP_FALSE);
! 622: break;
! 623: default:
! 624: return NULL;
! 625: }
! 626: return NULL;
! 627: }
! 628:
! 629: static struct ospf_area *
! 630: ospf_area_lookup_next (struct ospf *ospf, struct in_addr *area_id, int first)
! 631: {
! 632: struct ospf_area *area;
! 633: struct listnode *node;
! 634:
! 635: if (ospf == NULL)
! 636: return NULL;
! 637:
! 638: if (first)
! 639: {
! 640: node = listhead (ospf->areas);
! 641: if (node)
! 642: {
! 643: area = listgetdata (node);
! 644: *area_id = area->area_id;
! 645: return area;
! 646: }
! 647: return NULL;
! 648: }
! 649: for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
! 650: {
! 651: if (ntohl (area->area_id.s_addr) > ntohl (area_id->s_addr))
! 652: {
! 653: *area_id = area->area_id;
! 654: return area;
! 655: }
! 656: }
! 657: return NULL;
! 658: }
! 659:
! 660: static struct ospf_area *
! 661: ospfAreaLookup (struct variable *v, oid name[], size_t *length,
! 662: struct in_addr *addr, int exact)
! 663: {
! 664: struct ospf *ospf;
! 665: struct ospf_area *area;
! 666: int len;
! 667:
! 668: ospf = ospf_lookup ();
! 669: if (ospf == NULL)
! 670: return NULL;
! 671:
! 672: if (exact)
! 673: {
! 674: /* Length is insufficient to lookup OSPF area. */
! 675: if (*length - v->namelen != sizeof (struct in_addr))
! 676: return NULL;
! 677:
! 678: oid2in_addr (name + v->namelen, sizeof (struct in_addr), addr);
! 679:
! 680: area = ospf_area_lookup_by_area_id (ospf, *addr);
! 681:
! 682: return area;
! 683: }
! 684: else
! 685: {
! 686: len = *length - v->namelen;
! 687: if (len > 4)
! 688: len = 4;
! 689:
! 690: oid2in_addr (name + v->namelen, len, addr);
! 691:
! 692: area = ospf_area_lookup_next (ospf, addr, len == 0 ? 1 : 0);
! 693:
! 694: if (area == NULL)
! 695: return NULL;
! 696:
! 697: oid_copy_addr (name + v->namelen, addr, sizeof (struct in_addr));
! 698: *length = sizeof (struct in_addr) + v->namelen;
! 699:
! 700: return area;
! 701: }
! 702: return NULL;
! 703: }
! 704:
! 705: static u_char *
! 706: ospfAreaEntry (struct variable *v, oid *name, size_t *length, int exact,
! 707: size_t *var_len, WriteMethod **write_method)
! 708: {
! 709: struct ospf_area *area;
! 710: struct in_addr addr;
! 711:
! 712: memset (&addr, 0, sizeof (struct in_addr));
! 713:
! 714: area = ospfAreaLookup (v, name, length, &addr, exact);
! 715: if (! area)
! 716: return NULL;
! 717:
! 718: /* Return the current value of the variable */
! 719: switch (v->magic)
! 720: {
! 721: case OSPFAREAID: /* 1 */
! 722: return SNMP_IPADDRESS (area->area_id);
! 723: break;
! 724: case OSPFAUTHTYPE: /* 2 */
! 725: return SNMP_INTEGER (area->auth_type);
! 726: break;
! 727: case OSPFIMPORTASEXTERN: /* 3 */
! 728: return SNMP_INTEGER (area->external_routing + 1);
! 729: break;
! 730: case OSPFSPFRUNS: /* 4 */
! 731: return SNMP_INTEGER (area->spf_calculation);
! 732: break;
! 733: case OSPFAREABDRRTRCOUNT: /* 5 */
! 734: return SNMP_INTEGER (area->abr_count);
! 735: break;
! 736: case OSPFASBDRRTRCOUNT: /* 6 */
! 737: return SNMP_INTEGER (area->asbr_count);
! 738: break;
! 739: case OSPFAREALSACOUNT: /* 7 */
! 740: return SNMP_INTEGER (area->lsdb->total);
! 741: break;
! 742: case OSPFAREALSACKSUMSUM: /* 8 */
! 743: return SNMP_INTEGER (0);
! 744: break;
! 745: case OSPFAREASUMMARY: /* 9 */
! 746: #define OSPF_noAreaSummary 1
! 747: #define OSPF_sendAreaSummary 2
! 748: if (area->no_summary)
! 749: return SNMP_INTEGER (OSPF_noAreaSummary);
! 750: else
! 751: return SNMP_INTEGER (OSPF_sendAreaSummary);
! 752: break;
! 753: case OSPFAREASTATUS: /* 10 */
! 754: return SNMP_INTEGER (SNMP_VALID);
! 755: break;
! 756: default:
! 757: return NULL;
! 758: break;
! 759: }
! 760: return NULL;
! 761: }
! 762:
! 763: static struct ospf_area *
! 764: ospf_stub_area_lookup_next (struct in_addr *area_id, int first)
! 765: {
! 766: struct ospf_area *area;
! 767: struct listnode *node;
! 768: struct ospf *ospf;
! 769:
! 770: ospf = ospf_lookup ();
! 771: if (ospf == NULL)
! 772: return NULL;
! 773:
! 774: for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
! 775: {
! 776: if (area->external_routing == OSPF_AREA_STUB)
! 777: {
! 778: if (first)
! 779: {
! 780: *area_id = area->area_id;
! 781: return area;
! 782: }
! 783: else if (ntohl (area->area_id.s_addr) > ntohl (area_id->s_addr))
! 784: {
! 785: *area_id = area->area_id;
! 786: return area;
! 787: }
! 788: }
! 789: }
! 790: return NULL;
! 791: }
! 792:
! 793: static struct ospf_area *
! 794: ospfStubAreaLookup (struct variable *v, oid name[], size_t *length,
! 795: struct in_addr *addr, int exact)
! 796: {
! 797: struct ospf *ospf;
! 798: struct ospf_area *area;
! 799: int len;
! 800:
! 801: ospf = ospf_lookup ();
! 802: if (ospf == NULL)
! 803: return NULL;
! 804:
! 805: /* Exact lookup. */
! 806: if (exact)
! 807: {
! 808: /* ospfStubAreaID + ospfStubTOS. */
! 809: if (*length != v->namelen + sizeof (struct in_addr) + 1)
! 810: return NULL;
! 811:
! 812: /* Check ospfStubTOS is zero. */
! 813: if (name[*length - 1] != 0)
! 814: return NULL;
! 815:
! 816: oid2in_addr (name + v->namelen, sizeof (struct in_addr), addr);
! 817:
! 818: area = ospf_area_lookup_by_area_id (ospf, *addr);
! 819:
! 820: if (area->external_routing == OSPF_AREA_STUB)
! 821: return area;
! 822: else
! 823: return NULL;
! 824: }
! 825: else
! 826: {
! 827: len = *length - v->namelen;
! 828: if (len > 4)
! 829: len = 4;
! 830:
! 831: oid2in_addr (name + v->namelen, len, addr);
! 832:
! 833: area = ospf_stub_area_lookup_next (addr, len == 0 ? 1 : 0);
! 834:
! 835: if (area == NULL)
! 836: return NULL;
! 837:
! 838: oid_copy_addr (name + v->namelen, addr, sizeof (struct in_addr));
! 839: /* Set TOS 0. */
! 840: name[v->namelen + sizeof (struct in_addr)] = 0;
! 841: *length = v->namelen + sizeof (struct in_addr) + 1;
! 842:
! 843: return area;
! 844: }
! 845: return NULL;
! 846: }
! 847:
! 848: static u_char *
! 849: ospfStubAreaEntry (struct variable *v, oid *name, size_t *length,
! 850: int exact, size_t *var_len, WriteMethod **write_method)
! 851: {
! 852: struct ospf_area *area;
! 853: struct in_addr addr;
! 854:
! 855: memset (&addr, 0, sizeof (struct in_addr));
! 856:
! 857: area = ospfStubAreaLookup (v, name, length, &addr, exact);
! 858: if (! area)
! 859: return NULL;
! 860:
! 861: /* Return the current value of the variable */
! 862: switch (v->magic)
! 863: {
! 864: case OSPFSTUBAREAID: /* 1 */
! 865: /* OSPF stub area id. */
! 866: return SNMP_IPADDRESS (area->area_id);
! 867: break;
! 868: case OSPFSTUBTOS: /* 2 */
! 869: /* TOS value is not supported. */
! 870: return SNMP_INTEGER (0);
! 871: break;
! 872: case OSPFSTUBMETRIC: /* 3 */
! 873: /* Default cost to stub area. */
! 874: return SNMP_INTEGER (area->default_cost);
! 875: break;
! 876: case OSPFSTUBSTATUS: /* 4 */
! 877: /* Status of the stub area. */
! 878: return SNMP_INTEGER (SNMP_VALID);
! 879: break;
! 880: case OSPFSTUBMETRICTYPE: /* 5 */
! 881: /* OSPF Metric type. */
! 882: #define OSPF_ospfMetric 1
! 883: #define OSPF_comparableCost 2
! 884: #define OSPF_nonComparable 3
! 885: return SNMP_INTEGER (OSPF_ospfMetric);
! 886: break;
! 887: default:
! 888: return NULL;
! 889: break;
! 890: }
! 891: return NULL;
! 892: }
! 893:
! 894: static struct ospf_lsa *
! 895: lsdb_lookup_next (struct ospf_area *area, u_char *type, int type_next,
! 896: struct in_addr *ls_id, int ls_id_next,
! 897: struct in_addr *router_id, int router_id_next)
! 898: {
! 899: struct ospf_lsa *lsa;
! 900: int i;
! 901:
! 902: if (type_next)
! 903: i = OSPF_MIN_LSA;
! 904: else
! 905: i = *type;
! 906:
! 907: /* Sanity check, if LSA type unknwon
! 908: merley skip any LSA */
! 909: if ((i < OSPF_MIN_LSA) || (i >= OSPF_MAX_LSA))
! 910: {
! 911: zlog_debug("Strange request with LSA type %d\n", i);
! 912: return NULL;
! 913: }
! 914:
! 915: for (; i < OSPF_MAX_LSA; i++)
! 916: {
! 917: *type = i;
! 918:
! 919: lsa = ospf_lsdb_lookup_by_id_next (area->lsdb, *type, *ls_id, *router_id,
! 920: ls_id_next);
! 921: if (lsa)
! 922: return lsa;
! 923:
! 924: ls_id_next = 1;
! 925: }
! 926: return NULL;
! 927: }
! 928:
! 929: static struct ospf_lsa *
! 930: ospfLsdbLookup (struct variable *v, oid *name, size_t *length,
! 931: struct in_addr *area_id, u_char *type,
! 932: struct in_addr *ls_id, struct in_addr *router_id, int exact)
! 933: {
! 934: struct ospf *ospf;
! 935: struct ospf_area *area;
! 936: struct ospf_lsa *lsa;
! 937: unsigned int len;
! 938: int type_next;
! 939: int ls_id_next;
! 940: int router_id_next;
! 941: oid *offset;
! 942: int offsetlen;
! 943:
! 944: ospf = ospf_lookup ();
! 945:
! 946: #define OSPF_LSDB_ENTRY_OFFSET \
! 947: (IN_ADDR_SIZE + 1 + IN_ADDR_SIZE + IN_ADDR_SIZE)
! 948:
! 949: if (exact)
! 950: {
! 951: /* Area ID + Type + LS ID + Router ID. */
! 952: if (*length - v->namelen != OSPF_LSDB_ENTRY_OFFSET)
! 953: return NULL;
! 954:
! 955: /* Set OID offset for Area ID. */
! 956: offset = name + v->namelen;
! 957:
! 958: /* Lookup area first. */
! 959: oid2in_addr (offset, IN_ADDR_SIZE, area_id);
! 960: area = ospf_area_lookup_by_area_id (ospf, *area_id);
! 961: if (! area)
! 962: return NULL;
! 963: offset += IN_ADDR_SIZE;
! 964:
! 965: /* Type. */
! 966: *type = *offset;
! 967: offset++;
! 968:
! 969: /* LS ID. */
! 970: oid2in_addr (offset, IN_ADDR_SIZE, ls_id);
! 971: offset += IN_ADDR_SIZE;
! 972:
! 973: /* Router ID. */
! 974: oid2in_addr (offset, IN_ADDR_SIZE, router_id);
! 975:
! 976: /* Lookup LSDB. */
! 977: return ospf_lsdb_lookup_by_id (area->lsdb, *type, *ls_id, *router_id);
! 978: }
! 979: else
! 980: {
! 981: /* Get variable length. */
! 982: offset = name + v->namelen;
! 983: offsetlen = *length - v->namelen;
! 984: len = offsetlen;
! 985:
! 986: if (len > IN_ADDR_SIZE)
! 987: len = IN_ADDR_SIZE;
! 988:
! 989: oid2in_addr (offset, len, area_id);
! 990:
! 991: /* First we search area. */
! 992: if (len == IN_ADDR_SIZE)
! 993: area = ospf_area_lookup_by_area_id (ospf, *area_id);
! 994: else
! 995: area = ospf_area_lookup_next (ospf, area_id, len == 0 ? 1 : 0);
! 996:
! 997: if (area == NULL)
! 998: return NULL;
! 999:
! 1000: do
! 1001: {
! 1002: /* Next we lookup type. */
! 1003: offset += IN_ADDR_SIZE;
! 1004: offsetlen -= IN_ADDR_SIZE;
! 1005: len = offsetlen;
! 1006:
! 1007: if (len <= 0)
! 1008: type_next = 1;
! 1009: else
! 1010: {
! 1011: len = 1;
! 1012: type_next = 0;
! 1013: *type = *offset;
! 1014: }
! 1015:
! 1016: /* LS ID. */
! 1017: offset++;
! 1018: offsetlen--;
! 1019: len = offsetlen;
! 1020:
! 1021: if (len <= 0)
! 1022: ls_id_next = 1;
! 1023: else
! 1024: {
! 1025: ls_id_next = 0;
! 1026: if (len > IN_ADDR_SIZE)
! 1027: len = IN_ADDR_SIZE;
! 1028:
! 1029: oid2in_addr (offset, len, ls_id);
! 1030: }
! 1031:
! 1032: /* Router ID. */
! 1033: offset += IN_ADDR_SIZE;
! 1034: offsetlen -= IN_ADDR_SIZE;
! 1035: len = offsetlen;
! 1036:
! 1037: if (len <= 0)
! 1038: router_id_next = 1;
! 1039: else
! 1040: {
! 1041: router_id_next = 0;
! 1042: if (len > IN_ADDR_SIZE)
! 1043: len = IN_ADDR_SIZE;
! 1044:
! 1045: oid2in_addr (offset, len, router_id);
! 1046: }
! 1047:
! 1048: lsa = lsdb_lookup_next (area, type, type_next, ls_id, ls_id_next,
! 1049: router_id, router_id_next);
! 1050:
! 1051: if (lsa)
! 1052: {
! 1053: /* Fill in length. */
! 1054: *length = v->namelen + OSPF_LSDB_ENTRY_OFFSET;
! 1055:
! 1056: /* Fill in value. */
! 1057: offset = name + v->namelen;
! 1058: oid_copy_addr (offset, area_id, IN_ADDR_SIZE);
! 1059: offset += IN_ADDR_SIZE;
! 1060: *offset = lsa->data->type;
! 1061: offset++;
! 1062: oid_copy_addr (offset, &lsa->data->id, IN_ADDR_SIZE);
! 1063: offset += IN_ADDR_SIZE;
! 1064: oid_copy_addr (offset, &lsa->data->adv_router, IN_ADDR_SIZE);
! 1065:
! 1066: return lsa;
! 1067: }
! 1068: }
! 1069: while ((area = ospf_area_lookup_next (ospf, area_id, 0)) != NULL);
! 1070: }
! 1071: return NULL;
! 1072: }
! 1073:
! 1074: static u_char *
! 1075: ospfLsdbEntry (struct variable *v, oid *name, size_t *length, int exact,
! 1076: size_t *var_len, WriteMethod **write_method)
! 1077: {
! 1078: struct ospf_lsa *lsa;
! 1079: struct lsa_header *lsah;
! 1080: struct in_addr area_id;
! 1081: u_char type;
! 1082: struct in_addr ls_id;
! 1083: struct in_addr router_id;
! 1084: struct ospf *ospf;
! 1085:
! 1086: /* INDEX { ospfLsdbAreaId, ospfLsdbType,
! 1087: ospfLsdbLsid, ospfLsdbRouterId } */
! 1088:
! 1089: memset (&area_id, 0, sizeof (struct in_addr));
! 1090: type = 0;
! 1091: memset (&ls_id, 0, sizeof (struct in_addr));
! 1092: memset (&router_id, 0, sizeof (struct in_addr));
! 1093:
! 1094: /* Check OSPF instance. */
! 1095: ospf = ospf_lookup ();
! 1096: if (ospf == NULL)
! 1097: return NULL;
! 1098:
! 1099: lsa = ospfLsdbLookup (v, name, length, &area_id, &type, &ls_id, &router_id,
! 1100: exact);
! 1101: if (! lsa)
! 1102: return NULL;
! 1103:
! 1104: lsah = lsa->data;
! 1105:
! 1106: /* Return the current value of the variable */
! 1107: switch (v->magic)
! 1108: {
! 1109: case OSPFLSDBAREAID: /* 1 */
! 1110: return SNMP_IPADDRESS (lsa->area->area_id);
! 1111: break;
! 1112: case OSPFLSDBTYPE: /* 2 */
! 1113: return SNMP_INTEGER (lsah->type);
! 1114: break;
! 1115: case OSPFLSDBLSID: /* 3 */
! 1116: return SNMP_IPADDRESS (lsah->id);
! 1117: break;
! 1118: case OSPFLSDBROUTERID: /* 4 */
! 1119: return SNMP_IPADDRESS (lsah->adv_router);
! 1120: break;
! 1121: case OSPFLSDBSEQUENCE: /* 5 */
! 1122: return SNMP_INTEGER (lsah->ls_seqnum);
! 1123: break;
! 1124: case OSPFLSDBAGE: /* 6 */
! 1125: return SNMP_INTEGER (lsah->ls_age);
! 1126: break;
! 1127: case OSPFLSDBCHECKSUM: /* 7 */
! 1128: return SNMP_INTEGER (lsah->checksum);
! 1129: break;
! 1130: case OSPFLSDBADVERTISEMENT: /* 8 */
! 1131: *var_len = ntohs (lsah->length);
! 1132: return (u_char *) lsah;
! 1133: break;
! 1134: default:
! 1135: return NULL;
! 1136: break;
! 1137: }
! 1138: return NULL;
! 1139: }
! 1140:
! 1141: static struct ospf_area_range *
! 1142: ospfAreaRangeLookup (struct variable *v, oid *name, size_t *length,
! 1143: struct in_addr *area_id, struct in_addr *range_net,
! 1144: int exact)
! 1145: {
! 1146: oid *offset;
! 1147: int offsetlen;
! 1148: unsigned int len;
! 1149: struct ospf *ospf;
! 1150: struct ospf_area *area;
! 1151: struct ospf_area_range *range;
! 1152: struct prefix_ipv4 p;
! 1153: p.family = AF_INET;
! 1154: p.prefixlen = IPV4_MAX_BITLEN;
! 1155:
! 1156: ospf = ospf_lookup ();
! 1157:
! 1158: if (exact)
! 1159: {
! 1160: /* Area ID + Range Network. */
! 1161: if (v->namelen + IN_ADDR_SIZE + IN_ADDR_SIZE != *length)
! 1162: return NULL;
! 1163:
! 1164: /* Set OID offset for Area ID. */
! 1165: offset = name + v->namelen;
! 1166:
! 1167: /* Lookup area first. */
! 1168: oid2in_addr (offset, IN_ADDR_SIZE, area_id);
! 1169:
! 1170: area = ospf_area_lookup_by_area_id (ospf, *area_id);
! 1171: if (! area)
! 1172: return NULL;
! 1173:
! 1174: offset += IN_ADDR_SIZE;
! 1175:
! 1176: /* Lookup area range. */
! 1177: oid2in_addr (offset, IN_ADDR_SIZE, range_net);
! 1178: p.prefix = *range_net;
! 1179:
! 1180: return ospf_area_range_lookup (area, &p);
! 1181: }
! 1182: else
! 1183: {
! 1184: /* Set OID offset for Area ID. */
! 1185: offset = name + v->namelen;
! 1186: offsetlen = *length - v->namelen;
! 1187:
! 1188: len = offsetlen;
! 1189: if (len > IN_ADDR_SIZE)
! 1190: len = IN_ADDR_SIZE;
! 1191:
! 1192: oid2in_addr (offset, len, area_id);
! 1193:
! 1194: /* First we search area. */
! 1195: if (len == IN_ADDR_SIZE)
! 1196: area = ospf_area_lookup_by_area_id (ospf,*area_id);
! 1197: else
! 1198: area = ospf_area_lookup_next (ospf, area_id, len == 0 ? 1 : 0);
! 1199:
! 1200: if (area == NULL)
! 1201: return NULL;
! 1202:
! 1203: do
! 1204: {
! 1205: offset += IN_ADDR_SIZE;
! 1206: offsetlen -= IN_ADDR_SIZE;
! 1207: len = offsetlen;
! 1208:
! 1209: if (len < 0)
! 1210: len = 0;
! 1211: if (len > IN_ADDR_SIZE)
! 1212: len = IN_ADDR_SIZE;
! 1213:
! 1214: oid2in_addr (offset, len, range_net);
! 1215:
! 1216: range = ospf_area_range_lookup_next (area, range_net,
! 1217: len == 0 ? 1 : 0);
! 1218:
! 1219: if (range)
! 1220: {
! 1221: /* Fill in length. */
! 1222: *length = v->namelen + IN_ADDR_SIZE + IN_ADDR_SIZE;
! 1223:
! 1224: /* Fill in value. */
! 1225: offset = name + v->namelen;
! 1226: oid_copy_addr (offset, area_id, IN_ADDR_SIZE);
! 1227: offset += IN_ADDR_SIZE;
! 1228: oid_copy_addr (offset, range_net, IN_ADDR_SIZE);
! 1229:
! 1230: return range;
! 1231: }
! 1232: }
! 1233: while ((area = ospf_area_lookup_next (ospf, area_id, 0)) != NULL);
! 1234: }
! 1235: return NULL;
! 1236: }
! 1237:
! 1238: static u_char *
! 1239: ospfAreaRangeEntry (struct variable *v, oid *name, size_t *length, int exact,
! 1240: size_t *var_len, WriteMethod **write_method)
! 1241: {
! 1242: struct ospf_area_range *range;
! 1243: struct in_addr area_id;
! 1244: struct in_addr range_net;
! 1245: struct in_addr mask;
! 1246: struct ospf *ospf;
! 1247:
! 1248: /* Check OSPF instance. */
! 1249: ospf = ospf_lookup ();
! 1250: if (ospf == NULL)
! 1251: return NULL;
! 1252:
! 1253: memset (&area_id, 0, IN_ADDR_SIZE);
! 1254: memset (&range_net, 0, IN_ADDR_SIZE);
! 1255:
! 1256: range = ospfAreaRangeLookup (v, name, length, &area_id, &range_net, exact);
! 1257: if (! range)
! 1258: return NULL;
! 1259:
! 1260: /* Convert prefixlen to network mask format. */
! 1261: masklen2ip (range->subst_masklen, &mask);
! 1262:
! 1263: /* Return the current value of the variable */
! 1264: switch (v->magic)
! 1265: {
! 1266: case OSPFAREARANGEAREAID: /* 1 */
! 1267: return SNMP_IPADDRESS (area_id);
! 1268: break;
! 1269: case OSPFAREARANGENET: /* 2 */
! 1270: return SNMP_IPADDRESS (range_net);
! 1271: break;
! 1272: case OSPFAREARANGEMASK: /* 3 */
! 1273: return SNMP_IPADDRESS (mask);
! 1274: break;
! 1275: case OSPFAREARANGESTATUS: /* 4 */
! 1276: return SNMP_INTEGER (SNMP_VALID);
! 1277: break;
! 1278: case OSPFAREARANGEEFFECT: /* 5 */
! 1279: #define OSPF_advertiseMatching 1
! 1280: #define OSPF_doNotAdvertiseMatching 2
! 1281: return SNMP_INTEGER (OSPF_advertiseMatching);
! 1282: break;
! 1283: default:
! 1284: return NULL;
! 1285: break;
! 1286: }
! 1287: return NULL;
! 1288: }
! 1289:
! 1290: static struct ospf_nbr_nbma *
! 1291: ospfHostLookup (struct variable *v, oid *name, size_t *length,
! 1292: struct in_addr *addr, int exact)
! 1293: {
! 1294: int len;
! 1295: struct ospf_nbr_nbma *nbr_nbma;
! 1296: struct ospf *ospf;
! 1297:
! 1298: ospf = ospf_lookup ();
! 1299: if (ospf == NULL)
! 1300: return NULL;
! 1301:
! 1302: if (exact)
! 1303: {
! 1304: /* INDEX { ospfHostIpAddress, ospfHostTOS } */
! 1305: if (*length != v->namelen + IN_ADDR_SIZE + 1)
! 1306: return NULL;
! 1307:
! 1308: /* Check ospfHostTOS. */
! 1309: if (name[*length - 1] != 0)
! 1310: return NULL;
! 1311:
! 1312: oid2in_addr (name + v->namelen, IN_ADDR_SIZE, addr);
! 1313:
! 1314: nbr_nbma = ospf_nbr_nbma_lookup (ospf, *addr);
! 1315:
! 1316: return nbr_nbma;
! 1317: }
! 1318: else
! 1319: {
! 1320: len = *length - v->namelen;
! 1321: if (len > 4)
! 1322: len = 4;
! 1323:
! 1324: oid2in_addr (name + v->namelen, len, addr);
! 1325:
! 1326: nbr_nbma = ospf_nbr_nbma_lookup_next (ospf, addr, len == 0 ? 1 : 0);
! 1327:
! 1328: if (nbr_nbma == NULL)
! 1329: return NULL;
! 1330:
! 1331: oid_copy_addr (name + v->namelen, addr, IN_ADDR_SIZE);
! 1332:
! 1333: /* Set TOS 0. */
! 1334: name[v->namelen + IN_ADDR_SIZE] = 0;
! 1335:
! 1336: *length = v->namelen + IN_ADDR_SIZE + 1;
! 1337:
! 1338: return nbr_nbma;
! 1339: }
! 1340: return NULL;
! 1341: }
! 1342:
! 1343: static u_char *
! 1344: ospfHostEntry (struct variable *v, oid *name, size_t *length, int exact,
! 1345: size_t *var_len, WriteMethod **write_method)
! 1346: {
! 1347: struct ospf_nbr_nbma *nbr_nbma;
! 1348: struct ospf_interface *oi;
! 1349: struct in_addr addr;
! 1350: struct ospf *ospf;
! 1351:
! 1352: /* Check OSPF instance. */
! 1353: ospf = ospf_lookup ();
! 1354: if (ospf == NULL)
! 1355: return NULL;
! 1356:
! 1357: memset (&addr, 0, sizeof (struct in_addr));
! 1358:
! 1359: nbr_nbma = ospfHostLookup (v, name, length, &addr, exact);
! 1360: if (nbr_nbma == NULL)
! 1361: return NULL;
! 1362:
! 1363: oi = nbr_nbma->oi;
! 1364:
! 1365: /* Return the current value of the variable */
! 1366: switch (v->magic)
! 1367: {
! 1368: case OSPFHOSTIPADDRESS: /* 1 */
! 1369: return SNMP_IPADDRESS (nbr_nbma->addr);
! 1370: break;
! 1371: case OSPFHOSTTOS: /* 2 */
! 1372: return SNMP_INTEGER (0);
! 1373: break;
! 1374: case OSPFHOSTMETRIC: /* 3 */
! 1375: if (oi)
! 1376: return SNMP_INTEGER (oi->output_cost);
! 1377: else
! 1378: return SNMP_INTEGER (1);
! 1379: break;
! 1380: case OSPFHOSTSTATUS: /* 4 */
! 1381: return SNMP_INTEGER (SNMP_VALID);
! 1382: break;
! 1383: case OSPFHOSTAREAID: /* 5 */
! 1384: if (oi && oi->area)
! 1385: return SNMP_IPADDRESS (oi->area->area_id);
! 1386: else
! 1387: return SNMP_IPADDRESS (ospf_empty_addr);
! 1388: break;
! 1389: default:
! 1390: return NULL;
! 1391: break;
! 1392: }
! 1393: return NULL;
! 1394: }
! 1395:
! 1396: struct list *ospf_snmp_iflist;
! 1397:
! 1398: struct ospf_snmp_if
! 1399: {
! 1400: struct in_addr addr;
! 1401: unsigned int ifindex;
! 1402: struct interface *ifp;
! 1403: };
! 1404:
! 1405: static struct ospf_snmp_if *
! 1406: ospf_snmp_if_new (void)
! 1407: {
! 1408: return XCALLOC (0, sizeof (struct ospf_snmp_if));
! 1409: }
! 1410:
! 1411: static void
! 1412: ospf_snmp_if_free (struct ospf_snmp_if *osif)
! 1413: {
! 1414: XFREE (0, osif);
! 1415: }
! 1416:
! 1417: void
! 1418: ospf_snmp_if_delete (struct interface *ifp)
! 1419: {
! 1420: struct listnode *node, *nnode;
! 1421: struct ospf_snmp_if *osif;
! 1422:
! 1423: for (ALL_LIST_ELEMENTS (ospf_snmp_iflist, node, nnode, osif))
! 1424: {
! 1425: if (osif->ifp == ifp)
! 1426: {
! 1427: list_delete_node (ospf_snmp_iflist, node);
! 1428: ospf_snmp_if_free (osif);
! 1429: return;
! 1430: }
! 1431: }
! 1432: }
! 1433:
! 1434: void
! 1435: ospf_snmp_if_update (struct interface *ifp)
! 1436: {
! 1437: struct listnode *node;
! 1438: struct listnode *pn;
! 1439: struct connected *ifc;
! 1440: struct prefix *p;
! 1441: struct ospf_snmp_if *osif;
! 1442: struct in_addr *addr;
! 1443: unsigned int ifindex;
! 1444:
! 1445: ospf_snmp_if_delete (ifp);
! 1446:
! 1447: p = NULL;
! 1448: addr = NULL;
! 1449: ifindex = 0;
! 1450:
! 1451: /* Lookup first IPv4 address entry. */
! 1452: for (ALL_LIST_ELEMENTS_RO (ifp->connected, node, ifc))
! 1453: {
! 1454: p = CONNECTED_ID(ifc);
! 1455:
! 1456: if (p->family == AF_INET)
! 1457: {
! 1458: addr = &p->u.prefix4;
! 1459: break;
! 1460: }
! 1461: }
! 1462: if (! addr)
! 1463: ifindex = ifp->ifindex;
! 1464:
! 1465: /* Add interface to the list. */
! 1466: pn = NULL;
! 1467: for (ALL_LIST_ELEMENTS_RO (ospf_snmp_iflist, node, osif))
! 1468: {
! 1469: if (addr)
! 1470: {
! 1471: /* Usual interfaces --> Sort them based on interface IPv4 addresses */
! 1472: if (ntohl (osif->addr.s_addr) > ntohl (addr->s_addr))
! 1473: break;
! 1474: }
! 1475: else
! 1476: {
! 1477: /* Unnumbered interfaces --> Sort them based on interface indexes */
! 1478: if (osif->addr.s_addr != 0 || osif->ifindex > ifindex)
! 1479: break;
! 1480: }
! 1481: pn = node;
! 1482: }
! 1483:
! 1484: osif = ospf_snmp_if_new ();
! 1485: if (addr) /* Usual interface */
! 1486: {
! 1487: osif->addr = *addr;
! 1488:
! 1489: /* This field is used for storing ospfAddressLessIf OID value,
! 1490: * conform to RFC1850 OSPF-MIB specification, it must be 0 for
! 1491: * usual interface */
! 1492: osif->ifindex = 0;
! 1493: }
! 1494: else /* Unnumbered interface */
! 1495: osif->ifindex = ifindex;
! 1496: osif->ifp = ifp;
! 1497:
! 1498: listnode_add_after (ospf_snmp_iflist, pn, osif);
! 1499: }
! 1500:
! 1501: static int
! 1502: ospf_snmp_is_if_have_addr (struct interface *ifp)
! 1503: {
! 1504: struct listnode *nn;
! 1505: struct connected *ifc;
! 1506:
! 1507: /* Is this interface having any connected IPv4 address ? */
! 1508: for (ALL_LIST_ELEMENTS_RO (ifp->connected, nn, ifc))
! 1509: {
! 1510: if (CONNECTED_PREFIX(ifc)->family == AF_INET)
! 1511: return 1;
! 1512: }
! 1513:
! 1514: return 0;
! 1515: }
! 1516:
! 1517: static struct ospf_interface *
! 1518: ospf_snmp_if_lookup (struct in_addr *ifaddr, unsigned int *ifindex)
! 1519: {
! 1520: struct listnode *node;
! 1521: struct ospf_snmp_if *osif;
! 1522: struct ospf_interface *oi = NULL;
! 1523: struct ospf *ospf = ospf_lookup ();
! 1524:
! 1525: for (ALL_LIST_ELEMENTS_RO (ospf_snmp_iflist, node, osif))
! 1526: {
! 1527: if (ifaddr->s_addr)
! 1528: {
! 1529: if (IPV4_ADDR_SAME (&osif->addr, ifaddr))
! 1530: oi = ospf_if_lookup_by_local_addr (ospf, osif->ifp, *ifaddr);
! 1531: }
! 1532: else
! 1533: {
! 1534: if (osif->ifindex == *ifindex)
! 1535: oi = ospf_if_lookup_by_local_addr (ospf, osif->ifp, *ifaddr);
! 1536: }
! 1537: }
! 1538: return oi;
! 1539: }
! 1540:
! 1541: static struct ospf_interface *
! 1542: ospf_snmp_if_lookup_next (struct in_addr *ifaddr, unsigned int *ifindex,
! 1543: int ifaddr_next, int ifindex_next)
! 1544: {
! 1545: struct ospf_snmp_if *osif;
! 1546: struct listnode *nn;
! 1547: struct ospf *ospf = ospf_lookup ();
! 1548: struct ospf_interface *oi = NULL;
! 1549:
! 1550: if (ospf == NULL)
! 1551: return NULL;
! 1552:
! 1553: /* No instance is specified --> Return the first OSPF interface */
! 1554: if (ifaddr_next)
! 1555: {
! 1556: for (ALL_LIST_ELEMENTS_RO (ospf_snmp_iflist, nn, osif))
! 1557: {
! 1558: osif = listgetdata (nn);
! 1559: *ifaddr = osif->addr;
! 1560: *ifindex = osif->ifindex;
! 1561: /* Because no instance is specified, we don't care about the kind of
! 1562: * interface (usual or unnumbered), just returning the first valid
! 1563: * OSPF interface */
! 1564: oi = ospf_if_lookup_by_local_addr (ospf, osif->ifp, *ifaddr);
! 1565: if (oi)
! 1566: return (oi);
! 1567: }
! 1568: return NULL;
! 1569: }
! 1570:
! 1571: /* An instance is specified --> Return the next OSPF interface */
! 1572: for (ALL_LIST_ELEMENTS_RO (ospf_snmp_iflist, nn, osif))
! 1573: {
! 1574: /* Usual interface */
! 1575: if (ifaddr->s_addr)
! 1576: {
! 1577: /* The interface must have valid AF_INET connected address */
! 1578: /* it must have lager IPv4 address value than the lookup entry */
! 1579: if ((ospf_snmp_is_if_have_addr(osif->ifp)) &&
! 1580: (ntohl (osif->addr.s_addr) > ntohl (ifaddr->s_addr)))
! 1581: {
! 1582: *ifaddr = osif->addr;
! 1583: *ifindex = osif->ifindex;
! 1584:
! 1585: /* and it must be an OSPF interface */
! 1586: oi = ospf_if_lookup_by_local_addr (ospf, osif->ifp, *ifaddr);
! 1587: if (oi)
! 1588: return oi;
! 1589: }
! 1590: }
! 1591: /* Unnumbered interface */
! 1592: else
! 1593: /* The interface must NOT have valid AF_INET connected address */
! 1594: /* it must have lager interface index than the lookup entry */
! 1595: if ((!ospf_snmp_is_if_have_addr(osif->ifp)) &&
! 1596: (osif->ifindex > *ifindex))
! 1597: {
! 1598: *ifaddr = osif->addr;
! 1599: *ifindex = osif->ifindex;
! 1600:
! 1601: /* and it must be an OSPF interface */
! 1602: oi = ospf_if_lookup_by_local_addr (ospf, osif->ifp, *ifaddr);
! 1603: if (oi)
! 1604: return oi;
! 1605: }
! 1606: }
! 1607: return NULL;
! 1608: }
! 1609:
! 1610: static int
! 1611: ospf_snmp_iftype (struct interface *ifp)
! 1612: {
! 1613: #define ospf_snmp_iftype_broadcast 1
! 1614: #define ospf_snmp_iftype_nbma 2
! 1615: #define ospf_snmp_iftype_pointToPoint 3
! 1616: #define ospf_snmp_iftype_pointToMultipoint 5
! 1617: if (if_is_broadcast (ifp))
! 1618: return ospf_snmp_iftype_broadcast;
! 1619: if (if_is_pointopoint (ifp))
! 1620: return ospf_snmp_iftype_pointToPoint;
! 1621: return ospf_snmp_iftype_broadcast;
! 1622: }
! 1623:
! 1624: static struct ospf_interface *
! 1625: ospfIfLookup (struct variable *v, oid *name, size_t *length,
! 1626: struct in_addr *ifaddr, unsigned int *ifindex, int exact)
! 1627: {
! 1628: unsigned int len;
! 1629: int ifaddr_next = 0;
! 1630: int ifindex_next = 0;
! 1631: struct ospf_interface *oi;
! 1632: oid *offset;
! 1633:
! 1634: if (exact)
! 1635: {
! 1636: if (*length != v->namelen + IN_ADDR_SIZE + 1)
! 1637: return NULL;
! 1638:
! 1639: oid2in_addr (name + v->namelen, IN_ADDR_SIZE, ifaddr);
! 1640: *ifindex = name[v->namelen + IN_ADDR_SIZE];
! 1641:
! 1642: return ospf_snmp_if_lookup (ifaddr, ifindex);
! 1643: }
! 1644: else
! 1645: {
! 1646: len = *length - v->namelen;
! 1647: if (len >= IN_ADDR_SIZE)
! 1648: len = IN_ADDR_SIZE;
! 1649: if (len <= 0)
! 1650: ifaddr_next = 1;
! 1651:
! 1652: oid2in_addr (name + v->namelen, len, ifaddr);
! 1653:
! 1654: len = *length - v->namelen - IN_ADDR_SIZE;
! 1655: if (len >= 1)
! 1656: len = 1;
! 1657: else
! 1658: ifindex_next = 1;
! 1659:
! 1660: if (len == 1)
! 1661: *ifindex = name[v->namelen + IN_ADDR_SIZE];
! 1662:
! 1663: oi = ospf_snmp_if_lookup_next (ifaddr, ifindex, ifaddr_next,
! 1664: ifindex_next);
! 1665: if (oi)
! 1666: {
! 1667: *length = v->namelen + IN_ADDR_SIZE + 1;
! 1668: offset = name + v->namelen;
! 1669: oid_copy_addr (offset, ifaddr, IN_ADDR_SIZE);
! 1670: offset += IN_ADDR_SIZE;
! 1671: *offset = *ifindex;
! 1672: return oi;
! 1673: }
! 1674: }
! 1675: return NULL;
! 1676: }
! 1677:
! 1678: static u_char *
! 1679: ospfIfEntry (struct variable *v, oid *name, size_t *length, int exact,
! 1680: size_t *var_len, WriteMethod **write_method)
! 1681: {
! 1682: unsigned int ifindex;
! 1683: struct in_addr ifaddr;
! 1684: struct ospf_interface *oi;
! 1685: struct ospf *ospf;
! 1686:
! 1687: ifindex = 0;
! 1688: memset (&ifaddr, 0, sizeof (struct in_addr));
! 1689:
! 1690: /* Check OSPF instance. */
! 1691: ospf = ospf_lookup ();
! 1692: if (ospf == NULL)
! 1693: return NULL;
! 1694:
! 1695: oi = ospfIfLookup (v, name, length, &ifaddr, &ifindex, exact);
! 1696: if (oi == NULL)
! 1697: return NULL;
! 1698:
! 1699: /* Return the current value of the variable */
! 1700: switch (v->magic)
! 1701: {
! 1702: case OSPFIFIPADDRESS: /* 1 */
! 1703: return SNMP_IPADDRESS (ifaddr);
! 1704: break;
! 1705: case OSPFADDRESSLESSIF: /* 2 */
! 1706: return SNMP_INTEGER (ifindex);
! 1707: break;
! 1708: case OSPFIFAREAID: /* 3 */
! 1709: if (oi->area)
! 1710: return SNMP_IPADDRESS (oi->area->area_id);
! 1711: else
! 1712: return SNMP_IPADDRESS (ospf_empty_addr);
! 1713: break;
! 1714: case OSPFIFTYPE: /* 4 */
! 1715: return SNMP_INTEGER (ospf_snmp_iftype (oi->ifp));
! 1716: break;
! 1717: case OSPFIFADMINSTAT: /* 5 */
! 1718: if (oi)
! 1719: return SNMP_INTEGER (OSPF_STATUS_ENABLED);
! 1720: else
! 1721: return SNMP_INTEGER (OSPF_STATUS_DISABLED);
! 1722: break;
! 1723: case OSPFIFRTRPRIORITY: /* 6 */
! 1724: return SNMP_INTEGER (PRIORITY (oi));
! 1725: break;
! 1726: case OSPFIFTRANSITDELAY: /* 7 */
! 1727: return SNMP_INTEGER (OSPF_IF_PARAM (oi, transmit_delay));
! 1728: break;
! 1729: case OSPFIFRETRANSINTERVAL: /* 8 */
! 1730: return SNMP_INTEGER (OSPF_IF_PARAM (oi, retransmit_interval));
! 1731: break;
! 1732: case OSPFIFHELLOINTERVAL: /* 9 */
! 1733: return SNMP_INTEGER (OSPF_IF_PARAM (oi, v_hello));
! 1734: break;
! 1735: case OSPFIFRTRDEADINTERVAL: /* 10 */
! 1736: return SNMP_INTEGER (OSPF_IF_PARAM (oi, v_wait));
! 1737: break;
! 1738: case OSPFIFPOLLINTERVAL: /* 11 */
! 1739: return SNMP_INTEGER (OSPF_POLL_INTERVAL_DEFAULT);
! 1740: break;
! 1741: case OSPFIFSTATE: /* 12 */
! 1742: return SNMP_INTEGER (ISM_SNMP(oi->state));
! 1743: break;
! 1744: case OSPFIFDESIGNATEDROUTER: /* 13 */
! 1745: return SNMP_IPADDRESS (DR (oi));
! 1746: break;
! 1747: case OSPFIFBACKUPDESIGNATEDROUTER: /* 14 */
! 1748: return SNMP_IPADDRESS (BDR (oi));
! 1749: break;
! 1750: case OSPFIFEVENTS: /* 15 */
! 1751: return SNMP_INTEGER (oi->state_change);
! 1752: break;
! 1753: case OSPFIFAUTHKEY: /* 16 */
! 1754: *var_len = 0;
! 1755: return (u_char *) OSPF_IF_PARAM (oi, auth_simple);
! 1756: break;
! 1757: case OSPFIFSTATUS: /* 17 */
! 1758: return SNMP_INTEGER (SNMP_VALID);
! 1759: break;
! 1760: case OSPFIFMULTICASTFORWARDING: /* 18 */
! 1761: #define ospf_snmp_multiforward_blocked 1
! 1762: #define ospf_snmp_multiforward_multicast 2
! 1763: #define ospf_snmp_multiforward_unicast 3
! 1764: return SNMP_INTEGER (ospf_snmp_multiforward_blocked);
! 1765: break;
! 1766: case OSPFIFDEMAND: /* 19 */
! 1767: return SNMP_INTEGER (SNMP_FALSE);
! 1768: break;
! 1769: case OSPFIFAUTHTYPE: /* 20 */
! 1770: if (oi->area)
! 1771: return SNMP_INTEGER (oi->area->auth_type);
! 1772: else
! 1773: return SNMP_INTEGER (0);
! 1774: break;
! 1775: default:
! 1776: return NULL;
! 1777: break;
! 1778: }
! 1779: return NULL;
! 1780: }
! 1781:
! 1782: #define OSPF_SNMP_METRIC_VALUE 1
! 1783:
! 1784: static struct ospf_interface *
! 1785: ospfIfMetricLookup (struct variable *v, oid *name, size_t *length,
! 1786: struct in_addr *ifaddr, unsigned int *ifindex, int exact)
! 1787: {
! 1788: unsigned int len;
! 1789: int ifaddr_next = 0;
! 1790: int ifindex_next = 0;
! 1791: struct ospf_interface *oi;
! 1792: oid *offset;
! 1793: int metric;
! 1794:
! 1795: if (exact)
! 1796: {
! 1797: if (*length != v->namelen + IN_ADDR_SIZE + 1 + 1)
! 1798: return NULL;
! 1799:
! 1800: oid2in_addr (name + v->namelen, IN_ADDR_SIZE, ifaddr);
! 1801: *ifindex = name[v->namelen + IN_ADDR_SIZE];
! 1802: metric = name[v->namelen + IN_ADDR_SIZE + 1];
! 1803:
! 1804: if (metric != OSPF_SNMP_METRIC_VALUE)
! 1805: return NULL;
! 1806:
! 1807: return ospf_snmp_if_lookup (ifaddr, ifindex);
! 1808: }
! 1809: else
! 1810: {
! 1811: len = *length - v->namelen;
! 1812: if (len >= IN_ADDR_SIZE)
! 1813: len = IN_ADDR_SIZE;
! 1814: else
! 1815: ifaddr_next = 1;
! 1816:
! 1817: oid2in_addr (name + v->namelen, len, ifaddr);
! 1818:
! 1819: len = *length - v->namelen - IN_ADDR_SIZE;
! 1820: if (len >= 1)
! 1821: len = 1;
! 1822: else
! 1823: ifindex_next = 1;
! 1824:
! 1825: if (len == 1)
! 1826: *ifindex = name[v->namelen + IN_ADDR_SIZE];
! 1827:
! 1828: oi = ospf_snmp_if_lookup_next (ifaddr, ifindex, ifaddr_next,
! 1829: ifindex_next);
! 1830: if (oi)
! 1831: {
! 1832: *length = v->namelen + IN_ADDR_SIZE + 1 + 1;
! 1833: offset = name + v->namelen;
! 1834: oid_copy_addr (offset, ifaddr, IN_ADDR_SIZE);
! 1835: offset += IN_ADDR_SIZE;
! 1836: *offset = *ifindex;
! 1837: offset++;
! 1838: *offset = OSPF_SNMP_METRIC_VALUE;
! 1839: return oi;
! 1840: }
! 1841: }
! 1842: return NULL;
! 1843: }
! 1844:
! 1845: static u_char *
! 1846: ospfIfMetricEntry (struct variable *v, oid *name, size_t *length, int exact,
! 1847: size_t *var_len, WriteMethod **write_method)
! 1848: {
! 1849: /* Currently we support metric 1 only. */
! 1850: unsigned int ifindex;
! 1851: struct in_addr ifaddr;
! 1852: struct ospf_interface *oi;
! 1853: struct ospf *ospf;
! 1854:
! 1855: ifindex = 0;
! 1856: memset (&ifaddr, 0, sizeof (struct in_addr));
! 1857:
! 1858: /* Check OSPF instance. */
! 1859: ospf = ospf_lookup ();
! 1860: if (ospf == NULL)
! 1861: return NULL;
! 1862:
! 1863: oi = ospfIfMetricLookup (v, name, length, &ifaddr, &ifindex, exact);
! 1864: if (oi == NULL)
! 1865: return NULL;
! 1866:
! 1867: /* Return the current value of the variable */
! 1868: switch (v->magic)
! 1869: {
! 1870: case OSPFIFMETRICIPADDRESS:
! 1871: return SNMP_IPADDRESS (ifaddr);
! 1872: break;
! 1873: case OSPFIFMETRICADDRESSLESSIF:
! 1874: return SNMP_INTEGER (ifindex);
! 1875: break;
! 1876: case OSPFIFMETRICTOS:
! 1877: return SNMP_INTEGER (0);
! 1878: break;
! 1879: case OSPFIFMETRICVALUE:
! 1880: return SNMP_INTEGER (OSPF_SNMP_METRIC_VALUE);
! 1881: break;
! 1882: case OSPFIFMETRICSTATUS:
! 1883: return SNMP_INTEGER (1);
! 1884: break;
! 1885: default:
! 1886: return NULL;
! 1887: break;
! 1888: }
! 1889: return NULL;
! 1890: }
! 1891:
! 1892: struct route_table *ospf_snmp_vl_table;
! 1893:
! 1894: void
! 1895: ospf_snmp_vl_add (struct ospf_vl_data *vl_data)
! 1896: {
! 1897: struct prefix_ls lp;
! 1898: struct route_node *rn;
! 1899:
! 1900: memset (&lp, 0, sizeof (struct prefix_ls));
! 1901: lp.family = 0;
! 1902: lp.prefixlen = 64;
! 1903: lp.id = vl_data->vl_area_id;
! 1904: lp.adv_router = vl_data->vl_peer;
! 1905:
! 1906: rn = route_node_get (ospf_snmp_vl_table, (struct prefix *) &lp);
! 1907: rn->info = vl_data;
! 1908: }
! 1909:
! 1910: void
! 1911: ospf_snmp_vl_delete (struct ospf_vl_data *vl_data)
! 1912: {
! 1913: struct prefix_ls lp;
! 1914: struct route_node *rn;
! 1915:
! 1916: memset (&lp, 0, sizeof (struct prefix_ls));
! 1917: lp.family = 0;
! 1918: lp.prefixlen = 64;
! 1919: lp.id = vl_data->vl_area_id;
! 1920: lp.adv_router = vl_data->vl_peer;
! 1921:
! 1922: rn = route_node_lookup (ospf_snmp_vl_table, (struct prefix *) &lp);
! 1923: if (! rn)
! 1924: return;
! 1925: rn->info = NULL;
! 1926: route_unlock_node (rn);
! 1927: route_unlock_node (rn);
! 1928: }
! 1929:
! 1930: static struct ospf_vl_data *
! 1931: ospf_snmp_vl_lookup (struct in_addr *area_id, struct in_addr *neighbor)
! 1932: {
! 1933: struct prefix_ls lp;
! 1934: struct route_node *rn;
! 1935: struct ospf_vl_data *vl_data;
! 1936:
! 1937: memset (&lp, 0, sizeof (struct prefix_ls));
! 1938: lp.family = 0;
! 1939: lp.prefixlen = 64;
! 1940: lp.id = *area_id;
! 1941: lp.adv_router = *neighbor;
! 1942:
! 1943: rn = route_node_lookup (ospf_snmp_vl_table, (struct prefix *) &lp);
! 1944: if (rn)
! 1945: {
! 1946: vl_data = rn->info;
! 1947: route_unlock_node (rn);
! 1948: return vl_data;
! 1949: }
! 1950: return NULL;
! 1951: }
! 1952:
! 1953: static struct ospf_vl_data *
! 1954: ospf_snmp_vl_lookup_next (struct in_addr *area_id, struct in_addr *neighbor,
! 1955: int first)
! 1956: {
! 1957: struct prefix_ls lp;
! 1958: struct route_node *rn;
! 1959: struct ospf_vl_data *vl_data;
! 1960:
! 1961: memset (&lp, 0, sizeof (struct prefix_ls));
! 1962: lp.family = 0;
! 1963: lp.prefixlen = 64;
! 1964: lp.id = *area_id;
! 1965: lp.adv_router = *neighbor;
! 1966:
! 1967: if (first)
! 1968: rn = route_top (ospf_snmp_vl_table);
! 1969: else
! 1970: {
! 1971: rn = route_node_get (ospf_snmp_vl_table, (struct prefix *) &lp);
! 1972: rn = route_next (rn);
! 1973: }
! 1974:
! 1975: for (; rn; rn = route_next (rn))
! 1976: if (rn->info)
! 1977: break;
! 1978:
! 1979: if (rn && rn->info)
! 1980: {
! 1981: vl_data = rn->info;
! 1982: *area_id = vl_data->vl_area_id;
! 1983: *neighbor = vl_data->vl_peer;
! 1984: route_unlock_node (rn);
! 1985: return vl_data;
! 1986: }
! 1987: return NULL;
! 1988: }
! 1989:
! 1990: static struct ospf_vl_data *
! 1991: ospfVirtIfLookup (struct variable *v, oid *name, size_t *length,
! 1992: struct in_addr *area_id, struct in_addr *neighbor, int exact)
! 1993: {
! 1994: int first;
! 1995: unsigned int len;
! 1996: struct ospf_vl_data *vl_data;
! 1997:
! 1998: if (exact)
! 1999: {
! 2000: if (*length != v->namelen + IN_ADDR_SIZE + IN_ADDR_SIZE)
! 2001: return NULL;
! 2002:
! 2003: oid2in_addr (name + v->namelen, IN_ADDR_SIZE, area_id);
! 2004: oid2in_addr (name + v->namelen + IN_ADDR_SIZE, IN_ADDR_SIZE, neighbor);
! 2005:
! 2006: return ospf_snmp_vl_lookup (area_id, neighbor);
! 2007: }
! 2008: else
! 2009: {
! 2010: first = 0;
! 2011:
! 2012: len = *length - v->namelen;
! 2013: if (len <= 0)
! 2014: first = 1;
! 2015: if (len > IN_ADDR_SIZE)
! 2016: len = IN_ADDR_SIZE;
! 2017: oid2in_addr (name + v->namelen, len, area_id);
! 2018:
! 2019: len = *length - v->namelen - IN_ADDR_SIZE;
! 2020: if (len > IN_ADDR_SIZE)
! 2021: len = IN_ADDR_SIZE;
! 2022: oid2in_addr (name + v->namelen + IN_ADDR_SIZE, len, neighbor);
! 2023:
! 2024: vl_data = ospf_snmp_vl_lookup_next (area_id, neighbor, first);
! 2025:
! 2026: if (vl_data)
! 2027: {
! 2028: *length = v->namelen + IN_ADDR_SIZE + IN_ADDR_SIZE;
! 2029: oid_copy_addr (name + v->namelen, area_id, IN_ADDR_SIZE);
! 2030: oid_copy_addr (name + v->namelen + IN_ADDR_SIZE, neighbor,
! 2031: IN_ADDR_SIZE);
! 2032: return vl_data;
! 2033: }
! 2034: }
! 2035: return NULL;
! 2036: }
! 2037:
! 2038: static u_char *
! 2039: ospfVirtIfEntry (struct variable *v, oid *name, size_t *length, int exact,
! 2040: size_t *var_len, WriteMethod **write_method)
! 2041: {
! 2042: struct ospf_vl_data *vl_data;
! 2043: struct ospf_interface *oi;
! 2044: struct in_addr area_id;
! 2045: struct in_addr neighbor;
! 2046:
! 2047: memset (&area_id, 0, sizeof (struct in_addr));
! 2048: memset (&neighbor, 0, sizeof (struct in_addr));
! 2049:
! 2050: vl_data = ospfVirtIfLookup (v, name, length, &area_id, &neighbor, exact);
! 2051: if (! vl_data)
! 2052: return NULL;
! 2053: oi = vl_data->vl_oi;
! 2054: if (! oi)
! 2055: return NULL;
! 2056:
! 2057: /* Return the current value of the variable */
! 2058: switch (v->magic)
! 2059: {
! 2060: case OSPFVIRTIFAREAID:
! 2061: return SNMP_IPADDRESS (area_id);
! 2062: break;
! 2063: case OSPFVIRTIFNEIGHBOR:
! 2064: return SNMP_IPADDRESS (neighbor);
! 2065: break;
! 2066: case OSPFVIRTIFTRANSITDELAY:
! 2067: return SNMP_INTEGER (OSPF_IF_PARAM (oi, transmit_delay));
! 2068: break;
! 2069: case OSPFVIRTIFRETRANSINTERVAL:
! 2070: return SNMP_INTEGER (OSPF_IF_PARAM (oi, retransmit_interval));
! 2071: break;
! 2072: case OSPFVIRTIFHELLOINTERVAL:
! 2073: return SNMP_INTEGER (OSPF_IF_PARAM (oi, v_hello));
! 2074: break;
! 2075: case OSPFVIRTIFRTRDEADINTERVAL:
! 2076: return SNMP_INTEGER (OSPF_IF_PARAM (oi, v_wait));
! 2077: break;
! 2078: case OSPFVIRTIFSTATE:
! 2079: return SNMP_INTEGER (oi->state);
! 2080: break;
! 2081: case OSPFVIRTIFEVENTS:
! 2082: return SNMP_INTEGER (oi->state_change);
! 2083: break;
! 2084: case OSPFVIRTIFAUTHKEY:
! 2085: *var_len = 0;
! 2086: return (u_char *) OSPF_IF_PARAM (oi, auth_simple);
! 2087: break;
! 2088: case OSPFVIRTIFSTATUS:
! 2089: return SNMP_INTEGER (SNMP_VALID);
! 2090: break;
! 2091: case OSPFVIRTIFAUTHTYPE:
! 2092: if (oi->area)
! 2093: return SNMP_INTEGER (oi->area->auth_type);
! 2094: else
! 2095: return SNMP_INTEGER (0);
! 2096: break;
! 2097: default:
! 2098: return NULL;
! 2099: break;
! 2100: }
! 2101: return NULL;
! 2102: }
! 2103:
! 2104: static struct ospf_neighbor *
! 2105: ospf_snmp_nbr_lookup (struct ospf *ospf, struct in_addr *nbr_addr,
! 2106: unsigned int *ifindex)
! 2107: {
! 2108: struct listnode *node, *nnode;
! 2109: struct ospf_interface *oi;
! 2110: struct ospf_neighbor *nbr;
! 2111: struct route_node *rn;
! 2112:
! 2113: for (ALL_LIST_ELEMENTS (ospf->oiflist, node, nnode, oi))
! 2114: {
! 2115: for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
! 2116: if ((nbr = rn->info) != NULL
! 2117: && nbr != oi->nbr_self
! 2118: /* If EXACT match is needed, provide ALL entry found
! 2119: && nbr->state != NSM_Down
! 2120: */
! 2121: && nbr->src.s_addr != 0)
! 2122: {
! 2123: if (IPV4_ADDR_SAME (&nbr->src, nbr_addr))
! 2124: {
! 2125: route_unlock_node (rn);
! 2126: return nbr;
! 2127: }
! 2128: }
! 2129: }
! 2130: return NULL;
! 2131: }
! 2132:
! 2133: static struct ospf_neighbor *
! 2134: ospf_snmp_nbr_lookup_next (struct in_addr *nbr_addr, unsigned int *ifindex,
! 2135: int first)
! 2136: {
! 2137: struct listnode *nn;
! 2138: struct ospf_interface *oi;
! 2139: struct ospf_neighbor *nbr;
! 2140: struct route_node *rn;
! 2141: struct ospf_neighbor *min = NULL;
! 2142: struct ospf *ospf = ospf;
! 2143:
! 2144: ospf = ospf_lookup ();
! 2145:
! 2146: for (ALL_LIST_ELEMENTS_RO (ospf->oiflist, nn, oi))
! 2147: {
! 2148: for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
! 2149: if ((nbr = rn->info) != NULL
! 2150: && nbr != oi->nbr_self
! 2151: && nbr->state != NSM_Down
! 2152: && nbr->src.s_addr != 0)
! 2153: {
! 2154: if (first)
! 2155: {
! 2156: if (! min)
! 2157: min = nbr;
! 2158: else if (ntohl (nbr->src.s_addr) < ntohl (min->src.s_addr))
! 2159: min = nbr;
! 2160: }
! 2161: else if (ntohl (nbr->src.s_addr) > ntohl (nbr_addr->s_addr))
! 2162: {
! 2163: if (! min)
! 2164: min = nbr;
! 2165: else if (ntohl (nbr->src.s_addr) < ntohl (min->src.s_addr))
! 2166: min = nbr;
! 2167: }
! 2168: }
! 2169: }
! 2170: if (min)
! 2171: {
! 2172: *nbr_addr = min->src;
! 2173: *ifindex = 0;
! 2174: return min;
! 2175: }
! 2176: return NULL;
! 2177: }
! 2178:
! 2179: static struct ospf_neighbor *
! 2180: ospfNbrLookup (struct variable *v, oid *name, size_t *length,
! 2181: struct in_addr *nbr_addr, unsigned int *ifindex, int exact)
! 2182: {
! 2183: unsigned int len;
! 2184: int first;
! 2185: struct ospf_neighbor *nbr;
! 2186: struct ospf *ospf;
! 2187:
! 2188: ospf = ospf_lookup ();
! 2189:
! 2190: if (! ospf)
! 2191: return NULL;
! 2192:
! 2193: if (exact)
! 2194: {
! 2195: if (*length != v->namelen + IN_ADDR_SIZE + 1)
! 2196: return NULL;
! 2197:
! 2198: oid2in_addr (name + v->namelen, IN_ADDR_SIZE, nbr_addr);
! 2199: *ifindex = name[v->namelen + IN_ADDR_SIZE];
! 2200:
! 2201: return ospf_snmp_nbr_lookup (ospf, nbr_addr, ifindex);
! 2202: }
! 2203: else
! 2204: {
! 2205: first = 0;
! 2206: len = *length - v->namelen;
! 2207:
! 2208: if (len <= 0)
! 2209: first = 1;
! 2210:
! 2211: if (len > IN_ADDR_SIZE)
! 2212: len = IN_ADDR_SIZE;
! 2213:
! 2214: oid2in_addr (name + v->namelen, len, nbr_addr);
! 2215:
! 2216: len = *length - v->namelen - IN_ADDR_SIZE;
! 2217: if (len >= 1)
! 2218: *ifindex = name[v->namelen + IN_ADDR_SIZE];
! 2219:
! 2220: nbr = ospf_snmp_nbr_lookup_next (nbr_addr, ifindex, first);
! 2221:
! 2222: if (nbr)
! 2223: {
! 2224: *length = v->namelen + IN_ADDR_SIZE + 1;
! 2225: oid_copy_addr (name + v->namelen, nbr_addr, IN_ADDR_SIZE);
! 2226: name[v->namelen + IN_ADDR_SIZE] = *ifindex;
! 2227: return nbr;
! 2228: }
! 2229: }
! 2230: return NULL;
! 2231: }
! 2232:
! 2233: /* map internal quagga neighbor states to official MIB values:
! 2234:
! 2235: ospfNbrState OBJECT-TYPE
! 2236: SYNTAX INTEGER {
! 2237: down (1),
! 2238: attempt (2),
! 2239: init (3),
! 2240: twoWay (4),
! 2241: exchangeStart (5),
! 2242: exchange (6),
! 2243: loading (7),
! 2244: full (8)
! 2245: }
! 2246: */
! 2247: static int32_t
! 2248: ospf_snmp_neighbor_state(u_char nst)
! 2249: {
! 2250: switch (nst)
! 2251: {
! 2252: case NSM_Attempt:
! 2253: return 2;
! 2254: case NSM_Init:
! 2255: return 3;
! 2256: case NSM_TwoWay:
! 2257: return 4;
! 2258: case NSM_ExStart:
! 2259: return 5;
! 2260: case NSM_Exchange:
! 2261: return 6;
! 2262: case NSM_Loading:
! 2263: return 7;
! 2264: case NSM_Full:
! 2265: return 8;
! 2266: default:
! 2267: return 1; /* down */
! 2268: }
! 2269: }
! 2270:
! 2271: static u_char *
! 2272: ospfNbrEntry (struct variable *v, oid *name, size_t *length, int exact,
! 2273: size_t *var_len, WriteMethod **write_method)
! 2274: {
! 2275: struct in_addr nbr_addr;
! 2276: unsigned int ifindex;
! 2277: struct ospf_neighbor *nbr;
! 2278: struct ospf_interface *oi;
! 2279:
! 2280: memset (&nbr_addr, 0, sizeof (struct in_addr));
! 2281: ifindex = 0;
! 2282:
! 2283: nbr = ospfNbrLookup (v, name, length, &nbr_addr, &ifindex, exact);
! 2284: if (! nbr)
! 2285: return NULL;
! 2286: oi = nbr->oi;
! 2287: if (! oi)
! 2288: return NULL;
! 2289:
! 2290: /* Return the current value of the variable */
! 2291: switch (v->magic)
! 2292: {
! 2293: case OSPFNBRIPADDR:
! 2294: return SNMP_IPADDRESS (nbr_addr);
! 2295: break;
! 2296: case OSPFNBRADDRESSLESSINDEX:
! 2297: return SNMP_INTEGER (ifindex);
! 2298: break;
! 2299: case OSPFNBRRTRID:
! 2300: return SNMP_IPADDRESS (nbr->router_id);
! 2301: break;
! 2302: case OSPFNBROPTIONS:
! 2303: return SNMP_INTEGER (oi->nbr_self->options);
! 2304: break;
! 2305: case OSPFNBRPRIORITY:
! 2306: return SNMP_INTEGER (nbr->priority);
! 2307: break;
! 2308: case OSPFNBRSTATE:
! 2309: return SNMP_INTEGER (ospf_snmp_neighbor_state(nbr->state));
! 2310: break;
! 2311: case OSPFNBREVENTS:
! 2312: return SNMP_INTEGER (nbr->state_change);
! 2313: break;
! 2314: case OSPFNBRLSRETRANSQLEN:
! 2315: return SNMP_INTEGER (ospf_ls_retransmit_count (nbr));
! 2316: break;
! 2317: case OSPFNBMANBRSTATUS:
! 2318: return SNMP_INTEGER (SNMP_VALID);
! 2319: break;
! 2320: case OSPFNBMANBRPERMANENCE:
! 2321: return SNMP_INTEGER (2);
! 2322: break;
! 2323: case OSPFNBRHELLOSUPPRESSED:
! 2324: return SNMP_INTEGER (SNMP_FALSE);
! 2325: break;
! 2326: default:
! 2327: return NULL;
! 2328: break;
! 2329: }
! 2330: return NULL;
! 2331: }
! 2332:
! 2333: static u_char *
! 2334: ospfVirtNbrEntry (struct variable *v, oid *name, size_t *length, int exact,
! 2335: size_t *var_len, WriteMethod **write_method)
! 2336: {
! 2337: struct ospf_vl_data *vl_data;
! 2338: struct in_addr area_id;
! 2339: struct in_addr neighbor;
! 2340: struct ospf *ospf;
! 2341:
! 2342: memset (&area_id, 0, sizeof (struct in_addr));
! 2343: memset (&neighbor, 0, sizeof (struct in_addr));
! 2344:
! 2345: /* Check OSPF instance. */
! 2346: ospf = ospf_lookup ();
! 2347: if (ospf == NULL)
! 2348: return NULL;
! 2349:
! 2350: vl_data = ospfVirtIfLookup (v, name, length, &area_id, &neighbor, exact);
! 2351: if (! vl_data)
! 2352: return NULL;
! 2353:
! 2354: /* Return the current value of the variable */
! 2355: switch (v->magic)
! 2356: {
! 2357: case OSPFVIRTNBRAREA:
! 2358: return (u_char *) NULL;
! 2359: break;
! 2360: case OSPFVIRTNBRRTRID:
! 2361: return (u_char *) NULL;
! 2362: break;
! 2363: case OSPFVIRTNBRIPADDR:
! 2364: return (u_char *) NULL;
! 2365: break;
! 2366: case OSPFVIRTNBROPTIONS:
! 2367: return (u_char *) NULL;
! 2368: break;
! 2369: case OSPFVIRTNBRSTATE:
! 2370: return (u_char *) NULL;
! 2371: break;
! 2372: case OSPFVIRTNBREVENTS:
! 2373: return (u_char *) NULL;
! 2374: break;
! 2375: case OSPFVIRTNBRLSRETRANSQLEN:
! 2376: return (u_char *) NULL;
! 2377: break;
! 2378: case OSPFVIRTNBRHELLOSUPPRESSED:
! 2379: return (u_char *) NULL;
! 2380: break;
! 2381: default:
! 2382: return NULL;
! 2383: break;
! 2384: }
! 2385: return NULL;
! 2386: }
! 2387:
! 2388: static struct ospf_lsa *
! 2389: ospfExtLsdbLookup (struct variable *v, oid *name, size_t *length, u_char *type,
! 2390: struct in_addr *ls_id, struct in_addr *router_id, int exact)
! 2391: {
! 2392: int first;
! 2393: oid *offset;
! 2394: int offsetlen;
! 2395: u_char lsa_type;
! 2396: unsigned int len;
! 2397: struct ospf_lsa *lsa;
! 2398: struct ospf *ospf;
! 2399:
! 2400: ospf = ospf_lookup ();
! 2401: if (exact)
! 2402: {
! 2403: if (*length != v->namelen + 1 + IN_ADDR_SIZE + IN_ADDR_SIZE)
! 2404: return NULL;
! 2405:
! 2406: offset = name + v->namelen;
! 2407:
! 2408: /* Make it sure given value match to type. */
! 2409: lsa_type = *offset;
! 2410: offset++;
! 2411:
! 2412: if (lsa_type != *type)
! 2413: return NULL;
! 2414:
! 2415: /* LS ID. */
! 2416: oid2in_addr (offset, IN_ADDR_SIZE, ls_id);
! 2417: offset += IN_ADDR_SIZE;
! 2418:
! 2419: /* Router ID. */
! 2420: oid2in_addr (offset, IN_ADDR_SIZE, router_id);
! 2421:
! 2422: return ospf_lsdb_lookup_by_id (ospf->lsdb, *type, *ls_id, *router_id);
! 2423: }
! 2424: else
! 2425: {
! 2426: /* Get variable length. */
! 2427: first = 0;
! 2428: offset = name + v->namelen;
! 2429: offsetlen = *length - v->namelen;
! 2430:
! 2431: /* LSA type value. */
! 2432: lsa_type = *offset;
! 2433: offset++;
! 2434: offsetlen--;
! 2435:
! 2436: if (offsetlen <= 0 || lsa_type < OSPF_AS_EXTERNAL_LSA)
! 2437: first = 1;
! 2438:
! 2439: /* LS ID. */
! 2440: len = offsetlen;
! 2441: if (len > IN_ADDR_SIZE)
! 2442: len = IN_ADDR_SIZE;
! 2443:
! 2444: oid2in_addr (offset, len, ls_id);
! 2445:
! 2446: offset += IN_ADDR_SIZE;
! 2447: offsetlen -= IN_ADDR_SIZE;
! 2448:
! 2449: /* Router ID. */
! 2450: len = offsetlen;
! 2451: if (len > IN_ADDR_SIZE)
! 2452: len = IN_ADDR_SIZE;
! 2453:
! 2454: oid2in_addr (offset, len, router_id);
! 2455:
! 2456: lsa = ospf_lsdb_lookup_by_id_next (ospf->lsdb, *type, *ls_id,
! 2457: *router_id, first);
! 2458:
! 2459: if (lsa)
! 2460: {
! 2461: /* Fill in length. */
! 2462: *length = v->namelen + 1 + IN_ADDR_SIZE + IN_ADDR_SIZE;
! 2463:
! 2464: /* Fill in value. */
! 2465: offset = name + v->namelen;
! 2466:
! 2467: *offset = OSPF_AS_EXTERNAL_LSA;
! 2468: offset++;
! 2469: oid_copy_addr (offset, &lsa->data->id, IN_ADDR_SIZE);
! 2470: offset += IN_ADDR_SIZE;
! 2471: oid_copy_addr (offset, &lsa->data->adv_router, IN_ADDR_SIZE);
! 2472:
! 2473: return lsa;
! 2474: }
! 2475: }
! 2476: return NULL;
! 2477: }
! 2478:
! 2479: static u_char *
! 2480: ospfExtLsdbEntry (struct variable *v, oid *name, size_t *length, int exact,
! 2481: size_t *var_len, WriteMethod **write_method)
! 2482: {
! 2483: struct ospf_lsa *lsa;
! 2484: struct lsa_header *lsah;
! 2485: u_char type;
! 2486: struct in_addr ls_id;
! 2487: struct in_addr router_id;
! 2488: struct ospf *ospf;
! 2489:
! 2490: type = OSPF_AS_EXTERNAL_LSA;
! 2491: memset (&ls_id, 0, sizeof (struct in_addr));
! 2492: memset (&router_id, 0, sizeof (struct in_addr));
! 2493:
! 2494: /* Check OSPF instance. */
! 2495: ospf = ospf_lookup ();
! 2496: if (ospf == NULL)
! 2497: return NULL;
! 2498:
! 2499: lsa = ospfExtLsdbLookup (v, name, length, &type, &ls_id, &router_id, exact);
! 2500: if (! lsa)
! 2501: return NULL;
! 2502:
! 2503: lsah = lsa->data;
! 2504:
! 2505: /* Return the current value of the variable */
! 2506: switch (v->magic)
! 2507: {
! 2508: case OSPFEXTLSDBTYPE:
! 2509: return SNMP_INTEGER (OSPF_AS_EXTERNAL_LSA);
! 2510: break;
! 2511: case OSPFEXTLSDBLSID:
! 2512: return SNMP_IPADDRESS (lsah->id);
! 2513: break;
! 2514: case OSPFEXTLSDBROUTERID:
! 2515: return SNMP_IPADDRESS (lsah->adv_router);
! 2516: break;
! 2517: case OSPFEXTLSDBSEQUENCE:
! 2518: return SNMP_INTEGER (lsah->ls_seqnum);
! 2519: break;
! 2520: case OSPFEXTLSDBAGE:
! 2521: return SNMP_INTEGER (lsah->ls_age);
! 2522: break;
! 2523: case OSPFEXTLSDBCHECKSUM:
! 2524: return SNMP_INTEGER (lsah->checksum);
! 2525: break;
! 2526: case OSPFEXTLSDBADVERTISEMENT:
! 2527: *var_len = ntohs (lsah->length);
! 2528: return (u_char *) lsah;
! 2529: break;
! 2530: default:
! 2531: return NULL;
! 2532: break;
! 2533: }
! 2534: return NULL;
! 2535: }
! 2536:
! 2537: static u_char *
! 2538: ospfAreaAggregateEntry (struct variable *v, oid *name, size_t *length,
! 2539: int exact, size_t *var_len, WriteMethod **write_method)
! 2540: {
! 2541: /* Return the current value of the variable */
! 2542: switch (v->magic)
! 2543: {
! 2544: case OSPFAREAAGGREGATEAREAID:
! 2545: return (u_char *) NULL;
! 2546: break;
! 2547: case OSPFAREAAGGREGATELSDBTYPE:
! 2548: return (u_char *) NULL;
! 2549: break;
! 2550: case OSPFAREAAGGREGATENET:
! 2551: return (u_char *) NULL;
! 2552: break;
! 2553: case OSPFAREAAGGREGATEMASK:
! 2554: return (u_char *) NULL;
! 2555: break;
! 2556: case OSPFAREAAGGREGATESTATUS:
! 2557: return (u_char *) NULL;
! 2558: break;
! 2559: case OSPFAREAAGGREGATEEFFECT:
! 2560: return (u_char *) NULL;
! 2561: break;
! 2562: default:
! 2563: return NULL;
! 2564: break;
! 2565: }
! 2566: return NULL;
! 2567: }
! 2568:
! 2569: /* OSPF Traps. */
! 2570: #define IFSTATECHANGE 16
! 2571: #define VIRTIFSTATECHANGE 1
! 2572: #define NBRSTATECHANGE 2
! 2573: #define VIRTNBRSTATECHANGE 3
! 2574:
! 2575: struct trap_object ospfNbrTrapList[] =
! 2576: {
! 2577: {ospfGeneralGroup, -2, {1, OSPFROUTERID}},
! 2578: {ospfNbrEntry, 3, {10, 1, OSPFNBRIPADDR}},
! 2579: {ospfNbrEntry, 3, {10, 1, OSPFNBRRTRID}},
! 2580: {ospfNbrEntry, 3, {10, 1, OSPFNBRSTATE}}
! 2581: };
! 2582:
! 2583:
! 2584: struct trap_object ospfVirtNbrTrapList[] =
! 2585: {
! 2586: {ospfGeneralGroup, -2, {1, 1}},
! 2587: {ospfVirtNbrEntry, 3, {11, 1, OSPFVIRTNBRAREA}},
! 2588: {ospfVirtNbrEntry, 3, {11, 1, OSPFVIRTNBRRTRID}},
! 2589: {ospfVirtNbrEntry, 3, {11, 1, OSPFVIRTNBRSTATE}}
! 2590: };
! 2591:
! 2592: struct trap_object ospfIfTrapList[] =
! 2593: {
! 2594: {ospfGeneralGroup, -2, {1, OSPFROUTERID}},
! 2595: {ospfIfEntry, 3, {7, 1, OSPFIFIPADDRESS}},
! 2596: {ospfIfEntry, 3, {7, 1, OSPFADDRESSLESSIF}},
! 2597: {ospfIfEntry, 3, {7, 1, OSPFIFSTATE}}
! 2598: };
! 2599:
! 2600: struct trap_object ospfVirtIfTrapList[] =
! 2601: {
! 2602: {ospfGeneralGroup, -2, {1, OSPFROUTERID}},
! 2603: {ospfVirtIfEntry, 3, {9, 1, OSPFVIRTIFAREAID}},
! 2604: {ospfVirtIfEntry, 3, {9, 1, OSPFVIRTIFNEIGHBOR}},
! 2605: {ospfVirtIfEntry, 3, {9, 1, OSPFVIRTIFSTATE}}
! 2606: };
! 2607:
! 2608: void
! 2609: ospfTrapNbrStateChange (struct ospf_neighbor *on)
! 2610: {
! 2611: oid index[sizeof (oid) * (IN_ADDR_SIZE + 1)];
! 2612: char msgbuf[16];
! 2613:
! 2614: ospf_nbr_state_message(on, msgbuf, sizeof(msgbuf));
! 2615: zlog (NULL, LOG_INFO, "ospfTrapNbrStateChange trap sent: %s now %s",
! 2616: inet_ntoa(on->address.u.prefix4), msgbuf);
! 2617:
! 2618: oid_copy_addr (index, &(on->address.u.prefix4), IN_ADDR_SIZE);
! 2619: index[IN_ADDR_SIZE] = 0;
! 2620:
! 2621: smux_trap (ospf_oid, sizeof ospf_oid / sizeof (oid),
! 2622: index, IN_ADDR_SIZE + 1,
! 2623: ospfNbrTrapList,
! 2624: sizeof ospfNbrTrapList / sizeof (struct trap_object),
! 2625: time (NULL), NBRSTATECHANGE);
! 2626: }
! 2627:
! 2628: void
! 2629: ospfTrapVirtNbrStateChange (struct ospf_neighbor *on)
! 2630: {
! 2631: oid index[sizeof (oid) * (IN_ADDR_SIZE + 1)];
! 2632:
! 2633: zlog (NULL, LOG_INFO, "ospfTrapVirtNbrStateChange trap sent");
! 2634:
! 2635: oid_copy_addr (index, &(on->address.u.prefix4), IN_ADDR_SIZE);
! 2636: index[IN_ADDR_SIZE] = 0;
! 2637:
! 2638: smux_trap (ospf_oid, sizeof ospf_oid / sizeof (oid),
! 2639: index, IN_ADDR_SIZE + 1,
! 2640: ospfVirtNbrTrapList,
! 2641: sizeof ospfVirtNbrTrapList / sizeof (struct trap_object),
! 2642: time (NULL), VIRTNBRSTATECHANGE);
! 2643: }
! 2644:
! 2645: void
! 2646: ospfTrapIfStateChange (struct ospf_interface *oi)
! 2647: {
! 2648: oid index[sizeof (oid) * (IN_ADDR_SIZE + 1)];
! 2649:
! 2650: zlog (NULL, LOG_INFO, "ospfTrapIfStateChange trap sent: %s now %s",
! 2651: inet_ntoa(oi->address->u.prefix4),
! 2652: LOOKUP(ospf_ism_state_msg, oi->state));
! 2653:
! 2654: oid_copy_addr (index, &(oi->address->u.prefix4), IN_ADDR_SIZE);
! 2655: index[IN_ADDR_SIZE] = 0;
! 2656:
! 2657: smux_trap (ospf_oid, sizeof ospf_oid / sizeof (oid),
! 2658: index, IN_ADDR_SIZE + 1,
! 2659: ospfIfTrapList,
! 2660: sizeof ospfIfTrapList / sizeof (struct trap_object),
! 2661: time (NULL), IFSTATECHANGE);
! 2662: }
! 2663:
! 2664: void
! 2665: ospfTrapVirtIfStateChange (struct ospf_interface *oi)
! 2666: {
! 2667: oid index[sizeof (oid) * (IN_ADDR_SIZE + 1)];
! 2668:
! 2669: zlog (NULL, LOG_INFO, "ospfTrapVirtIfStateChange trap sent");
! 2670:
! 2671: oid_copy_addr (index, &(oi->address->u.prefix4), IN_ADDR_SIZE);
! 2672: index[IN_ADDR_SIZE] = 0;
! 2673:
! 2674: smux_trap (ospf_oid, sizeof ospf_oid / sizeof (oid),
! 2675: index, IN_ADDR_SIZE + 1,
! 2676: ospfVirtIfTrapList,
! 2677: sizeof ospfVirtIfTrapList / sizeof (struct trap_object),
! 2678: time (NULL), VIRTIFSTATECHANGE);
! 2679: }
! 2680: /* Register OSPF2-MIB. */
! 2681: void
! 2682: ospf_snmp_init ()
! 2683: {
! 2684: ospf_snmp_iflist = list_new ();
! 2685: ospf_snmp_vl_table = route_table_init ();
! 2686: smux_init (om->master);
! 2687: REGISTER_MIB("mibII/ospf", ospf_variables, variable, ospf_oid);
! 2688: }
! 2689: #endif /* HAVE_SNMP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>