📄 var_route.c
字号:
#if 0 /* * Only reload if this is the start of a wildcard */ if (*length < 14) { Route_Scan_Reload(); }#else Route_Scan_Reload();#endif for(RtIndex=0; RtIndex < rtsize; RtIndex++) {#if NEED_KLGETSA sa = klgetsa((struct sockaddr_in *) rthead[RtIndex]->rt_dst); cp = (u_char *) &(sa->sin_addr.s_addr);#else cp = (u_char *)&(((struct sockaddr_in *) &(rthead[RtIndex]->rt_dst))->sin_addr.s_addr);#endif op = Current + 10; *op++ = *cp++; *op++ = *cp++; *op++ = *cp++; *op++ = *cp++; result = snmp_oid_compare(name, *length, Current, 14); if ((exact && (result == 0)) || (!exact && (result < 0))) break; } if (RtIndex >= rtsize) return(NULL); /* * Save in the 'cache' */ memcpy( (char *) saveName,(char *) name, *length * sizeof(oid)); saveName[9] = 0; saveNameLen = *length; saveExact = exact; saveRtIndex = RtIndex; /* * Return the name */ memcpy( (char *) name,(char *) Current, 14 * sizeof(oid)); *length = 14; } *write_method = write_rte; *var_len = sizeof(long_return); switch(vp->magic){ case IPROUTEDEST:#if NEED_KLGETSA sa = klgetsa((struct sockaddr_in *) rthead[RtIndex]->rt_dst); return(u_char *) &(sa->sin_addr.s_addr);#else return(u_char *) &((struct sockaddr_in *) &rthead[RtIndex]->rt_dst)->sin_addr.s_addr;#endif case IPROUTEIFINDEX: long_return = (u_long)rthead[RtIndex]->rt_unit; return (u_char *)&long_return; case IPROUTEMETRIC1: long_return = (rthead[RtIndex]->rt_flags & RTF_GATEWAY) ? 1 : 0; return (u_char *)&long_return; case IPROUTEMETRIC2:#if NO_DUMMY_VALUES return NULL;#endif long_return = -1; return (u_char *)&long_return; case IPROUTEMETRIC3:#if NO_DUMMY_VALUES return NULL;#endif long_return = -1; return (u_char *)&long_return; case IPROUTEMETRIC4:#if NO_DUMMY_VALUES return NULL;#endif long_return = -1; return (u_char *)&long_return; case IPROUTEMETRIC5:#if NO_DUMMY_VALUES return NULL;#endif long_return = -1; return (u_char *)&long_return; case IPROUTENEXTHOP:#if NEED_KLGETSA sa = klgetsa((struct sockaddr_in *) rthead[RtIndex]->rt_gateway); return(u_char *) &(sa->sin_addr.s_addr);#else return(u_char *) &((struct sockaddr_in *) &rthead[RtIndex]->rt_gateway)->sin_addr.s_addr;#endif /* *bsd */ case IPROUTETYPE: long_return = (rthead[RtIndex]->rt_flags & RTF_GATEWAY) ? 4 : 3; return (u_char *)&long_return; case IPROUTEPROTO: long_return = (rthead[RtIndex]->rt_flags & RTF_DYNAMIC) ? 4 : 2; return (u_char *)&long_return; case IPROUTEAGE:#if NO_DUMMY_VALUES return NULL;#endif long_return = 0; return (u_char *)&long_return; case IPROUTEMASK:#if NEED_KLGETSA /* XXX - Almost certainly not right but I don't have a suitable system to test this on */#if NO_DUMMY_VALUES return NULL;#endif long_return = 0;#else /* NEED_KLGETSA */ if ( ((struct sockaddr_in *) &rthead[RtIndex]->rt_dst)->sin_addr.s_addr == 0 ) long_return = 0; /* Default route */ else {#ifndef linux klookup((unsigned long) rthead[RtIndex]->rt_ifp, (char *) &rt_ifnet, sizeof(rt_ifnet)); klookup((unsigned long) rt_ifnet.if_addrlist, (char *) &rt_ifnetaddr, sizeof(rt_ifnetaddr)); long_return = rt_ifnetaddr.ia_subnetmask;#else /* linux */ cp = (u_char *)&(((struct sockaddr_in *) &(rthead[RtIndex]->rt_dst))->sin_addr.s_addr); return (u_char *) &(((struct sockaddr_in *) &(rthead[RtIndex]->rt_genmask))->sin_addr.s_addr);#endif /* linux */ }#endif /* NEED_KLGETSA */ return (u_char *)&long_return; case IPROUTEINFO: *var_len = nullOidLen; return (u_char *)nullOid; default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ipRouteEntry\n", vp->magic)); } return NULL;}#else /* solaris2 */static intIP_Cmp_Route(void *addr, void *ep){ mib2_ipRouteEntry_t *Ep = ep, *Addr = addr; if ( (Ep->ipRouteDest == Addr->ipRouteDest) && (Ep->ipRouteNextHop == Addr->ipRouteNextHop) && (Ep->ipRouteType == Addr->ipRouteType) && (Ep->ipRouteProto == Addr->ipRouteProto) && (Ep->ipRouteMask == Addr->ipRouteMask) && (Ep->ipRouteInfo.re_max_frag == Addr->ipRouteInfo.re_max_frag) && (Ep->ipRouteInfo.re_rtt == Addr->ipRouteInfo.re_rtt) && (Ep->ipRouteInfo.re_ref == Addr->ipRouteInfo.re_ref) && (Ep->ipRouteInfo.re_frag_flag == Addr->ipRouteInfo.re_frag_flag) && (Ep->ipRouteInfo.re_src_addr == Addr->ipRouteInfo.re_src_addr) && (Ep->ipRouteInfo.re_ire_type == Addr->ipRouteInfo.re_ire_type) && (Ep->ipRouteInfo.re_obpkt == Addr->ipRouteInfo.re_obpkt) && (Ep->ipRouteInfo.re_ibpkt == Addr->ipRouteInfo.re_ibpkt) ) return (0); else return (1); /* Not found */}u_char *var_ipRouteEntry(struct variable *vp, oid *name, size_t *length, int exact, size_t *var_len, WriteMethod **write_method){ /* * object identifier is of form: * 1.3.6.1.2.1.4.21.1.1.A.B.C.D, where A.B.C.D is IP address. * IPADDR starts at offset 10. */#define IP_ROUTENAME_LENGTH 14#define IP_ROUTEADDR_OFF 10 oid current[IP_ROUTENAME_LENGTH], lowest[IP_ROUTENAME_LENGTH]; u_char *cp; oid *op; mib2_ipRouteEntry_t Lowentry, Nextentry, entry; int Found = 0; req_e req_type; /* fill in object part of name for current (less sizeof instance part) */ memcpy( (char *)current,(char *)vp->name, vp->namelen * sizeof(oid)); if (*length == IP_ROUTENAME_LENGTH) /* Assume that the input name is the lowest */ memcpy( (char *)lowest,(char *)name, IP_ROUTENAME_LENGTH * sizeof(oid)); else name[IP_ROUTEADDR_OFF] = (oid)-1; /* Grhhh: to prevent accidental comparison :-( */ for (Nextentry.ipRouteDest = (u_long)-2, req_type = GET_FIRST; ; Nextentry = entry, req_type = GET_NEXT) { if (getMibstat(MIB_IP_ROUTE, &entry, sizeof(mib2_ipRouteEntry_t), req_type, &IP_Cmp_Route, &Nextentry) != 0) break; COPY_IPADDR(cp, (u_char *)&entry.ipRouteDest, op, current + IP_ROUTEADDR_OFF); if (exact){ if (snmp_oid_compare(current, IP_ROUTENAME_LENGTH, name, *length) == 0){ memcpy( (char *)lowest,(char *)current, IP_ROUTENAME_LENGTH * sizeof(oid)); Lowentry = entry; Found++; break; /* no need to search further */ } } else { if ((snmp_oid_compare(current, IP_ROUTENAME_LENGTH, name, *length) > 0) && ((Nextentry.ipRouteDest == (u_long)-2) || (snmp_oid_compare(current, IP_ROUTENAME_LENGTH, lowest, IP_ROUTENAME_LENGTH) < 0) || (snmp_oid_compare(name, IP_ROUTENAME_LENGTH, lowest, IP_ROUTENAME_LENGTH) == 0))){ /* if new one is greater than input and closer to input than * previous lowest, and is not equal to it, save this one as the "next" one. */ memcpy( (char *)lowest,(char *)current, IP_ROUTENAME_LENGTH * sizeof(oid)); Lowentry = entry; Found++; } } } if (Found == 0) return(NULL); memcpy( (char *) name,(char *)lowest, IP_ROUTENAME_LENGTH * sizeof(oid)); *length = IP_ROUTENAME_LENGTH; *write_method = write_rte; *var_len = sizeof(long_return); switch(vp->magic){ case IPROUTEDEST: long_return = Lowentry.ipRouteDest; return (u_char *)&long_return; case IPROUTEIFINDEX: long_return = Interface_Index_By_Name(Lowentry.ipRouteIfIndex.o_bytes, Lowentry.ipRouteIfIndex.o_length); return (u_char *)&long_return; case IPROUTEMETRIC1: long_return = Lowentry.ipRouteMetric1; return (u_char *)&long_return; case IPROUTEMETRIC2: long_return = Lowentry.ipRouteMetric2; return (u_char *)&long_return; case IPROUTEMETRIC3: long_return = Lowentry.ipRouteMetric3; return (u_char *)&long_return; case IPROUTEMETRIC4: long_return = Lowentry.ipRouteMetric4; return (u_char *)&long_return; case IPROUTENEXTHOP: long_return = Lowentry.ipRouteNextHop; return (u_char *)&long_return; case IPROUTETYPE: long_return = Lowentry.ipRouteType; return (u_char *)&long_return; case IPROUTEPROTO: long_return = Lowentry.ipRouteProto; return (u_char *)&long_return; case IPROUTEAGE: long_return = Lowentry.ipRouteAge; return (u_char *)&long_return; case IPROUTEMASK: long_return = Lowentry.ipRouteMask; return (u_char *)&long_return; default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ipRouteEntry\n", vp->magic)); }; return NULL;}#endif /* solaris2 - var_IProute */#ifndef solaris2static int qsort_compare (RTENTRY **, RTENTRY **);#endif#if defined(RTENTRY_4_4) || defined(RTENTRY_RT_NEXT)#ifdef RTENTRY_4_4voidload_rtentries(struct radix_node *pt){ struct radix_node node; RTENTRY rt; struct ifnet ifnet; char name[16], temp[16];#if !STRUCT_IFNET_HAS_IF_XNAME register char *cp;#endif if (!klookup((unsigned long)pt , (char *) &node , sizeof (struct radix_node))) { DEBUGMSGTL(("mibII/var_route", "Fail\n")); return; } if (node.rn_b >= 0) { load_rtentries(node.rn_r); load_rtentries(node.rn_l); } else { if (node.rn_flags & RNF_ROOT) { /* root node */ if (node.rn_dupedkey) load_rtentries(node.rn_dupedkey); return; } /* get the route */ klookup((unsigned long)pt, (char *) &rt, sizeof (RTENTRY)); if (rt.rt_ifp != 0) { klookup((unsigned long)rt.rt_ifp, (char *)&ifnet, sizeof (ifnet));#if STRUCT_IFNET_HAS_IF_XNAME#if defined(netbsd1) || defined(openbsd2) strncpy(name, ifnet.if_xname, sizeof name);#else klookup((unsigned long)ifnet.if_xname, name, sizeof name);#endif name[sizeof (name)-1] = '\0';#else klookup((unsigned long)ifnet.if_name, name, sizeof name); name[sizeof (name) - 1] = '\0'; cp = (char *) strchr(name, '\0'); string_append_int (cp, ifnet.if_unit);#endif Interface_Scan_Init(); rt.rt_unit = 0; while (Interface_Scan_Next((short *) &(rt.rt_unit), temp, NULL, NULL) != 0) { if (strcmp(name, temp) == 0) break; } } #if CHECK_RT_FLAGS if (((rt.rt_flags & RTF_CLONING) != RTF_CLONING) && ((rt.rt_flags & RTF_LLINFO) != RTF_LLINFO)) {#endif /* check for space and malloc */ if (rtsize >= rtallocate) { rthead = (RTENTRY **) realloc((char *)rthead, 2 * rtallocate * sizeof(RTENTRY *)); memset((char *) &rthead[rtallocate],(0), rtallocate * sizeof(RTENTRY *)); rtallocate *= 2; } if (!rthead[rtsize]) rthead[rtsize] = (RTENTRY *) malloc(sizeof(RTENTRY)); /* * Add this to the database */ memcpy( (char *)rthead[rtsize],(char *) &rt, sizeof(RTENTRY)); rtsize++;#if CHECK_RT_FLAGS }#endif if (node.rn_dupedkey) load_rtentries(node.rn_dupedkey); }}#endif /* RTENTRY_4_4 */static void Route_Scan_Reload (void){#if defined(RTENTRY_4_4) struct radix_node_head head, *rt_table[AF_MAX+1]; int i;#else RTENTRY **routehash, mb; register RTENTRY *m; RTENTRY *rt; struct ifnet ifnet; int i, table; register char *cp; char name[16], temp[16]; int hashsize;#endif static int Time_Of_Last_Reload=0; struct timeval now; gettimeofday(&now, (struct timezone *)0); if (Time_Of_Last_Reload+CACHE_TIME > now.tv_sec) return; Time_Of_Last_Reload = now.tv_sec; /* * Makes sure we have SOME space allocated for new routing entries */ if (!rthead) { rthead = (RTENTRY **) malloc(100 * sizeof(RTENTRY *)); if (!rthead) { snmp_log(LOG_ERR,"route table malloc fail\n"); return; } memset((char *)rthead,(0), 100 * sizeof(RTENTRY *)); rtallocate = 100; } /* reset the routing table size to zero -- was a CMU memory leak */ rtsize = 0;#ifdef RTENTRY_4_4 /* rtentry is a BSD 4.4 compat */#if !defined(AF_UNSPEC)#define AF_UNSPEC AF_INET #endif auto_nlist(RTTABLES_SYMBOL, (char *) rt_table, sizeof(rt_table)); for(i=0; i <= AF_MAX; i++) { if(rt_table[i] == 0) continue; if (klookup((unsigned long)rt_table[i], (char *) &head, sizeof(head))) { load_rtentries(head.rnh_treetop); } } #else /* rtentry is a BSD 4.3 compat */ for (table=0; table<NUM_ROUTE_SYMBOLS; table++) { auto_nlist(RTHASHSIZE_SYMBOL, (char *)&hashsize, sizeof(hashsize)); routehash = (RTENTRY **)malloc(hashsize * sizeof(struct mbuf *)); auto_nlist(route_symbols[table], (char *)routehash, hashsize * sizeof(struct mbuf *)); for (i = 0; i < hashsize; i++) { if (routehash[i] == 0) continue; m = routehash[i]; while (m) { /* * Dig the route out of the kernel... */ klookup(m , (char *)&mb, sizeof (mb)); m = mb.rt_next; rt = &mb; if (rt->rt_ifp != 0) { klookup( rt->rt_ifp, (char *)&ifnet, sizeof (ifnet)); klookup( ifnet.if_name, name, 16); name[15] = '\0'; cp = (char *) strchr(name, '\0'); string_append_int (cp, ifnet.if_unit); Interface_Scan_Init(); while (Interface_Scan_Next((short *)&rt->rt_unit, temp, NULL, NULL) != 0) { if (strcmp(name, temp) == 0) break; } } /* * Allocate a block to hold it and add it to the database */ if (rtsize >= rtallocate) { rthead = (RTENTRY **) realloc((char *)rthead, 2 * rtallocate * sizeof(RTENTRY *)); memset((char *) &rthead[rtallocate],(0), rtallocate * sizeof(RTENTRY *)); rtallocate *= 2; } if (!rthead[rtsize]) rthead[rtsize] = (RTENTRY *) malloc(sizeof(RTENTRY)); /* * Add this to the database */ memcpy( (char *)rthead[rtsize],(char *)rt, sizeof(RTENTRY)); rtsize++; } } free(routehash); }#endif /* * Sort it! */ qsort((char *) rthead, rtsize, sizeof(rthead[0]),#ifdef __STDC__ (int (*)(const void *, const void *))qsort_compare#else qsort_compare#endif );}#else#if HAVE_SYS_MBUF_Hstatic void Route_Scan_Reload (void){ struct mbuf **routehash, mb; register struct mbuf *m; struct ifnet ifnet; RTENTRY *rt; int i, table; register char *cp; char name[16], temp[16]; static int Time_Of_Last_Reload=0; struct timeval now; int hashsize; gettimeofday(&now, (struct timezone *)0); if (Time_Of_Last_Reload+CACHE_TIME > now.tv_sec) return; Time_Of_Last_Reload = now.tv_sec; /* * Makes sure we have SOME space allocated for new routing entries */ if (!rthead) { rthead = (RTENTRY **) malloc(100 * sizeof(RTENTRY *)); if (!rthead) { snmp_log(LOG_ERR,"route table malloc fail\n"); return; } memset((char *)rthead,(0), 100 * sizeof(RTENTRY *)); rtallocate = 100; } /* reset the routing table size to zero -- was a CMU memory leak */ rtsize = 0; for (table=0; table<NUM_ROUTE_SYMBOLS; table++) {#ifdef sunV3 hashsize = RTHASHSIZ;#else auto_nlist(RTHASHSIZE_SYMBOL, (char *)&hashsize, sizeof(hashsize));#endif routehash = (struct mbuf **)malloc(hashsize * sizeof(struct mbuf *)); auto_nlist(route_symbols[table], (char *)routehash, hashsize * sizeof(struct mbuf *)); for (i = 0; i < hashsize; i++) { if (routehash[i] == 0) continue; m = routehash[i]; while (m) { /* * Dig the route out of the kernel... */ klookup((unsigned long) m , (char *)&mb, sizeof (mb)); m = mb.m_next; rt = mtod(&mb, RTENTRY *); if (rt->rt_ifp != 0) { klookup((unsigned long) rt->rt_ifp, (char *)&ifnet, sizeof (ifnet)); klookup((unsigned long) ifnet.if_name, name, 16); name[15] = '\0'; cp = (char *) strchr(name, '\0'); string_append_int (cp, ifnet.if_unit); if (strcmp(name,"lo0") == 0) continue; Interface_Scan_Init(); while (Interface_Scan_Next((short *)&rt->rt_unit, temp, NULL, NULL) != 0) { if (strcmp(name, temp) == 0) break; } } /* * Allocate a block to hold it and add it to the database */ if (rtsize >= rtallocate) { rthead = (RTENTRY **) realloc((char *)rthead, 2 * rtallocate * sizeof(RTENTRY *)); memset((char *) &rthead[rtallocate],(0), rtallocate * sizeof(RTENTRY *)); rtallocate *= 2; } if (!rthead[rtsize]) rthead[rtsize] = (RTENTRY *) malloc(sizeof(RTENTRY)); /* * Add this to the database
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -