IP-FORWARD-MIB DEFINITIONS ::= BEGIN

IMPORTS
    MODULE-IDENTITY, OBJECT-TYPE,
    IpAddress, Integer32, Gauge32,
    Counter32                          FROM SNMPv2-SMI
    RowStatus                          FROM SNMPv2-TC



    MODULE-COMPLIANCE, OBJECT-GROUP    FROM SNMPv2-CONF
    InterfaceIndexOrZero               FROM IF-MIB
    ip                                 FROM IP-MIB
    IANAipRouteProtocol                FROM IANA-RTPROTO-MIB
    InetAddress, InetAddressType,
    InetAddressPrefixLength,
    InetAutonomousSystemNumber         FROM INET-ADDRESS-MIB;

ipForward MODULE-IDENTITY
    LAST-UPDATED "200602010000Z"
    ORGANIZATION
           "IETF IPv6 Working Group
            http://www.ietf.org/html.charters/ipv6-charter.html"
    CONTACT-INFO
           "Editor:
            Brian Haberman
            Johns Hopkins University - Applied Physics Laboratory
            Mailstop 17-S442
            11100 Johns Hopkins Road
            Laurel MD,  20723-6099  USA

            Phone: +1-443-778-1319
            Email: brian@innovationslab.net

            Send comments to <ipv6@ietf.org>"
    DESCRIPTION
           "The MIB module for the management of CIDR multipath IP
            Routes.

            Copyright (C) The Internet Society (2006).  This version
            of this MIB module is a part of RFC 4292; see the RFC
            itself for full legal notices."

    REVISION      "200602010000Z"
    DESCRIPTION
           "IPv4/v6 version-independent revision.  Minimal changes
            were made to the original RFC 2096 MIB to allow easy
            upgrade of existing IPv4 implementations to the
            version-independent MIB.  These changes include:

            Adding inetCidrRouteDiscards as a replacement for the
            deprecated ipRoutingDiscards and ipv6DiscardedRoutes
            objects.

            Adding a new conformance statement to support the
            implementation of the IP Forwarding MIB in a
            read-only mode.




            The inetCidrRouteTable replaces the IPv4-specific
            ipCidrRouteTable, its related objects, and related
            conformance statements.

            Published as RFC 4292."

    REVISION      "199609190000Z"
    DESCRIPTION
           "Revised to support CIDR routes.
            Published as RFC 2096."

    REVISION      "199207022156Z"
    DESCRIPTION
           "Initial version, published as RFC 1354."
    ::= { ip 24 }

inetCidrRouteNumber OBJECT-TYPE
    SYNTAX     Gauge32
    MAX-ACCESS read-only
    STATUS     current
    DESCRIPTION
           "The number of current inetCidrRouteTable entries that
            are not invalid."
::= { ipForward 6 }

inetCidrRouteDiscards OBJECT-TYPE
    SYNTAX     Counter32
    MAX-ACCESS read-only
    STATUS     current
    DESCRIPTION
           "The number of valid route entries discarded from the
            inetCidrRouteTable.  Discarded route entries do not
            appear in the inetCidrRouteTable.  One possible reason
            for discarding an entry would be to free-up buffer space
            for other route table entries."
    ::= { ipForward 8 }

--  Inet CIDR Route Table

--  The Inet CIDR Route Table deprecates and replaces the
--  ipCidrRoute Table currently in the IP Forwarding Table MIB.
--  It adds IP protocol independence.

inetCidrRouteTable OBJECT-TYPE
    SYNTAX     SEQUENCE OF InetCidrRouteEntry
    MAX-ACCESS not-accessible
    STATUS     current
    DESCRIPTION



           "This entity's IP Routing table."
    REFERENCE
           "RFC 1213 Section 6.6, The IP Group"
    ::= { ipForward 7 }

inetCidrRouteEntry OBJECT-TYPE
    SYNTAX     InetCidrRouteEntry
    MAX-ACCESS not-accessible
    STATUS     current
    DESCRIPTION
           "A particular route to a particular destination, under a
            particular policy (as reflected in the
            inetCidrRoutePolicy object).

            Dynamically created rows will survive an agent reboot.

            Implementers need to be aware that if the total number
            of elements (octets or sub-identifiers) in
            inetCidrRouteDest, inetCidrRoutePolicy, and
            inetCidrRouteNextHop exceeds 111, then OIDs of column
            instances in this table will have more than 128 sub-
            identifiers and cannot be accessed using SNMPv1,
            SNMPv2c, or SNMPv3."
    INDEX {
        inetCidrRouteDestType,
        inetCidrRouteDest,
        inetCidrRoutePfxLen,
        inetCidrRoutePolicy,
        inetCidrRouteNextHopType,
        inetCidrRouteNextHop
        }
    ::= { inetCidrRouteTable 1 }

InetCidrRouteEntry ::= SEQUENCE {
        inetCidrRouteDestType     InetAddressType,
        inetCidrRouteDest         InetAddress,
        inetCidrRoutePfxLen       InetAddressPrefixLength,
        inetCidrRoutePolicy       OBJECT IDENTIFIER,
        inetCidrRouteNextHopType  InetAddressType,
        inetCidrRouteNextHop      InetAddress,
        inetCidrRouteIfIndex      InterfaceIndexOrZero,
        inetCidrRouteType         INTEGER,
        inetCidrRouteProto        IANAipRouteProtocol,
        inetCidrRouteAge          Gauge32,
        inetCidrRouteNextHopAS    InetAutonomousSystemNumber,
        inetCidrRouteMetric1      Integer32,
        inetCidrRouteMetric2      Integer32,
        inetCidrRouteMetric3      Integer32,



        inetCidrRouteMetric4      Integer32,
        inetCidrRouteMetric5      Integer32,
        inetCidrRouteStatus       RowStatus
    }

inetCidrRouteDestType OBJECT-TYPE
    SYNTAX     InetAddressType
    MAX-ACCESS not-accessible
    STATUS     current
    DESCRIPTION
           "The type of the inetCidrRouteDest address, as defined
            in the InetAddress MIB.

            Only those address types that may appear in an actual
            routing table are allowed as values of this object."
    REFERENCE "RFC 4001"
    ::= { inetCidrRouteEntry 1 }

inetCidrRouteDest OBJECT-TYPE
    SYNTAX     InetAddress
    MAX-ACCESS not-accessible
    STATUS     current
    DESCRIPTION
           "The destination IP address of this route.

            The type of this address is determined by the value of
            the inetCidrRouteDestType object.

            The values for the index objects inetCidrRouteDest and
            inetCidrRoutePfxLen must be consistent.  When the value
            of inetCidrRouteDest (excluding the zone index, if one
            is present) is x, then the bitwise logical-AND
            of x with the value of the mask formed from the
            corresponding index object inetCidrRoutePfxLen MUST be
            equal to x.  If not, then the index pair is not
            consistent and an inconsistentName error must be
            returned on SET or CREATE requests."

    ::= { inetCidrRouteEntry 2 }

inetCidrRoutePfxLen OBJECT-TYPE
    SYNTAX     InetAddressPrefixLength
    MAX-ACCESS not-accessible
    STATUS     current
    DESCRIPTION
           "Indicates the number of leading one bits that form the
            mask to be logical-ANDed with the destination address
            before being compared to the value in the



            inetCidrRouteDest field.

            The values for the index objects inetCidrRouteDest and
            inetCidrRoutePfxLen must be consistent.  When the value
            of inetCidrRouteDest (excluding the zone index, if one
            is present) is x, then the bitwise logical-AND
            of x with the value of the mask formed from the
            corresponding index object inetCidrRoutePfxLen MUST be
            equal to x.  If not, then the index pair is not
            consistent and an inconsistentName error must be
            returned on SET or CREATE requests."

    ::= { inetCidrRouteEntry 3 }

inetCidrRoutePolicy OBJECT-TYPE
    SYNTAX     OBJECT IDENTIFIER
    MAX-ACCESS not-accessible
    STATUS     current
    DESCRIPTION
           "This object is an opaque object without any defined
            semantics.  Its purpose is to serve as an additional
            index that may delineate between multiple entries to
            the same destination.  The value { 0 0 } shall be used
            as the default value for this object."
    ::= { inetCidrRouteEntry 4 }

inetCidrRouteNextHopType OBJECT-TYPE
    SYNTAX     InetAddressType
    MAX-ACCESS not-accessible
    STATUS     current
    DESCRIPTION
           "The type of the inetCidrRouteNextHop address, as
            defined in the InetAddress MIB.

            Value should be set to unknown(0) for non-remote
            routes.

            Only those address types that may appear in an actual
            routing table are allowed as values of this object."
    REFERENCE "RFC 4001"
    ::= { inetCidrRouteEntry 5 }

inetCidrRouteNextHop OBJECT-TYPE
    SYNTAX     InetAddress
    MAX-ACCESS not-accessible
    STATUS     current
    DESCRIPTION
           "On remote routes, the address of the next system en



            route.  For non-remote routes, a zero length string.

            The type of this address is determined by the value of
            the inetCidrRouteNextHopType object."
    ::= { inetCidrRouteEntry 6 }

inetCidrRouteIfIndex OBJECT-TYPE
    SYNTAX     InterfaceIndexOrZero
    MAX-ACCESS read-create
    STATUS     current
    DESCRIPTION
           "The ifIndex value that identifies the local interface
            through which the next hop of this route should be
            reached.  A value of 0 is valid and represents the
            scenario where no interface is specified."
    ::= { inetCidrRouteEntry 7 }

inetCidrRouteType OBJECT-TYPE
    SYNTAX     INTEGER {
                other    (1), -- not specified by this MIB
                reject   (2), -- route that discards traffic and
                              --   returns ICMP notification
                local    (3), -- local interface
                remote   (4), -- remote destination
                blackhole(5)  -- route that discards traffic
                              --   silently
             }
    MAX-ACCESS read-create
    STATUS     current
    DESCRIPTION
           "The type of route.  Note that local(3) refers to a
            route for which the next hop is the final destination;
            remote(4) refers to a route for which the next hop is
            not the final destination.

            Routes that do not result in traffic forwarding or
            rejection should not be displayed, even if the
            implementation keeps them stored internally.

            reject(2) refers to a route that, if matched, discards
            the message as unreachable and returns a notification
            (e.g., ICMP error) to the message sender.  This is used
            in some protocols as a means of correctly aggregating
            routes.

            blackhole(5) refers to a route that, if matched,
            discards the message silently."
    ::= { inetCidrRouteEntry 8 }




inetCidrRouteProto OBJECT-TYPE
    SYNTAX     IANAipRouteProtocol
    MAX-ACCESS read-only
    STATUS     current
    DESCRIPTION
           "The routing mechanism via which this route was learned.
            Inclusion of values for gateway routing protocols is
            not intended to imply that hosts should support those
            protocols."
    ::= { inetCidrRouteEntry 9 }

inetCidrRouteAge OBJECT-TYPE
    SYNTAX     Gauge32
    MAX-ACCESS read-only
    STATUS     current
    DESCRIPTION
           "The number of seconds since this route was last updated
            or otherwise determined to be correct.  Note that no
            semantics of 'too old' can be implied, except through
            knowledge of the routing protocol by which the route
            was learned."
    ::= { inetCidrRouteEntry 10 }

inetCidrRouteNextHopAS OBJECT-TYPE
    SYNTAX     InetAutonomousSystemNumber
    MAX-ACCESS read-create
    STATUS     current
    DESCRIPTION
           "The Autonomous System Number of the Next Hop.  The
            semantics of this object are determined by the routing-
            protocol specified in the route's inetCidrRouteProto
            value.  When this object is unknown or not relevant, its
            value should be set to zero."
    DEFVAL { 0 }
    ::= { inetCidrRouteEntry 11 }

inetCidrRouteMetric1 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     current
    DESCRIPTION
           "The primary routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's inetCidrRouteProto
            value.  If this metric is not used, its value should be
            set to -1."
    DEFVAL { -1 }



    ::= { inetCidrRouteEntry 12 }

inetCidrRouteMetric2 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     current
    DESCRIPTION
           "An alternate routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's inetCidrRouteProto
            value.  If this metric is not used, its value should be
            set to -1."
    DEFVAL { -1 }
    ::= { inetCidrRouteEntry 13 }

inetCidrRouteMetric3 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     current
    DESCRIPTION
           "An alternate routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's inetCidrRouteProto
            value.  If this metric is not used, its value should be
            set to -1."
    DEFVAL { -1 }
    ::= { inetCidrRouteEntry 14 }

inetCidrRouteMetric4 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     current
    DESCRIPTION
           "An alternate routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's inetCidrRouteProto
            value.  If this metric is not used, its value should be
            set to -1."
    DEFVAL { -1 }
    ::= { inetCidrRouteEntry 15 }

inetCidrRouteMetric5 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     current
    DESCRIPTION
           "An alternate routing metric for this route.  The
            semantics of this metric are determined by the routing-



            protocol specified in the route's inetCidrRouteProto
            value.  If this metric is not used, its value should be
            set to -1."
    DEFVAL { -1 }
    ::= { inetCidrRouteEntry 16 }

inetCidrRouteStatus OBJECT-TYPE
    SYNTAX     RowStatus
    MAX-ACCESS read-create
    STATUS     current
    DESCRIPTION
           "The row status variable, used according to row
            installation and removal conventions.

            A row entry cannot be modified when the status is
            marked as active(1)."
    ::= { inetCidrRouteEntry 17 }

--  Conformance information

ipForwardConformance
     OBJECT IDENTIFIER ::= { ipForward 5 }

ipForwardGroups
     OBJECT IDENTIFIER ::= { ipForwardConformance 1 }

ipForwardCompliances
     OBJECT IDENTIFIER ::= { ipForwardConformance 2 }

--  Compliance statements

ipForwardFullCompliance MODULE-COMPLIANCE
    STATUS     current
    DESCRIPTION
           "When this MIB is implemented for read-create, the
            implementation can claim full compliance.

            There are a number of INDEX objects that cannot be
            represented in the form of OBJECT clauses in SMIv2,
            but for which there are compliance requirements,
            expressed in OBJECT clause form in this description:

            -- OBJECT      inetCidrRouteDestType
            -- SYNTAX      InetAddressType (ipv4(1), ipv6(2),
            --                              ipv4z(3), ipv6z(4))
            -- DESCRIPTION
            --     This MIB requires support for global and
            --     non-global ipv4 and ipv6 addresses.



            --
            -- OBJECT      inetCidrRouteDest
            -- SYNTAX      InetAddress (SIZE (4 | 8 | 16 | 20))
            -- DESCRIPTION
            --     This MIB requires support for global and
            --     non-global IPv4 and IPv6 addresses.
            --
            -- OBJECT      inetCidrRouteNextHopType
            -- SYNTAX      InetAddressType (unknown(0), ipv4(1),
            --                              ipv6(2), ipv4z(3)
            --                              ipv6z(4))
            -- DESCRIPTION
            --     This MIB requires support for global and
            --     non-global ipv4 and ipv6 addresses.
            --
            -- OBJECT      inetCidrRouteNextHop
            -- SYNTAX      InetAddress (SIZE (0 | 4 | 8 | 16 | 20))
            -- DESCRIPTION
            --     This MIB requires support for global and
            --     non-global IPv4 and IPv6 addresses.
            "

   MODULE -- this module
   MANDATORY-GROUPS { inetForwardCidrRouteGroup }

   OBJECT        inetCidrRouteStatus
   SYNTAX        RowStatus { active(1), notInService (2) }
   WRITE-SYNTAX  RowStatus { active(1), notInService (2),
                             createAndGo(4), destroy(6) }
   DESCRIPTION  "Support for createAndWait is not required."

   ::= { ipForwardCompliances 3 }

ipForwardReadOnlyCompliance MODULE-COMPLIANCE
   STATUS     current
   DESCRIPTION
           "When this MIB is implemented without support for read-
            create (i.e., in read-only mode), the implementation can
            claim read-only compliance."
   MODULE -- this module
   MANDATORY-GROUPS { inetForwardCidrRouteGroup }

   OBJECT      inetCidrRouteIfIndex
   MIN-ACCESS  read-only
   DESCRIPTION
      "Write access is not required."

   OBJECT      inetCidrRouteType



   MIN-ACCESS  read-only
   DESCRIPTION
      "Write access is not required."

   OBJECT      inetCidrRouteNextHopAS
   MIN-ACCESS  read-only
   DESCRIPTION
      "Write access is not required."

   OBJECT      inetCidrRouteMetric1
   MIN-ACCESS  read-only
   DESCRIPTION
      "Write access is not required."

   OBJECT      inetCidrRouteMetric2
   MIN-ACCESS  read-only
   DESCRIPTION
      "Write access is not required."

   OBJECT      inetCidrRouteMetric3
   MIN-ACCESS  read-only
   DESCRIPTION
      "Write access is not required."

   OBJECT      inetCidrRouteMetric4
   MIN-ACCESS  read-only
   DESCRIPTION
      "Write access is not required."

   OBJECT      inetCidrRouteMetric5
   MIN-ACCESS  read-only
   DESCRIPTION
      "Write access is not required."

   OBJECT      inetCidrRouteStatus
   SYNTAX      RowStatus { active(1) }
   MIN-ACCESS  read-only
   DESCRIPTION
      "Write access is not required."

   ::= { ipForwardCompliances 4 }

-- units of conformance

inetForwardCidrRouteGroup OBJECT-GROUP
    OBJECTS { inetCidrRouteDiscards,
              inetCidrRouteIfIndex, inetCidrRouteType,
              inetCidrRouteProto, inetCidrRouteAge,



              inetCidrRouteNextHopAS, inetCidrRouteMetric1,
              inetCidrRouteMetric2, inetCidrRouteMetric3,
              inetCidrRouteMetric4, inetCidrRouteMetric5,
              inetCidrRouteStatus, inetCidrRouteNumber
        }
    STATUS     current
    DESCRIPTION
           "The IP version-independent CIDR Route Table."
    ::= { ipForwardGroups 4 }

--  Deprecated Objects

ipCidrRouteNumber OBJECT-TYPE
    SYNTAX     Gauge32
    MAX-ACCESS read-only
    STATUS     deprecated
    DESCRIPTION
           "The number of current ipCidrRouteTable entries that are
            not invalid.  This object is deprecated in favor of
            inetCidrRouteNumber and the inetCidrRouteTable."
    ::= { ipForward 3 }

--  IP CIDR Route Table

--  The IP CIDR Route Table obsoletes and replaces the ipRoute
--  Table current in MIB-I and MIB-II and the IP Forwarding Table.
--  It adds knowledge of the autonomous system of the next hop,
--  multiple next hops, policy routing, and Classless
--  Inter-Domain Routing.

ipCidrRouteTable OBJECT-TYPE
    SYNTAX     SEQUENCE OF IpCidrRouteEntry
    MAX-ACCESS not-accessible
    STATUS     deprecated
    DESCRIPTION
           "This entity's IP Routing table.  This table has been
            deprecated in favor of the IP version neutral
            inetCidrRouteTable."
    REFERENCE
           "RFC 1213 Section 6.6, The IP Group"
    ::= { ipForward 4 }

ipCidrRouteEntry OBJECT-TYPE
    SYNTAX     IpCidrRouteEntry
    MAX-ACCESS not-accessible
    STATUS     deprecated
    DESCRIPTION
           "A particular route to a particular destination, under a



            particular policy."
    INDEX {
        ipCidrRouteDest,
        ipCidrRouteMask,
        ipCidrRouteTos,
        ipCidrRouteNextHop
        }
       ::= { ipCidrRouteTable 1 }

IpCidrRouteEntry ::= SEQUENCE {
        ipCidrRouteDest       IpAddress,
        ipCidrRouteMask       IpAddress,
        ipCidrRouteTos        Integer32,
        ipCidrRouteNextHop    IpAddress,
        ipCidrRouteIfIndex    Integer32,
        ipCidrRouteType       INTEGER,
        ipCidrRouteProto      INTEGER,
        ipCidrRouteAge        Integer32,
        ipCidrRouteInfo       OBJECT IDENTIFIER,
        ipCidrRouteNextHopAS  Integer32,
        ipCidrRouteMetric1    Integer32,
        ipCidrRouteMetric2    Integer32,
        ipCidrRouteMetric3    Integer32,
        ipCidrRouteMetric4    Integer32,
        ipCidrRouteMetric5    Integer32,
        ipCidrRouteStatus     RowStatus
    }

ipCidrRouteDest OBJECT-TYPE
    SYNTAX     IpAddress
    MAX-ACCESS read-only
    STATUS     deprecated
    DESCRIPTION
           "The destination IP address of this route.

            This object may not take a Multicast (Class D) address
            value.

            Any assignment (implicit or otherwise) of an instance
            of this object to a value x must be rejected if the
            bitwise logical-AND of x with the value of the
            corresponding instance of the ipCidrRouteMask object is
            not equal to x."
    ::= { ipCidrRouteEntry 1 }

ipCidrRouteMask OBJECT-TYPE
    SYNTAX     IpAddress
    MAX-ACCESS read-only



    STATUS     deprecated
    DESCRIPTION
           "Indicate the mask to be logical-ANDed with the
            destination address before being compared to the value
            in the ipCidrRouteDest field.  For those systems that
            do not support arbitrary subnet masks, an agent
            constructs the value of the ipCidrRouteMask by
            reference to the IP Address Class.

            Any assignment (implicit or otherwise) of an instance
            of this object to a value x must be rejected if the
            bitwise logical-AND of x with the value of the
            corresponding instance of the ipCidrRouteDest object is
            not equal to ipCidrRouteDest."
    ::= { ipCidrRouteEntry 2 }

-- The following convention is included for specification
-- of TOS Field contents.  At this time, the Host Requirements
-- and the Router Requirements documents disagree on the width
-- of the TOS field.  This mapping describes the Router
-- Requirements mapping, and leaves room to widen the TOS field
-- without impact to fielded systems.

ipCidrRouteTos OBJECT-TYPE
    SYNTAX     Integer32 (0..2147483647)
    MAX-ACCESS read-only
    STATUS     deprecated
    DESCRIPTION
           "The policy specifier is the IP TOS Field.  The encoding
            of IP TOS is as specified by the following convention.
            Zero indicates the default path if no more specific
            policy applies.

            +-----+-----+-----+-----+-----+-----+-----+-----+
            |                 |                       |     |
            |   PRECEDENCE    |    TYPE OF SERVICE    |  0  |
            |                 |                       |     |
            +-----+-----+-----+-----+-----+-----+-----+-----+

                         IP TOS                IP TOS
               Field     Policy      Field     Policy
               Contents    Code      Contents    Code
               0 0 0 0  ==>   0      0 0 0 1  ==>   2
               0 0 1 0  ==>   4      0 0 1 1  ==>   6
               0 1 0 0  ==>   8      0 1 0 1  ==>  10
               0 1 1 0  ==>  12      0 1 1 1  ==>  14
               1 0 0 0  ==>  16      1 0 0 1  ==>  18
               1 0 1 0  ==>  20      1 0 1 1  ==>  22



               1 1 0 0  ==>  24      1 1 0 1  ==>  26
               1 1 1 0  ==>  28      1 1 1 1  ==>  30"
    ::= { ipCidrRouteEntry 3 }

ipCidrRouteNextHop OBJECT-TYPE
    SYNTAX     IpAddress
    MAX-ACCESS read-only
    STATUS     deprecated
    DESCRIPTION
           "On remote routes, the address of the next system en
            route; Otherwise, 0.0.0.0."
    ::= { ipCidrRouteEntry 4 }

ipCidrRouteIfIndex OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     deprecated
    DESCRIPTION
           "The ifIndex value that identifies the local interface
            through which the next hop of this route should be
            reached."
    DEFVAL { 0 }
    ::= { ipCidrRouteEntry 5 }

ipCidrRouteType OBJECT-TYPE
    SYNTAX     INTEGER {
                other    (1), -- not specified by this MIB
                reject   (2), -- route that discards traffic
                local    (3), -- local interface
                remote   (4)  -- remote destination
             }
    MAX-ACCESS read-create
    STATUS     deprecated
    DESCRIPTION
           "The type of route.  Note that local(3) refers to a
            route for which the next hop is the final destination;
            remote(4) refers to a route for which the next hop is
            not the final destination.

            Routes that do not result in traffic forwarding or
            rejection should not be displayed, even if the
            implementation keeps them stored internally.

            reject (2) refers to a route that, if matched,
            discards the message as unreachable.  This is used in
            some protocols as a means of correctly aggregating
            routes."
    ::= { ipCidrRouteEntry 6 }




ipCidrRouteProto OBJECT-TYPE
    SYNTAX     INTEGER {
                other     (1),  -- not specified
                local     (2),  -- local interface
                netmgmt   (3),  -- static route
                icmp      (4),  -- result of ICMP Redirect

                        -- the following are all dynamic
                        -- routing protocols
                egp        (5),  -- Exterior Gateway Protocol
                ggp        (6),  -- Gateway-Gateway Protocol
                hello      (7),  -- FuzzBall HelloSpeak
                rip        (8),  -- Berkeley RIP or RIP-II
                isIs       (9),  -- Dual IS-IS
                esIs       (10), -- ISO 9542
                ciscoIgrp  (11), -- Cisco IGRP
                bbnSpfIgp  (12), -- BBN SPF IGP
                ospf       (13), -- Open Shortest Path First
                bgp        (14), -- Border Gateway Protocol
                idpr       (15), -- InterDomain Policy Routing
                ciscoEigrp (16)  -- Cisco EIGRP
             }
    MAX-ACCESS read-only
    STATUS     deprecated
    DESCRIPTION
           "The routing mechanism via which this route was learned.
            Inclusion of values for gateway routing protocols is
            not intended to imply that hosts should support those
            protocols."
    ::= { ipCidrRouteEntry 7 }

ipCidrRouteAge OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-only
    STATUS     deprecated
    DESCRIPTION
           "The number of seconds since this route was last updated
            or otherwise determined to be correct.  Note that no
            semantics of `too old' can be implied, except through
            knowledge of the routing protocol by which the route
            was learned."
    DEFVAL  { 0 }
    ::= { ipCidrRouteEntry 8 }

ipCidrRouteInfo OBJECT-TYPE
    SYNTAX     OBJECT IDENTIFIER
    MAX-ACCESS read-create



    STATUS     deprecated
    DESCRIPTION
           "A reference to MIB definitions specific to the
            particular routing protocol that is responsible for
            this route, as determined by the value specified in the
            route's ipCidrRouteProto value.  If this information is
            not present, its value should be set to the OBJECT
            IDENTIFIER { 0 0 }, which is a syntactically valid
            object identifier, and any implementation conforming to
            ASN.1 and the Basic Encoding Rules must be able to
            generate and recognize this value."
    ::= { ipCidrRouteEntry 9 }

ipCidrRouteNextHopAS OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     deprecated
    DESCRIPTION
           "The Autonomous System Number of the Next Hop.  The
            semantics of this object are determined by the routing-
            protocol specified in the route's ipCidrRouteProto
            value.  When this object is unknown or not relevant, its
            value should be set to zero."
    DEFVAL { 0 }
    ::= { ipCidrRouteEntry 10 }

ipCidrRouteMetric1 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     deprecated
    DESCRIPTION
           "The primary routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's ipCidrRouteProto
            value.  If this metric is not used, its value should be
            set to -1."
    DEFVAL { -1 }
    ::= { ipCidrRouteEntry 11 }

ipCidrRouteMetric2 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     deprecated
    DESCRIPTION
           "An alternate routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's ipCidrRouteProto
            value.  If this metric is not used, its value should be



            set to -1."
    DEFVAL { -1 }
    ::= { ipCidrRouteEntry 12 }

ipCidrRouteMetric3 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     deprecated
    DESCRIPTION
           "An alternate routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's ipCidrRouteProto
            value.  If this metric is not used, its value should be
            set to -1."
    DEFVAL { -1 }
    ::= { ipCidrRouteEntry 13 }

ipCidrRouteMetric4 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     deprecated
    DESCRIPTION
           "An alternate routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's ipCidrRouteProto
            value.  If this metric is not used, its value should be
            set to -1."
    DEFVAL { -1 }
    ::= { ipCidrRouteEntry 14 }

ipCidrRouteMetric5 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     deprecated
    DESCRIPTION
           "An alternate routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's ipCidrRouteProto
            value.  If this metric is not used, its value should be
            set to -1."
    DEFVAL { -1 }
    ::= { ipCidrRouteEntry 15 }

ipCidrRouteStatus OBJECT-TYPE
    SYNTAX     RowStatus
    MAX-ACCESS read-create
    STATUS     deprecated
    DESCRIPTION



           "The row status variable, used according to row
            installation and removal conventions."
    ::= { ipCidrRouteEntry 16 }

-- compliance statements

ipForwardCompliance MODULE-COMPLIANCE
    STATUS     deprecated
    DESCRIPTION
           "The compliance statement for SNMPv2 entities that
            implement the ipForward MIB.

            This compliance statement has been deprecated and
            replaced with ipForwardFullCompliance and
            ipForwardReadOnlyCompliance."

   MODULE  -- this module
   MANDATORY-GROUPS { ipForwardCidrRouteGroup }

   ::= { ipForwardCompliances 1 }

-- units of conformance

ipForwardCidrRouteGroup OBJECT-GROUP
    OBJECTS { ipCidrRouteNumber,
              ipCidrRouteDest, ipCidrRouteMask, ipCidrRouteTos,
              ipCidrRouteNextHop, ipCidrRouteIfIndex,
              ipCidrRouteType, ipCidrRouteProto, ipCidrRouteAge,
              ipCidrRouteInfo,ipCidrRouteNextHopAS,
              ipCidrRouteMetric1, ipCidrRouteMetric2,
              ipCidrRouteMetric3, ipCidrRouteMetric4,
              ipCidrRouteMetric5, ipCidrRouteStatus
        }
    STATUS     deprecated
    DESCRIPTION
           "The CIDR Route Table.

            This group has been deprecated and replaced with
            inetForwardCidrRouteGroup."
    ::= { ipForwardGroups 3 }

-- Obsoleted Definitions - Objects

ipForwardNumber OBJECT-TYPE
    SYNTAX     Gauge32
    MAX-ACCESS read-only
    STATUS     obsolete
    DESCRIPTION



           "The number of current ipForwardTable entries that are
            not invalid."
    ::= { ipForward 1 }

--  IP Forwarding Table

--  The IP Forwarding Table obsoletes and replaces the ipRoute
--  Table current in MIB-I and MIB-II.  It adds knowledge of
--  the autonomous system of the next hop, multiple next hop
--  support, and policy routing support.

ipForwardTable OBJECT-TYPE
    SYNTAX     SEQUENCE OF IpForwardEntry
    MAX-ACCESS not-accessible
    STATUS     obsolete
    DESCRIPTION
           "This entity's IP Routing table."
    REFERENCE
           "RFC 1213 Section 6.6, The IP Group"
    ::= { ipForward 2 }

ipForwardEntry OBJECT-TYPE
    SYNTAX     IpForwardEntry
    MAX-ACCESS not-accessible
    STATUS     obsolete
    DESCRIPTION
           "A particular route to a particular destination, under a
            particular policy."
    INDEX {
        ipForwardDest,
        ipForwardProto,
        ipForwardPolicy,
        ipForwardNextHop
        }
    ::= { ipForwardTable 1 }

IpForwardEntry ::= SEQUENCE {
        ipForwardDest       IpAddress,
        ipForwardMask       IpAddress,
        ipForwardPolicy     Integer32,
        ipForwardNextHop    IpAddress,
        ipForwardIfIndex    Integer32,
        ipForwardType       INTEGER,
        ipForwardProto      INTEGER,
        ipForwardAge        Integer32,
        ipForwardInfo       OBJECT IDENTIFIER,
        ipForwardNextHopAS  Integer32,
        ipForwardMetric1    Integer32,



        ipForwardMetric2    Integer32,
        ipForwardMetric3    Integer32,
        ipForwardMetric4    Integer32,
        ipForwardMetric5    Integer32
    }

ipForwardDest OBJECT-TYPE
    SYNTAX     IpAddress
    MAX-ACCESS read-only
    STATUS     obsolete
    DESCRIPTION
           "The destination IP address of this route.  An entry
            with a value of 0.0.0.0 is considered a default route.

            This object may not take a Multicast (Class D) address
            value.

            Any assignment (implicit or otherwise) of an instance
            of this object to a value x must be rejected if the
            bitwise logical-AND of x with the value of the
            corresponding instance of the ipForwardMask object is
            not equal to x."
    ::= { ipForwardEntry 1 }

ipForwardMask OBJECT-TYPE
    SYNTAX     IpAddress
    MAX-ACCESS read-create
    STATUS     obsolete
    DESCRIPTION
           "Indicate the mask to be logical-ANDed with the
            destination address before being compared to the value
            in the ipForwardDest field.  For those systems that do
            not support arbitrary subnet masks, an agent constructs
            the value of the ipForwardMask by reference to the IP
            Address Class.

            Any assignment (implicit or otherwise) of an instance
            of this object to a value x must be rejected if the
            bitwise logical-AND of x with the value of the
            corresponding instance of the ipForwardDest object is
            not equal to ipForwardDest."
    DEFVAL { '00000000'H }      -- 0.0.0.0
    ::= { ipForwardEntry 2 }

-- The following convention is included for specification
-- of TOS Field contents.  At this time, the Host Requirements
-- and the Router Requirements documents disagree on the width
-- of the TOS field.  This mapping describes the Router



-- Requirements mapping, and leaves room to widen the TOS field
-- without impact to fielded systems.

ipForwardPolicy OBJECT-TYPE
    SYNTAX     Integer32 (0..2147483647)
    MAX-ACCESS read-only
    STATUS     obsolete
    DESCRIPTION
           "The general set of conditions that would cause
            the selection of one multipath route (set of
            next hops for a given destination) is referred
            to as 'policy'.

            Unless the mechanism indicated by ipForwardProto
            specifies otherwise, the policy specifier is
            the IP TOS Field.  The encoding of IP TOS is as
            specified by the following convention.  Zero
            indicates the default path if no more specific
            policy applies.

            +-----+-----+-----+-----+-----+-----+-----+-----+
            |                 |                       |     |
            |   PRECEDENCE    |    TYPE OF SERVICE    |  0  |
            |                 |                       |     |
            +-----+-----+-----+-----+-----+-----+-----+-----+



                         IP TOS                IP TOS
               Field     Policy      Field     Policy
               Contents    Code      Contents    Code
               0 0 0 0  ==>   0      0 0 0 1  ==>   2
               0 0 1 0  ==>   4      0 0 1 1  ==>   6
               0 1 0 0  ==>   8      0 1 0 1  ==>  10
               0 1 1 0  ==>  12      0 1 1 1  ==>  14
               1 0 0 0  ==>  16      1 0 0 1  ==>  18
               1 0 1 0  ==>  20      1 0 1 1  ==>  22
               1 1 0 0  ==>  24      1 1 0 1  ==>  26
               1 1 1 0  ==>  28      1 1 1 1  ==>  30

            Protocols defining 'policy' otherwise must either
            define a set of values that are valid for
            this object or must implement an integer-instanced
            policy table for which this object's
            value acts as an index."
    ::= { ipForwardEntry 3 }

ipForwardNextHop OBJECT-TYPE



    SYNTAX     IpAddress
    MAX-ACCESS read-only
    STATUS     obsolete
    DESCRIPTION
           "On remote routes, the address of the next system en
            route; otherwise, 0.0.0.0."
    ::= { ipForwardEntry 4 }

ipForwardIfIndex OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     obsolete
    DESCRIPTION
           "The ifIndex value that identifies the local interface
            through which the next hop of this route should be
            reached."
    DEFVAL { 0 }
    ::= { ipForwardEntry 5 }

ipForwardType OBJECT-TYPE
    SYNTAX     INTEGER {
                other    (1), -- not specified by this MIB
                invalid  (2), -- logically deleted
                local    (3), -- local interface
                remote   (4)  -- remote destination
             }
    MAX-ACCESS read-create
    STATUS     obsolete
    DESCRIPTION
           "The type of route.  Note that local(3) refers to a
            route for which the next hop is the final destination;
            remote(4) refers to a route for which the next hop is
            not the final destination.

            Setting this object to the value invalid(2) has the
            effect of invalidating the corresponding entry in the
            ipForwardTable object.  That is, it effectively
            disassociates the destination identified with said
            entry from the route identified with said entry.  It is
            an implementation-specific matter as to whether the
            agent removes an invalidated entry from the table.
            Accordingly, management stations must be prepared to
            receive tabular information from agents that
            corresponds to entries not currently in use.  Proper
            interpretation of such entries requires examination of
            the relevant ipForwardType object."
    DEFVAL { invalid }
    ::= { ipForwardEntry 6 }




ipForwardProto OBJECT-TYPE
    SYNTAX     INTEGER {
                other     (1),  -- not specified
                local     (2),  -- local interface
                netmgmt   (3),  -- static route
                icmp      (4),  -- result of ICMP Redirect

                        -- the following are all dynamic
                        -- routing protocols
                egp       (5),  -- Exterior Gateway Protocol
                ggp       (6),  -- Gateway-Gateway Protocol
                hello     (7),  -- FuzzBall HelloSpeak
                rip       (8),  -- Berkeley RIP or RIP-II
                is-is     (9),  -- Dual IS-IS
                es-is     (10), -- ISO 9542
                ciscoIgrp (11), -- Cisco IGRP
                bbnSpfIgp (12), -- BBN SPF IGP
                ospf      (13), -- Open Shortest Path First
                bgp       (14), -- Border Gateway Protocol
                idpr      (15)  -- InterDomain Policy Routing
             }
    MAX-ACCESS read-only
    STATUS     obsolete
    DESCRIPTION
           "The routing mechanism via which this route was learned.
            Inclusion of values for gateway routing protocols is
            not intended to imply that hosts should support those
            protocols."
    ::= { ipForwardEntry 7 }

ipForwardAge OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-only
    STATUS     obsolete
    DESCRIPTION
           "The number of seconds since this route was last updated
            or otherwise determined to be correct.  Note that no
            semantics of `too old' can be implied except through
            knowledge of the routing protocol by which the route
            was learned."
    DEFVAL  { 0 }
    ::= { ipForwardEntry 8 }

ipForwardInfo OBJECT-TYPE
    SYNTAX     OBJECT IDENTIFIER
    MAX-ACCESS read-create
    STATUS     obsolete



    DESCRIPTION
           "A reference to MIB definitions specific to the
            particular routing protocol that is responsible for
            this route, as determined by the value specified in the
            route's ipForwardProto value.  If this information is
            not present, its value should be set to the OBJECT
            IDENTIFIER { 0 0 }, which is a syntactically valid
            object identifier, and any implementation conforming to
            ASN.1 and the Basic Encoding Rules must be able to
            generate and recognize this value."
    ::= { ipForwardEntry 9 }

ipForwardNextHopAS OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     obsolete
    DESCRIPTION
           "The Autonomous System Number of the Next Hop.  When
            this is unknown or not relevant to the protocol
            indicated by ipForwardProto, zero."
    DEFVAL { 0 }
    ::= { ipForwardEntry 10 }

ipForwardMetric1 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     obsolete
    DESCRIPTION
           "The primary routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's ipForwardProto value.
            If this metric is not used, its value should be set to
            -1."
    DEFVAL { -1 }
    ::= { ipForwardEntry 11 }

ipForwardMetric2 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     obsolete
    DESCRIPTION
           "An alternate routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's ipForwardProto value.
            If this metric is not used, its value should be set to
            -1."
    DEFVAL { -1 }
    ::= { ipForwardEntry 12 }




