📄 ospf_snmp.c
字号:
if (IPV4_ADDR_SAME (&osif->addr, ifaddr)) return osif->ifp; } else { if (osif->ifindex == *ifindex) return osif->ifp; } } return NULL;}struct interface *ospf_snmp_if_lookup_next (struct in_addr *ifaddr, unsigned int *ifindex, int ifaddr_next, int ifindex_next){ struct ospf_snmp_if *osif; struct listnode *nn; if (ifaddr_next) { nn = listhead (ospf_snmp_iflist); if (nn) { osif = getdata (nn); *ifaddr = osif->addr; *ifindex = osif->ifindex; return osif->ifp; } return NULL; } LIST_LOOP (ospf_snmp_iflist, osif, nn) { if (ifaddr->s_addr) { if (ntohl (osif->addr.s_addr) > ntohl (ifaddr->s_addr)) { *ifaddr = osif->addr; *ifindex = osif->ifindex; return osif->ifp; } } else { if (osif->ifindex > *ifindex || osif->addr.s_addr) { *ifaddr = osif->addr; *ifindex = osif->ifindex; return osif->ifp; } } } return NULL;}intospf_snmp_iftype (struct interface *ifp){#define ospf_snmp_iftype_broadcast 1#define ospf_snmp_iftype_nbma 2#define ospf_snmp_iftype_pointToPoint 3#define ospf_snmp_iftype_pointToMultipoint 5 if (if_is_broadcast (ifp)) return ospf_snmp_iftype_broadcast; if (if_is_pointopoint (ifp)) return ospf_snmp_iftype_pointToPoint; return ospf_snmp_iftype_broadcast;}struct interface *ospfIfLookup (struct variable *v, oid *name, size_t *length, struct in_addr *ifaddr, unsigned int *ifindex, int exact){ int len; int ifaddr_next = 0; int ifindex_next = 0; struct interface *ifp; oid *offset; if (exact) { if (*length != v->namelen + IN_ADDR_SIZE + 1) return NULL; oid2in_addr (name + v->namelen, IN_ADDR_SIZE, ifaddr); *ifindex = name[v->namelen + IN_ADDR_SIZE]; return ospf_snmp_if_lookup (ifaddr, ifindex); } else { len = *length - v->namelen; if (len >= IN_ADDR_SIZE) len = IN_ADDR_SIZE; if (len <= 0) ifaddr_next = 1; oid2in_addr (name + v->namelen, len, ifaddr); len = *length - v->namelen - IN_ADDR_SIZE; if (len >= 1) len = 1; else ifindex_next = 1; if (len == 1) *ifindex = name[v->namelen + IN_ADDR_SIZE]; ifp = ospf_snmp_if_lookup_next (ifaddr, ifindex, ifaddr_next, ifindex_next); if (ifp) { *length = v->namelen + IN_ADDR_SIZE + 1; offset = name + v->namelen; oid_copy_addr (offset, ifaddr, IN_ADDR_SIZE); offset += IN_ADDR_SIZE; *offset = *ifindex; return ifp; } } return NULL;}static u_char *ospfIfEntry (struct variable *v, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ struct interface *ifp; unsigned int ifindex; struct in_addr ifaddr; struct ospf_interface *oi; struct ospf *ospf; ifindex = 0; memset (&ifaddr, 0, sizeof (struct in_addr)); /* Check OSPF instance. */ ospf = ospf_lookup (); if (ospf == NULL) return NULL; ifp = ospfIfLookup (v, name, length, &ifaddr, &ifindex, exact); if (ifp == NULL) return NULL; oi = ospf_if_lookup_by_local_addr (ospf, ifp, ifaddr); if (oi == NULL) return NULL; /* Return the current value of the variable */ switch (v->magic) { case OSPFIFIPADDRESS: /* 1 */ return SNMP_IPADDRESS (ifaddr); break; case OSPFADDRESSLESSIF: /* 2 */ return SNMP_INTEGER (ifindex); break; case OSPFIFAREAID: /* 3 */ if (oi->area) return SNMP_IPADDRESS (oi->area->area_id); else return SNMP_IPADDRESS (ospf_empty_addr); break; case OSPFIFTYPE: /* 4 */ return SNMP_INTEGER (ospf_snmp_iftype (ifp)); break; case OSPFIFADMINSTAT: /* 5 */ if (oi) return SNMP_INTEGER (OSPF_STATUS_ENABLED); else return SNMP_INTEGER (OSPF_STATUS_DISABLED); break; case OSPFIFRTRPRIORITY: /* 6 */ return SNMP_INTEGER (PRIORITY (oi)); break; case OSPFIFTRANSITDELAY: /* 7 */ return SNMP_INTEGER (OSPF_IF_PARAM (oi, transmit_delay)); break; case OSPFIFRETRANSINTERVAL: /* 8 */ return SNMP_INTEGER (OSPF_IF_PARAM (oi, retransmit_interval)); break; case OSPFIFHELLOINTERVAL: /* 9 */ return SNMP_INTEGER (OSPF_IF_PARAM (oi, v_hello)); break; case OSPFIFRTRDEADINTERVAL: /* 10 */ return SNMP_INTEGER (OSPF_IF_PARAM (oi, v_wait)); break; case OSPFIFPOLLINTERVAL: /* 11 */ return SNMP_INTEGER (OSPF_POLL_INTERVAL_DEFAULT); break; case OSPFIFSTATE: /* 12 */ return SNMP_INTEGER (oi->state); break; case OSPFIFDESIGNATEDROUTER: /* 13 */ return SNMP_IPADDRESS (DR (oi)); break; case OSPFIFBACKUPDESIGNATEDROUTER: /* 14 */ return SNMP_IPADDRESS (BDR (oi)); break; case OSPFIFEVENTS: /* 15 */ return SNMP_INTEGER (oi->state_change); break; case OSPFIFAUTHKEY: /* 16 */ *var_len = 0; return (u_char *) OSPF_IF_PARAM (oi, auth_simple); break; case OSPFIFSTATUS: /* 17 */ return SNMP_INTEGER (SNMP_VALID); break; case OSPFIFMULTICASTFORWARDING: /* 18 */#define ospf_snmp_multiforward_blocked 1#define ospf_snmp_multiforward_multicast 2#define ospf_snmp_multiforward_unicast 3 return SNMP_INTEGER (ospf_snmp_multiforward_blocked); break; case OSPFIFDEMAND: /* 19 */ return SNMP_INTEGER (SNMP_FALSE); break; case OSPFIFAUTHTYPE: /* 20 */ if (oi->area) return SNMP_INTEGER (oi->area->auth_type); else return SNMP_INTEGER (0); break; default: return NULL; break; } return NULL;}#define OSPF_SNMP_METRIC_VALUE 1struct interface *ospfIfMetricLookup (struct variable *v, oid *name, size_t *length, struct in_addr *ifaddr, unsigned int *ifindex, int exact){ int len; int ifaddr_next = 0; int ifindex_next = 0; struct interface *ifp; oid *offset; int metric; if (exact) { if (*length != v->namelen + IN_ADDR_SIZE + 1 + 1) return NULL; oid2in_addr (name + v->namelen, IN_ADDR_SIZE, ifaddr); *ifindex = name[v->namelen + IN_ADDR_SIZE]; metric = name[v->namelen + IN_ADDR_SIZE + 1]; if (metric != OSPF_SNMP_METRIC_VALUE) return NULL; return ospf_snmp_if_lookup (ifaddr, ifindex); } else { len = *length - v->namelen; if (len >= IN_ADDR_SIZE) len = IN_ADDR_SIZE; else ifaddr_next = 1; oid2in_addr (name + v->namelen, len, ifaddr); len = *length - v->namelen - IN_ADDR_SIZE; if (len >= 1) len = 1; else ifindex_next = 1; if (len == 1) *ifindex = name[v->namelen + IN_ADDR_SIZE]; ifp = ospf_snmp_if_lookup_next (ifaddr, ifindex, ifaddr_next, ifindex_next); if (ifp) { *length = v->namelen + IN_ADDR_SIZE + 1 + 1; offset = name + v->namelen; oid_copy_addr (offset, ifaddr, IN_ADDR_SIZE); offset += IN_ADDR_SIZE; *offset = *ifindex; offset++; *offset = OSPF_SNMP_METRIC_VALUE; return ifp; } } return NULL;}static u_char *ospfIfMetricEntry (struct variable *v, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ /* Currently we support metric 1 only. */ struct interface *ifp; unsigned int ifindex; struct in_addr ifaddr; struct ospf_interface *oi; struct ospf *ospf; ifindex = 0; memset (&ifaddr, 0, sizeof (struct in_addr)); /* Check OSPF instance. */ ospf = ospf_lookup (); if (ospf == NULL) return NULL; ifp = ospfIfMetricLookup (v, name, length, &ifaddr, &ifindex, exact); if (ifp == NULL) return NULL; oi = ospf_if_lookup_by_local_addr (ospf, ifp, ifaddr); if (oi == NULL) return NULL; /* Return the current value of the variable */ switch (v->magic) { case OSPFIFMETRICIPADDRESS: return SNMP_IPADDRESS (ifaddr); break; case OSPFIFMETRICADDRESSLESSIF: return SNMP_INTEGER (ifindex); break; case OSPFIFMETRICTOS: return SNMP_INTEGER (0); break; case OSPFIFMETRICVALUE: return SNMP_INTEGER (OSPF_SNMP_METRIC_VALUE); break; case OSPFIFMETRICSTATUS: return SNMP_INTEGER (1); break; default: return NULL; break; } return NULL;}struct route_table *ospf_snmp_vl_table;voidospf_snmp_vl_add (struct ospf_vl_data *vl_data){ struct prefix_ls lp; struct route_node *rn; memset (&lp, 0, sizeof (struct prefix_ls)); lp.family = 0; lp.prefixlen = 64; lp.id = vl_data->vl_area_id; lp.adv_router = vl_data->vl_peer; rn = route_node_get (ospf_snmp_vl_table, (struct prefix *) &lp); rn->info = vl_data;}voidospf_snmp_vl_delete (struct ospf_vl_data *vl_data){ struct prefix_ls lp; struct route_node *rn; memset (&lp, 0, sizeof (struct prefix_ls)); lp.family = 0; lp.prefixlen = 64; lp.id = vl_data->vl_area_id; lp.adv_router = vl_data->vl_peer; rn = route_node_lookup (ospf_snmp_vl_table, (struct prefix *) &lp); if (! rn) return; rn->info = NULL; route_unlock_node (rn); route_unlock_node (rn);}struct ospf_vl_data *ospf_snmp_vl_lookup (struct in_addr *area_id, struct in_addr *neighbor){ struct prefix_ls lp; struct route_node *rn; struct ospf_vl_data *vl_data; memset (&lp, 0, sizeof (struct prefix_ls)); lp.family = 0; lp.prefixlen = 64; lp.id = *area_id; lp.adv_router = *neighbor; rn = route_node_lookup (ospf_snmp_vl_table, (struct prefix *) &lp); if (rn) { vl_data = rn->info; route_unlock_node (rn); return vl_data; } return NULL;}struct ospf_vl_data *ospf_snmp_vl_lookup_next (struct in_addr *area_id, struct in_addr *neighbor, int first){ struct prefix_ls lp; struct route_node *rn; struct ospf_vl_data *vl_data; memset (&lp, 0, sizeof (struct prefix_ls)); lp.family = 0; lp.prefixlen = 64; lp.id = *area_id; lp.adv_router = *neighbor; if (first) rn = route_top (ospf_snmp_vl_table); else { rn = route_node_get (ospf_snmp_vl_table, (struct prefix *) &lp); rn = route_next (rn); } for (; rn; rn = route_next (rn)) if (rn->info) break; if (rn && rn->info) { vl_data = rn->info; *area_id = vl_data->vl_area_id; *neighbor = vl_data->vl_peer; route_unlock_node (rn); return vl_data; } return NULL;}struct ospf_vl_data *ospfVirtIfLookup (struct variable *v, oid *name, size_t *length, struct in_addr *area_id, struct in_addr *neighbor, int exact){ int first; int len; struct ospf_vl_data *vl_data; if (exact) { if (*length != v->namelen + IN_ADDR_SIZE + IN_ADDR_SIZE) return NULL; oid2in_addr (name + v->namelen, IN_ADDR_SIZE, area_id); oid2in_addr (name + v->namelen + IN_ADDR_SIZE, IN_ADDR_SIZE, neighbor); return ospf_snmp_vl_lookup (area_id, neighbor); } else { first = 0; len = *length - v->namelen; if (len <= 0) first = 1; if (len > IN_ADDR_SIZE) len = IN_ADDR_SIZE; oid2in_addr (name + v->namelen, len, area_id); len = *length - v->namelen - IN_ADDR_SIZE; if (len > IN_ADDR_SIZE) len = IN_ADDR_SIZE; oid2in_addr (name + v->namelen + IN_ADDR_SIZE, len, neighbor); vl_data = ospf_snmp_vl_lookup_next (area_id, neighbor, first); if (vl_data) { *length = v->namelen + IN_ADDR_SIZE + IN_ADDR_SIZE; oid_copy_addr (name + v->namelen, area_id, IN_ADDR_SIZE); oid_copy_addr (name + v->namelen + IN_ADDR_SIZE, neighbor, IN_ADDR_SIZE); return vl_data; } } return NULL;}static u_char *ospfVirtIfEntry (struct variable *v, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -