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

📄 iproute.c

📁 Snmp(简单网管协议)软件包。
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * ipRoute.c - handle the IP Routing table * * *//***********************************************************	Copyright 1988, 1989 by Carnegie Mellon University	Copyright 1989	TGV, Incorporated		      All Rights ReservedPermission to use, copy, modify, and distribute this software and itsdocumentation for any purpose and without fee is hereby granted,provided that the above copyright notice appear in all copies and thatboth that copyright notice and this permission notice appear insupporting documentation, and that the name of CMU and TGV not be usedin advertising or publicity pertaining to distribution of the softwarewithout specific, written prior permission.CMU AND TGV DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NOEVENT SHALL CMU OR TGV BE LIABLE FOR ANY SPECIAL, INDIRECT ORCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OFUSE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OROTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE ORPERFORMANCE OF THIS SOFTWARE.******************************************************************//* * additions, fixes and enhancements for Linux by Erik Schoenfelder * (schoenfr@ibr.cs.tu-bs.de) 1994/1995. * Linux additions taken from CMU to UCD stack by Jennifer Bray of Origin * (jbray@origin-at.co.uk) 1997 * Support for system({CTL_NET,PF_ROUTE,...) by Simon Leinen * (simon@switch.ch) 1997 */#include <config.h>#include "mibincl.h"#define GATEWAY			/* MultiNet is always configured this way! */#include <stdio.h>#include <sys/types.h>#if HAVE_SYS_PARAM_H#include <sys/param.h>#endif#include <sys/socket.h>#if HAVE_SYS_SELECT_H#include <sys/select.h>#endif#if HAVE_ARPA_INET_H#include <arpa/inet.h>#endif#if HAVE_SYSLOG_H#include <syslog.h>#endif#if HAVE_MACHINE_PARAM_H#include <machine/param.h>#endif#if HAVE_SYS_MBUF_H#include <sys/mbuf.h>#endif#include <net/if.h>#ifdef HAVE_NET_IF_VAR_H#include <net/if_var.h>#endif#if HAVE_SYS_HASHING_H#include <sys/hashing.h>#endif#if HAVE_NETINET_IN_VAR_H#include <netinet/in_var.h>#endif#define KERNEL		/* to get routehash and RTHASHSIZ */#if HAVE_SYS_STREAM_H#include <sys/stream.h>#endif#include <net/route.h>#undef	KERNEL#ifndef NULL#define NULL 0#endif#if HAVE_KVM_OPENFILES#include <fcntl.h>#endif#if HAVE_KVM_H#include <kvm.h>#endif#if HAVE_STRING_H#include <string.h>#else#include <strings.h>#endif#if HAVE_INET_MIB2_H#include <inet/mib2.h>#endif#if HAVE_SYS_SYSCTL_H#include <sys/sysctl.h>#endif#if HAVE_NET_IF_DL_H#include <net/if_dl.h>#endif#if HAVE_NLIST_H#include <nlist.h>#endif#include "auto_nlist.h"#if solaris2#include "kernel_sunos5.h"#endif#ifdef hpux#include <sys/mib.h>#include "kernel_hpux.h"#endif #if HAVE_DMALLOC_H#include <dmalloc.h>#endif#include "ipRoute.h"#include "kernel.h"#include "interfaces.h"#include "struct.h"#include "util_funcs.h"#ifndef  MIN#define  MIN(a,b)                     (((a) < (b)) ? (a) : (b))#endif#ifndef ROUTE_CACHE_TIMEOUT#define ROUTE_CACHE_TIMEOUT MIB_STATS_CACHE_TIMEOUT#endifmib_table_t route_table;	/*********************	 *	 *  Kernel & interface information,	 *   and internal forward declarations	 *	 *********************/#ifdef hpux#define ROUTE_TYPE	mib_ipRouteEnt#define RT_ADDRESS_FIELD	Dest#define RT_GATEWAY_FIELD	NextHop#define RT_NETMASK_FIELD	Mask#define RT_INDEX_FIELD		IfIndex#define USES_SNMP_DESIGNED_ROUTE_STRUCT#undef  SOCKADDR#define SOCKADDR(x)	x#endif#ifdef CAN_USE_SYSCTLstruct snmprt {    struct rt_msghdr	hdr;    struct in_addr	rt_dst;    struct in_addr	rt_gateway;    struct in_addr	rt_genmask;    int			index;    struct in_addr	ifa;};#define ROUTE_TYPE	struct snmprt#define RT_ADDRESS_FIELD	rt_dst#define RT_GATEWAY_FIELD	rt_gateway#define RT_NETMASK_FIELD	rt_genmask#define RT_FLAGS_FIELD		hdr.rtm_flags#define RT_INDEX_FIELD		index#endif#ifdef linux#define ROUTE_TYPE	struct rtentry#define RT_ADDRESS_FIELD	rt_dst#define RT_GATEWAY_FIELD	rt_gateway#define RT_FLAGS_FIELD		rt_flags#define RT_NETMASK_FIELD	rt_genmask#define RT_INDEX_FIELD		rt_window	/* nick unused field */#endif#ifndef ROUTE_TYPE#define ROUTE_TYPE	struct rtentry#ifndef STRUCT_RTENTRY_HAS_RT_DST#define rt_dst rt_nodes->rn_key#endif#define RT_ADDRESS_FIELD	rt_dst#define RT_GATEWAY_FIELD	rt_gateway#define RT_FLAGS_FIELD		rt_flags#define RT_NETMASK_FIELD	rt_subnetmask#define RT_INDEX_FIELD		rt_use		/* nick unused field */#endif/* extern WriteMethod *write_rte; */int Route_Scan_Reload ( mib_table_t );int IP_Cmp_Route(const void *, const void *);ROUTE_TYPE* search_route(oid* idx, int idx_len, int exact);	/*********************	 *	 *  Initialisation	 *	 *********************/struct variable2 ipRoute_variables[] = {    {IPROUTEDEST,  ASN_IPADDRESS, RONLY, var_ipRouteEntry, 1, {1}},    {IPROUTEIFINDEX, ASN_INTEGER, RONLY, var_ipRouteEntry, 1, {2}},    {IPROUTEMETRIC1, ASN_INTEGER, RONLY, var_ipRouteEntry, 1, {3}},    {IPROUTEMETRIC2, ASN_INTEGER, RONLY, var_ipRouteEntry, 1, {4}},    {IPROUTEMETRIC3, ASN_INTEGER, RONLY, var_ipRouteEntry, 1, {5}},    {IPROUTEMETRIC4, ASN_INTEGER, RONLY, var_ipRouteEntry, 1, {6}},    {IPROUTENEXTHOP, ASN_IPADDRESS, RONLY, var_ipRouteEntry, 1, {7}},    {IPROUTETYPE,    ASN_INTEGER, RONLY, var_ipRouteEntry, 1, {8}},    {IPROUTEPROTO,   ASN_INTEGER, RONLY, var_ipRouteEntry, 1, {9}},    {IPROUTEAGE,     ASN_INTEGER, RONLY, var_ipRouteEntry, 1, {10}},    {IPROUTEMASK,  ASN_IPADDRESS, RONLY, var_ipRouteEntry, 1, {11}},    {IPROUTEMETRIC5, ASN_INTEGER, RONLY, var_ipRouteEntry, 1, {12}},    {IPROUTEINFO,  ASN_OBJECT_ID, RONLY, var_ipRouteEntry, 1, {13}}};oid ipRoute_variables_oid[] = { SNMP_OID_MIB2,4,21,1 };void init_ipRoute( void ){    REGISTER_MIB("mibII/ipRoute", ipRoute_variables, variable2, ipRoute_variables_oid);    route_table = Initialise_Table( sizeof( ROUTE_TYPE ),			ROUTE_CACHE_TIMEOUT,			Route_Scan_Reload, IP_Cmp_Route);}	/*********************	 *	 *  Main variable handling routines	 *	 *********************//*  var_ipRouteEntry(...  Arguments:  vp	        IN      - pointer to variable entry that points here  name          IN/OUT  - IN/name requested, OUT/name found  length        IN/OUT  - length of IN/OUT oid's   exact         IN      - TRUE if an exact match was requested  var_len       OUT     - length of variable or 0 if function returned  write_method  out     - pointer to function to set variable, otherwise 0*/u_char *var_ipRouteEntry(struct variable *vp,		 oid *name,		 size_t *length,		 int exact,		 size_t *var_len,		 WriteMethod **write_method){    int i, idx;    oid newname[MAX_OID_LEN], *op;    u_char *cp;    ROUTE_TYPE* routeEntry;		/*		 * Check the name given in the request,		 *  and indentify the index part of it		 */    switch (snmp_oid_compare(name, MIN(*length, vp->namelen),			     vp->name, vp->namelen)) {	case -1:	/* name given is earlier than this table */		if ( exact )		    return NULL;		op = NULL;		i = 0;		break;	case 0:		/* name given matches this table */		op = &name[vp->namelen];		i  = *length - vp->namelen;		break;	case 1:		/* name given is later than this table */		return NULL;	default:	/* Can't happen */		return NULL;    }    		/*		 *  Search for the relevant route entry,		 *   either the index just identified,		 *   or the next one, depending on whether		 *   this is an exact match or not.		 */    routeEntry = search_route( op, i, exact );    if ( !routeEntry )	return NULL;		/*		 * We've found something we can use.		 *  Update the 'newname' with the relevant index		 */    memcpy((char *)newname, (char *)vp->name, (int)vp->namelen * sizeof(oid));    cp = (u_char *)&(SOCKADDR(routeEntry->RT_ADDRESS_FIELD));    op = newname + vp->namelen;    *op++ = *cp++;    *op++ = *cp++;    *op++ = *cp++;    *op++ = *cp++;       memcpy( (char *)name,(char *)newname, ((int)vp->namelen + 4) * sizeof(oid));    *length = vp->namelen + 4;    /**write_method = write_rte;*/    *var_len = sizeof(long_return);    switch(vp->magic){	case IPROUTEDEST:	    return (u_char *)&(SOCKADDR(routeEntry->RT_ADDRESS_FIELD));	case IPROUTEIFINDEX:	    long_return = routeEntry->RT_INDEX_FIELD;	    return (u_char *)&long_return;	case IPROUTEMETRIC1:#ifdef USES_SNMP_DESIGNED_ROUTE_STRUCT	    long_return = routeEntry->Metric1;#else	    long_return = (routeEntry->RT_FLAGS_FIELD & RTF_GATEWAY) ? 1 : 0;#endif	    return (u_char *)&long_return;	case IPROUTEMETRIC2:#ifdef USES_SNMP_DESIGNED_ROUTE_STRUCT	    long_return = routeEntry->Metric2;#else	    long_return = -1;		/* the defined 'unused' value */#endif	    return (u_char *)&long_return;	case IPROUTEMETRIC3:#ifdef USES_SNMP_DESIGNED_ROUTE_STRUCT	    long_return = routeEntry->Metric3;#else	    long_return = -1;		/* the defined 'unused' value */#endif	    return (u_char *)&long_return;	case IPROUTEMETRIC4:#ifdef USES_SNMP_DESIGNED_ROUTE_STRUCT	    long_return = routeEntry->Metric4;#else	    long_return = -1;		/* the defined 'unused' value */#endif	    return (u_char *)&long_return;	case IPROUTEMETRIC5:	    long_return = -1;		/* the defined 'unused' value */	    return (u_char *)&long_return;	    	case IPROUTENEXTHOP:	    return (u_char *)&(SOCKADDR(routeEntry->RT_GATEWAY_FIELD));	case IPROUTETYPE:#ifdef USES_SNMP_DESIGNED_ROUTE_STRUCT	    long_return = routeEntry->Type;#else	    long_return = (routeEntry->RT_FLAGS_FIELD & RTF_GATEWAY)	      ? 4		/* indirect */	      : 3;		/*   direct */#endif	    return (u_char *)&long_return;	case IPROUTEPROTO:#ifdef USES_SNMP_DESIGNED_ROUTE_STRUCT	    long_return = routeEntry->Proto;#else	    long_return = (routeEntry->RT_FLAGS_FIELD & RTF_DYNAMIC)	      ? 4		/*  ICMP */	      : 2;		/* local */#endif	    return (u_char *)&long_return;	case IPROUTEAGE:#ifdef USES_SNMP_DESIGNED_ROUTE_STRUCT	    long_return = routeEntry->Age;	    return (u_char *)&long_return;#else	    return NULL;#endif	case IPROUTEMASK:	    return (u_char *)&(SOCKADDR(routeEntry->RT_NETMASK_FIELD));	case IPROUTEINFO:	    *var_len = nullOidLen;	    return (u_char *) nullOid;	default:	    DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_ipRouteEntry\n",					vp->magic));    }    return NULL;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -