forked from Mirror/frr
Merge svn revisions 1208, 1222 and 1228 from Zebra cvs.
This commit is contained in:
parent
c065230a4c
commit
2680aa2b2b
|
@ -47,6 +47,15 @@
|
||||||
* ospf6_spf.c: ditto.
|
* ospf6_spf.c: ditto.
|
||||||
* ospf6_top.c: ditto.
|
* ospf6_top.c: ditto.
|
||||||
|
|
||||||
|
2004-10-06 Yasuhiro Ohara <yasu@sfc.wide.ad.jp>
|
||||||
|
|
||||||
|
* ospf6_snmp.c: add partial support for SNMP
|
||||||
|
(i.e. ospfv3AreaLsdbTable).
|
||||||
|
* OSPFv3-MIB.txt: Net-SNMP translate Unsigned32 range
|
||||||
|
(0..'FFFFFFFF'h) incorrectly to (0..-1). Those parts for
|
||||||
|
Unsigned32 range are changed to (0..4294967295).
|
||||||
|
Also, doubtful 'not-accessible's are changed to read-only.
|
||||||
|
|
||||||
2004-10-06 Yasuhiro Ohara <yasu@sfc.wide.ad.jp>
|
2004-10-06 Yasuhiro Ohara <yasu@sfc.wide.ad.jp>
|
||||||
|
|
||||||
* ospf6_snmp.[ch], OSPFV3-MIB.txt: start supporting SNMP.
|
* ospf6_snmp.[ch], OSPFV3-MIB.txt: start supporting SNMP.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
OSPFV3-MIB DEFINITIONS ::= BEGIN
|
OSPFV3-MIB DEFINITIONS ::= BEGIN
|
||||||
|
|
||||||
IMPORTS
|
IMPORTS
|
||||||
MODULE-IDENTITY, OBJECT-TYPE, mib-2,
|
MODULE-IDENTITY, OBJECT-TYPE, mib-2, experimental,
|
||||||
Counter32, Gauge32, Integer32, IpAddress,
|
Counter32, Gauge32, Integer32, IpAddress,
|
||||||
Unsigned32
|
Unsigned32
|
||||||
FROM SNMPv2-SMI
|
FROM SNMPv2-SMI
|
||||||
|
@ -45,7 +45,7 @@ ospfv3MIB MODULE-IDENTITY
|
||||||
REVISION "200404081200Z"
|
REVISION "200404081200Z"
|
||||||
DESCRIPTION -- RFC Editor assigns RFC xxxx
|
DESCRIPTION -- RFC Editor assigns RFC xxxx
|
||||||
"Initial version, published as RFC xxxx"
|
"Initial version, published as RFC xxxx"
|
||||||
::= { mib-2 xx } -- IANA assigns xx
|
::= { experimental 102 } -- IANA assigns xx
|
||||||
|
|
||||||
-- Texual conventions
|
-- Texual conventions
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ RouterDeadRange ::= TEXTUAL-CONVENTION
|
||||||
"The range of intervals in seconds that a routers hello
|
"The range of intervals in seconds that a routers hello
|
||||||
must have not been seen before a neighbor declares the
|
must have not been seen before a neighbor declares the
|
||||||
router down"
|
router down"
|
||||||
SYNTAX Integer32 (1..ĆFFFFĆh)
|
SYNTAX Integer32 (1..'FFFF'h)
|
||||||
|
|
||||||
|
|
||||||
-- Top-level structure of MIB
|
-- Top-level structure of MIB
|
||||||
|
@ -420,7 +420,7 @@ Ospfv3AreaEntry ::= SEQUENCE {
|
||||||
|
|
||||||
ospfv3AreaId OBJECT-TYPE
|
ospfv3AreaId OBJECT-TYPE
|
||||||
SYNTAX AreaID
|
SYNTAX AreaID
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"A 32-bit integer uniquely identifying an area.
|
"A 32-bit integer uniquely identifying an area.
|
||||||
|
@ -654,8 +654,8 @@ Ospfv3AsLsdbEntry ::= SEQUENCE {
|
||||||
}
|
}
|
||||||
|
|
||||||
ospfv3AsLsdbType OBJECT-TYPE
|
ospfv3AsLsdbType OBJECT-TYPE
|
||||||
SYNTAX Unsigned32(0..'FFFFFFFF'h)
|
SYNTAX Unsigned32 (0..4294967295)
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The type of the link state advertisement.
|
"The type of the link state advertisement.
|
||||||
|
@ -666,7 +666,7 @@ ospfv3AsLsdbType OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3AsLsdbRouterId OBJECT-TYPE
|
ospfv3AsLsdbRouterId OBJECT-TYPE
|
||||||
SYNTAX RouterID
|
SYNTAX RouterID
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The 32 bit number that uniquely identifies the
|
"The 32 bit number that uniquely identifies the
|
||||||
|
@ -677,7 +677,7 @@ ospfv3AsLsdbRouterId OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3AsLsdbLsid OBJECT-TYPE
|
ospfv3AsLsdbLsid OBJECT-TYPE
|
||||||
SYNTAX IpAddress
|
SYNTAX IpAddress
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The Link State ID is an LS Type Specific field
|
"The Link State ID is an LS Type Specific field
|
||||||
|
@ -806,7 +806,7 @@ Ospfv3AreaLsdbEntry ::= SEQUENCE {
|
||||||
|
|
||||||
ospfv3AreaLsdbAreaId OBJECT-TYPE
|
ospfv3AreaLsdbAreaId OBJECT-TYPE
|
||||||
SYNTAX AreaID
|
SYNTAX AreaID
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The 32 bit identifier of the Area from which the
|
"The 32 bit identifier of the Area from which the
|
||||||
|
@ -816,8 +816,8 @@ ospfv3AreaLsdbAreaId OBJECT-TYPE
|
||||||
::= { ospfv3AreaLsdbEntry 1 }
|
::= { ospfv3AreaLsdbEntry 1 }
|
||||||
|
|
||||||
ospfv3AreaLsdbType OBJECT-TYPE
|
ospfv3AreaLsdbType OBJECT-TYPE
|
||||||
SYNTAX Unsigned32(0..'FFFFFFFF'h)
|
SYNTAX Unsigned32 (0..4294967295)
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The type of the link state advertisement.
|
"The type of the link state advertisement.
|
||||||
|
@ -828,7 +828,7 @@ ospfv3AreaLsdbType OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3AreaLsdbRouterId OBJECT-TYPE
|
ospfv3AreaLsdbRouterId OBJECT-TYPE
|
||||||
SYNTAX RouterID
|
SYNTAX RouterID
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The 32 bit number that uniquely identifies the
|
"The 32 bit number that uniquely identifies the
|
||||||
|
@ -839,7 +839,7 @@ ospfv3AreaLsdbRouterId OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3AreaLsdbLsid OBJECT-TYPE
|
ospfv3AreaLsdbLsid OBJECT-TYPE
|
||||||
SYNTAX IpAddress
|
SYNTAX IpAddress
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The Link State ID is an LS Type Specific field
|
"The Link State ID is an LS Type Specific field
|
||||||
|
@ -967,7 +967,7 @@ Ospfv3LinkLsdbEntry ::= SEQUENCE {
|
||||||
|
|
||||||
ospfv3LinkLsdbIfIndex OBJECT-TYPE
|
ospfv3LinkLsdbIfIndex OBJECT-TYPE
|
||||||
SYNTAX InterfaceIndex
|
SYNTAX InterfaceIndex
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The identifier of the link from which the LSA
|
"The identifier of the link from which the LSA
|
||||||
|
@ -977,8 +977,8 @@ ospfv3LinkLsdbIfIndex OBJECT-TYPE
|
||||||
::= { ospfv3LinkLsdbEntry 1 }
|
::= { ospfv3LinkLsdbEntry 1 }
|
||||||
|
|
||||||
ospfv3LinkLsdbType OBJECT-TYPE
|
ospfv3LinkLsdbType OBJECT-TYPE
|
||||||
SYNTAX Unsigned32(0..'FFFFFFFF'h)
|
SYNTAX Unsigned32 (0..4294967295)
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The type of the link state advertisement.
|
"The type of the link state advertisement.
|
||||||
|
@ -989,7 +989,7 @@ ospfv3LinkLsdbType OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3LinkLsdbRouterId OBJECT-TYPE
|
ospfv3LinkLsdbRouterId OBJECT-TYPE
|
||||||
SYNTAX RouterID
|
SYNTAX RouterID
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The 32 bit number that uniquely identifies the
|
"The 32 bit number that uniquely identifies the
|
||||||
|
@ -1000,7 +1000,7 @@ ospfv3LinkLsdbRouterId OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3LinkLsdbLsid OBJECT-TYPE
|
ospfv3LinkLsdbLsid OBJECT-TYPE
|
||||||
SYNTAX IpAddress
|
SYNTAX IpAddress
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The Link State ID is an LS Type Specific field
|
"The Link State ID is an LS Type Specific field
|
||||||
|
@ -1125,7 +1125,7 @@ Ospfv3HostEntry ::= SEQUENCE {
|
||||||
|
|
||||||
ospfv3HostAddressType OBJECT-TYPE
|
ospfv3HostAddressType OBJECT-TYPE
|
||||||
SYNTAX InetAddressType
|
SYNTAX InetAddressType
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The address type of ospfv3HostAddress. Only IPv6
|
"The address type of ospfv3HostAddress. Only IPv6
|
||||||
|
@ -1138,7 +1138,7 @@ ospfv3HostAddressType OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3HostAddress OBJECT-TYPE
|
ospfv3HostAddress OBJECT-TYPE
|
||||||
SYNTAX InetAddress (SIZE (16))
|
SYNTAX InetAddress (SIZE (16))
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The IPv6 Address of the Host. Must be a Global
|
"The IPv6 Address of the Host. Must be a Global
|
||||||
|
@ -1259,7 +1259,7 @@ Ospfv3IfEntry ::= SEQUENCE {
|
||||||
|
|
||||||
ospfv3IfIndex OBJECT-TYPE
|
ospfv3IfIndex OBJECT-TYPE
|
||||||
SYNTAX InterfaceIndex
|
SYNTAX InterfaceIndex
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The interface index of this OSPFv3 interface.
|
"The interface index of this OSPFv3 interface.
|
||||||
|
@ -1608,7 +1608,7 @@ Ospfv3VirtIfEntry ::= SEQUENCE {
|
||||||
|
|
||||||
ospfv3VirtIfAreaId OBJECT-TYPE
|
ospfv3VirtIfAreaId OBJECT-TYPE
|
||||||
SYNTAX AreaID
|
SYNTAX AreaID
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The Transit Area that the Virtual Link
|
"The Transit Area that the Virtual Link
|
||||||
|
@ -1617,7 +1617,7 @@ ospfv3VirtIfAreaId OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3VirtIfNeighbor OBJECT-TYPE
|
ospfv3VirtIfNeighbor OBJECT-TYPE
|
||||||
SYNTAX RouterID
|
SYNTAX RouterID
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The Router ID of the Virtual Neighbor."
|
"The Router ID of the Virtual Neighbor."
|
||||||
|
@ -1805,7 +1805,7 @@ Ospfv3NbrEntry ::= SEQUENCE {
|
||||||
|
|
||||||
ospfv3NbrIfIndex OBJECT-TYPE
|
ospfv3NbrIfIndex OBJECT-TYPE
|
||||||
SYNTAX InterfaceIndex
|
SYNTAX InterfaceIndex
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The local link ID of the link over which the
|
"The local link ID of the link over which the
|
||||||
|
@ -1814,7 +1814,7 @@ ospfv3NbrIfIndex OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3NbrRtrId OBJECT-TYPE
|
ospfv3NbrRtrId OBJECT-TYPE
|
||||||
SYNTAX RouterID
|
SYNTAX RouterID
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"A 32-bit integer (represented as a type IpAd-
|
"A 32-bit integer (represented as a type IpAd-
|
||||||
|
@ -2018,7 +2018,7 @@ Ospfv3NbmaNbrEntry ::= SEQUENCE {
|
||||||
|
|
||||||
ospfv3NbmaNbrIfIndex OBJECT-TYPE
|
ospfv3NbmaNbrIfIndex OBJECT-TYPE
|
||||||
SYNTAX InterfaceIndex
|
SYNTAX InterfaceIndex
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The local link ID of the link over which the
|
"The local link ID of the link over which the
|
||||||
|
@ -2027,7 +2027,7 @@ ospfv3NbmaNbrIfIndex OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3NbmaNbrAddressType OBJECT-TYPE
|
ospfv3NbmaNbrAddressType OBJECT-TYPE
|
||||||
SYNTAX InetAddressType
|
SYNTAX InetAddressType
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The address type of ospfv3NbrAddress. Only IPv6
|
"The address type of ospfv3NbrAddress. Only IPv6
|
||||||
|
@ -2036,7 +2036,7 @@ ospfv3NbmaNbrAddressType OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3NbmaNbrAddress OBJECT-TYPE
|
ospfv3NbmaNbrAddress OBJECT-TYPE
|
||||||
SYNTAX InetAddress (SIZE (16))
|
SYNTAX InetAddress (SIZE (16))
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The IPv6 address of the neighbor associated with
|
"The IPv6 address of the neighbor associated with
|
||||||
|
@ -2173,7 +2173,7 @@ Ospfv3VirtNbrEntry ::= SEQUENCE {
|
||||||
|
|
||||||
ospfv3VirtNbrArea OBJECT-TYPE
|
ospfv3VirtNbrArea OBJECT-TYPE
|
||||||
SYNTAX AreaID
|
SYNTAX AreaID
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The Transit Area Identifier."
|
"The Transit Area Identifier."
|
||||||
|
@ -2181,7 +2181,7 @@ ospfv3VirtNbrArea OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3VirtNbrRtrId OBJECT-TYPE
|
ospfv3VirtNbrRtrId OBJECT-TYPE
|
||||||
SYNTAX RouterID
|
SYNTAX RouterID
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"A 32-bit integer uniquely identifying the
|
"A 32-bit integer uniquely identifying the
|
||||||
|
@ -2378,7 +2378,7 @@ Ospfv3AreaAggregateEntry ::= SEQUENCE {
|
||||||
|
|
||||||
ospfv3AreaAggregateAreaID OBJECT-TYPE
|
ospfv3AreaAggregateAreaID OBJECT-TYPE
|
||||||
SYNTAX AreaID
|
SYNTAX AreaID
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The Area the Address Aggregate is to be found
|
"The Area the Address Aggregate is to be found
|
||||||
|
@ -2392,7 +2392,7 @@ ospfv3AreaAggregateAreaLsdbType OBJECT-TYPE
|
||||||
interAreaPrefixLsa(8195), -- 0x2003
|
interAreaPrefixLsa(8195), -- 0x2003
|
||||||
nssaExternalLsa(8199) -- 0x2007
|
nssaExternalLsa(8199) -- 0x2007
|
||||||
}
|
}
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The type of the Address Aggregate. This field
|
"The type of the Address Aggregate. This field
|
||||||
|
@ -2405,7 +2405,7 @@ ospfv3AreaAggregateAreaLsdbType OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3AreaAggregatePrefixType OBJECT-TYPE
|
ospfv3AreaAggregatePrefixType OBJECT-TYPE
|
||||||
SYNTAX InetAddressType
|
SYNTAX InetAddressType
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The prefix type of ospfv3AreaAggregatePrefix. Only
|
"The prefix type of ospfv3AreaAggregatePrefix. Only
|
||||||
|
@ -2414,7 +2414,7 @@ ospfv3AreaAggregatePrefixType OBJECT-TYPE
|
||||||
|
|
||||||
ospfv3AreaAggregatePrefix OBJECT-TYPE
|
ospfv3AreaAggregatePrefix OBJECT-TYPE
|
||||||
SYNTAX InetAddress (SIZE (0..16))
|
SYNTAX InetAddress (SIZE (0..16))
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The IPv6 Prefix."
|
"The IPv6 Prefix."
|
||||||
|
@ -2425,7 +2425,7 @@ ospfv3AreaAggregatePrefix OBJECT-TYPE
|
||||||
ospfv3AreaAggregatePrefixLength OBJECT-TYPE
|
ospfv3AreaAggregatePrefixLength OBJECT-TYPE
|
||||||
SYNTAX InetAddressPrefixLength (3..128)
|
SYNTAX InetAddressPrefixLength (3..128)
|
||||||
UNITS "bits"
|
UNITS "bits"
|
||||||
MAX-ACCESS not-accessible
|
MAX-ACCESS read-only
|
||||||
STATUS current
|
STATUS current
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
"The length of the prefix (in bits). A prefix can
|
"The length of the prefix (in bits). A prefix can
|
|
@ -97,6 +97,9 @@ ospf6_get_lsa_handler (u_int16_t type)
|
||||||
else
|
else
|
||||||
handler = vector_slot (ospf6_lsa_handler_vector, index);
|
handler = vector_slot (ospf6_lsa_handler_vector, index);
|
||||||
|
|
||||||
|
if (handler == NULL)
|
||||||
|
handler = &unknown_handler;
|
||||||
|
|
||||||
return handler;
|
return handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -148,6 +148,10 @@ struct ospf6_lsa_handler
|
||||||
u_char debug;
|
u_char debug;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern struct ospf6_lsa_handler unknown_handler;
|
||||||
|
#define OSPF6_LSA_IS_KNOWN(type) \
|
||||||
|
(ospf6_get_lsa_handler (type) != &unknown_handler ? 1 : 0)
|
||||||
|
|
||||||
/* Macro for LSA Origination */
|
/* Macro for LSA Origination */
|
||||||
/* addr is (struct prefix *) */
|
/* addr is (struct prefix *) */
|
||||||
#define CONTINUE_IF_ADDRESS_LINKLOCAL(debug,addr) \
|
#define CONTINUE_IF_ADDRESS_LINKLOCAL(debug,addr) \
|
||||||
|
@ -236,6 +240,8 @@ int ospf6_lsa_prohibited_duration (u_int16_t type, u_int32_t id,
|
||||||
u_int32_t adv_router, void *scope);
|
u_int32_t adv_router, void *scope);
|
||||||
|
|
||||||
void ospf6_install_lsa_handler (struct ospf6_lsa_handler *handler);
|
void ospf6_install_lsa_handler (struct ospf6_lsa_handler *handler);
|
||||||
|
struct ospf6_lsa_handler *ospf6_get_lsa_handler (u_int16_t type);
|
||||||
|
|
||||||
void ospf6_lsa_init ();
|
void ospf6_lsa_init ();
|
||||||
void ospf6_lsa_cmd_init ();
|
void ospf6_lsa_cmd_init ();
|
||||||
|
|
||||||
|
|
|
@ -258,6 +258,81 @@ ospf6_lsdb_lookup (u_int16_t type, u_int32_t id, u_int32_t adv_router,
|
||||||
return (struct ospf6_lsa *) node->info;
|
return (struct ospf6_lsa *) node->info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Macro version of check_bit (). */
|
||||||
|
#define CHECK_BIT(X,P) ((((u_char *)(X))[(P) / 8]) >> (7 - ((P) % 8)) & 1)
|
||||||
|
|
||||||
|
struct ospf6_lsa *
|
||||||
|
ospf6_lsdb_lookup_next (u_int16_t type, u_int32_t id, u_int32_t adv_router,
|
||||||
|
struct ospf6_lsdb *lsdb)
|
||||||
|
{
|
||||||
|
struct route_node *node;
|
||||||
|
struct route_node *matched = NULL;
|
||||||
|
struct prefix_ipv6 key;
|
||||||
|
struct prefix *p;
|
||||||
|
|
||||||
|
if (lsdb == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
memset (&key, 0, sizeof (key));
|
||||||
|
ospf6_lsdb_set_key (&key, &type, sizeof (type));
|
||||||
|
ospf6_lsdb_set_key (&key, &adv_router, sizeof (adv_router));
|
||||||
|
ospf6_lsdb_set_key (&key, &id, sizeof (id));
|
||||||
|
p = (struct prefix *) &key;
|
||||||
|
|
||||||
|
{
|
||||||
|
char buf[64];
|
||||||
|
prefix2str (p, buf, sizeof (buf));
|
||||||
|
zlog_info ("lsdb_lookup_next: key: %s", buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
node = lsdb->table->top;
|
||||||
|
/* walk down tree. */
|
||||||
|
while (node && node->p.prefixlen <= p->prefixlen &&
|
||||||
|
prefix_match (&node->p, p))
|
||||||
|
{
|
||||||
|
matched = node;
|
||||||
|
node = node->link[CHECK_BIT(&p->u.prefix, node->p.prefixlen)];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matched)
|
||||||
|
node = matched;
|
||||||
|
else
|
||||||
|
node = lsdb->table->top;
|
||||||
|
route_lock_node (node);
|
||||||
|
|
||||||
|
/* skip to real existing entry */
|
||||||
|
while (node && node->info == NULL)
|
||||||
|
node = route_next (node);
|
||||||
|
|
||||||
|
if (! node)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (prefix_same (&node->p, p))
|
||||||
|
{
|
||||||
|
struct route_node *prev = node;
|
||||||
|
struct ospf6_lsa *lsa_prev;
|
||||||
|
struct ospf6_lsa *lsa_next;
|
||||||
|
|
||||||
|
node = route_next (node);
|
||||||
|
while (node && node->info == NULL)
|
||||||
|
node = route_next (node);
|
||||||
|
|
||||||
|
lsa_prev = prev->info;
|
||||||
|
lsa_next = (node ? node->info : NULL);
|
||||||
|
assert (lsa_prev);
|
||||||
|
assert (lsa_prev->next == lsa_next);
|
||||||
|
if (lsa_next)
|
||||||
|
assert (lsa_next->prev == lsa_prev);
|
||||||
|
zlog_info ("lsdb_lookup_next: assert OK with previous LSA");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! node)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
route_unlock_node (node);
|
||||||
|
return (struct ospf6_lsa *) node->info;
|
||||||
|
}
|
||||||
|
|
||||||
/* Iteration function */
|
/* Iteration function */
|
||||||
struct ospf6_lsa *
|
struct ospf6_lsa *
|
||||||
ospf6_lsdb_head (struct ospf6_lsdb *lsdb)
|
ospf6_lsdb_head (struct ospf6_lsdb *lsdb)
|
||||||
|
@ -292,9 +367,6 @@ ospf6_lsdb_next (struct ospf6_lsa *lsa)
|
||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Macro version of check_bit (). */
|
|
||||||
#define CHECK_BIT(X,P) ((((u_char *)(X))[(P) / 8]) >> (7 - ((P) % 8)) & 1)
|
|
||||||
|
|
||||||
struct ospf6_lsa *
|
struct ospf6_lsa *
|
||||||
ospf6_lsdb_type_router_head (u_int16_t type, u_int32_t adv_router,
|
ospf6_lsdb_type_router_head (u_int16_t type, u_int32_t adv_router,
|
||||||
struct ospf6_lsdb *lsdb)
|
struct ospf6_lsdb *lsdb)
|
||||||
|
|
|
@ -53,9 +53,12 @@ struct ospf6_lsdb
|
||||||
struct ospf6_lsdb *ospf6_lsdb_create (void *data);
|
struct ospf6_lsdb *ospf6_lsdb_create (void *data);
|
||||||
void ospf6_lsdb_delete (struct ospf6_lsdb *lsdb);
|
void ospf6_lsdb_delete (struct ospf6_lsdb *lsdb);
|
||||||
|
|
||||||
struct ospf6_lsa *ospf6_lsdb_lookup (u_int16_t type, u_int32_t id,
|
struct ospf6_lsa *
|
||||||
u_int32_t adv_router,
|
ospf6_lsdb_lookup (u_int16_t type, u_int32_t id, u_int32_t adv_router,
|
||||||
struct ospf6_lsdb *lsdb);
|
struct ospf6_lsdb *lsdb);
|
||||||
|
struct ospf6_lsa *
|
||||||
|
ospf6_lsdb_lookup_next (u_int16_t type, u_int32_t id,
|
||||||
|
u_int32_t adv_router, struct ospf6_lsdb *lsdb);
|
||||||
|
|
||||||
void ospf6_lsdb_add (struct ospf6_lsa *lsa, struct ospf6_lsdb *lsdb);
|
void ospf6_lsdb_add (struct ospf6_lsa *lsa, struct ospf6_lsdb *lsdb);
|
||||||
void ospf6_lsdb_remove (struct ospf6_lsa *lsa, struct ospf6_lsdb *lsdb);
|
void ospf6_lsdb_remove (struct ospf6_lsa *lsa, struct ospf6_lsdb *lsdb);
|
||||||
|
|
|
@ -76,6 +76,30 @@
|
||||||
/* OSPFv3 MIB Area Table values. */
|
/* OSPFv3 MIB Area Table values. */
|
||||||
#define OSPFv3AREAID 1
|
#define OSPFv3AREAID 1
|
||||||
#define OSPFv3IMPORTASEXTERN 2
|
#define OSPFv3IMPORTASEXTERN 2
|
||||||
|
#define OSPFv3AREASPFRUNS 3
|
||||||
|
#define OSPFv3AREABDRRTRCOUNT 4
|
||||||
|
#define OSPFv3AREAASBDRRTRCOUNT 5
|
||||||
|
#define OSPFv3AREASCOPELSACOUNT 6
|
||||||
|
#define OSPFv3AREASCOPELSACKSUMSUM 7
|
||||||
|
#define OSPFv3AREASUMMARY 8
|
||||||
|
#define OSPFv3AREASTATUS 9
|
||||||
|
#define OSPFv3STUBMETRIC 10
|
||||||
|
#define OSPFv3AREANSSATRANSLATORROLE 11
|
||||||
|
#define OSPFv3AREANSSATRANSLATORSTATE 12
|
||||||
|
#define OSPFv3AREANSSATRANSLATORSTABILITYINTERVAL 13
|
||||||
|
#define OSPFv3AREANSSATRANSLATOREVENTS 14
|
||||||
|
#define OSPFv3AREASTUBMETRICTYPE 15
|
||||||
|
|
||||||
|
/* OSPFv3 MIB Area Lsdb Table values. */
|
||||||
|
#define OSPFv3AREALSDBAREAID 1
|
||||||
|
#define OSPFv3AREALSDBTYPE 2
|
||||||
|
#define OSPFv3AREALSDBROUTERID 3
|
||||||
|
#define OSPFv3AREALSDBLSID 4
|
||||||
|
#define OSPFv3AREALSDBSEQUENCE 5
|
||||||
|
#define OSPFv3AREALSDBAGE 6
|
||||||
|
#define OSPFv3AREALSDBCHECKSUM 7
|
||||||
|
#define OSPFv3AREALSDBADVERTISEMENT 8
|
||||||
|
#define OSPFv3AREALSDBTYPEKNOWN 9
|
||||||
|
|
||||||
/* SYNTAX Status from OSPF-MIB. */
|
/* SYNTAX Status from OSPF-MIB. */
|
||||||
#define OSPF_STATUS_ENABLED 1
|
#define OSPF_STATUS_ENABLED 1
|
||||||
|
@ -105,6 +129,7 @@ static struct in_addr ospf6_empty_id = {0};
|
||||||
/* Hook functions. */
|
/* Hook functions. */
|
||||||
static u_char *ospfv3GeneralGroup ();
|
static u_char *ospfv3GeneralGroup ();
|
||||||
static u_char *ospfv3AreaEntry ();
|
static u_char *ospfv3AreaEntry ();
|
||||||
|
static u_char *ospfv3AreaLsdbEntry ();
|
||||||
|
|
||||||
struct variable ospfv3_variables[] =
|
struct variable ospfv3_variables[] =
|
||||||
{
|
{
|
||||||
|
@ -155,8 +180,54 @@ struct variable ospfv3_variables[] =
|
||||||
/* OSPFv3 Area Data Structure */
|
/* OSPFv3 Area Data Structure */
|
||||||
{OSPFv3AREAID, IPADDRESS, RONLY, ospfv3AreaEntry,
|
{OSPFv3AREAID, IPADDRESS, RONLY, ospfv3AreaEntry,
|
||||||
4, {1, 2, 1, 1}},
|
4, {1, 2, 1, 1}},
|
||||||
{OSPFv3IMPORTASEXTERN, INTEGER, RONLY, ospfv3AreaEntry,
|
{OSPFv3IMPORTASEXTERN, INTEGER, RWRITE, ospfv3AreaEntry,
|
||||||
4, {1, 2, 1, 2}},
|
4, {1, 2, 1, 2}},
|
||||||
|
{OSPFv3AREASPFRUNS, COUNTER, RONLY, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 3}},
|
||||||
|
{OSPFv3AREABDRRTRCOUNT, GAUGE, RONLY, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 4}},
|
||||||
|
{OSPFv3AREAASBDRRTRCOUNT, GAUGE, RONLY, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 5}},
|
||||||
|
{OSPFv3AREASCOPELSACOUNT, GAUGE, RONLY, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 6}},
|
||||||
|
{OSPFv3AREASCOPELSACKSUMSUM, INTEGER, RONLY, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 7}},
|
||||||
|
{OSPFv3AREASUMMARY, INTEGER, RWRITE, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 8}},
|
||||||
|
{OSPFv3AREASTATUS, INTEGER, RWRITE, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 9}},
|
||||||
|
{OSPFv3STUBMETRIC, INTEGER, RWRITE, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 10}},
|
||||||
|
{OSPFv3AREANSSATRANSLATORROLE, INTEGER, RWRITE, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 11}},
|
||||||
|
{OSPFv3AREANSSATRANSLATORSTATE, INTEGER, RONLY, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 12}},
|
||||||
|
{OSPFv3AREANSSATRANSLATORSTABILITYINTERVAL, INTEGER, RWRITE, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 13}},
|
||||||
|
{OSPFv3AREANSSATRANSLATOREVENTS, COUNTER, RONLY, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 14}},
|
||||||
|
{OSPFv3AREASTUBMETRICTYPE, INTEGER, RWRITE, ospfv3AreaEntry,
|
||||||
|
4, {1, 2, 1, 15}},
|
||||||
|
|
||||||
|
{OSPFv3AREALSDBAREAID, IPADDRESS, RONLY, ospfv3AreaLsdbEntry,
|
||||||
|
4, {1, 4, 1, 1}},
|
||||||
|
{OSPFv3AREALSDBTYPE, GAUGE, RONLY, ospfv3AreaLsdbEntry,
|
||||||
|
4, {1, 4, 1, 2}},
|
||||||
|
{OSPFv3AREALSDBROUTERID, IPADDRESS, RONLY, ospfv3AreaLsdbEntry,
|
||||||
|
4, {1, 4, 1, 3}},
|
||||||
|
{OSPFv3AREALSDBLSID, IPADDRESS, RONLY, ospfv3AreaLsdbEntry,
|
||||||
|
4, {1, 4, 1, 4}},
|
||||||
|
{OSPFv3AREALSDBSEQUENCE, INTEGER, RONLY, ospfv3AreaLsdbEntry,
|
||||||
|
4, {1, 4, 1, 5}},
|
||||||
|
{OSPFv3AREALSDBAGE, INTEGER, RONLY, ospfv3AreaLsdbEntry,
|
||||||
|
4, {1, 4, 1, 6}},
|
||||||
|
{OSPFv3AREALSDBCHECKSUM, INTEGER, RONLY, ospfv3AreaLsdbEntry,
|
||||||
|
4, {1, 4, 1, 7}},
|
||||||
|
{OSPFv3AREALSDBADVERTISEMENT, STRING, RONLY, ospfv3AreaLsdbEntry,
|
||||||
|
4, {1, 4, 1, 8}},
|
||||||
|
{OSPFv3AREALSDBTYPEKNOWN, INTEGER, RONLY, ospfv3AreaLsdbEntry,
|
||||||
|
4, {1, 4, 1, 9}},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static u_char *
|
static u_char *
|
||||||
|
@ -287,6 +358,169 @@ ospfv3AreaEntry (struct variable *v, oid *name, size_t *length,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u_char *
|
||||||
|
ospfv3AreaLsdbEntry (struct variable *v, oid *name, size_t *length,
|
||||||
|
int exact, size_t *var_len, WriteMethod **write_method)
|
||||||
|
{
|
||||||
|
struct ospf6_lsa *lsa = NULL;
|
||||||
|
struct in_addr area_id;
|
||||||
|
u_int16_t type;
|
||||||
|
struct in_addr id;
|
||||||
|
struct in_addr adv_router;
|
||||||
|
int len;
|
||||||
|
oid *offset;
|
||||||
|
int offsetlen;
|
||||||
|
char a[16], b[16], c[16];
|
||||||
|
struct ospf6_area *oa;
|
||||||
|
listnode node;
|
||||||
|
|
||||||
|
memset (&area_id, 0, sizeof (struct in_addr));
|
||||||
|
type = 0;
|
||||||
|
memset (&id, 0, sizeof (struct in_addr));
|
||||||
|
memset (&adv_router, 0, sizeof (struct in_addr));
|
||||||
|
|
||||||
|
/* Check OSPFv3 instance. */
|
||||||
|
if (ospf6 == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Get variable length. */
|
||||||
|
offset = name + v->namelen;
|
||||||
|
offsetlen = *length - v->namelen;
|
||||||
|
|
||||||
|
#define OSPFV3_AREA_LSDB_ENTRY_EXACT_OFFSET \
|
||||||
|
(IN_ADDR_SIZE + 1 + IN_ADDR_SIZE + IN_ADDR_SIZE)
|
||||||
|
|
||||||
|
if (exact && offsetlen != OSPFV3_AREA_LSDB_ENTRY_EXACT_OFFSET)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Parse area-id */
|
||||||
|
len = (offsetlen < IN_ADDR_SIZE ? offsetlen : IN_ADDR_SIZE);
|
||||||
|
if (len)
|
||||||
|
oid2in_addr (offset, len, &area_id);
|
||||||
|
offset += len;
|
||||||
|
offsetlen -= len;
|
||||||
|
|
||||||
|
/* Parse type */
|
||||||
|
len = (offsetlen < 1 ? offsetlen : 1);
|
||||||
|
if (len)
|
||||||
|
type = htons (*offset);
|
||||||
|
offset += len;
|
||||||
|
offsetlen -= len;
|
||||||
|
|
||||||
|
/* Parse Router-ID */
|
||||||
|
len = (offsetlen < IN_ADDR_SIZE ? offsetlen : IN_ADDR_SIZE);
|
||||||
|
if (len)
|
||||||
|
oid2in_addr (offset, len, &adv_router);
|
||||||
|
offset += len;
|
||||||
|
offsetlen -= len;
|
||||||
|
|
||||||
|
/* Parse LS-ID */
|
||||||
|
len = (offsetlen < IN_ADDR_SIZE ? offsetlen : IN_ADDR_SIZE);
|
||||||
|
if (len)
|
||||||
|
oid2in_addr (offset, len, &id);
|
||||||
|
offset += len;
|
||||||
|
offsetlen -= len;
|
||||||
|
|
||||||
|
inet_ntop (AF_INET, &area_id, a, sizeof (a));
|
||||||
|
inet_ntop (AF_INET, &adv_router, b, sizeof (b));
|
||||||
|
inet_ntop (AF_INET, &id, c, sizeof (c));
|
||||||
|
zlog_info ("SNMP access by lsdb: area=%s exact=%d length=%d magic=%d"
|
||||||
|
" type=%#x adv_router=%s id=%s",
|
||||||
|
a, exact, *length, v->magic, ntohs (type), b, c);
|
||||||
|
|
||||||
|
if (exact)
|
||||||
|
{
|
||||||
|
oa = ospf6_area_lookup (area_id.s_addr, ospf6);
|
||||||
|
lsa = ospf6_lsdb_lookup (type, id.s_addr, adv_router.s_addr, oa->lsdb);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (node = listhead (ospf6->area_list); node; nextnode (node))
|
||||||
|
{
|
||||||
|
oa = (struct ospf6_area *) getdata (node);
|
||||||
|
|
||||||
|
if (lsa)
|
||||||
|
continue;
|
||||||
|
if (ntohl (oa->area_id) < ntohl (area_id.s_addr))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
lsa = ospf6_lsdb_lookup_next (type, id.s_addr, adv_router.s_addr,
|
||||||
|
oa->lsdb);
|
||||||
|
if (! lsa)
|
||||||
|
{
|
||||||
|
type = 0;
|
||||||
|
memset (&id, 0, sizeof (struct in_addr));
|
||||||
|
memset (&adv_router, 0, sizeof (struct in_addr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! lsa)
|
||||||
|
{
|
||||||
|
zlog_info ("SNMP respond: No LSA to return");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
oa = OSPF6_AREA (lsa->lsdb->data);
|
||||||
|
|
||||||
|
zlog_info ("SNMP respond: area: %s lsa: %s", oa->name, lsa->name);
|
||||||
|
|
||||||
|
/* Add Index (AreaId, Type, RouterId, Lsid) */
|
||||||
|
*length = v->namelen + OSPFV3_AREA_LSDB_ENTRY_EXACT_OFFSET;
|
||||||
|
offset = name + v->namelen;
|
||||||
|
oid_copy_addr (offset, (struct in_addr *) &oa->area_id, IN_ADDR_SIZE);
|
||||||
|
offset += IN_ADDR_SIZE;
|
||||||
|
*offset = ntohs (lsa->header->type);
|
||||||
|
offset++;
|
||||||
|
oid_copy_addr (offset, (struct in_addr *) &lsa->header->adv_router,
|
||||||
|
IN_ADDR_SIZE);
|
||||||
|
offset += IN_ADDR_SIZE;
|
||||||
|
oid_copy_addr (offset, (struct in_addr *) &lsa->header->id, IN_ADDR_SIZE);
|
||||||
|
offset += IN_ADDR_SIZE;
|
||||||
|
|
||||||
|
/* Return the current value of the variable */
|
||||||
|
switch (v->magic)
|
||||||
|
{
|
||||||
|
case OSPFv3AREALSDBAREAID: /* 1 */
|
||||||
|
area_id.s_addr = OSPF6_AREA (lsa->lsdb->data)->area_id;
|
||||||
|
return SNMP_IPADDRESS (area_id);
|
||||||
|
break;
|
||||||
|
case OSPFv3AREALSDBTYPE: /* 2 */
|
||||||
|
return SNMP_INTEGER (ntohs (lsa->header->type));
|
||||||
|
break;
|
||||||
|
case OSPFv3AREALSDBROUTERID: /* 3 */
|
||||||
|
adv_router.s_addr = lsa->header->adv_router;
|
||||||
|
return SNMP_IPADDRESS (adv_router);
|
||||||
|
break;
|
||||||
|
case OSPFv3AREALSDBLSID: /* 4 */
|
||||||
|
id.s_addr = lsa->header->id;
|
||||||
|
return SNMP_IPADDRESS (id);
|
||||||
|
break;
|
||||||
|
case OSPFv3AREALSDBSEQUENCE: /* 5 */
|
||||||
|
return SNMP_INTEGER (lsa->header->seqnum);
|
||||||
|
break;
|
||||||
|
case OSPFv3AREALSDBAGE: /* 6 */
|
||||||
|
ospf6_lsa_age_current (lsa);
|
||||||
|
return SNMP_INTEGER (lsa->header->age);
|
||||||
|
break;
|
||||||
|
case OSPFv3AREALSDBCHECKSUM: /* 7 */
|
||||||
|
return SNMP_INTEGER (lsa->header->checksum);
|
||||||
|
break;
|
||||||
|
case OSPFv3AREALSDBADVERTISEMENT: /* 8 */
|
||||||
|
*var_len = ntohs (lsa->header->length);
|
||||||
|
return (u_char *) lsa->header;
|
||||||
|
break;
|
||||||
|
case OSPFv3AREALSDBTYPEKNOWN: /* 9 */
|
||||||
|
return SNMP_INTEGER (OSPF6_LSA_IS_KNOWN (lsa->header->type) ?
|
||||||
|
SNMP_TRUE : SNMP_FALSE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Register OSPFv3-MIB. */
|
/* Register OSPFv3-MIB. */
|
||||||
void
|
void
|
||||||
ospf6_snmp_init (struct thread_master *master)
|
ospf6_snmp_init (struct thread_master *master)
|
||||||
|
|
|
@ -487,6 +487,32 @@ ospf6_spf_calculation (u_int32_t router_id,
|
||||||
pqueue_delete (candidate_list);
|
pqueue_delete (candidate_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ospf6_spf_log_database (struct ospf6_area *oa)
|
||||||
|
{
|
||||||
|
char *p, *end, buffer[256];
|
||||||
|
struct listnode *node;
|
||||||
|
struct ospf6_interface *oi;
|
||||||
|
|
||||||
|
p = buffer;
|
||||||
|
end = buffer + sizeof (buffer);
|
||||||
|
|
||||||
|
snprintf (p, end - p, "SPF on DB (#LSAs):");
|
||||||
|
p = (buffer + strlen (buffer) < end ? buffer + strlen (buffer) : end);
|
||||||
|
snprintf (p, end - p, " Area %s: %d", oa->name, oa->lsdb->count);
|
||||||
|
p = (buffer + strlen (buffer) < end ? buffer + strlen (buffer) : end);
|
||||||
|
|
||||||
|
for (node = listhead (oa->if_list); node; nextnode (node))
|
||||||
|
{
|
||||||
|
oi = (struct ospf6_interface *) getdata (node);
|
||||||
|
snprintf (p, end - p, " I/F %s: %d",
|
||||||
|
oi->interface->name, oi->lsdb->count);
|
||||||
|
p = (buffer + strlen (buffer) < end ? buffer + strlen (buffer) : end);
|
||||||
|
}
|
||||||
|
|
||||||
|
zlog_info ("%s", buffer);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
ospf6_spf_calculation_thread (struct thread *t)
|
ospf6_spf_calculation_thread (struct thread *t)
|
||||||
{
|
{
|
||||||
|
@ -496,20 +522,20 @@ ospf6_spf_calculation_thread (struct thread *t)
|
||||||
oa = (struct ospf6_area *) THREAD_ARG (t);
|
oa = (struct ospf6_area *) THREAD_ARG (t);
|
||||||
oa->thread_spf_calculation = NULL;
|
oa->thread_spf_calculation = NULL;
|
||||||
|
|
||||||
if (IS_OSPF6_DEBUG_SPF (PROCESS) || IS_OSPF6_DEBUG_SPF (TIME))
|
if (IS_OSPF6_DEBUG_SPF (PROCESS))
|
||||||
zlog_info ("SPF calculation for area %s", oa->name);
|
zlog_info ("SPF calculation for Area %s", oa->name);
|
||||||
|
if (IS_OSPF6_DEBUG_SPF (DATABASE))
|
||||||
|
ospf6_spf_log_database (oa);
|
||||||
|
|
||||||
/* execute SPF calculation */
|
/* execute SPF calculation */
|
||||||
gettimeofday (&start, (struct timezone *) NULL);
|
gettimeofday (&start, (struct timezone *) NULL);
|
||||||
ospf6_spf_calculation (oa->ospf6->router_id, oa->spf_table, oa);
|
ospf6_spf_calculation (oa->ospf6->router_id, oa->spf_table, oa);
|
||||||
gettimeofday (&end, (struct timezone *) NULL);
|
gettimeofday (&end, (struct timezone *) NULL);
|
||||||
|
timersub (&end, &start, &runtime);
|
||||||
|
|
||||||
if (IS_OSPF6_DEBUG_SPF (PROCESS) || IS_OSPF6_DEBUG_SPF (TIME))
|
if (IS_OSPF6_DEBUG_SPF (PROCESS) || IS_OSPF6_DEBUG_SPF (TIME))
|
||||||
{
|
zlog_info ("SPF runtime: %ld sec %ld usec",
|
||||||
timersub (&end, &start, &runtime);
|
runtime.tv_sec, runtime.tv_usec);
|
||||||
zlog_info ("SPF calculation for area %s: runtime %ld sec %ld usec",
|
|
||||||
oa->name, runtime.tv_sec, runtime.tv_usec);
|
|
||||||
}
|
|
||||||
|
|
||||||
ospf6_intra_route_calculation (oa);
|
ospf6_intra_route_calculation (oa);
|
||||||
ospf6_intra_brouter_calculation (oa);
|
ospf6_intra_brouter_calculation (oa);
|
||||||
|
@ -588,6 +614,21 @@ DEFUN (debug_ospf6_spf_time,
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFUN (debug_ospf6_spf_database,
|
||||||
|
debug_ospf6_spf_database_cmd,
|
||||||
|
"debug ospf6 spf database",
|
||||||
|
DEBUG_STR
|
||||||
|
OSPF6_STR
|
||||||
|
"Debug SPF Calculation\n"
|
||||||
|
"Log number of LSAs at SPF Calculation time\n"
|
||||||
|
)
|
||||||
|
{
|
||||||
|
unsigned char level = 0;
|
||||||
|
level = OSPF6_DEBUG_SPF_DATABASE;
|
||||||
|
OSPF6_DEBUG_SPF_ON (level);
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
DEFUN (no_debug_ospf6_spf_process,
|
DEFUN (no_debug_ospf6_spf_process,
|
||||||
no_debug_ospf6_spf_process_cmd,
|
no_debug_ospf6_spf_process_cmd,
|
||||||
"no debug ospf6 spf process",
|
"no debug ospf6 spf process",
|
||||||
|
@ -620,6 +661,22 @@ DEFUN (no_debug_ospf6_spf_time,
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFUN (no_debug_ospf6_spf_database,
|
||||||
|
no_debug_ospf6_spf_database_cmd,
|
||||||
|
"no debug ospf6 spf database",
|
||||||
|
NO_STR
|
||||||
|
DEBUG_STR
|
||||||
|
OSPF6_STR
|
||||||
|
"Debug SPF Calculation\n"
|
||||||
|
"Quit Logging number of LSAs at SPF Calculation time\n"
|
||||||
|
)
|
||||||
|
{
|
||||||
|
unsigned char level = 0;
|
||||||
|
level = OSPF6_DEBUG_SPF_DATABASE;
|
||||||
|
OSPF6_DEBUG_SPF_OFF (level);
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
config_write_ospf6_debug_spf (struct vty *vty)
|
config_write_ospf6_debug_spf (struct vty *vty)
|
||||||
{
|
{
|
||||||
|
@ -627,6 +684,8 @@ config_write_ospf6_debug_spf (struct vty *vty)
|
||||||
vty_out (vty, "debug ospf6 spf process%s", VNL);
|
vty_out (vty, "debug ospf6 spf process%s", VNL);
|
||||||
if (IS_OSPF6_DEBUG_SPF (TIME))
|
if (IS_OSPF6_DEBUG_SPF (TIME))
|
||||||
vty_out (vty, "debug ospf6 spf time%s", VNL);
|
vty_out (vty, "debug ospf6 spf time%s", VNL);
|
||||||
|
if (IS_OSPF6_DEBUG_SPF (DATABASE))
|
||||||
|
vty_out (vty, "debug ospf6 spf database%s", VNL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -635,12 +694,16 @@ install_element_ospf6_debug_spf ()
|
||||||
{
|
{
|
||||||
install_element (ENABLE_NODE, &debug_ospf6_spf_process_cmd);
|
install_element (ENABLE_NODE, &debug_ospf6_spf_process_cmd);
|
||||||
install_element (ENABLE_NODE, &debug_ospf6_spf_time_cmd);
|
install_element (ENABLE_NODE, &debug_ospf6_spf_time_cmd);
|
||||||
|
install_element (ENABLE_NODE, &debug_ospf6_spf_database_cmd);
|
||||||
install_element (ENABLE_NODE, &no_debug_ospf6_spf_process_cmd);
|
install_element (ENABLE_NODE, &no_debug_ospf6_spf_process_cmd);
|
||||||
install_element (ENABLE_NODE, &no_debug_ospf6_spf_time_cmd);
|
install_element (ENABLE_NODE, &no_debug_ospf6_spf_time_cmd);
|
||||||
|
install_element (ENABLE_NODE, &no_debug_ospf6_spf_database_cmd);
|
||||||
install_element (CONFIG_NODE, &debug_ospf6_spf_process_cmd);
|
install_element (CONFIG_NODE, &debug_ospf6_spf_process_cmd);
|
||||||
install_element (CONFIG_NODE, &debug_ospf6_spf_time_cmd);
|
install_element (CONFIG_NODE, &debug_ospf6_spf_time_cmd);
|
||||||
|
install_element (CONFIG_NODE, &debug_ospf6_spf_database_cmd);
|
||||||
install_element (CONFIG_NODE, &no_debug_ospf6_spf_process_cmd);
|
install_element (CONFIG_NODE, &no_debug_ospf6_spf_process_cmd);
|
||||||
install_element (CONFIG_NODE, &no_debug_ospf6_spf_time_cmd);
|
install_element (CONFIG_NODE, &no_debug_ospf6_spf_time_cmd);
|
||||||
|
install_element (CONFIG_NODE, &no_debug_ospf6_spf_database_cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
extern unsigned char conf_debug_ospf6_spf;
|
extern unsigned char conf_debug_ospf6_spf;
|
||||||
#define OSPF6_DEBUG_SPF_PROCESS 0x01
|
#define OSPF6_DEBUG_SPF_PROCESS 0x01
|
||||||
#define OSPF6_DEBUG_SPF_TIME 0x02
|
#define OSPF6_DEBUG_SPF_TIME 0x02
|
||||||
|
#define OSPF6_DEBUG_SPF_DATABASE 0x04
|
||||||
#define OSPF6_DEBUG_SPF_ON(level) \
|
#define OSPF6_DEBUG_SPF_ON(level) \
|
||||||
(conf_debug_ospf6_spf |= (level))
|
(conf_debug_ospf6_spf |= (level))
|
||||||
#define OSPF6_DEBUG_SPF_OFF(level) \
|
#define OSPF6_DEBUG_SPF_OFF(level) \
|
||||||
|
|
Loading…
Reference in a new issue