⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 var_route.c

📁 非常不错的网管开发包
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -