📄 ospf_snmp.c
字号:
{ struct ospf_vl_data *vl_data; struct ospf_interface *oi; struct in_addr area_id; struct in_addr neighbor; memset (&area_id, 0, sizeof (struct in_addr)); memset (&neighbor, 0, sizeof (struct in_addr)); vl_data = ospfVirtIfLookup (v, name, length, &area_id, &neighbor, exact); if (! vl_data) return NULL; oi = vl_data->vl_oi; if (! oi) return NULL; /* Return the current value of the variable */ switch (v->magic) { case OSPFVIRTIFAREAID: return SNMP_IPADDRESS (area_id); break; case OSPFVIRTIFNEIGHBOR: return SNMP_IPADDRESS (neighbor); break; case OSPFVIRTIFTRANSITDELAY: return SNMP_INTEGER (OSPF_IF_PARAM (oi, transmit_delay)); break; case OSPFVIRTIFRETRANSINTERVAL: return SNMP_INTEGER (OSPF_IF_PARAM (oi, retransmit_interval)); break; case OSPFVIRTIFHELLOINTERVAL: return SNMP_INTEGER (OSPF_IF_PARAM (oi, v_hello)); break; case OSPFVIRTIFRTRDEADINTERVAL: return SNMP_INTEGER (OSPF_IF_PARAM (oi, v_wait)); break; case OSPFVIRTIFSTATE: return SNMP_INTEGER (oi->state); break; case OSPFVIRTIFEVENTS: return SNMP_INTEGER (oi->state_change); break; case OSPFVIRTIFAUTHKEY: *var_len = 0; return (u_char *) OSPF_IF_PARAM (oi, auth_simple); break; case OSPFVIRTIFSTATUS: return SNMP_INTEGER (SNMP_VALID); break; case OSPFVIRTIFAUTHTYPE: if (oi->area) return SNMP_INTEGER (oi->area->auth_type); else return SNMP_INTEGER (0); break; default: return NULL; break; } return NULL;}struct ospf_neighbor *ospf_snmp_nbr_lookup (struct ospf *ospf, struct in_addr *nbr_addr, unsigned int *ifindex){ struct listnode *nn; struct ospf_interface *oi; struct ospf_neighbor *nbr; struct route_node *rn; LIST_LOOP (ospf->oiflist, oi, nn) { for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) if ((nbr = rn->info) != NULL && nbr != oi->nbr_self && nbr->state != NSM_Down && nbr->src.s_addr != 0) { if (IPV4_ADDR_SAME (&nbr->src, nbr_addr)) { route_unlock_node (rn); return nbr; } } } return NULL;}struct ospf_neighbor *ospf_snmp_nbr_lookup_next (struct in_addr *nbr_addr, unsigned int *ifindex, int first){ struct listnode *nn; struct ospf_interface *oi; struct ospf_neighbor *nbr; struct route_node *rn; struct ospf_neighbor *min = NULL; struct ospf *ospf = ospf; ospf = ospf_lookup (); LIST_LOOP (ospf->oiflist, oi, nn) { for (rn = route_top (oi->nbrs); rn; rn = route_next (rn)) if ((nbr = rn->info) != NULL && nbr != oi->nbr_self && nbr->state != NSM_Down && nbr->src.s_addr != 0) { if (first) { if (! min) min = nbr; else if (ntohl (nbr->src.s_addr) < ntohl (min->src.s_addr)) min = nbr; } else if (ntohl (nbr->src.s_addr) > ntohl (nbr_addr->s_addr)) { if (! min) min = nbr; else if (ntohl (nbr->src.s_addr) < ntohl (min->src.s_addr)) min = nbr; } } } if (min) { *nbr_addr = min->src; *ifindex = 0; return min; } return NULL;}struct ospf_neighbor *ospfNbrLookup (struct variable *v, oid *name, size_t *length, struct in_addr *nbr_addr, unsigned int *ifindex, int exact){ int len; int first; struct ospf_neighbor *nbr; struct ospf *ospf; ospf = ospf_lookup (); if (exact) { if (*length != v->namelen + IN_ADDR_SIZE + 1) return NULL; oid2in_addr (name + v->namelen, IN_ADDR_SIZE, nbr_addr); *ifindex = name[v->namelen + IN_ADDR_SIZE]; return ospf_snmp_nbr_lookup (ospf, nbr_addr, ifindex); } 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, nbr_addr); len = *length - v->namelen - IN_ADDR_SIZE; if (len >= 1) *ifindex = name[v->namelen + IN_ADDR_SIZE]; nbr = ospf_snmp_nbr_lookup_next (nbr_addr, ifindex, first); if (nbr) { *length = v->namelen + IN_ADDR_SIZE + 1; oid_copy_addr (name + v->namelen, nbr_addr, IN_ADDR_SIZE); name[v->namelen + IN_ADDR_SIZE] = *ifindex; return nbr; } } return NULL;}static u_char *ospfNbrEntry (struct variable *v, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ struct in_addr nbr_addr; unsigned int ifindex; struct ospf_neighbor *nbr; struct ospf_interface *oi; memset (&nbr_addr, 0, sizeof (struct in_addr)); ifindex = 0; nbr = ospfNbrLookup (v, name, length, &nbr_addr, &ifindex, exact); if (! nbr) return NULL; oi = nbr->oi; if (! oi) return NULL; /* Return the current value of the variable */ switch (v->magic) { case OSPFNBRIPADDR: return SNMP_IPADDRESS (nbr_addr); break; case OSPFNBRADDRESSLESSINDEX: return SNMP_INTEGER (ifindex); break; case OSPFNBRRTRID: return SNMP_IPADDRESS (nbr->router_id); break; case OSPFNBROPTIONS: return SNMP_INTEGER (oi->nbr_self->options); break; case OSPFNBRPRIORITY: return SNMP_INTEGER (nbr->priority); break; case OSPFNBRSTATE: return SNMP_INTEGER (nbr->state); break; case OSPFNBREVENTS: return SNMP_INTEGER (nbr->state_change); break; case OSPFNBRLSRETRANSQLEN: return SNMP_INTEGER (ospf_ls_retransmit_count (nbr)); break; case OSPFNBMANBRSTATUS: return SNMP_INTEGER (SNMP_VALID); break; case OSPFNBMANBRPERMANENCE: return SNMP_INTEGER (2); break; case OSPFNBRHELLOSUPPRESSED: return SNMP_INTEGER (SNMP_FALSE); break; default: return NULL; break; } return NULL;}static u_char *ospfVirtNbrEntry (struct variable *v, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ struct ospf_vl_data *vl_data; struct in_addr area_id; struct in_addr neighbor; struct ospf *ospf; memset (&area_id, 0, sizeof (struct in_addr)); memset (&neighbor, 0, sizeof (struct in_addr)); /* Check OSPF instance. */ ospf = ospf_lookup (); if (ospf == NULL) return NULL; vl_data = ospfVirtIfLookup (v, name, length, &area_id, &neighbor, exact); if (! vl_data) return NULL; /* Return the current value of the variable */ switch (v->magic) { case OSPFVIRTNBRAREA: return (u_char *) NULL; break; case OSPFVIRTNBRRTRID: return (u_char *) NULL; break; case OSPFVIRTNBRIPADDR: return (u_char *) NULL; break; case OSPFVIRTNBROPTIONS: return (u_char *) NULL; break; case OSPFVIRTNBRSTATE: return (u_char *) NULL; break; case OSPFVIRTNBREVENTS: return (u_char *) NULL; break; case OSPFVIRTNBRLSRETRANSQLEN: return (u_char *) NULL; break; case OSPFVIRTNBRHELLOSUPPRESSED: return (u_char *) NULL; break; default: return NULL; break; } return NULL;}struct ospf_lsa *ospfExtLsdbLookup (struct variable *v, oid *name, size_t *length, u_char *type, struct in_addr *ls_id, struct in_addr *router_id, int exact){ int first; oid *offset; int offsetlen; u_char lsa_type; int len; struct ospf_lsa *lsa; struct ospf *ospf; ospf = ospf_lookup (); if (exact) { if (*length != v->namelen + 1 + IN_ADDR_SIZE + IN_ADDR_SIZE) return NULL; offset = name + v->namelen; /* Make it sure given value match to type. */ lsa_type = *offset; offset++; if (lsa_type != *type) return NULL; /* LS ID. */ oid2in_addr (offset, IN_ADDR_SIZE, ls_id); offset += IN_ADDR_SIZE; /* Router ID. */ oid2in_addr (offset, IN_ADDR_SIZE, router_id); return ospf_lsdb_lookup_by_id (ospf->lsdb, *type, *ls_id, *router_id); } else { /* Get variable length. */ first = 0; offset = name + v->namelen; offsetlen = *length - v->namelen; /* LSA type value. */ lsa_type = *offset; offset++; offsetlen--; if (offsetlen <= 0 || lsa_type < OSPF_AS_EXTERNAL_LSA) first = 1; /* LS ID. */ len = offsetlen; if (len > IN_ADDR_SIZE) len = IN_ADDR_SIZE; oid2in_addr (offset, len, ls_id); offset += IN_ADDR_SIZE; offsetlen -= IN_ADDR_SIZE; /* Router ID. */ len = offsetlen; if (len > IN_ADDR_SIZE) len = IN_ADDR_SIZE; oid2in_addr (offset, len, router_id); lsa = ospf_lsdb_lookup_by_id_next (ospf->lsdb, *type, *ls_id, *router_id, first); if (lsa) { /* Fill in length. */ *length = v->namelen + 1 + IN_ADDR_SIZE + IN_ADDR_SIZE; /* Fill in value. */ offset = name + v->namelen; *offset = OSPF_AS_EXTERNAL_LSA; offset++; oid_copy_addr (offset, &lsa->data->id, IN_ADDR_SIZE); offset += IN_ADDR_SIZE; oid_copy_addr (offset, &lsa->data->adv_router, IN_ADDR_SIZE); return lsa; } } return NULL;}static u_char *ospfExtLsdbEntry (struct variable *v, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ struct ospf_lsa *lsa; struct lsa_header *lsah; u_char type; struct in_addr ls_id; struct in_addr router_id; struct ospf *ospf; type = OSPF_AS_EXTERNAL_LSA; memset (&ls_id, 0, sizeof (struct in_addr)); memset (&router_id, 0, sizeof (struct in_addr)); /* Check OSPF instance. */ ospf = ospf_lookup (); if (ospf == NULL) return NULL; lsa = ospfExtLsdbLookup (v, name, length, &type, &ls_id, &router_id, exact); if (! lsa) return NULL; lsah = lsa->data; /* Return the current value of the variable */ switch (v->magic) { case OSPFEXTLSDBTYPE: return SNMP_INTEGER (OSPF_AS_EXTERNAL_LSA); break; case OSPFEXTLSDBLSID: return SNMP_IPADDRESS (lsah->id); break; case OSPFEXTLSDBROUTERID: return SNMP_IPADDRESS (lsah->adv_router); break; case OSPFEXTLSDBSEQUENCE: return SNMP_INTEGER (lsah->ls_seqnum); break; case OSPFEXTLSDBAGE: return SNMP_INTEGER (lsah->ls_age); break; case OSPFEXTLSDBCHECKSUM: return SNMP_INTEGER (lsah->checksum); break; case OSPFEXTLSDBADVERTISEMENT: *var_len = ntohs (lsah->length); return (u_char *) lsah; break; default: return NULL; break; } return NULL;}static u_char *ospfAreaAggregateEntry (struct variable *v, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ /* Return the current value of the variable */ switch (v->magic) { case OSPFAREAAGGREGATEAREAID: return (u_char *) NULL; break; case OSPFAREAAGGREGATELSDBTYPE: return (u_char *) NULL; break; case OSPFAREAAGGREGATENET: return (u_char *) NULL; break; case OSPFAREAAGGREGATEMASK: return (u_char *) NULL; break; case OSPFAREAAGGREGATESTATUS: return (u_char *) NULL; break; case OSPFAREAAGGREGATEEFFECT: return (u_char *) NULL; break; default: return NULL; break; } return NULL;}/* Register OSPF2-MIB. */voidospf_snmp_init (){ ospf_snmp_iflist = list_new (); ospf_snmp_vl_table = route_table_init (); smux_init (ospfd_oid, sizeof (ospfd_oid) / sizeof (oid)); REGISTER_MIB("mibII/ospf", ospf_variables, variable, ospf_oid); smux_start ();}#endif /* HAVE_SNMP */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -