📄 iproute.c
字号:
/* * 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 + -