📄 ipv6.c
字号:
/* * IP MIB group implementation - ipv6.c * */#include <config.h>#if defined(IFNET_NEEDS_KERNEL) && !defined(_KERNEL)#define _KERNEL 1#define _I_DEFINED_KERNEL#endif#include <sys/types.h>#include <sys/param.h>#include <sys/socket.h>#if defined(__FreeBSD__) && __FreeBSD__ >= 3# if HAVE_SYS_SOCKETVAR_H# include <sys/socketvar.h># endif#endif#if STDC_HEADERS#include <string.h>#include <stdlib.h>#else#if HAVE_STDLIB_H#include <stdlib.h>#endif#endif#if HAVE_UNISTD_H#include <unistd.h>#endif#if HAVE_SYS_IOCTL_H#include <sys/ioctl.h>#endif#if HAVE_NETINET_IN_H#include <netinet/in.h>#endif#if HAVE_SYS_SYSCTL_H#ifdef _I_DEFINED_KERNEL#undef _KERNEL#endif#include <sys/sysctl.h>#ifdef _I_DEFINED_KERNEL#define _KERNEL 1#endif#endif#if HAVE_SYS_SYSMP_H#include <sys/sysmp.h>#endif#if HAVE_SYS_TCPIPSTATS_H#include <sys/tcpipstats.h>#endif#include <net/if.h>#if HAVE_NET_IF_VAR_H#include <net/if_var.h>#endif#if HAVE_NET_IF_DL_H#include <net/if_dl.h>#endif#ifdef HAVE_NET_IF_MIB_H#include <net/if_mib.h>#endif#ifdef _I_DEFINED_KERNEL#undef _KERNEL#endif#include <netinet/in_systm.h>#if HAVE_SYS_HASHING_H#include <sys/hashing.h>#endif#if HAVE_SYS_SOCKIO_H#include <sys/sockio.h>#endif#if HAVE_NETINET6_IN6_VAR_H#include <netinet6/in6_var.h>#endif#include <netinet/ip6.h>#if HAVE_NETINET_IP_VAR_H# include <netinet/ip_var.h>#endif#if HAVE_NETINET6_IP6_VAR_H# include <netinet6/ip6_var.h>#endif#include <net/route.h>#if defined(__FreeBSD__) && __FreeBSD__ >= 3# if HAVE_NETINET_IN_PCB_H# include <netinet/in_pcb.h># endif#endif#if HAVE_NETINET6_IN6_PCB_H# include <netinet6/in6_pcb.h>#endif#if HAVE_NETINET6_TCP6_H# define TCP6#endif#ifndef TCP6# if HAVE_NETINET_TCP_H# include <netinet/tcp.h># endif# if HAVE_NETINET_TCP_TIMER_H# include <netinet/tcp_timer.h># endif# if HAVE_NETINET_TCP_VAR_H# include <netinet/tcp_var.h># endif# if HAVE_NETINET_TCP_FSM_H# include <netinet/tcp_fsm.h># endif#endif#if HAVE_NETINET6_TCP6_H# include <netinet6/tcp6.h>#endif#if HAVE_NETINET6_TCP6_TIMER_H#include <netinet6/tcp6_timer.h>#endif#if HAVE_NETINET6_TCP6_VAR_H#include <netinet6/tcp6_var.h>#endif#if HAVE_NETINET6_TCP6_FSM_H#include <netinet6/tcp6_fsm.h>#endif#if HAVE_INET_MIB2_H#include <inet/mib2.h>#endif#ifdef HAVE_SYSLOG_H#include <syslog.h>#endif#include "mibincl.h"#include "kernel.h"#include "system.h"#include "util_funcs.h"#include "auto_nlist.h"#ifdef MIB_IPCOUNTER_SYMBOL#include <sys/mib.h>#include <netinet/mib_kern.h>#endif /* MIB_IPCOUNTER_SYMBOL */#include "ipv6.h"#include "interfaces.h"static int header_ipv6 __P((register struct variable *, oid *, size_t *, int, size_t *, WriteMethod **));static int header_ipv6_scan __P((register struct variable *, oid *, size_t *, int, size_t *, WriteMethod **, int, int));static int if_initialize __P((void));static int if_maxifindex __P((void));static char *if_getname __P((int));static int if_getindex __P((const char *));struct variable4 ipv6_variables[] = { {IPV6FORWARDING, ASN_INTEGER, RONLY, var_ipv6, 1, {1}}, {IPV6DEFAULTHOPLIMIT, ASN_INTEGER, RONLY, var_ipv6, 1, {2}}, {IPV6INTERFACES, ASN_GAUGE, RONLY, var_ipv6, 1, {3}}, {IPV6IFTBLLASTCHG, ASN_TIMETICKS, RONLY, var_ipv6, 1, {4}}, {IPV6IFDESCR, ASN_OCTET_STR, RONLY, var_ifv6Entry, 3, {5, 1, 2}}, {IPV6IFLOWLAYER, ASN_OBJECT_ID, RONLY, var_ifv6Entry, 3, {5, 1, 3}}, {IPV6IFEFFECTMTU, ASN_UNSIGNED, RONLY, var_ifv6Entry, 3, {5, 1, 4}}, {IPV6IFREASMMAXSIZE, ASN_UNSIGNED, RONLY, var_ifv6Entry, 3, {5, 1, 5}}, {IPV6IFTOKEN, ASN_OCTET_STR, RONLY, var_ifv6Entry, 3, {5, 1, 6}}, {IPV6IFTOKENLEN, ASN_INTEGER, RONLY, var_ifv6Entry, 3, {5, 1, 7}}, {IPV6IFPHYSADDRESS, ASN_OCTET_STR, RONLY, var_ifv6Entry, 3, {5, 1, 8}}, {IPV6IFADMSTATUS, ASN_INTEGER, RONLY, var_ifv6Entry, 3, {5, 1, 9}}, {IPV6IFOPERSTATUS, ASN_INTEGER, RONLY, var_ifv6Entry, 3, {5, 1, 10}}, {IPV6IFLASTCHANGE, ASN_TIMETICKS, RONLY, var_ifv6Entry, 3, {5, 1, 11}}, {IPV6IFSTATSINRCVS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 1}}, {IPV6IFSTATSINHDRERRS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 2}}, {IPV6IFSTATSTOOBIGERRS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 3}}, {IPV6IFSTATSINNOROUTES, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 4}}, {IPV6IFSTATSINADDRERRS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 5}}, {IPV6IFSTATSINUNKNOWPROTS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 6}}, {IPV6IFSTATSINTRUNCATPKTS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 7}}, {IPV6IFSTATSINDISCARDS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 8}}, {IPV6IFSTATSINDELIVERS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 9}}, {IPV6IFSTATSOUTFORWDATAS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 10}}, {IPV6IFSTATSOUTREQS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 11}}, {IPV6IFSTATSOUTDISCARDS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 12}}, {IPV6IFSTATSOUTFRAGOKS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 13}}, {IPV6IFSTATSOUTFRAGFAILS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 14}}, {IPV6IFSTATSOUTFRAGCREATS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 15}}, {IPV6IFSTATSOUTREASMREQS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 16}}, {IPV6IFSTATSOUTREASMOKS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 17}}, {IPV6IFSTATSOUTREASMFAILS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 18}}, {IPV6IFSTATSINMCASTPKTS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 19}}, {IPV6IFSTATSOUTMCASTPKTS, ASN_COUNTER, RONLY, var_ifv6Entry, 3, {6, 1, 20}},#if 0 {IPV6ADDRPREFIXONLINKFLG, INTEGER, RONLY, var_ipv6AddrEntry, 3, {7, 1, 3}}, {IPV6ADDRPREFIXAUTONOMOUSFLAG, INTEGER, RONLY, var_ipv6AddrEntry, 3, {7, 1, 4}}, {IPV6ADDRPREFIXADVPREFERLIFE, UNSIGNED32, RONLY, var_ipv6AddrEntry, 3, {7, 1, 5}}, {IPV6ADDRPREFIXVALIDLIFE, UNSIGNED32, RONLY, var_ipv6AddrEntry, 3, {7, 1, 6}}, {IPV6ADDRPFXLEN, INTEGER, RONLY, var_ipv6AddrEntry, 3, {8, 1, 2}}, {IPV6ADDRTYPE, INTEGER, RONLY, var_ipv6AddrEntry, 3, {8, 1, 3}}, {IPV6ADDRANYCASTFLAG, INTEGER, RONLY, var_ipv6AddrEntry, 3, {8, 1, 4}}, {IPV6ADDRSTATUS, INTEGER, RONLY, var_ipv6AddrEntry, 3, {8, 1, 5}}, {IPV6ROUTEIFINDEX, IpV6IFINDEX, RONLY, var_ipv6RouteEntry, 3, {11, 1, 4}}, {IPV6ROUTENEXTHOP, IpV6ADDRESS, RONLY, var_ipv6RouteEntry, 3, {11, 1, 5}}, {IPV6ROUTETYPE, INTEGER, RONLY, var_ipv6RouteEntry, 3, {11, 1, 6}}, {IPV6ROUTEPROTOCOL, INTEGER, RONLY, var_ipv6RouteEntry, 3, {11, 1, 7}}, {IPV6ROUTEPOLICY, UNSIGNED32, RONLY, var_ipv6RouteEntry, 3, {11, 1, 8}}, {IPV6ROUTEAGE, UNSIGNED32, RONLY, var_ipv6RouteEntry, 3, {11, 1, 9}}, {IPV6ROUTENEXTHOPRDI, UNSIGNED32, RONLY, var_ipv6RouteEntry, 3, {11, 1, 10}}, {IPV6ROUTEMETRIC, UNSIGNED32, RONLY, var_ipv6RouteEntry, 3, {11, 1, 11}}, {IPV6ROUTEWEIGHT, UNSIGNED32, RONLY, var_ipv6RouteEntry, 3, {11, 1, 12}}, {IPV6ROUTEINFO, OBJID, RONLY, var_ipv6RouteEntry, 3, {11, 1, 13}}, {IPV6ROUTEVALID, INTEGER, RONLY, var_ipv6RouteEntry, 3, {11, 1, 14}}, {IPV6NETTOMEDIAPHYADDR, STRING, RONLY, var_ndpEntry, 3, {12, 1, 2}}, {IPV6NETTOMEDIATYPE, INTEGER, RONLY, var_ndpEntry, 3, {12, 1, 3}}, {IPV6NETTOMEDIASTATE, INTEGER, RONLY, var_ndpEntry, 3, {12, 1, 4}}, {IPV6NETTOMEDIALASTUPDATE, TIMETICKS, RONLY, var_ndpEntry, 3, {12, 1, 5}}, {IPV6NETTOMEDIAVALID, INTEGER, RONLY, var_ndpEntry, 3, {12, 1, 6}},#endif};oid ipv6_variables_oid[] = {SNMP_OID_MIB2,55,1};#if 0 config_load_mib(MIB.55.1, 8, ipv6_variables) config_add_mib(IPV6-TC) config_add_mib(IPV6-MIB)#endifstruct variable4 ipv6icmp_variables[] = { {IPV6IFICMPINMSG, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 1}}, {IPV6IFICMPINERRORS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 2}}, {IPV6IFICMPINDSTUNRCHS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 3}}, {IPV6IFICMPINADMPROHS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 4}}, {IPV6IFICMPINTIMEXCDS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 5}}, {IPV6IFICMPINPARMPROBS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 6}}, {IPV6IFICMPINPKTTOOBIGS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 7}}, {IPV6IFICMPINECHOS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 8}}, {IPV6IFICMPINECHOREPS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 9}}, {IPV6IFICMPINRTRSLICITS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 10}}, {IPV6IFICMPINRTRADVS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 11}}, {IPV6IFICMPINNBRSLICITS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 12}}, {IPV6IFICMPINNBRADVS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 13}}, {IPV6IFICMPINREDIRECTS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 14}}, {IPV6IFICMPINGRPMEQERYS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 15}}, {IPV6IFICMPINGRPMERSPS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 16}}, {IPV6IFICMPINGRPMEREDCS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 17}}, {IPV6IFICMPOUTMSG, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 18}}, {IPV6IFICMPOUTERRORS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 19}}, {IPV6IFICMPOUTDSTUNRCHS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 20}}, {IPV6IFICMPOUTADMPROHS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 21}}, {IPV6IFICMPOUTTIMEXCDS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 22}}, {IPV6IFICMPOUTPARMPROBS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 23}}, {IPV6IFICMPOUTPKTTOOBIGS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 24}}, {IPV6IFICMPOUTECHOS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 25}}, {IPV6IFICMPOUTECHOREPS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 26}}, {IPV6IFICMPOUTRTRSLICITS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 27}}, {IPV6IFICMPOUTRTRADVS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 28}}, {IPV6IFICMPOUTNBRSLICITS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 29}}, {IPV6IFICMPOUTNBRADVS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 30}}, {IPV6IFICMPOUTREDIRECTS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 31}}, {IPV6IFICMPOUTGRPMEQERYS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 32}}, {IPV6IFICMPOUTGRPMERSPS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 33}}, {IPV6IFICMPOUTGRPMEREDCS, ASN_COUNTER, RONLY, var_icmpv6Entry, 3, {1, 1, 34}}};oid ipv6icmp_variables_oid[] = {1,3,6,1,2,1,56,1};#if 0 config_load_mib(MIB.56.1, 8, ipv6icmp_variables) config_add_mib(IPV6-ICMP-MIB)#endifstruct variable4 ipv6udp_variables[] = { {IPV6UDPLOCALADDRESS, ASN_OCTET_STR, RONLY, var_udp6, 2, {1, 1}}, {IPV6UDPLOCALPORT, ASN_INTEGER, RONLY, var_udp6, 2, {1, 2}}, {IPV6UDPIFINDEX, ASN_INTEGER, RONLY, var_udp6, 2, {1, 3}}};oid ipv6udp_variables_oid[] = {1,3,6,1,2,1,7,6};#if 0 config_load_mib(1.3.6.1.3.87.1, 7, ipv6udp_variables) config_add_mib(IPV6-UDP-MIB)#endifstruct variable4 ipv6tcp_variables[] = { {IPV6TCPLOCALADDR, ASN_OCTET_STR, RONLY, var_tcp6, 2, {1, 1}}, {IPV6TCPLOCALPORT, ASN_INTEGER, RONLY, var_tcp6, 2, {1, 2}}, {IPV6TCPREMOTEADDR, ASN_OCTET_STR, RONLY, var_tcp6, 2, {1, 3}}, {IPV6TCPREMOTEPORT, ASN_INTEGER, RONLY, var_tcp6, 2, {1, 4}}, {IPV6TCPIFINDEX, ASN_INTEGER, RONLY, var_tcp6, 2, {1, 5}}, {IPV6TCPCONNSTATE, ASN_INTEGER, RONLY, var_tcp6, 2, {1, 6}},};oid ipv6tcp_variables_oid[] = {1,3,6,1,2,1,6,16};#if 0 config_load_mib(1.3.6.1.3.86.1, 7, ipv6tcp_variables) config_add_mib(IPV6-TCP-MIB)#endifvoidinit_ipv6(){ /* register ourselves with the agent to handle our mib tree */ REGISTER_MIB("mibII/ipv6", ipv6_variables, variable4, ipv6_variables_oid); REGISTER_MIB("mibII/icmpv6", ipv6icmp_variables, variable4, ipv6icmp_variables_oid); REGISTER_MIB("mibII/ipv6udp", ipv6udp_variables, variable4, ipv6udp_variables_oid); REGISTER_MIB("mibII/ipv6tcp", ipv6tcp_variables, variable4, ipv6tcp_variables_oid);}static intheader_ipv6( register struct variable *vp, /* IN - pointer to variable entry that points here */ oid *name, /* IN/OUT - input name requested, output name found */ size_t *length, /* IN/OUT - length of input and output oid's */ int exact, /* IN - TRUE if an exact match was requested */ size_t *var_len, /* OUT - length of variable or 0 if function returned */ WriteMethod **write_method){ oid newname[MAX_OID_LEN]; int result; DEBUGMSGTL(("mibII/ipv6", "header_ipv6: ")); DEBUGMSGOID(("mibII/ipv6", name, *length)); DEBUGMSG(("mibII/ipv6"," %d\n", exact)); memcpy((char *)newname, (char *)vp->name, (int)vp->namelen * sizeof(oid)); newname[(int)vp->namelen] = 0; result = snmp_oid_compare(name, *length, newname, (int)vp->namelen + 1); if ((exact && (result != 0)) || (!exact && (result >= 0))) return(MATCH_FAILED); memcpy((char *)name, (char *)newname, ((int)vp->namelen + 1) * sizeof(oid)); *length = vp->namelen + 1; *write_method = 0; *var_len = sizeof(long); /* default to 'long' results */ return(MATCH_SUCCEEDED);}static intheader_ipv6_scan( register struct variable *vp, /* IN - pointer to variable entry that points here */ oid *name, /* IN/OUT - input name requested, output name found */ size_t *length, /* IN/OUT - length of input and output oid's */ int exact, /* IN - TRUE if an exact match was requested */ size_t *var_len, /* OUT - length of variable or 0 if function returned */ WriteMethod **write_method, int from, int to){ oid newname[MAX_OID_LEN]; int result; int i; DEBUGMSGTL(("mibII/ipv6", "header_ipv6_scan: ")); DEBUGMSGOID(("mibII/ipv6", name, *length)); DEBUGMSG(("mibII/ipv6"," %d\n", exact)); memcpy((char *)newname, (char *)vp->name, (int)vp->namelen * sizeof(oid)); for (i = from; i <= to; i++) { newname[(int)vp->namelen] = i; result = snmp_oid_compare(name, *length, newname, (int)vp->namelen + 1); if (((exact && result == 0) || (!exact && result < 0)) && if_getname(i)) break; } if (to < i) return(MATCH_FAILED); memcpy((char *)name, (char *)newname, ((int)vp->namelen + 1) * sizeof(oid)); *length = vp->namelen + 1; *write_method = 0; *var_len = sizeof(long); /* default to 'long' results */ return(MATCH_SUCCEEDED);}static struct if_nameindex *ifnames = NULL;#ifdef linuxstatic void linux_if_freenameindex(struct if_nameindex *);static struct if_nameindex *linux_if_nameindex(void);#endifstatic intif_initialize(void){#ifndef HAVE_IF_NAMEINDEX return -1;#else#ifndef linux if (ifnames) if_freenameindex(ifnames); ifnames = if_nameindex();#else if (ifnames) linux_if_freenameindex(ifnames); ifnames = linux_if_nameindex();#endif if (!ifnames) { ERROR_MSG("if_nameindex() failed"); return -1; } return 0;#endif}static intif_maxifindex(void){#ifndef HAVE_IF_NAMEINDEX return -1;#else struct if_nameindex *p; int max = 0; if (!ifnames) { if (if_initialize() < 0) return -1; } for (p = ifnames; p && p->if_index; p++) { if (max < p->if_index) max = p->if_index; } return max;#endif}static intif_countifindex(void){#ifndef HAVE_IF_NAMEINDEX return -1;#else struct if_nameindex *p; int count = 0; if (!ifnames) { if (if_initialize() < 0) return -1; } for (p = ifnames; p && p->if_index; p++) { count++; } return count;#endif}static char *if_getname(int idx){#ifndef HAVE_IF_NAMEINDEX return NULL;#else struct if_nameindex *p; int max = -1; if (!ifnames) { if (if_initialize() < 0) return NULL; } for (p = ifnames; p && p->if_index; p++) { if (p->if_index == idx) return p->if_name; } return NULL;#endif}static intif_getindex(const char *name){#ifndef HAVE_IF_NAMEINDEX return -1;#else struct if_nameindex *p; if (!ifnames) { if (if_initialize() < 0) return -1; } for (p = ifnames; p && p->if_index; p++) { if (strcmp(name, p->if_name) == 0) return p->if_index; } return -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -