|
32 | 32 | SNMP_LOCAL_VARIABLES
|
33 | 33 |
|
34 | 34 | static oid bgpv2_oid[] = {BGP4V2MIB};
|
| 35 | +static oid bgpv2_trap_oid[] = { BGP4V2MIB, 0 }; |
35 | 36 | static struct in_addr bgp_empty_addr = {};
|
36 | 37 |
|
37 | 38 | static struct peer *peer_lookup_all_vrf(struct ipaddr *addr)
|
@@ -793,6 +794,38 @@ static uint8_t *bgp4v2PathAttrTable(struct variable *v, oid name[],
|
793 | 794 | return NULL;
|
794 | 795 | }
|
795 | 796 |
|
| 797 | +/* BGP V2 Traps. */ |
| 798 | +static struct trap_object bgpv2TrapEstListv4[] = { |
| 799 | + { 6, { 1, 2, 1, BGP4V2_PEER_STATE, 1, 1 } }, |
| 800 | + { 6, { 1, 2, 1, BGP4V2_PEER_LOCAL_PORT, 1, 1 } }, |
| 801 | + { 6, { 1, 2, 1, BGP4V2_PEER_REMOTE_PORT, 1, 1 } } |
| 802 | +}; |
| 803 | + |
| 804 | +static struct trap_object bgpv2TrapEstListv6[] = { |
| 805 | + { 6, { 1, 2, 1, BGP4V2_PEER_STATE, 1, 2 } }, |
| 806 | + { 6, { 1, 2, 1, BGP4V2_PEER_LOCAL_PORT, 1, 2 } }, |
| 807 | + { 6, { 1, 2, 1, BGP4V2_PEER_REMOTE_PORT, 1, 2 } } |
| 808 | +}; |
| 809 | + |
| 810 | +static struct trap_object bgpv2TrapBackListv4[] = { |
| 811 | + { 6, { 1, 2, 1, BGP4V2_PEER_STATE, 1, 1 } }, |
| 812 | + { 6, { 1, 2, 1, BGP4V2_PEER_LOCAL_PORT, 1, 1 } }, |
| 813 | + { 6, { 1, 2, 1, BGP4V2_PEER_REMOTE_PORT, 1, 1 } }, |
| 814 | + { 6, { 1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED, 1, 1 } }, |
| 815 | + { 6, { 1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED, 1, 1 } }, |
| 816 | + { 6, { 1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT, 1, 1 } } |
| 817 | +}; |
| 818 | + |
| 819 | +static struct trap_object bgpv2TrapBackListv6[] = { |
| 820 | + { 6, { 1, 2, 1, BGP4V2_PEER_STATE, 1, 2 } }, |
| 821 | + { 6, { 1, 2, 1, BGP4V2_PEER_LOCAL_PORT, 1, 2 } }, |
| 822 | + { 6, { 1, 2, 1, BGP4V2_PEER_REMOTE_PORT, 1, 2 } }, |
| 823 | + { 6, { 1, 3, 1, BGP4V2_PEER_LAST_ERROR_CODE_RECEIVED, 1, 2 } }, |
| 824 | + { 6, { 1, 3, 1, BGP4V2_PEER_LAST_ERROR_SUBCODE_RECEIVED, 1, 2 } }, |
| 825 | + { 6, { 1, 3, 1, BGP4V2_PEER_LAST_ERROR_RECEIVED_TEXT, 1, 2 } } |
| 826 | +}; |
| 827 | + |
| 828 | + |
796 | 829 | static struct variable bgpv2_variables[] = {
|
797 | 830 | /* bgp4V2PeerEntry */
|
798 | 831 | {BGP4V2_PEER_INSTANCE,
|
@@ -1412,6 +1445,76 @@ static struct variable bgpv2_variables[] = {
|
1412 | 1445 | {1, 9, 1, BGP4V2_NLRI_PATH_ATTR_UNKNOWN, 1, 2}},
|
1413 | 1446 | };
|
1414 | 1447 |
|
| 1448 | +int bgpv2TrapEstablished(struct peer *peer) |
| 1449 | +{ |
| 1450 | + oid index[sizeof(oid) * IN6_ADDR_SIZE]; |
| 1451 | + size_t length; |
| 1452 | + |
| 1453 | + /* Check if this peer just went to Established */ |
| 1454 | + if ((peer->connection->ostatus != OpenConfirm) || |
| 1455 | + !(peer_established(peer->connection))) |
| 1456 | + return 0; |
| 1457 | + |
| 1458 | + switch (sockunion_family(&peer->connection->su)) { |
| 1459 | + case AF_INET: |
| 1460 | + oid_copy_in_addr(index, &peer->connection->su.sin.sin_addr); |
| 1461 | + length = IN_ADDR_SIZE; |
| 1462 | + smux_trap(bgpv2_variables, array_size(bgpv2_variables), |
| 1463 | + bgpv2_trap_oid, array_size(bgpv2_trap_oid), bgpv2_oid, |
| 1464 | + sizeof(bgpv2_oid) / sizeof(oid), index, length, |
| 1465 | + bgpv2TrapEstListv4, array_size(bgpv2TrapEstListv4), |
| 1466 | + BGP4V2ESTABLISHED); |
| 1467 | + break; |
| 1468 | + case AF_INET6: |
| 1469 | + oid_copy_in6_addr(index, &peer->connection->su.sin6.sin6_addr); |
| 1470 | + length = IN6_ADDR_SIZE; |
| 1471 | + smux_trap(bgpv2_variables, array_size(bgpv2_variables), |
| 1472 | + bgpv2_trap_oid, array_size(bgpv2_trap_oid), bgpv2_oid, |
| 1473 | + sizeof(bgpv2_oid) / sizeof(oid), index, length, |
| 1474 | + bgpv2TrapEstListv6, array_size(bgpv2TrapEstListv6), |
| 1475 | + BGP4V2ESTABLISHED); |
| 1476 | + break; |
| 1477 | + default: |
| 1478 | + return 0; |
| 1479 | + ; |
| 1480 | + } |
| 1481 | + |
| 1482 | + return 0; |
| 1483 | +} |
| 1484 | + |
| 1485 | +int bgpv2TrapBackwardTransition(struct peer *peer) |
| 1486 | +{ |
| 1487 | + oid index[sizeof(oid) * IN6_ADDR_SIZE]; |
| 1488 | + size_t length; |
| 1489 | + |
| 1490 | + switch (sockunion_family(&peer->connection->su)) { |
| 1491 | + case AF_INET: |
| 1492 | + oid_copy_in_addr(index, &peer->connection->su.sin.sin_addr); |
| 1493 | + length = IN_ADDR_SIZE; |
| 1494 | + smux_trap(bgpv2_variables, array_size(bgpv2_variables), |
| 1495 | + bgpv2_trap_oid, array_size(bgpv2_trap_oid), bgpv2_oid, |
| 1496 | + sizeof(bgpv2_oid) / sizeof(oid), index, length, |
| 1497 | + bgpv2TrapBackListv4, array_size(bgpv2TrapBackListv4), |
| 1498 | + BGP4V2BACKWARDTRANSITION); |
| 1499 | + break; |
| 1500 | + case AF_INET6: |
| 1501 | + oid_copy_in6_addr(index, &peer->connection->su.sin6.sin6_addr); |
| 1502 | + length = IN6_ADDR_SIZE; |
| 1503 | + smux_trap(bgpv2_variables, array_size(bgpv2_variables), |
| 1504 | + bgpv2_trap_oid, array_size(bgpv2_trap_oid), bgpv2_oid, |
| 1505 | + sizeof(bgpv2_oid) / sizeof(oid), index, length, |
| 1506 | + bgpv2TrapBackListv6, array_size(bgpv2TrapBackListv6), |
| 1507 | + BGP4V2BACKWARDTRANSITION); |
| 1508 | + break; |
| 1509 | + default: |
| 1510 | + return 0; |
| 1511 | + ; |
| 1512 | + } |
| 1513 | + |
| 1514 | + return 0; |
| 1515 | +} |
| 1516 | + |
| 1517 | + |
1415 | 1518 | int bgp_snmp_bgp4v2_init(struct event_loop *tm)
|
1416 | 1519 | {
|
1417 | 1520 | REGISTER_MIB("mibII/bgpv2", bgpv2_variables, variable, bgpv2_oid);
|
|
0 commit comments