📄 var_route.c
字号:
size = all_routes_size; } if (sysctl (name, sizeof (name) / sizeof (int), all_routes, &size, 0, 0) == -1) { snmp_log(LOG_ERR, "sysctl(CTL_NET,PF_ROUTE,0,0,NET_RT_DUMP,0)\n"); } all_routes_end = all_routes + size; }}#else /* not USE_SYSCTL_ROUTE_DUMP */void init_var_route(void){#ifdef RTTABLES_SYMBOL auto_nlist(RTTABLES_SYMBOL,0,0);#endif#ifdef RTHASHSIZE_SYMBOL auto_nlist(RTHASHSIZE_SYMBOL,0,0);#endif#ifdef RTHOST_SYMBOL auto_nlist(RTHOST_SYMBOL,0,0);#endif#ifdef RTNET_SYMBOL auto_nlist(RTNET_SYMBOL,0,0);#endif}#ifndef solaris2#if NEED_KLGETSAstatic union { struct sockaddr_in sin; u_short data[128];} klgetsatmp;struct sockaddr_in *klgetsa(struct sockaddr_in *dst){ klookup((u_long)dst, (char *)&klgetsatmp.sin, sizeof klgetsatmp.sin); if (klgetsatmp.sin.sin_len > sizeof (klgetsatmp.sin)) klookup((u_long)dst, (char *)&klgetsatmp.sin, klgetsatmp.sin.sin_len); return(&klgetsatmp.sin);}#endifu_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. */ register int Save_Valid, result, RtIndex; static int saveNameLen=0, saveExact=0, saveRtIndex=0; static oid saveName[MAX_OID_LEN], Current[MAX_OID_LEN]; u_char *cp; oid *op;#if NEED_KLGETSA struct sockaddr_in *sa;#endif#ifndef linux struct ifnet rt_ifnet; struct in_ifaddr rt_ifnetaddr;#endif /** ** this optimisation fails, if there is only a single route avail. ** it is a very special case, but better leave it out ... **/#if NO_DUMMY_VALUES saveNameLen = 0;#endif if (rtsize <= 1) Save_Valid = 0; else /* * OPTIMIZATION: * * If the name was the same as the last name, with the possible * exception of the [9]th token, then don't read the routing table * */ if ((saveNameLen == *length) && (saveExact == exact)) { register int temp=name[9]; name[9] = 0; Save_Valid = (snmp_oid_compare(name, *length, saveName, saveNameLen) == 0); name[9] = temp; } else Save_Valid = 0; if (Save_Valid) { register int temp=name[9]; /* Fix up 'lowest' found entry */ memcpy( (char *) name,(char *) Current, 14 * sizeof(oid)); name[9] = temp; *length = 14; RtIndex = saveRtIndex; } else { /* fill in object part of name for current (less sizeof instance part) */ memcpy( (char *)Current,(char *)vp->name, (int)(vp->namelen) * sizeof(oid));#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, SNMP_MIN(*length,MAX_OID_LEN) * 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; if (long_return == -1) long_return = 1; 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 (const void *, const void *);#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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -