2
Copyright (C) 1999, 2000 Kunihiro Ishiguro
4
This file is part of GNU Zebra.
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
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.
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 Free
18
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25
#include <net-snmp/net-snmp-config.h>
29
#include <snmp_impl.h>
38
#include "bgpd/bgpd.h"
39
#include "bgpd/bgp_table.h"
40
#include "bgpd/bgp_aspath.h"
41
#include "bgpd/bgp_attr.h"
42
#include "bgpd/bgp_route.h"
43
#include "bgpd/bgp_fsm.h"
45
/* BGP4-MIB described in RFC1657. */
46
#define BGP4MIB 1,3,6,1,2,1,15
49
#define BGPESTABLISHED 1
50
#define BGPBACKWARDTRANSITION 2
52
/* Zebra enterprise BGP MIB. This variable is used for register
53
OSPF MIB to SNMP agent under SMUX protocol. */
54
#define BGPDMIB 1,3,6,1,4,1,3317,1,2,2
56
/* BGP MIB bgpVersion. */
59
/* BGP MIB bgpLocalAs. */
62
/* BGP MIB bgpPeerTable. */
63
#define BGPPEERIDENTIFIER 1
64
#define BGPPEERSTATE 2
65
#define BGPPEERADMINSTATUS 3
66
#define BGPPEERNEGOTIATEDVERSION 4
67
#define BGPPEERLOCALADDR 5
68
#define BGPPEERLOCALPORT 6
69
#define BGPPEERREMOTEADDR 7
70
#define BGPPEERREMOTEPORT 8
71
#define BGPPEERREMOTEAS 9
72
#define BGPPEERINUPDATES 10
73
#define BGPPEEROUTUPDATES 11
74
#define BGPPEERINTOTALMESSAGES 12
75
#define BGPPEEROUTTOTALMESSAGES 13
76
#define BGPPEERLASTERROR 14
77
#define BGPPEERFSMESTABLISHEDTRANSITIONS 15
78
#define BGPPEERFSMESTABLISHEDTIME 16
79
#define BGPPEERCONNECTRETRYINTERVAL 17
80
#define BGPPEERHOLDTIME 18
81
#define BGPPEERKEEPALIVE 19
82
#define BGPPEERHOLDTIMECONFIGURED 20
83
#define BGPPEERKEEPALIVECONFIGURED 21
84
#define BGPPEERMINASORIGINATIONINTERVAL 22
85
#define BGPPEERMINROUTEADVERTISEMENTINTERVAL 23
86
#define BGPPEERINUPDATEELAPSEDTIME 24
88
/* BGP MIB bgpIdentifier. */
89
#define BGPIDENTIFIER 0
91
/* BGP MIB bgpRcvdPathAttrTable */
92
#define BGPPATHATTRPEER 1
93
#define BGPPATHATTRDESTNETWORK 2
94
#define BGPPATHATTRORIGIN 3
95
#define BGPPATHATTRASPATH 4
96
#define BGPPATHATTRNEXTHOP 5
97
#define BGPPATHATTRINTERASMETRIC 6
99
/* BGP MIB bgp4PathAttrTable. */
100
#define BGP4PATHATTRPEER 1
101
#define BGP4PATHATTRIPADDRPREFIXLEN 2
102
#define BGP4PATHATTRIPADDRPREFIX 3
103
#define BGP4PATHATTRORIGIN 4
104
#define BGP4PATHATTRASPATHSEGMENT 5
105
#define BGP4PATHATTRNEXTHOP 6
106
#define BGP4PATHATTRMULTIEXITDISC 7
107
#define BGP4PATHATTRLOCALPREF 8
108
#define BGP4PATHATTRATOMICAGGREGATE 9
109
#define BGP4PATHATTRAGGREGATORAS 10
110
#define BGP4PATHATTRAGGREGATORADDR 11
111
#define BGP4PATHATTRCALCLOCALPREF 12
112
#define BGP4PATHATTRBEST 13
113
#define BGP4PATHATTRUNKNOWN 14
115
/* SNMP value hack. */
116
#define INTEGER ASN_INTEGER
117
#define INTEGER32 ASN_INTEGER
118
#define COUNTER32 ASN_COUNTER
119
#define OCTET_STRING ASN_OCTET_STR
120
#define IPADDRESS ASN_IPADDRESS
121
#define GAUGE32 ASN_UNSIGNED
123
/* Declare static local variables for convenience. */
126
/* BGP-MIB instances. */
127
oid bgp_oid [] = { BGP4MIB };
128
oid bgpd_oid [] = { BGPDMIB };
130
/* IP address 0.0.0.0. */
131
static struct in_addr bgp_empty_addr = {0};
133
/* Hook functions. */
134
static u_char *bgpVersion ();
135
static u_char *bgpLocalAs ();
136
static u_char *bgpPeerTable ();
137
static u_char *bgpRcvdPathAttrTable ();
138
static u_char *bgpIdentifier ();
139
static u_char *bgp4PathAttrTable ();
140
/* static u_char *bgpTraps (); */
142
struct variable bgp_variables[] =
145
{BGPVERSION, OCTET_STRING, RONLY, bgpVersion,
148
{BGPLOCALAS, INTEGER, RONLY, bgpLocalAs,
150
/* BGP peer table. */
151
{BGPPEERIDENTIFIER, IPADDRESS, RONLY, bgpPeerTable,
153
{BGPPEERSTATE, INTEGER, RONLY, bgpPeerTable,
155
{BGPPEERADMINSTATUS, INTEGER, RWRITE, bgpPeerTable,
157
{BGPPEERNEGOTIATEDVERSION, INTEGER32, RONLY, bgpPeerTable,
159
{BGPPEERLOCALADDR, IPADDRESS, RONLY, bgpPeerTable,
161
{BGPPEERLOCALPORT, INTEGER, RONLY, bgpPeerTable,
163
{BGPPEERREMOTEADDR, IPADDRESS, RONLY, bgpPeerTable,
165
{BGPPEERREMOTEPORT, INTEGER, RONLY, bgpPeerTable,
167
{BGPPEERREMOTEAS, INTEGER, RONLY, bgpPeerTable,
169
{BGPPEERINUPDATES, COUNTER32, RONLY, bgpPeerTable,
171
{BGPPEEROUTUPDATES, COUNTER32, RONLY, bgpPeerTable,
173
{BGPPEERINTOTALMESSAGES, COUNTER32, RONLY, bgpPeerTable,
175
{BGPPEEROUTTOTALMESSAGES, COUNTER32, RONLY, bgpPeerTable,
177
{BGPPEERLASTERROR, OCTET_STRING, RONLY, bgpPeerTable,
179
{BGPPEERFSMESTABLISHEDTRANSITIONS, COUNTER32, RONLY, bgpPeerTable,
181
{BGPPEERFSMESTABLISHEDTIME, GAUGE32, RONLY, bgpPeerTable,
183
{BGPPEERCONNECTRETRYINTERVAL, INTEGER, RWRITE, bgpPeerTable,
185
{BGPPEERHOLDTIME, INTEGER, RONLY, bgpPeerTable,
187
{BGPPEERKEEPALIVE, INTEGER, RONLY, bgpPeerTable,
189
{BGPPEERHOLDTIMECONFIGURED, INTEGER, RWRITE, bgpPeerTable,
191
{BGPPEERKEEPALIVECONFIGURED, INTEGER, RWRITE, bgpPeerTable,
193
{BGPPEERMINASORIGINATIONINTERVAL, INTEGER, RWRITE, bgpPeerTable,
195
{BGPPEERMINROUTEADVERTISEMENTINTERVAL, INTEGER, RWRITE, bgpPeerTable,
197
{BGPPEERINUPDATEELAPSEDTIME, GAUGE32, RONLY, bgpPeerTable,
199
/* BGP identifier. */
200
{BGPIDENTIFIER, IPADDRESS, RONLY, bgpIdentifier,
202
/* BGP received path attribute table. */
203
{BGPPATHATTRPEER, IPADDRESS, RONLY, bgpRcvdPathAttrTable,
205
{BGPPATHATTRDESTNETWORK, IPADDRESS, RONLY, bgpRcvdPathAttrTable,
207
{BGPPATHATTRORIGIN, INTEGER, RONLY, bgpRcvdPathAttrTable,
209
{BGPPATHATTRASPATH, OCTET_STRING, RONLY, bgpRcvdPathAttrTable,
211
{BGPPATHATTRNEXTHOP, IPADDRESS, RONLY, bgpRcvdPathAttrTable,
213
{BGPPATHATTRINTERASMETRIC, INTEGER32, RONLY, bgpRcvdPathAttrTable,
215
/* BGP-4 received path attribute table. */
216
{BGP4PATHATTRPEER, IPADDRESS, RONLY, bgp4PathAttrTable,
218
{BGP4PATHATTRIPADDRPREFIXLEN, INTEGER, RONLY, bgp4PathAttrTable,
220
{BGP4PATHATTRIPADDRPREFIX, IPADDRESS, RONLY, bgp4PathAttrTable,
222
{BGP4PATHATTRORIGIN, INTEGER, RONLY, bgp4PathAttrTable,
224
{BGP4PATHATTRASPATHSEGMENT, OCTET_STRING, RONLY, bgp4PathAttrTable,
226
{BGP4PATHATTRNEXTHOP, IPADDRESS, RONLY, bgp4PathAttrTable,
228
{BGP4PATHATTRMULTIEXITDISC, INTEGER, RONLY, bgp4PathAttrTable,
230
{BGP4PATHATTRLOCALPREF, INTEGER, RONLY, bgp4PathAttrTable,
232
{BGP4PATHATTRATOMICAGGREGATE, INTEGER, RONLY, bgp4PathAttrTable,
234
{BGP4PATHATTRAGGREGATORAS, INTEGER, RONLY, bgp4PathAttrTable,
236
{BGP4PATHATTRAGGREGATORADDR, IPADDRESS, RONLY, bgp4PathAttrTable,
238
{BGP4PATHATTRCALCLOCALPREF, INTEGER, RONLY, bgp4PathAttrTable,
240
{BGP4PATHATTRBEST, INTEGER, RONLY, bgp4PathAttrTable,
242
{BGP4PATHATTRUNKNOWN, OCTET_STRING, RONLY, bgp4PathAttrTable,
248
bgpVersion (struct variable *v, oid name[], size_t *length, int exact,
249
size_t *var_len, WriteMethod **write_method)
251
static u_char version;
253
if (smux_header_generic(v, name, length, exact, var_len, write_method)
257
/* Retrun BGP version. Zebra bgpd only support version 4. */
258
version = (0x80 >> (BGP_VERSION_4 - 1));
260
/* Return octet string length 1. */
262
return (u_char *)&version;
266
bgpLocalAs (struct variable *v, oid name[], size_t *length,
267
int exact, size_t *var_len, WriteMethod **write_method)
271
if (smux_header_generic(v, name, length, exact, var_len, write_method)
275
/* Get BGP structure. */
276
bgp = bgp_get_default ();
280
return SNMP_INTEGER (bgp->as);
284
peer_lookup_addr_ipv4 (struct in_addr *src)
292
bgp = bgp_get_default ();
296
LIST_LOOP (bgp->peer, peer, nn)
298
ret = inet_pton (AF_INET, peer->host, &addr);
301
if (IPV4_ADDR_SAME (&addr, src))
309
bgp_peer_lookup_next (struct in_addr *src)
318
memset (&su, 0, sizeof (union sockunion));
320
bgp = bgp_get_default ();
324
LIST_LOOP (bgp->peer, peer, nn)
326
ret = inet_pton (AF_INET, peer->host, &su.sin.sin_addr);
329
p = &su.sin.sin_addr;
331
if (ntohl (p->s_addr) > ntohl (src->s_addr))
333
src->s_addr = p->s_addr;
342
bgpPeerTable_lookup (struct variable *v, oid name[], size_t *length,
343
struct in_addr *addr, int exact)
345
struct peer *peer = NULL;
350
/* Check the length. */
351
if (*length - v->namelen != sizeof (struct in_addr))
354
oid2in_addr (name + v->namelen, IN_ADDR_SIZE, addr);
356
peer = peer_lookup_addr_ipv4 (addr);
361
len = *length - v->namelen;
362
if (len > 4) len = 4;
364
oid2in_addr (name + v->namelen, len, addr);
366
peer = bgp_peer_lookup_next (addr);
371
oid_copy_addr (name + v->namelen, addr, sizeof (struct in_addr));
372
*length = sizeof (struct in_addr) + v->namelen;
379
/* BGP write methods. */
381
write_bgpPeerTable (int action, u_char *var_val,
382
u_char var_val_type, size_t var_val_len,
383
u_char *statP, oid *name, size_t length,
389
int bigsize = SNMP_MAX_LEN;
391
if (var_val_type != ASN_INTEGER)
393
return SNMP_ERR_WRONGTYPE;
395
if (var_val_len != sizeof (long))
397
return SNMP_ERR_WRONGLENGTH;
400
if (! asn_parse_int(var_val, &bigsize, &var_val_type,
401
&intval, sizeof(long)))
403
return SNMP_ERR_WRONGENCODING;
406
memset (&addr, 0, sizeof (struct in_addr));
408
peer = bgpPeerTable_lookup (v, name, &length, &addr, 1);
410
return SNMP_ERR_NOSUCHNAME;
412
printf ("val: %ld\n", intval);
416
case BGPPEERADMINSTATUS:
417
#define BGP_PeerAdmin_stop 1
418
#define BGP_PeerAdmin_start 2
419
/* When the peer is established, */
420
if (intval == BGP_PeerAdmin_stop)
421
BGP_EVENT_ADD (peer, BGP_Stop);
422
else if (intval == BGP_PeerAdmin_start)
425
return SNMP_ERR_NOSUCHNAME;
427
case BGPPEERCONNECTRETRYINTERVAL:
428
SET_FLAG (peer->config, PEER_CONFIG_CONNECT);
429
peer->connect = intval;
430
peer->v_connect = intval;
432
case BGPPEERHOLDTIMECONFIGURED:
433
SET_FLAG (peer->config, PEER_CONFIG_TIMER);
434
peer->holdtime = intval;
435
peer->v_holdtime = intval;
437
case BGPPEERKEEPALIVECONFIGURED:
438
SET_FLAG (peer->config, PEER_CONFIG_TIMER);
439
peer->keepalive = intval;
440
peer->v_keepalive = intval;
442
case BGPPEERMINASORIGINATIONINTERVAL:
443
peer->v_asorig = intval;
445
case BGPPEERMINROUTEADVERTISEMENTINTERVAL:
446
peer->v_routeadv = intval;
449
return SNMP_ERR_NOERROR;
453
bgpPeerTable (struct variable *v, oid name[], size_t *length,
454
int exact, size_t *var_len, WriteMethod **write_method)
456
static struct in_addr addr;
459
*write_method = NULL;
460
memset (&addr, 0, sizeof (struct in_addr));
462
peer = bgpPeerTable_lookup (v, name, length, &addr, exact);
468
case BGPPEERIDENTIFIER:
469
return SNMP_IPADDRESS (peer->remote_id);
472
return SNMP_INTEGER (peer->status);
474
case BGPPEERADMINSTATUS:
475
*write_method = write_bgpPeerTable;
476
#define BGP_PeerAdmin_stop 1
477
#define BGP_PeerAdmin_start 2
478
if (CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
479
return SNMP_INTEGER (BGP_PeerAdmin_stop);
481
return SNMP_INTEGER (BGP_PeerAdmin_start);
483
case BGPPEERNEGOTIATEDVERSION:
484
return SNMP_INTEGER (peer->version);
486
case BGPPEERLOCALADDR:
488
return SNMP_IPADDRESS (peer->su_local->sin.sin_addr);
490
return SNMP_IPADDRESS (bgp_empty_addr);
492
case BGPPEERLOCALPORT:
494
return SNMP_INTEGER (ntohs (peer->su_local->sin.sin_port));
496
return SNMP_INTEGER (0);
498
case BGPPEERREMOTEADDR:
500
return SNMP_IPADDRESS (peer->su_remote->sin.sin_addr);
502
return SNMP_IPADDRESS (bgp_empty_addr);
504
case BGPPEERREMOTEPORT:
506
return SNMP_INTEGER (ntohs (peer->su_remote->sin.sin_port));
508
return SNMP_INTEGER (0);
510
case BGPPEERREMOTEAS:
511
return SNMP_INTEGER (peer->as);
513
case BGPPEERINUPDATES:
514
return SNMP_INTEGER (peer->update_in);
516
case BGPPEEROUTUPDATES:
517
return SNMP_INTEGER (peer->update_out);
519
case BGPPEERINTOTALMESSAGES:
520
return SNMP_INTEGER (peer->open_in + peer->update_in
521
+ peer->keepalive_in + peer->notify_in
522
+ peer->refresh_in + peer->dynamic_cap_in);
524
case BGPPEEROUTTOTALMESSAGES:
525
return SNMP_INTEGER (peer->open_out + peer->update_out
526
+ peer->keepalive_out + peer->notify_out
527
+ peer->refresh_out + peer->dynamic_cap_out);
529
case BGPPEERLASTERROR:
531
static u_char lasterror[2];
532
lasterror[0] = peer->notify.code;
533
lasterror[1] = peer->notify.subcode;
535
return (u_char *)&lasterror;
538
case BGPPEERFSMESTABLISHEDTRANSITIONS:
539
return SNMP_INTEGER (peer->established);
541
case BGPPEERFSMESTABLISHEDTIME:
542
if (peer->uptime == 0)
543
return SNMP_INTEGER (0);
545
return SNMP_INTEGER (time (NULL) - peer->uptime);
547
case BGPPEERCONNECTRETRYINTERVAL:
548
*write_method = write_bgpPeerTable;
549
return SNMP_INTEGER (peer->v_connect);
551
case BGPPEERHOLDTIME:
552
return SNMP_INTEGER (peer->v_holdtime);
554
case BGPPEERKEEPALIVE:
555
return SNMP_INTEGER (peer->v_keepalive);
557
case BGPPEERHOLDTIMECONFIGURED:
558
*write_method = write_bgpPeerTable;
559
if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))
560
return SNMP_INTEGER (peer->holdtime);
562
return SNMP_INTEGER (peer->v_holdtime);
564
case BGPPEERKEEPALIVECONFIGURED:
565
*write_method = write_bgpPeerTable;
566
if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))
567
return SNMP_INTEGER (peer->keepalive);
569
return SNMP_INTEGER (peer->v_keepalive);
571
case BGPPEERMINASORIGINATIONINTERVAL:
572
*write_method = write_bgpPeerTable;
573
return SNMP_INTEGER (peer->v_asorig);
575
case BGPPEERMINROUTEADVERTISEMENTINTERVAL:
576
*write_method = write_bgpPeerTable;
577
return SNMP_INTEGER (peer->v_routeadv);
579
case BGPPEERINUPDATEELAPSEDTIME:
580
if (peer->update_time == 0)
581
return SNMP_INTEGER (0);
583
return SNMP_INTEGER (time (NULL) - peer->update_time);
593
bgpIdentifier (struct variable *v, oid name[], size_t *length,
594
int exact, size_t *var_len, WriteMethod **write_method)
598
if (smux_header_generic(v, name, length, exact, var_len, write_method)
602
bgp = bgp_get_default ();
606
return SNMP_IPADDRESS (bgp->router_id);
610
bgpRcvdPathAttrTable (struct variable *v, oid name[], size_t *length,
611
int exact, size_t *var_len, WriteMethod **write_method)
613
/* Received Path Attribute Table. This table contains, one entry
614
per path to a network, path attributes received from all peers
615
running BGP version 3 or less. This table is obsolete, having
616
been replaced in functionality with the bgp4PathAttrTable. */
621
bgp4PathAttrLookup (struct variable *v, oid name[], size_t *length,
622
struct bgp *bgp, struct prefix_ipv4 *addr, int exact)
626
struct bgp_info *binfo;
627
struct bgp_info *min;
631
struct in_addr paddr;
633
#define BGP_PATHATTR_ENTRY_OFFSET \
634
(IN_ADDR_SIZE + 1 + IN_ADDR_SIZE)
638
if (*length - v->namelen != BGP_PATHATTR_ENTRY_OFFSET)
641
/* Set OID offset for prefix. */
642
offset = name + v->namelen;
643
oid2in_addr (offset, IN_ADDR_SIZE, &addr->prefix);
644
offset += IN_ADDR_SIZE;
647
addr->prefixlen = *offset;
651
su.sin.sin_family = AF_INET;
652
oid2in_addr (offset, IN_ADDR_SIZE, &su.sin.sin_addr);
655
rn = bgp_node_lookup (bgp->rib[AFI_IP][SAFI_UNICAST],
656
(struct prefix *) addr);
659
bgp_unlock_node (rn);
661
for (binfo = rn->info; binfo; binfo = binfo->next)
662
if (sockunion_same (&binfo->peer->su, &su))
668
offset = name + v->namelen;
669
offsetlen = *length - v->namelen;
673
rn = bgp_table_top (bgp->rib[AFI_IP][SAFI_UNICAST]);
676
if (len > IN_ADDR_SIZE)
679
oid2in_addr (offset, len, &addr->prefix);
681
offset += IN_ADDR_SIZE;
682
offsetlen -= IN_ADDR_SIZE;
685
addr->prefixlen = *offset;
687
addr->prefixlen = len * 8;
689
rn = bgp_node_get (bgp->rib[AFI_IP][SAFI_UNICAST],
690
(struct prefix *) addr);
699
if (len > IN_ADDR_SIZE)
702
oid2in_addr (offset, len, &paddr);
714
for (binfo = rn->info; binfo; binfo = binfo->next)
716
if (binfo->peer->su.sin.sin_family == AF_INET
717
&& ntohl (paddr.s_addr)
718
< ntohl (binfo->peer->su.sin.sin_addr.s_addr))
722
if (ntohl (binfo->peer->su.sin.sin_addr.s_addr)
723
< ntohl (min->peer->su.sin.sin_addr.s_addr))
733
*length = v->namelen + BGP_PATHATTR_ENTRY_OFFSET;
735
offset = name + v->namelen;
736
oid_copy_addr (offset, &rn->p.u.prefix4, IN_ADDR_SIZE);
737
offset += IN_ADDR_SIZE;
738
*offset = rn->p.prefixlen;
740
oid_copy_addr (offset, &min->peer->su.sin.sin_addr,
742
addr->prefix = rn->p.u.prefix4;
743
addr->prefixlen = rn->p.prefixlen;
745
bgp_unlock_node (rn);
752
while ((rn = bgp_route_next (rn)) != NULL);
758
bgp4PathAttrTable (struct variable *v, oid name[], size_t *length,
759
int exact, size_t *var_len, WriteMethod **write_method)
762
struct bgp_info *binfo;
763
struct prefix_ipv4 addr;
765
bgp = bgp_get_default ();
769
memset (&addr, 0, sizeof (struct prefix_ipv4));
771
binfo = bgp4PathAttrLookup (v, name, length, bgp, &addr, exact);
777
case BGP4PATHATTRPEER: /* 1 */
778
return SNMP_IPADDRESS (binfo->peer->su.sin.sin_addr);
780
case BGP4PATHATTRIPADDRPREFIXLEN: /* 2 */
781
return SNMP_INTEGER (addr.prefixlen);
783
case BGP4PATHATTRIPADDRPREFIX: /* 3 */
784
return SNMP_IPADDRESS (addr.prefix);
786
case BGP4PATHATTRORIGIN: /* 4 */
787
return SNMP_INTEGER (binfo->attr->origin);
789
case BGP4PATHATTRASPATHSEGMENT: /* 5 */
790
*var_len = binfo->attr->aspath->length;
791
return (u_char *) binfo->attr->aspath->data;
793
case BGP4PATHATTRNEXTHOP: /* 6 */
794
return SNMP_IPADDRESS (binfo->attr->nexthop);
796
case BGP4PATHATTRMULTIEXITDISC: /* 7 */
797
return SNMP_INTEGER (binfo->attr->med);
799
case BGP4PATHATTRLOCALPREF: /* 8 */
800
return SNMP_INTEGER (binfo->attr->local_pref);
802
case BGP4PATHATTRATOMICAGGREGATE: /* 9 */
803
return SNMP_INTEGER (1);
805
case BGP4PATHATTRAGGREGATORAS: /* 10 */
806
return SNMP_INTEGER (binfo->attr->aggregator_as);
808
case BGP4PATHATTRAGGREGATORADDR: /* 11 */
809
return SNMP_IPADDRESS (binfo->attr->aggregator_addr);
811
case BGP4PATHATTRCALCLOCALPREF: /* 12 */
812
return SNMP_INTEGER (-1);
814
case BGP4PATHATTRBEST: /* 13 */
815
#define BGP4_PathAttrBest_false 1
816
#define BGP4_PathAttrBest_true 2
817
if (CHECK_FLAG (binfo->flags, BGP_INFO_SELECTED))
818
return SNMP_INTEGER (BGP4_PathAttrBest_true);
820
return SNMP_INTEGER (BGP4_PathAttrBest_false);
822
case BGP4PATHATTRUNKNOWN: /* 14 */
831
struct trap_object bgpTrapList[] =
833
{bgpPeerTable, 3, {3, 1, BGPPEERLASTERROR}},
834
{bgpPeerTable, 3, {3, 1, BGPPEERSTATE}}
838
bgpTrapEstablished (struct peer *peer)
842
oid index[sizeof (oid) * IN_ADDR_SIZE];
844
ret = inet_aton (peer->host, &addr);
848
oid_copy_addr (index, &addr, IN_ADDR_SIZE);
850
smux_trap (bgp_oid, sizeof bgp_oid / sizeof (oid),
852
bgpTrapList, sizeof bgpTrapList / sizeof (struct trap_object),
853
bm->start_time - time (NULL), BGPESTABLISHED);
857
bgpTrapBackwardTransition (struct peer *peer)
861
oid index[sizeof (oid) * IN_ADDR_SIZE];
863
ret = inet_aton (peer->host, &addr);
867
oid_copy_addr (index, &addr, IN_ADDR_SIZE);
869
smux_trap (bgp_oid, sizeof bgp_oid / sizeof (oid),
871
bgpTrapList, sizeof bgpTrapList / sizeof (struct trap_object),
872
bm->start_time - time (NULL), BGPBACKWARDTRANSITION);
878
struct bgp_master *bm;
880
if ( !(bm = bgp_get_master ()) )
883
smux_init (bm->master, bgpd_oid, sizeof bgpd_oid / sizeof (oid));
884
REGISTER_MIB("mibII/bgp", bgp_variables, variable, bgp_oid);
887
#endif /* HAVE_SNMP */