ipForwardMetric3 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     obsolete
    DESCRIPTION
           "An alternate routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's ipForwardProto value.
            If this metric is not used, its value should be set to
            -1."
    DEFVAL { -1 }
    ::= { ipForwardEntry 13 }

ipForwardMetric4 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     obsolete
    DESCRIPTION
           "An alternate routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's ipForwardProto value.
            If this metric is not used, its value should be set to
            -1."
    DEFVAL { -1 }
    ::= { ipForwardEntry 14 }

ipForwardMetric5 OBJECT-TYPE
    SYNTAX     Integer32
    MAX-ACCESS read-create
    STATUS     obsolete
    DESCRIPTION
           "An alternate routing metric for this route.  The
            semantics of this metric are determined by the routing-
            protocol specified in the route's ipForwardProto value.
            If this metric is not used, its value should be set to
            -1."
    DEFVAL { -1 }
    ::= { ipForwardEntry 15 }

-- Obsoleted Definitions - Groups
-- compliance statements

ipForwardOldCompliance MODULE-COMPLIANCE
    STATUS     obsolete
    DESCRIPTION
           "The compliance statement for SNMP entities that
            implement the ipForward MIB."




   MODULE  -- this module
   MANDATORY-GROUPS { ipForwardMultiPathGroup }

   ::= { ipForwardCompliances 2 }

ipForwardMultiPathGroup OBJECT-GROUP
    OBJECTS { ipForwardNumber,
              ipForwardDest, ipForwardMask, ipForwardPolicy,
              ipForwardNextHop, ipForwardIfIndex, ipForwardType,
              ipForwardProto, ipForwardAge, ipForwardInfo,
              ipForwardNextHopAS,
              ipForwardMetric1, ipForwardMetric2, ipForwardMetric3,
              ipForwardMetric4, ipForwardMetric5
        }
    STATUS     obsolete
    DESCRIPTION
           "IP Multipath Route Table."
    ::= { ipForwardGroups 2 }

END
