Annotation of embedaddon/quagga/ospf6d/ospf6_snmp.c, revision 1.1.1.2
1.1 misho 1: /* OSPFv3 SNMP support
2: * Copyright (C) 2004 Yasuhiro Ohara
3: *
4: * This file is part of GNU Zebra.
5: *
6: * GNU Zebra is free software; you can redistribute it and/or modify it
7: * under the terms of the GNU General Public License as published by the
8: * Free Software Foundation; either version 2, or (at your option) any
9: * later version.
10: *
11: * GNU Zebra is distributed in the hope that it will be useful, but
12: * WITHOUT ANY WARRANTY; without even the implied warranty of
13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: * General Public License for more details.
15: *
16: * You should have received a copy of the GNU General Public License
17: * along with GNU Zebra; see the file COPYING. If not, write to the
18: * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19: * Boston, MA 02111-1307, USA.
20: */
21:
22: #include <zebra.h>
23:
24: #ifdef HAVE_SNMP
25:
26: #include <net-snmp/net-snmp-config.h>
27: #include <net-snmp/net-snmp-includes.h>
28:
29: #include "log.h"
30: #include "vty.h"
31: #include "linklist.h"
32: #include "smux.h"
33:
34: #include "ospf6_proto.h"
35: #include "ospf6_lsa.h"
36: #include "ospf6_lsdb.h"
37: #include "ospf6_route.h"
38: #include "ospf6_top.h"
39: #include "ospf6_area.h"
40: #include "ospf6_interface.h"
41: #include "ospf6_message.h"
42: #include "ospf6_neighbor.h"
43: #include "ospf6d.h"
44: #include "ospf6_snmp.h"
45:
46: /* OSPFv3-MIB */
1.1.1.2 ! misho 47: #define OSPFv3MIB 1,3,6,1,2,1,191
1.1 misho 48:
49: /* OSPFv3 MIB General Group values. */
50: #define OSPFv3ROUTERID 1
51: #define OSPFv3ADMINSTAT 2
52: #define OSPFv3VERSIONNUMBER 3
53: #define OSPFv3AREABDRRTRSTATUS 4
54: #define OSPFv3ASBDRRTRSTATUS 5
55: #define OSPFv3ASSCOPELSACOUNT 6
56: #define OSPFv3ASSCOPELSACHECKSUMSUM 7
57: #define OSPFv3ORIGINATENEWLSAS 8
58: #define OSPFv3RXNEWLSAS 9
59: #define OSPFv3EXTLSACOUNT 10
60: #define OSPFv3EXTAREALSDBLIMIT 11
1.1.1.2 ! misho 61: #define OSPFv3EXITOVERFLOWINTERVAL 12
! 62: #define OSPFv3DEMANDEXTENSIONS 13
! 63: #define OSPFv3REFERENCEBANDWIDTH 14
! 64: #define OSPFv3RESTARTSUPPORT 15
! 65: #define OSPFv3RESTARTINTERVAL 16
! 66: #define OSPFv3RESTARTSTRICTLSACHECKING 17
! 67: #define OSPFv3RESTARTSTATUS 18
! 68: #define OSPFv3RESTARTAGE 19
! 69: #define OSPFv3RESTARTEXITREASON 20
! 70: #define OSPFv3NOTIFICATIONENABLE 21
! 71: #define OSPFv3STUBROUTERSUPPORT 22
! 72: #define OSPFv3STUBROUTERADVERTISEMENT 23
! 73: #define OSPFv3DISCONTINUITYTIME 24
! 74: #define OSPFv3RESTARTTIME 25
1.1 misho 75:
1.1.1.2 ! misho 76: /* OSPFv3 MIB Area Table values: ospfv3AreaTable */
1.1 misho 77: #define OSPFv3IMPORTASEXTERN 2
78: #define OSPFv3AREASPFRUNS 3
79: #define OSPFv3AREABDRRTRCOUNT 4
80: #define OSPFv3AREAASBDRRTRCOUNT 5
81: #define OSPFv3AREASCOPELSACOUNT 6
82: #define OSPFv3AREASCOPELSACKSUMSUM 7
83: #define OSPFv3AREASUMMARY 8
1.1.1.2 ! misho 84: #define OSPFv3AREAROWSTATUS 9
! 85: #define OSPFv3AREASTUBMETRIC 10
1.1 misho 86: #define OSPFv3AREANSSATRANSLATORROLE 11
87: #define OSPFv3AREANSSATRANSLATORSTATE 12
1.1.1.2 ! misho 88: #define OSPFv3AREANSSATRANSLATORSTABINTERVAL 13
1.1 misho 89: #define OSPFv3AREANSSATRANSLATOREVENTS 14
90: #define OSPFv3AREASTUBMETRICTYPE 15
1.1.1.2 ! misho 91: #define OSPFv3AREATEENABLED 16
1.1 misho 92:
1.1.1.2 ! misho 93: /* OSPFv3 MIB * Lsdb Table values: ospfv3*LsdbTable */
! 94: #define OSPFv3WWLSDBSEQUENCE 1
! 95: #define OSPFv3WWLSDBAGE 2
! 96: #define OSPFv3WWLSDBCHECKSUM 3
! 97: #define OSPFv3WWLSDBADVERTISEMENT 4
! 98: #define OSPFv3WWLSDBTYPEKNOWN 5
! 99:
! 100: /* Three first bits are to identify column */
! 101: #define OSPFv3WWCOLUMN 0x7
! 102: /* Then we use other bits to identify table */
! 103: #define OSPFv3WWASTABLE (1 << 3)
! 104: #define OSPFv3WWAREATABLE (1 << 4)
! 105: #define OSPFv3WWLINKTABLE (1 << 5)
! 106: #define OSPFv3WWVIRTLINKTABLE (1 << 6)
! 107:
! 108: /* OSPFv3 MIB Host Table values: ospfv3HostTable */
! 109: #define OSPFv3HOSTMETRIC 3
! 110: #define OSPFv3HOSTROWSTATUS 4
! 111: #define OSPFv3HOSTAREAID 5
! 112:
! 113: /* OSPFv3 MIB Interface Table values: ospfv3IfTable */
! 114: #define OSPFv3IFAREAID 3
! 115: #define OSPFv3IFTYPE 4
! 116: #define OSPFv3IFADMINSTATUS 5
! 117: #define OSPFv3IFRTRPRIORITY 6
! 118: #define OSPFv3IFTRANSITDELAY 7
! 119: #define OSPFv3IFRETRANSINTERVAL 8
! 120: #define OSPFv3IFHELLOINTERVAL 9
! 121: #define OSPFv3IFRTRDEADINTERVAL 10
! 122: #define OSPFv3IFPOLLINTERVAL 11
! 123: #define OSPFv3IFSTATE 12
! 124: #define OSPFv3IFDESIGNATEDROUTER 13
! 125: #define OSPFv3IFBACKUPDESIGNATEDROUTER 14
! 126: #define OSPFv3IFEVENTS 15
! 127: #define OSPFv3IFROWSTATUS 16
! 128: #define OSPFv3IFDEMAND 17
! 129: #define OSPFv3IFMETRICVALUE 18
! 130: #define OSPFv3IFLINKSCOPELSACOUNT 19
! 131: #define OSPFv3IFLINKLSACKSUMSUM 20
! 132: #define OSPFv3IFDEMANDNBRPROBE 21
! 133: #define OSPFv3IFDEMANDNBRPROBERETRANSLIMIT 22
! 134: #define OSPFv3IFDEMANDNBRPROBEINTERVAL 23
! 135: #define OSPFv3IFTEDISABLED 24
! 136: #define OSPFv3IFLINKLSASUPPRESSION 25
! 137:
! 138: /* OSPFv3 MIB Virtual Interface Table values: ospfv3VirtIfTable */
! 139: #define OSPFv3VIRTIFINDEX 3
! 140: #define OSPFv3VIRTIFINSTID 4
! 141: #define OSPFv3VIRTIFTRANSITDELAY 5
! 142: #define OSPFv3VIRTIFRETRANSINTERVAL 6
! 143: #define OSPFv3VIRTIFHELLOINTERVAL 7
! 144: #define OSPFv3VIRTIFRTRDEADINTERVAL 8
! 145: #define OSPFv3VIRTIFSTATE 9
! 146: #define OSPFv3VIRTIFEVENTS 10
! 147: #define OSPFv3VIRTIFROWSTATUS 11
! 148: #define OSPFv3VIRTIFLINKSCOPELSACOUNT 12
! 149: #define OSPFv3VIRTIFLINKLSACKSUMSUM 13
! 150:
! 151: /* OSPFv3 MIB Neighbors Table values: ospfv3NbrTable */
! 152: #define OSPFv3NBRADDRESSTYPE 4
! 153: #define OSPFv3NBRADDRESS 5
! 154: #define OSPFv3NBROPTIONS 6
! 155: #define OSPFv3NBRPRIORITY 7
! 156: #define OSPFv3NBRSTATE 8
! 157: #define OSPFv3NBREVENTS 9
! 158: #define OSPFv3NBRLSRETRANSQLEN 10
! 159: #define OSPFv3NBRHELLOSUPPRESSED 11
! 160: #define OSPFv3NBRIFID 12
! 161: #define OSPFv3NBRRESTARTHELPERSTATUS 13
! 162: #define OSPFv3NBRRESTARTHELPERAGE 14
! 163: #define OSPFv3NBRRESTARTHELPEREXITREASON 15
! 164:
! 165: /* OSPFv3 MIB Configured Neighbors Table values: ospfv3CfgNbrTable */
! 166: #define OSPFv3CFGNBRPRIORITY 5
! 167: #define OSPFv3CFGNBRROWSTATUS 6
! 168:
! 169: /* OSPFv3 MIB Virtual Neighbors Table values: ospfv3VirtNbrTable */
! 170: #define OSPFv3VIRTNBRIFINDEX 3
! 171: #define OSPFv3VIRTNBRIFINSTID 4
! 172: #define OSPFv3VIRTNBRADDRESSTYPE 5
! 173: #define OSPFv3VIRTNBRADDRESS 6
! 174: #define OSPFv3VIRTNBROPTIONS 7
! 175: #define OSPFv3VIRTNBRSTATE 8
! 176: #define OSPFv3VIRTNBREVENTS 9
! 177: #define OSPFv3VIRTNBRLSRETRANSQLEN 10
! 178: #define OSPFv3VIRTNBRHELLOSUPPRESSED 11
! 179: #define OSPFv3VIRTNBRIFID 12
! 180: #define OSPFv3VIRTNBRRESTARTHELPERSTATUS 13
! 181: #define OSPFv3VIRTNBRRESTARTHELPERAGE 14
! 182: #define OSPFv3VIRTNBRRESTARTHELPEREXITREASON 15
! 183:
! 184: /* OSPFv3 MIB Area Aggregate Table values: ospfv3AreaAggregateTable */
! 185: #define OSPFv3AREAAGGREGATEROWSTATUS 6
! 186: #define OSPFv3AREAAGGREGATEEFFECT 7
! 187: #define OSPFv3AREAAGGREGATEROUTETAG 8
1.1 misho 188:
189: /* SYNTAX Status from OSPF-MIB. */
190: #define OSPF_STATUS_ENABLED 1
191: #define OSPF_STATUS_DISABLED 2
192:
193: /* SNMP value hack. */
194: #define COUNTER ASN_COUNTER
195: #define INTEGER ASN_INTEGER
196: #define GAUGE ASN_GAUGE
1.1.1.2 ! misho 197: #define UNSIGNED ASN_UNSIGNED
1.1 misho 198: #define TIMETICKS ASN_TIMETICKS
199: #define IPADDRESS ASN_IPADDRESS
200: #define STRING ASN_OCTET_STR
201:
202: /* For return values e.g. SNMP_INTEGER macro */
203: SNMP_LOCAL_VARIABLES
204:
205: /* OSPFv3-MIB instances. */
206: oid ospfv3_oid [] = { OSPFv3MIB };
1.1.1.2 ! misho 207: oid ospfv3_trap_oid [] = { OSPFv3MIB, 0 };
1.1 misho 208:
209: /* Hook functions. */
210: static u_char *ospfv3GeneralGroup (struct variable *, oid *, size_t *,
211: int, size_t *, WriteMethod **);
212: static u_char *ospfv3AreaEntry (struct variable *, oid *, size_t *,
213: int, size_t *, WriteMethod **);
1.1.1.2 ! misho 214: static u_char *ospfv3WwLsdbEntry (struct variable *, oid *, size_t *,
! 215: int, size_t *, WriteMethod **);
! 216: static u_char *ospfv3NbrEntry (struct variable *, oid *, size_t *,
! 217: int, size_t *, WriteMethod **);
! 218: static u_char *ospfv3IfEntry (struct variable *, oid *, size_t *,
! 219: int, size_t *, WriteMethod **);
1.1 misho 220:
221: struct variable ospfv3_variables[] =
222: {
223: /* OSPF general variables */
1.1.1.2 ! misho 224: {OSPFv3ROUTERID, UNSIGNED, RWRITE, ospfv3GeneralGroup,
1.1 misho 225: 3, {1, 1, 1}},
226: {OSPFv3ADMINSTAT, INTEGER, RWRITE, ospfv3GeneralGroup,
227: 3, {1, 1, 2}},
228: {OSPFv3VERSIONNUMBER, INTEGER, RONLY, ospfv3GeneralGroup,
229: 3, {1, 1, 3}},
230: {OSPFv3AREABDRRTRSTATUS, INTEGER, RONLY, ospfv3GeneralGroup,
231: 3, {1, 1, 4}},
232: {OSPFv3ASBDRRTRSTATUS, INTEGER, RWRITE, ospfv3GeneralGroup,
233: 3, {1, 1, 5}},
234: {OSPFv3ASSCOPELSACOUNT, GAUGE, RONLY, ospfv3GeneralGroup,
235: 3, {1, 1, 6}},
1.1.1.2 ! misho 236: {OSPFv3ASSCOPELSACHECKSUMSUM,UNSIGNED, RONLY, ospfv3GeneralGroup,
1.1 misho 237: 3, {1, 1, 7}},
238: {OSPFv3ORIGINATENEWLSAS, COUNTER, RONLY, ospfv3GeneralGroup,
239: 3, {1, 1, 8}},
240: {OSPFv3RXNEWLSAS, COUNTER, RONLY, ospfv3GeneralGroup,
241: 3, {1, 1, 9}},
242: {OSPFv3EXTLSACOUNT, GAUGE, RONLY, ospfv3GeneralGroup,
243: 3, {1, 1, 10}},
244: {OSPFv3EXTAREALSDBLIMIT, INTEGER, RWRITE, ospfv3GeneralGroup,
245: 3, {1, 1, 11}},
1.1.1.2 ! misho 246: {OSPFv3EXITOVERFLOWINTERVAL, UNSIGNED, RWRITE, ospfv3GeneralGroup,
1.1 misho 247: 3, {1, 1, 12}},
248: {OSPFv3DEMANDEXTENSIONS, INTEGER, RWRITE, ospfv3GeneralGroup,
1.1.1.2 ! misho 249: 3, {1, 1, 13}},
! 250: {OSPFv3REFERENCEBANDWIDTH, UNSIGNED, RWRITE, ospfv3GeneralGroup,
1.1 misho 251: 3, {1, 1, 14}},
1.1.1.2 ! misho 252: {OSPFv3RESTARTSUPPORT, INTEGER, RWRITE, ospfv3GeneralGroup,
1.1 misho 253: 3, {1, 1, 15}},
1.1.1.2 ! misho 254: {OSPFv3RESTARTINTERVAL, UNSIGNED, RWRITE, ospfv3GeneralGroup,
1.1 misho 255: 3, {1, 1, 16}},
1.1.1.2 ! misho 256: {OSPFv3RESTARTSTRICTLSACHECKING, INTEGER, RWRITE, ospfv3GeneralGroup,
1.1 misho 257: 3, {1, 1, 17}},
258: {OSPFv3RESTARTSTATUS, INTEGER, RONLY, ospfv3GeneralGroup,
1.1.1.2 ! misho 259: 3, {1, 1, 18}},
! 260: {OSPFv3RESTARTAGE, UNSIGNED, RONLY, ospfv3GeneralGroup,
1.1 misho 261: 3, {1, 1, 19}},
262: {OSPFv3RESTARTEXITREASON, INTEGER, RONLY, ospfv3GeneralGroup,
1.1.1.2 ! misho 263: 3, {1, 1, 20}},
! 264: {OSPFv3NOTIFICATIONENABLE, INTEGER, RWRITE, ospfv3GeneralGroup,
1.1 misho 265: 3, {1, 1, 21}},
1.1.1.2 ! misho 266: {OSPFv3STUBROUTERSUPPORT, INTEGER, RONLY, ospfv3GeneralGroup,
! 267: 3, {1, 1, 22}},
! 268: {OSPFv3STUBROUTERADVERTISEMENT, INTEGER, RWRITE, ospfv3GeneralGroup,
! 269: 3, {1, 1, 23}},
! 270: {OSPFv3DISCONTINUITYTIME, TIMETICKS, RONLY, ospfv3GeneralGroup,
! 271: 3, {1, 1, 24}},
! 272: {OSPFv3RESTARTTIME, TIMETICKS, RONLY, ospfv3GeneralGroup,
! 273: 3, {1, 1, 25}},
1.1 misho 274:
275: /* OSPFv3 Area Data Structure */
276: {OSPFv3IMPORTASEXTERN, INTEGER, RWRITE, ospfv3AreaEntry,
277: 4, {1, 2, 1, 2}},
278: {OSPFv3AREASPFRUNS, COUNTER, RONLY, ospfv3AreaEntry,
279: 4, {1, 2, 1, 3}},
280: {OSPFv3AREABDRRTRCOUNT, GAUGE, RONLY, ospfv3AreaEntry,
281: 4, {1, 2, 1, 4}},
282: {OSPFv3AREAASBDRRTRCOUNT, GAUGE, RONLY, ospfv3AreaEntry,
283: 4, {1, 2, 1, 5}},
284: {OSPFv3AREASCOPELSACOUNT, GAUGE, RONLY, ospfv3AreaEntry,
285: 4, {1, 2, 1, 6}},
1.1.1.2 ! misho 286: {OSPFv3AREASCOPELSACKSUMSUM, UNSIGNED, RONLY, ospfv3AreaEntry,
1.1 misho 287: 4, {1, 2, 1, 7}},
288: {OSPFv3AREASUMMARY, INTEGER, RWRITE, ospfv3AreaEntry,
289: 4, {1, 2, 1, 8}},
1.1.1.2 ! misho 290: {OSPFv3AREAROWSTATUS, INTEGER, RWRITE, ospfv3AreaEntry,
1.1 misho 291: 4, {1, 2, 1, 9}},
1.1.1.2 ! misho 292: {OSPFv3AREASTUBMETRIC, INTEGER, RWRITE, ospfv3AreaEntry,
1.1 misho 293: 4, {1, 2, 1, 10}},
294: {OSPFv3AREANSSATRANSLATORROLE, INTEGER, RWRITE, ospfv3AreaEntry,
295: 4, {1, 2, 1, 11}},
296: {OSPFv3AREANSSATRANSLATORSTATE, INTEGER, RONLY, ospfv3AreaEntry,
297: 4, {1, 2, 1, 12}},
1.1.1.2 ! misho 298: {OSPFv3AREANSSATRANSLATORSTABINTERVAL, UNSIGNED, RWRITE, ospfv3AreaEntry,
1.1 misho 299: 4, {1, 2, 1, 13}},
300: {OSPFv3AREANSSATRANSLATOREVENTS, COUNTER, RONLY, ospfv3AreaEntry,
301: 4, {1, 2, 1, 14}},
302: {OSPFv3AREASTUBMETRICTYPE, INTEGER, RWRITE, ospfv3AreaEntry,
303: 4, {1, 2, 1, 15}},
1.1.1.2 ! misho 304: {OSPFv3AREATEENABLED, INTEGER, RWRITE, ospfv3AreaEntry,
! 305: 4, {1, 2, 1, 16}},
! 306:
! 307: /* OSPFv3 AS LSDB */
! 308: {OSPFv3WWLSDBSEQUENCE | OSPFv3WWASTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
! 309: 4, {1, 3, 1, 4}},
! 310: {OSPFv3WWLSDBAGE | OSPFv3WWASTABLE, UNSIGNED, RONLY, ospfv3WwLsdbEntry,
! 311: 4, {1, 3, 1, 5}},
! 312: {OSPFv3WWLSDBCHECKSUM | OSPFv3WWASTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
! 313: 4, {1, 3, 1, 6}},
! 314: {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWASTABLE, STRING, RONLY, ospfv3WwLsdbEntry,
! 315: 4, {1, 3, 1, 7}},
! 316: {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWASTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
! 317: 4, {1, 3, 1, 8}},
1.1 misho 318:
1.1.1.2 ! misho 319: /* OSPFv3 Area LSDB */
! 320: {OSPFv3WWLSDBSEQUENCE | OSPFv3WWAREATABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
1.1 misho 321: 4, {1, 4, 1, 5}},
1.1.1.2 ! misho 322: {OSPFv3WWLSDBAGE | OSPFv3WWAREATABLE, UNSIGNED, RONLY, ospfv3WwLsdbEntry,
1.1 misho 323: 4, {1, 4, 1, 6}},
1.1.1.2 ! misho 324: {OSPFv3WWLSDBCHECKSUM | OSPFv3WWAREATABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
1.1 misho 325: 4, {1, 4, 1, 7}},
1.1.1.2 ! misho 326: {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWAREATABLE, STRING, RONLY, ospfv3WwLsdbEntry,
1.1 misho 327: 4, {1, 4, 1, 8}},
1.1.1.2 ! misho 328: {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWAREATABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
1.1 misho 329: 4, {1, 4, 1, 9}},
330:
1.1.1.2 ! misho 331: /* OSPFv3 Link LSDB */
! 332: {OSPFv3WWLSDBSEQUENCE | OSPFv3WWLINKTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
! 333: 4, {1, 5, 1, 6}},
! 334: {OSPFv3WWLSDBAGE | OSPFv3WWLINKTABLE, UNSIGNED, RONLY, ospfv3WwLsdbEntry,
! 335: 4, {1, 5, 1, 7}},
! 336: {OSPFv3WWLSDBCHECKSUM | OSPFv3WWLINKTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
! 337: 4, {1, 5, 1, 8}},
! 338: {OSPFv3WWLSDBADVERTISEMENT | OSPFv3WWLINKTABLE, STRING, RONLY, ospfv3WwLsdbEntry,
! 339: 4, {1, 5, 1, 9}},
! 340: {OSPFv3WWLSDBTYPEKNOWN | OSPFv3WWLINKTABLE, INTEGER, RONLY, ospfv3WwLsdbEntry,
! 341: 4, {1, 5, 1, 10}},
! 342:
! 343: /* OSPFv3 interfaces */
! 344: {OSPFv3IFAREAID, UNSIGNED, RONLY, ospfv3IfEntry,
! 345: 4, {1, 7, 1, 3}},
! 346: {OSPFv3IFTYPE, INTEGER, RONLY, ospfv3IfEntry,
! 347: 4, {1, 7, 1, 4}},
! 348: {OSPFv3IFADMINSTATUS, INTEGER, RONLY, ospfv3IfEntry,
! 349: 4, {1, 7, 1, 5}},
! 350: {OSPFv3IFRTRPRIORITY, INTEGER, RONLY, ospfv3IfEntry,
! 351: 4, {1, 7, 1, 6}},
! 352: {OSPFv3IFTRANSITDELAY, UNSIGNED, RONLY, ospfv3IfEntry,
! 353: 4, {1, 7, 1, 7}},
! 354: {OSPFv3IFRETRANSINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
! 355: 4, {1, 7, 1, 8}},
! 356: {OSPFv3IFHELLOINTERVAL, INTEGER, RONLY, ospfv3IfEntry,
! 357: 4, {1, 7, 1, 9}},
! 358: {OSPFv3IFRTRDEADINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
! 359: 4, {1, 7, 1, 10}},
! 360: {OSPFv3IFPOLLINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
! 361: 4, {1, 7, 1, 11}},
! 362: {OSPFv3IFSTATE, INTEGER, RONLY, ospfv3IfEntry,
! 363: 4, {1, 7, 1, 12}},
! 364: {OSPFv3IFDESIGNATEDROUTER, UNSIGNED, RONLY, ospfv3IfEntry,
! 365: 4, {1, 7, 1, 13}},
! 366: {OSPFv3IFBACKUPDESIGNATEDROUTER, UNSIGNED, RONLY, ospfv3IfEntry,
! 367: 4, {1, 7, 1, 14}},
! 368: {OSPFv3IFEVENTS, COUNTER, RONLY, ospfv3IfEntry,
! 369: 4, {1, 7, 1, 15}},
! 370: {OSPFv3IFROWSTATUS, INTEGER, RONLY, ospfv3IfEntry,
! 371: 4, {1, 7, 1, 16}},
! 372: {OSPFv3IFDEMAND, INTEGER, RONLY, ospfv3IfEntry,
! 373: 4, {1, 7, 1, 17}},
! 374: {OSPFv3IFMETRICVALUE, INTEGER, RONLY, ospfv3IfEntry,
! 375: 4, {1, 7, 1, 18}},
! 376: {OSPFv3IFLINKSCOPELSACOUNT, GAUGE, RONLY, ospfv3IfEntry,
! 377: 4, {1, 7, 1, 19}},
! 378: {OSPFv3IFLINKLSACKSUMSUM, UNSIGNED, RONLY, ospfv3IfEntry,
! 379: 4, {1, 7, 1, 20}},
! 380: {OSPFv3IFDEMANDNBRPROBE, INTEGER, RONLY, ospfv3IfEntry,
! 381: 4, {1, 7, 1, 21}},
! 382: {OSPFv3IFDEMANDNBRPROBERETRANSLIMIT, UNSIGNED, RONLY, ospfv3IfEntry,
! 383: 4, {1, 7, 1, 22}},
! 384: {OSPFv3IFDEMANDNBRPROBEINTERVAL, UNSIGNED, RONLY, ospfv3IfEntry,
! 385: 4, {1, 7, 1, 23}},
! 386: {OSPFv3IFTEDISABLED, INTEGER, RONLY, ospfv3IfEntry,
! 387: 4, {1, 7, 1, 24}},
! 388: {OSPFv3IFLINKLSASUPPRESSION, INTEGER, RONLY, ospfv3IfEntry,
! 389: 4, {1, 7, 1, 25}},
! 390:
! 391: /* OSPFv3 neighbors */
! 392: {OSPFv3NBRADDRESSTYPE, INTEGER, RONLY, ospfv3NbrEntry,
! 393: 4, {1, 9, 1, 4}},
! 394: {OSPFv3NBRADDRESS, STRING, RONLY, ospfv3NbrEntry,
! 395: 4, {1, 9, 1, 5}},
! 396: {OSPFv3NBROPTIONS, INTEGER, RONLY, ospfv3NbrEntry,
! 397: 4, {1, 9, 1, 6}},
! 398: {OSPFv3NBRPRIORITY, INTEGER, RONLY, ospfv3NbrEntry,
! 399: 4, {1, 9, 1, 7}},
! 400: {OSPFv3NBRSTATE, INTEGER, RONLY, ospfv3NbrEntry,
! 401: 4, {1, 9, 1, 8}},
! 402: {OSPFv3NBREVENTS, COUNTER, RONLY, ospfv3NbrEntry,
! 403: 4, {1, 9, 1, 9}},
! 404: {OSPFv3NBRLSRETRANSQLEN, GAUGE, RONLY, ospfv3NbrEntry,
! 405: 4, {1, 9, 1, 10}},
! 406: {OSPFv3NBRHELLOSUPPRESSED, INTEGER, RONLY, ospfv3NbrEntry,
! 407: 4, {1, 9, 1, 11}},
! 408: {OSPFv3NBRIFID, INTEGER, RONLY, ospfv3NbrEntry,
! 409: 4, {1, 9, 1, 12}},
! 410: {OSPFv3NBRRESTARTHELPERSTATUS, INTEGER, RONLY, ospfv3NbrEntry,
! 411: 4, {1, 9, 1, 13}},
! 412: {OSPFv3NBRRESTARTHELPERAGE, UNSIGNED, RONLY, ospfv3NbrEntry,
! 413: 4, {1, 9, 1, 14}},
! 414: {OSPFv3NBRRESTARTHELPEREXITREASON, INTEGER, RONLY, ospfv3NbrEntry,
! 415: 4, {1, 9, 1, 15}},
1.1 misho 416: };
417:
418: static u_char *
419: ospfv3GeneralGroup (struct variable *v, oid *name, size_t *length,
420: int exact, size_t *var_len, WriteMethod **write_method)
421: {
1.1.1.2 ! misho 422: u_int16_t sum;
! 423: u_int32_t count;
! 424: struct ospf6_lsa *lsa = NULL;
! 425:
1.1 misho 426: /* Check whether the instance identifier is valid */
427: if (smux_header_generic (v, name, length, exact, var_len, write_method)
428: == MATCH_FAILED)
429: return NULL;
430:
431: /* Return the current value of the variable */
432: switch (v->magic)
433: {
1.1.1.2 ! misho 434: case OSPFv3ROUTERID:
1.1 misho 435: /* Router-ID of this OSPF instance. */
436: if (ospf6)
1.1.1.2 ! misho 437: return SNMP_INTEGER (ntohl (ospf6->router_id));
! 438: return SNMP_INTEGER (0);
! 439: case OSPFv3ADMINSTAT:
! 440: if (ospf6)
! 441: return SNMP_INTEGER (CHECK_FLAG (ospf6->flag, OSPF6_DISABLED)?
! 442: OSPF_STATUS_DISABLED:OSPF_STATUS_ENABLED);
! 443: return SNMP_INTEGER (OSPF_STATUS_DISABLED);
! 444: case OSPFv3VERSIONNUMBER:
! 445: return SNMP_INTEGER (3);
! 446: case OSPFv3AREABDRRTRSTATUS:
! 447: if (ospf6)
! 448: return SNMP_INTEGER (ospf6_is_router_abr (ospf6)?SNMP_TRUE:SNMP_FALSE);
! 449: return SNMP_INTEGER (SNMP_FALSE);
! 450: case OSPFv3ASBDRRTRSTATUS:
! 451: if (ospf6)
! 452: return SNMP_INTEGER (ospf6_asbr_is_asbr (ospf6)?SNMP_TRUE:SNMP_FALSE);
! 453: return SNMP_INTEGER (SNMP_FALSE);
! 454: case OSPFv3ASSCOPELSACOUNT:
! 455: if (ospf6)
! 456: return SNMP_INTEGER (ospf6->lsdb->count);
! 457: return SNMP_INTEGER (0);
! 458: case OSPFv3ASSCOPELSACHECKSUMSUM:
! 459: if (ospf6)
! 460: {
! 461: for (sum = 0, lsa = ospf6_lsdb_head (ospf6->lsdb);
! 462: lsa;
! 463: lsa = ospf6_lsdb_next (lsa))
! 464: sum += ntohs (lsa->header->checksum);
! 465: return SNMP_INTEGER (sum);
! 466: }
! 467: return SNMP_INTEGER (0);
! 468: case OSPFv3ORIGINATENEWLSAS:
! 469: return SNMP_INTEGER (0); /* Don't know where to get this value... */
! 470: case OSPFv3RXNEWLSAS:
! 471: return SNMP_INTEGER (0); /* Don't know where to get this value... */
! 472: case OSPFv3EXTLSACOUNT:
! 473: if (ospf6)
! 474: {
! 475: for (count = 0, lsa = ospf6_lsdb_type_head (htons (OSPF6_LSTYPE_AS_EXTERNAL),
! 476: ospf6->lsdb);
! 477: lsa;
! 478: lsa = ospf6_lsdb_type_next (htons (OSPF6_LSTYPE_AS_EXTERNAL),
! 479: lsa))
! 480: count += 1;
! 481: return SNMP_INTEGER (count);
! 482: }
! 483: return SNMP_INTEGER (0);
! 484: case OSPFv3EXTAREALSDBLIMIT:
! 485: return SNMP_INTEGER (-1);
! 486: case OSPFv3EXITOVERFLOWINTERVAL:
! 487: return SNMP_INTEGER (0); /* Not supported */
! 488: case OSPFv3DEMANDEXTENSIONS:
! 489: return SNMP_INTEGER (0); /* Not supported */
! 490: case OSPFv3REFERENCEBANDWIDTH:
! 491: return SNMP_INTEGER (100000);
! 492: case OSPFv3RESTARTSUPPORT:
! 493: case OSPFv3RESTARTINTERVAL:
! 494: case OSPFv3RESTARTSTRICTLSACHECKING:
! 495: case OSPFv3RESTARTSTATUS:
! 496: case OSPFv3RESTARTAGE:
! 497: case OSPFv3RESTARTEXITREASON:
! 498: case OSPFv3NOTIFICATIONENABLE:
! 499: case OSPFv3STUBROUTERSUPPORT:
! 500: case OSPFv3STUBROUTERADVERTISEMENT:
! 501: case OSPFv3DISCONTINUITYTIME:
! 502: case OSPFv3RESTARTTIME:
! 503: /* TODO: Not implemented */
1.1 misho 504: return NULL;
505: }
506: return NULL;
507: }
508:
509: static u_char *
510: ospfv3AreaEntry (struct variable *v, oid *name, size_t *length,
511: int exact, size_t *var_len, WriteMethod **write_method)
512: {
513: struct ospf6_area *oa, *area = NULL;
1.1.1.2 ! misho 514: struct ospf6_lsa *lsa = NULL;
1.1 misho 515: u_int32_t area_id = 0;
1.1.1.2 ! misho 516: u_int32_t count;
! 517: u_int16_t sum;
1.1 misho 518: struct listnode *node;
519: unsigned int len;
1.1.1.2 ! misho 520: char a[16];
! 521: struct ospf6_route *ro;
1.1 misho 522:
523: if (ospf6 == NULL)
524: return NULL;
525:
1.1.1.2 ! misho 526: if (smux_header_table(v, name, length, exact, var_len, write_method)
! 527: == MATCH_FAILED)
! 528: return NULL;
! 529:
1.1 misho 530: len = *length - v->namelen;
1.1.1.2 ! misho 531: len = (len >= 1 ? sizeof 1 : 0);
! 532: if (exact && len != 1)
1.1 misho 533: return NULL;
534: if (len)
1.1.1.2 ! misho 535: area_id = htonl (name[v->namelen]);
1.1 misho 536:
1.1.1.2 ! misho 537: inet_ntop (AF_INET, &area_id, a, sizeof (a));
1.1 misho 538: zlog_debug ("SNMP access by area: %s, exact=%d len=%d length=%lu",
1.1.1.2 ! misho 539: a, exact, len, (u_long)*length);
1.1 misho 540:
541: for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
542: {
543: if (area == NULL)
544: {
545: if (len == 0) /* return first area entry */
546: area = oa;
547: else if (exact && ntohl (oa->area_id) == ntohl (area_id))
548: area = oa;
549: else if (ntohl (oa->area_id) > ntohl (area_id))
550: area = oa;
551: }
552: }
553:
554: if (area == NULL)
555: return NULL;
556:
1.1.1.2 ! misho 557: *length = v->namelen + 1;
! 558: name[v->namelen] = ntohl (area->area_id);
1.1 misho 559:
1.1.1.2 ! misho 560: inet_ntop (AF_INET, &area->area_id, a, sizeof (a));
1.1 misho 561: zlog_debug ("SNMP found area: %s, exact=%d len=%d length=%lu",
1.1.1.2 ! misho 562: a, exact, len, (u_long)*length);
1.1 misho 563:
564: switch (v->magic)
565: {
1.1.1.2 ! misho 566: case OSPFv3IMPORTASEXTERN:
! 567: /* No NSSA support */
! 568: return SNMP_INTEGER (IS_AREA_STUB(area)?2:1);
! 569: case OSPFv3AREASPFRUNS:
! 570: return SNMP_INTEGER (area->spf_calculation);
! 571: case OSPFv3AREABDRRTRCOUNT:
! 572: case OSPFv3AREAASBDRRTRCOUNT:
! 573: count = 0;
! 574: for (ro = ospf6_route_head (ospf6->brouter_table); ro;
! 575: ro = ospf6_route_next (ro))
! 576: {
! 577: if (ntohl (ro->path.area_id) != ntohl (area->area_id)) continue;
! 578: if (v->magic == OSPFv3AREABDRRTRCOUNT &&
! 579: CHECK_FLAG (ro->path.router_bits, OSPF6_ROUTER_BIT_B))
! 580: count++;
! 581: if (v->magic == OSPFv3AREAASBDRRTRCOUNT &&
! 582: CHECK_FLAG (ro->path.router_bits, OSPF6_ROUTER_BIT_E))
! 583: count++;
! 584: }
! 585: return SNMP_INTEGER (count);
! 586: case OSPFv3AREASCOPELSACOUNT:
! 587: return SNMP_INTEGER (area->lsdb->count);
! 588: case OSPFv3AREASCOPELSACKSUMSUM:
! 589: for (sum = 0, lsa = ospf6_lsdb_head (area->lsdb);
! 590: lsa;
! 591: lsa = ospf6_lsdb_next (lsa))
! 592: sum += ntohs (lsa->header->checksum);
! 593: return SNMP_INTEGER (sum);
! 594: case OSPFv3AREASUMMARY:
! 595: return SNMP_INTEGER (2); /* sendAreaSummary */
! 596: case OSPFv3AREAROWSTATUS:
! 597: return SNMP_INTEGER (1); /* Active */
! 598: case OSPFv3AREASTUBMETRIC:
! 599: case OSPFv3AREANSSATRANSLATORROLE:
! 600: case OSPFv3AREANSSATRANSLATORSTATE:
! 601: case OSPFv3AREANSSATRANSLATORSTABINTERVAL:
! 602: case OSPFv3AREANSSATRANSLATOREVENTS:
! 603: case OSPFv3AREASTUBMETRICTYPE:
! 604: case OSPFv3AREATEENABLED:
! 605: /* Not implemented. */
1.1 misho 606: return NULL;
607: }
608: return NULL;
609: }
610:
1.1.1.2 ! misho 611: static int
! 612: if_icmp_func (struct interface *ifp1, struct interface *ifp2)
! 613: {
! 614: return (ifp1->ifindex - ifp2->ifindex);
! 615: }
! 616:
1.1 misho 617: static u_char *
1.1.1.2 ! misho 618: ospfv3WwLsdbEntry (struct variable *v, oid *name, size_t *length,
1.1 misho 619: int exact, size_t *var_len, WriteMethod **write_method)
620: {
621: struct ospf6_lsa *lsa = NULL;
1.1.1.2 ! misho 622: u_int32_t ifindex, area_id, id, instid, adv_router;
1.1 misho 623: u_int16_t type;
624: int len;
625: oid *offset;
626: int offsetlen;
627: char a[16], b[16], c[16];
628: struct ospf6_area *oa;
629: struct listnode *node;
1.1.1.2 ! misho 630: struct interface *iif;
! 631: struct ospf6_interface *oi = NULL;
! 632: struct list *ifslist;
! 633:
! 634: if (smux_header_table(v, name, length, exact, var_len, write_method)
! 635: == MATCH_FAILED)
! 636: return NULL;
1.1 misho 637:
1.1.1.2 ! misho 638: instid = ifindex = area_id = type = id = adv_router = 0;
1.1 misho 639:
640: /* Check OSPFv3 instance. */
641: if (ospf6 == NULL)
642: return NULL;
643:
644: /* Get variable length. */
645: offset = name + v->namelen;
646: offsetlen = *length - v->namelen;
647:
1.1.1.2 ! misho 648: if (exact && (v->magic & OSPFv3WWASTABLE) && offsetlen != 3)
! 649: return NULL;
! 650: if (exact && (v->magic & OSPFv3WWAREATABLE) && offsetlen != 4)
! 651: return NULL;
! 652: if (exact && (v->magic & OSPFv3WWLINKTABLE) && offsetlen != 5)
1.1 misho 653: return NULL;
654:
1.1.1.2 ! misho 655: if (v->magic & OSPFv3WWLINKTABLE)
! 656: {
! 657: /* Parse ifindex */
! 658: len = (offsetlen < 1 ? 0 : 1);
! 659: if (len)
! 660: ifindex = *offset;
! 661: offset += len;
! 662: offsetlen -= len;
! 663:
! 664: /* Parse instance ID */
! 665: len = (offsetlen < 1 ? 0 : 1);
! 666: if (len)
! 667: instid = *offset;
! 668: offset += len;
! 669: offsetlen -= len;
! 670: }
! 671: else if (v->magic & OSPFv3WWAREATABLE)
! 672: {
! 673: /* Parse area-id */
! 674: len = (offsetlen < 1 ? 0 : 1);
! 675: if (len)
! 676: area_id = htonl (*offset);
! 677: offset += len;
! 678: offsetlen -= len;
! 679: }
1.1 misho 680:
681: /* Parse type */
1.1.1.2 ! misho 682: len = (offsetlen < 1 ? 0 : 1);
1.1 misho 683: if (len)
684: type = htons (*offset);
685: offset += len;
686: offsetlen -= len;
687:
688: /* Parse Router-ID */
1.1.1.2 ! misho 689: len = (offsetlen < 1 ? 0 : 1);
1.1 misho 690: if (len)
1.1.1.2 ! misho 691: adv_router = htonl (*offset);
1.1 misho 692: offset += len;
693: offsetlen -= len;
694:
695: /* Parse LS-ID */
1.1.1.2 ! misho 696: len = (offsetlen < 1 ? 0 : 1);
1.1 misho 697: if (len)
1.1.1.2 ! misho 698: id = htonl (*offset);
1.1 misho 699: offset += len;
700: offsetlen -= len;
701:
702: if (exact)
703: {
1.1.1.2 ! misho 704: if (v->magic & OSPFv3WWASTABLE)
! 705: {
! 706: lsa = ospf6_lsdb_lookup (type, id, adv_router, ospf6->lsdb);
! 707: }
! 708: else if (v->magic & OSPFv3WWAREATABLE)
! 709: {
! 710: oa = ospf6_area_lookup (area_id, ospf6);
! 711: if (!oa) return NULL;
! 712: lsa = ospf6_lsdb_lookup (type, id, adv_router, oa->lsdb);
! 713: }
! 714: else if (v->magic & OSPFv3WWLINKTABLE)
! 715: {
! 716: oi = ospf6_interface_lookup_by_ifindex (ifindex);
! 717: if (!oi || oi->instance_id != instid) return NULL;
! 718: lsa = ospf6_lsdb_lookup (type, id, adv_router, oi->lsdb);
! 719: }
1.1 misho 720: }
721: else
722: {
1.1.1.2 ! misho 723: if (v->magic & OSPFv3WWASTABLE)
! 724: {
! 725: if (ospf6->lsdb->count)
! 726: lsa = ospf6_lsdb_lookup_next (type, id, adv_router,
! 727: ospf6->lsdb);
! 728: }
! 729: else if (v->magic & OSPFv3WWAREATABLE)
! 730: for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
! 731: {
! 732: if (oa->area_id < area_id)
! 733: continue;
! 734:
! 735: if (oa->lsdb->count)
! 736: lsa = ospf6_lsdb_lookup_next (type, id, adv_router,
! 737: oa->lsdb);
! 738: if (lsa) break;
! 739: type = 0;
! 740: id = 0;
! 741: adv_router = 0;
! 742: }
! 743: else if (v->magic & OSPFv3WWLINKTABLE)
1.1 misho 744: {
1.1.1.2 ! misho 745: /* We build a sorted list of interfaces */
! 746: ifslist = list_new ();
! 747: if (!ifslist) return NULL;
! 748: ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
! 749: for (ALL_LIST_ELEMENTS_RO (iflist, node, iif))
! 750: listnode_add_sort (ifslist, iif);
! 751:
! 752: for (ALL_LIST_ELEMENTS_RO (ifslist, node, iif))
1.1 misho 753: {
1.1.1.2 ! misho 754: if (!iif->ifindex) continue;
! 755: oi = ospf6_interface_lookup_by_ifindex (iif->ifindex);
! 756: if (!oi) continue;
! 757: if (iif->ifindex < ifindex) continue;
! 758: if (oi->instance_id < instid) continue;
! 759:
! 760: if (oi->lsdb->count)
! 761: lsa = ospf6_lsdb_lookup_next (type, id, adv_router,
! 762: oi->lsdb);
! 763: if (lsa) break;
1.1 misho 764: type = 0;
1.1.1.2 ! misho 765: id = 0;
! 766: adv_router = 0;
! 767: oi = NULL;
1.1 misho 768: }
1.1.1.2 ! misho 769:
! 770: list_delete_all_node (ifslist);
1.1 misho 771: }
772: }
773:
774: if (! lsa)
775: return NULL;
776:
1.1.1.2 ! misho 777: /* Add indexes */
! 778: if (v->magic & OSPFv3WWASTABLE)
! 779: {
! 780: *length = v->namelen + 3;
! 781: offset = name + v->namelen;
! 782: }
! 783: else if (v->magic & OSPFv3WWAREATABLE)
! 784: {
! 785: *length = v->namelen + 4;
! 786: offset = name + v->namelen;
! 787: *offset = ntohl (oa->area_id);
! 788: offset++;
! 789: }
! 790: else if (v->magic & OSPFv3WWLINKTABLE)
! 791: {
! 792: *length = v->namelen + 5;
! 793: offset = name + v->namelen;
! 794: *offset = oi->interface->ifindex;
! 795: offset++;
! 796: *offset = oi->instance_id;
! 797: offset++;
! 798: }
1.1 misho 799: *offset = ntohs (lsa->header->type);
800: offset++;
1.1.1.2 ! misho 801: *offset = ntohl (lsa->header->adv_router);
! 802: offset++;
! 803: *offset = ntohl (lsa->header->id);
! 804: offset++;
1.1 misho 805:
806: /* Return the current value of the variable */
1.1.1.2 ! misho 807: switch (v->magic & OSPFv3WWCOLUMN)
1.1 misho 808: {
1.1.1.2 ! misho 809: case OSPFv3WWLSDBSEQUENCE:
! 810: return SNMP_INTEGER (ntohl (lsa->header->seqnum));
1.1 misho 811: break;
1.1.1.2 ! misho 812: case OSPFv3WWLSDBAGE:
1.1 misho 813: ospf6_lsa_age_current (lsa);
1.1.1.2 ! misho 814: return SNMP_INTEGER (ntohs (lsa->header->age));
1.1 misho 815: break;
1.1.1.2 ! misho 816: case OSPFv3WWLSDBCHECKSUM:
! 817: return SNMP_INTEGER (ntohs (lsa->header->checksum));
1.1 misho 818: break;
1.1.1.2 ! misho 819: case OSPFv3WWLSDBADVERTISEMENT:
1.1 misho 820: *var_len = ntohs (lsa->header->length);
821: return (u_char *) lsa->header;
822: break;
1.1.1.2 ! misho 823: case OSPFv3WWLSDBTYPEKNOWN:
1.1 misho 824: return SNMP_INTEGER (OSPF6_LSA_IS_KNOWN (lsa->header->type) ?
825: SNMP_TRUE : SNMP_FALSE);
826: break;
1.1.1.2 ! misho 827: }
! 828: return NULL;
! 829: }
! 830:
! 831: static u_char *
! 832: ospfv3IfEntry (struct variable *v, oid *name, size_t *length,
! 833: int exact, size_t *var_len, WriteMethod **write_method)
! 834: {
! 835: unsigned int ifindex, instid;
! 836: struct ospf6_interface *oi = NULL;
! 837: struct ospf6_lsa *lsa = NULL;
! 838: struct interface *iif;
! 839: struct listnode *i;
! 840: struct list *ifslist;
! 841: oid *offset;
! 842: int offsetlen, len;
! 843: u_int32_t sum;
! 844:
! 845: if (smux_header_table (v, name, length, exact, var_len, write_method)
! 846: == MATCH_FAILED)
! 847: return NULL;
! 848:
! 849: ifindex = instid = 0;
! 850:
! 851: /* Check OSPFv3 instance. */
! 852: if (ospf6 == NULL)
! 853: return NULL;
! 854:
! 855: /* Get variable length. */
! 856: offset = name + v->namelen;
! 857: offsetlen = *length - v->namelen;
! 858:
! 859: if (exact && offsetlen != 2)
! 860: return NULL;
! 861:
! 862: /* Parse if index */
! 863: len = (offsetlen < 1 ? 0 : 1);
! 864: if (len)
! 865: ifindex = *offset;
! 866: offset += len;
! 867: offsetlen -= len;
! 868:
! 869: /* Parse instance ID */
! 870: len = (offsetlen < 1 ? 0 : 1);
! 871: if (len)
! 872: instid = *offset;
! 873: offset += len;
! 874: offsetlen -= len;
! 875:
! 876: if (exact)
! 877: {
! 878: oi = ospf6_interface_lookup_by_ifindex (ifindex);
! 879: if (!oi || oi->instance_id != instid) return NULL;
! 880: }
! 881: else
! 882: {
! 883: /* We build a sorted list of interfaces */
! 884: ifslist = list_new ();
! 885: if (!ifslist) return NULL;
! 886: ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
! 887: for (ALL_LIST_ELEMENTS_RO (iflist, i, iif))
! 888: listnode_add_sort (ifslist, iif);
! 889:
! 890: for (ALL_LIST_ELEMENTS_RO (ifslist, i, iif))
! 891: {
! 892: if (!iif->ifindex) continue;
! 893: oi = ospf6_interface_lookup_by_ifindex (iif->ifindex);
! 894: if (!oi) continue;
! 895: if (iif->ifindex > ifindex ||
! 896: (iif->ifindex == ifindex &&
! 897: (oi->instance_id > instid)))
! 898: break;
! 899: oi = NULL;
! 900: }
! 901:
! 902: list_delete_all_node (ifslist);
! 903: }
! 904:
! 905: if (!oi) return NULL;
! 906:
! 907: /* Add Index (IfIndex, IfInstId) */
! 908: *length = v->namelen + 2;
! 909: offset = name + v->namelen;
! 910: *offset = oi->interface->ifindex;
! 911: offset++;
! 912: *offset = oi->instance_id;
! 913: offset++;
! 914:
! 915: /* Return the current value of the variable */
! 916: switch (v->magic)
! 917: {
! 918: case OSPFv3IFAREAID:
! 919: if (oi->area)
! 920: return SNMP_INTEGER (ntohl (oi->area->area_id));
! 921: break;
! 922: case OSPFv3IFTYPE:
! 923: if (if_is_broadcast (oi->interface))
! 924: return SNMP_INTEGER (1);
! 925: else if (if_is_pointopoint (oi->interface))
! 926: return SNMP_INTEGER (3);
! 927: else break; /* Unknown, don't put anything */
! 928: case OSPFv3IFADMINSTATUS:
! 929: if (oi->area)
! 930: return SNMP_INTEGER (OSPF_STATUS_ENABLED);
! 931: return SNMP_INTEGER (OSPF_STATUS_DISABLED);
! 932: case OSPFv3IFRTRPRIORITY:
! 933: return SNMP_INTEGER (oi->priority);
! 934: case OSPFv3IFTRANSITDELAY:
! 935: return SNMP_INTEGER (oi->transdelay);
! 936: case OSPFv3IFRETRANSINTERVAL:
! 937: return SNMP_INTEGER (oi->rxmt_interval);
! 938: case OSPFv3IFHELLOINTERVAL:
! 939: return SNMP_INTEGER (oi->hello_interval);
! 940: case OSPFv3IFRTRDEADINTERVAL:
! 941: return SNMP_INTEGER (oi->dead_interval);
! 942: case OSPFv3IFPOLLINTERVAL:
! 943: /* No support for NBMA */
! 944: break;
! 945: case OSPFv3IFSTATE:
! 946: return SNMP_INTEGER (oi->state);
! 947: case OSPFv3IFDESIGNATEDROUTER:
! 948: return SNMP_INTEGER (ntohl (oi->drouter));
! 949: case OSPFv3IFBACKUPDESIGNATEDROUTER:
! 950: return SNMP_INTEGER (ntohl (oi->bdrouter));
! 951: case OSPFv3IFEVENTS:
! 952: return SNMP_INTEGER (oi->state_change);
! 953: case OSPFv3IFROWSTATUS:
! 954: return SNMP_INTEGER (1);
! 955: case OSPFv3IFDEMAND:
! 956: return SNMP_INTEGER (SNMP_FALSE);
! 957: case OSPFv3IFMETRICVALUE:
! 958: return SNMP_INTEGER (oi->cost);
! 959: case OSPFv3IFLINKSCOPELSACOUNT:
! 960: return SNMP_INTEGER (oi->lsdb->count);
! 961: case OSPFv3IFLINKLSACKSUMSUM:
! 962: for (sum = 0, lsa = ospf6_lsdb_head (oi->lsdb);
! 963: lsa;
! 964: lsa = ospf6_lsdb_next (lsa))
! 965: sum += ntohs (lsa->header->checksum);
! 966: return SNMP_INTEGER (sum);
! 967: case OSPFv3IFDEMANDNBRPROBE:
! 968: case OSPFv3IFDEMANDNBRPROBERETRANSLIMIT:
! 969: case OSPFv3IFDEMANDNBRPROBEINTERVAL:
! 970: case OSPFv3IFTEDISABLED:
! 971: case OSPFv3IFLINKLSASUPPRESSION:
! 972: /* Not implemented. Only works if all the last ones are not
! 973: implemented! */
1.1 misho 974: return NULL;
975: }
1.1.1.2 ! misho 976:
! 977: /* Try an internal getnext. Some columns are missing in this table. */
! 978: if (!exact && (name[*length-1] < MAX_SUBID))
! 979: return ospfv3IfEntry(v, name, length,
! 980: exact, var_len, write_method);
! 981: return NULL;
! 982: }
! 983:
! 984: static u_char *
! 985: ospfv3NbrEntry (struct variable *v, oid *name, size_t *length,
! 986: int exact, size_t *var_len, WriteMethod **write_method)
! 987: {
! 988: unsigned int ifindex, instid, rtrid;
! 989: struct ospf6_interface *oi = NULL;
! 990: struct ospf6_neighbor *on = NULL;
! 991: struct interface *iif;
! 992: struct listnode *i, *j;
! 993: struct list *ifslist;
! 994: oid *offset;
! 995: int offsetlen, len;
! 996:
! 997: if (smux_header_table (v, name, length, exact, var_len, write_method)
! 998: == MATCH_FAILED)
! 999: return NULL;
! 1000:
! 1001: ifindex = instid = rtrid = 0;
! 1002:
! 1003: /* Check OSPFv3 instance. */
! 1004: if (ospf6 == NULL)
! 1005: return NULL;
! 1006:
! 1007: /* Get variable length. */
! 1008: offset = name + v->namelen;
! 1009: offsetlen = *length - v->namelen;
! 1010:
! 1011: if (exact && offsetlen != 3)
! 1012: return NULL;
! 1013:
! 1014: /* Parse if index */
! 1015: len = (offsetlen < 1 ? 0 : 1);
! 1016: if (len)
! 1017: ifindex = *offset;
! 1018: offset += len;
! 1019: offsetlen -= len;
! 1020:
! 1021: /* Parse instance ID */
! 1022: len = (offsetlen < 1 ? 0 : 1);
! 1023: if (len)
! 1024: instid = *offset;
! 1025: offset += len;
! 1026: offsetlen -= len;
! 1027:
! 1028: /* Parse router ID */
! 1029: len = (offsetlen < 1 ? 0 : 1);
! 1030: if (len)
! 1031: rtrid = htonl (*offset);
! 1032: offset += len;
! 1033: offsetlen -= len;
! 1034:
! 1035: if (exact)
! 1036: {
! 1037: oi = ospf6_interface_lookup_by_ifindex (ifindex);
! 1038: if (!oi || oi->instance_id != instid) return NULL;
! 1039: on = ospf6_neighbor_lookup (rtrid, oi);
! 1040: }
! 1041: else
! 1042: {
! 1043: /* We build a sorted list of interfaces */
! 1044: ifslist = list_new ();
! 1045: if (!ifslist) return NULL;
! 1046: ifslist->cmp = (int (*)(void *, void *))if_icmp_func;
! 1047: for (ALL_LIST_ELEMENTS_RO (iflist, i, iif))
! 1048: listnode_add_sort (ifslist, iif);
! 1049:
! 1050: for (ALL_LIST_ELEMENTS_RO (ifslist, i, iif))
! 1051: {
! 1052: if (!iif->ifindex) continue;
! 1053: oi = ospf6_interface_lookup_by_ifindex (iif->ifindex);
! 1054: if (!oi) continue;
! 1055: for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, j, on)) {
! 1056: if (iif->ifindex > ifindex ||
! 1057: (iif->ifindex == ifindex &&
! 1058: (oi->instance_id > instid ||
! 1059: (oi->instance_id == instid &&
! 1060: ntohl (on->router_id) > ntohl (rtrid)))))
! 1061: break;
! 1062: }
! 1063: if (on) break;
! 1064: oi = NULL;
! 1065: on = NULL;
! 1066: }
! 1067:
! 1068: list_delete_all_node (ifslist);
! 1069: }
! 1070:
! 1071: if (!oi || !on) return NULL;
! 1072:
! 1073: /* Add Index (IfIndex, IfInstId, RtrId) */
! 1074: *length = v->namelen + 3;
! 1075: offset = name + v->namelen;
! 1076: *offset = oi->interface->ifindex;
! 1077: offset++;
! 1078: *offset = oi->instance_id;
! 1079: offset++;
! 1080: *offset = ntohl (on->router_id);
! 1081: offset++;
! 1082:
! 1083: /* Return the current value of the variable */
! 1084: switch (v->magic)
! 1085: {
! 1086: case OSPFv3NBRADDRESSTYPE:
! 1087: return SNMP_INTEGER (2); /* IPv6 only */
! 1088: case OSPFv3NBRADDRESS:
! 1089: *var_len = sizeof (struct in6_addr);
! 1090: return (u_char *) &on->linklocal_addr;
! 1091: case OSPFv3NBROPTIONS:
! 1092: return SNMP_INTEGER (on->options[2]);
! 1093: case OSPFv3NBRPRIORITY:
! 1094: return SNMP_INTEGER (on->priority);
! 1095: case OSPFv3NBRSTATE:
! 1096: return SNMP_INTEGER (on->state);
! 1097: case OSPFv3NBREVENTS:
! 1098: return SNMP_INTEGER (on->state_change);
! 1099: case OSPFv3NBRLSRETRANSQLEN:
! 1100: return SNMP_INTEGER (on->retrans_list->count);
! 1101: case OSPFv3NBRHELLOSUPPRESSED:
! 1102: return SNMP_INTEGER (SNMP_FALSE);
! 1103: case OSPFv3NBRIFID:
! 1104: return SNMP_INTEGER (on->ifindex);
! 1105: case OSPFv3NBRRESTARTHELPERSTATUS:
! 1106: case OSPFv3NBRRESTARTHELPERAGE:
! 1107: case OSPFv3NBRRESTARTHELPEREXITREASON:
! 1108: /* Not implemented. Only works if all the last ones are not
! 1109: implemented! */
! 1110: return NULL;
! 1111: }
! 1112:
1.1 misho 1113: return NULL;
1114: }
1115:
1.1.1.2 ! misho 1116: /* OSPF Traps. */
! 1117: #define NBRSTATECHANGE 2
! 1118: #define IFSTATECHANGE 10
! 1119:
! 1120: static struct trap_object ospf6NbrTrapList[] =
! 1121: {
! 1122: {-3, {1, 1, OSPFv3ROUTERID}},
! 1123: {4, {1, 9, 1, OSPFv3NBRADDRESSTYPE}},
! 1124: {4, {1, 9, 1, OSPFv3NBRADDRESS}},
! 1125: {4, {1, 9, 1, OSPFv3NBRSTATE}}
! 1126: };
! 1127:
! 1128: static struct trap_object ospf6IfTrapList[] =
! 1129: {
! 1130: {-3, {1, 1, OSPFv3ROUTERID}},
! 1131: {4, {1, 7, 1, OSPFv3IFSTATE}},
! 1132: {4, {1, 7, 1, OSPFv3IFADMINSTATUS}},
! 1133: {4, {1, 7, 1, OSPFv3IFAREAID}}
! 1134: };
! 1135:
! 1136: void
! 1137: ospf6TrapNbrStateChange (struct ospf6_neighbor *on)
! 1138: {
! 1139: oid index[3];
! 1140:
! 1141: index[0] = on->ospf6_if->interface->ifindex;
! 1142: index[1] = on->ospf6_if->instance_id;
! 1143: index[2] = ntohl (on->router_id);
! 1144:
! 1145: smux_trap (ospfv3_variables, sizeof ospfv3_variables / sizeof (struct variable),
! 1146: ospfv3_trap_oid, sizeof ospfv3_trap_oid / sizeof (oid),
! 1147: ospfv3_oid, sizeof ospfv3_oid / sizeof (oid),
! 1148: index, 3,
! 1149: ospf6NbrTrapList,
! 1150: sizeof ospf6NbrTrapList / sizeof (struct trap_object),
! 1151: NBRSTATECHANGE);
! 1152: }
! 1153:
! 1154: void
! 1155: ospf6TrapIfStateChange (struct ospf6_interface *oi)
! 1156: {
! 1157: oid index[2];
! 1158:
! 1159: index[0] = oi->interface->ifindex;
! 1160: index[1] = oi->instance_id;
! 1161:
! 1162: smux_trap (ospfv3_variables, sizeof ospfv3_variables / sizeof (struct variable),
! 1163: ospfv3_trap_oid, sizeof ospfv3_trap_oid / sizeof (oid),
! 1164: ospfv3_oid, sizeof ospfv3_oid / sizeof (oid),
! 1165: index, 2,
! 1166: ospf6IfTrapList,
! 1167: sizeof ospf6IfTrapList / sizeof (struct trap_object),
! 1168: IFSTATECHANGE);
! 1169: }
1.1 misho 1170:
1171: /* Register OSPFv3-MIB. */
1172: void
1173: ospf6_snmp_init (struct thread_master *master)
1174: {
1175: smux_init (master);
1176: REGISTER_MIB ("OSPFv3MIB", ospfv3_variables, variable, ospfv3_oid);
1177: }
1178:
1179: #endif /* HAVE_SNMP */
1180:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>