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

📄 ipv6.c

📁 ucd-snmp源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
#endif}/*------------------------------------------------------------*/#ifndef linux/* KAME dependent part */static intif_getifnet(int idx, struct ifnet *result){    caddr_t q;    struct ifnet tmp;    if (!auto_nlist("ifnet", (char *)&q, sizeof(q)))	return -1;    while (q) {	klookup((u_long)q, (char *)&tmp, sizeof(tmp));	if (idx == tmp.if_index) {	    memcpy(result, &tmp, sizeof(tmp));	    return 0;	}#if defined(__FreeBSD__) && 3 <= __FreeBSD__	q = (caddr_t)TAILQ_NEXT(&tmp, if_link);#else# if defined(__NetBSD__) || defined(__OpenBSD__)	q = (caddr_t)TAILQ_NEXT(&tmp, if_list);# else	q = (caddr_t)tmp.if_next;# endif#endif    }    return -1;}#ifdef HAVE_NET_IF_MIB_H#if defined(HAVE_SYS_SYSCTL_H) && defined(CTL_NET)static intif_getifmibdata(int idx, struct ifmibdata *result){    int mib[6] = {	CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, 0, IFDATA_GENERAL    };    int len;    struct ifmibdata tmp;    mib[4] = idx;    len = sizeof(struct ifmibdata);    if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), &tmp, &len, 0, 0) < 0)	return -1;    memcpy(result, &tmp, sizeof(tmp));    return 0;}#endif#endif /*HAVE_NET_IF_MIB_H*/#ifdef __KAME__#define IPV6_FORWARDING_SYMBOL	"ip6_forwarding"#define IPV6_DEFHLIM_SYMBOL	"ip6_defhlim"#endifu_char *var_ipv6(    register struct variable *vp,    oid *name,    size_t *length,    int exact,    size_t *var_len,    WriteMethod **write_method){    int i;    if (header_ipv6(vp, name, length, exact, var_len, write_method)	    == MATCH_FAILED) {	return NULL;    }#if defined(HAVE_SYS_SYSCTL_H) && defined(CTL_NET)    /* try with sysctl routines */    {	int name[] = { CTL_NET, PF_INET6, IPPROTO_IPV6, 0 };	const char *namestr = NULL;	int result;	int resultsiz;	resultsiz = sizeof(result);	switch (vp->magic) {	case IPV6FORWARDING:	    name[3] = IPV6CTL_FORWARDING;	    namestr = "IPV6CTL_FORWARDING";	    if (sysctl(name, sizeof(name)/sizeof(name[0]), &result, &resultsiz,		    0, 0) < 0) {		DEBUGP("sysctl(CTL_NET,PF_INET6,IPPROTO_IPV6,%s)\n", namestr);		break;	    } else {		if (result)		    long_return = 1; /* GATEWAY */		else		    long_return = 2; /* HOST */		    return (u_char *)&long_return;	    }	    break;	case IPV6DEFAULTHOPLIMIT:	    name[3] = IPV6CTL_DEFHLIM;	    namestr = "IPV6CTL_DEFHLIM";	    if (sysctl(name, sizeof(name)/sizeof(name[0]), &result, &resultsiz,		    0, 0) < 0) {		DEBUGP("sysctl(CTL_NET,PF_INET6,IPPROTO_IPV6,%s)\n", namestr);		break;	    } else {		long_return = result;		return (u_char *)&long_return;	    }	}    }#endif /* not (HAVE_SYS_SYSCTL_H && CTL_NET) */    /* try looking into the kernel variable */    switch (vp->magic) {#ifdef IPV6_FORWARDING_SYMBOL    case IPV6FORWARDING:	if (auto_nlist(IPV6_FORWARDING_SYMBOL, (char *)&i, sizeof(i))) {	    if (i)		long_return = 1;	/*GATEWAY*/	    else		long_return = 2;	/*HOST*/		return (u_char *)&long_return;	}	break;#endif#ifdef IPV6_DEFHLIM_SYMBOL    case IPV6DEFAULTHOPLIMIT:	if (auto_nlist(IPV6_DEFHLIM_SYMBOL, (char *)&i, sizeof(i))) {	    long_return = i;	    return (u_char *)&long_return;	}	break;#endif    case IPV6INTERFACES:#ifdef HAVE_IF_NAMEINDEX	/*	 * not really the right answer... we must count IPv6 capable	 * interfaces only.	 */	long_return = if_countifindex();	if (long_return < 0)	    break;	return (u_char *)&long_return;#endif	break;#if 0    case IPV6IFTBLLASTCHG:	long_return = 0;	/*XXX*/	return (u_char *)&long_return;#endif    default:	break;    }    ERROR_MSG("");    return NULL;}u_char *var_ifv6Entry(    register struct variable *vp,    oid *name,    size_t *length,    int exact,    size_t *var_len,    WriteMethod **write_method){#ifndef HAVE_IF_NAMEINDEX    return NULL;#else    int interface;    int max;    char *p;    max = if_maxifindex();    if (max < 0)	return NULL;    if (header_ipv6_scan(vp, name, length, exact, var_len, write_method, 1, max)	    == MATCH_FAILED) {	return NULL;    }    interface = name[*length - 1];    DEBUGP("interface: %d(%s)\n", interface, if_getname(interface));    if (interface > max)	return NULL;    switch (vp->magic) {    case IPV6IFDESCR:	p = if_getname(interface);	if (p) {	    *var_len = strlen(p);	    return p;	}	break;    case IPV6IFLOWLAYER:	/* should check if type, this is a hard one... */	*var_len = nullOidLen;	return (u_char *)nullOid;    case IPV6IFEFFECTMTU:      {#if defined(SIOCGIFMTU) && !defined(__OpenBSD__)	struct ifreq ifr;	int s;	memset(&ifr, 0, sizeof(ifr));	ifr.ifr_addr.sa_family = AF_INET6;	strncpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name));	if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)	    break;	if (ioctl(s, SIOCGIFMTU, (caddr_t)&ifr) < 0) {	    close(s);	    break;	}	long_return = ifr.ifr_mtu;	close(s);	return (u_char *)&long_return;#else	break;#endif      }#if 0 /*not yet*/    case IPV6IFREASMMAXSIZE:	/* I dunno what the spec means for this MIB */    case IPV6IFTOKEN:    case IPV6IFTOKENLEN:#endif    case IPV6IFPHYSADDRESS:      {	struct ifnet ifnet;	struct ifaddr ifaddr;	static struct sockaddr_dl sdl;	caddr_t ifa;	if (if_getifnet(interface, &ifnet) < 0)	    break;#if defined(__FreeBSD__) && 3 <= __FreeBSD__	ifa = (caddr_t)TAILQ_FIRST(&ifnet.if_addrhead);#else# if defined(__NetBSD__) || defined(__OpenBSD__)	ifa = (caddr_t)TAILQ_FIRST(&ifnet.if_addrlist);# else	ifa = (caddr_t)ifnet.if_addrlist;# endif#endif	while (ifa) {	    klookup((u_long)ifa, (char *)&ifaddr, sizeof(ifaddr));	    klookup((u_long)ifaddr.ifa_addr, (char *)&sdl, sizeof(sdl));	    if (sdl.sdl_family == AF_LINK) {		if (sizeof(sdl.sdl_data) < sdl.sdl_nlen + sdl.sdl_alen) {		    ERROR_MSG("sdl_alen too long for interface\n");		    break;		}		*var_len = sdl.sdl_alen;		return (u_char *)(sdl.sdl_data + sdl.sdl_nlen);	    }#if defined(__FreeBSD__) && 3 <= __FreeBSD__	    ifa = (caddr_t)TAILQ_NEXT(&ifaddr, ifa_link);#else# if defined(__NetBSD__) || defined(__OpenBSD__)	    ifa = (caddr_t)TAILQ_NEXT(&ifaddr, ifa_list);# else	    ifa = (caddr_t)ifaddr.ifa_next;# endif#endif	}	/* no physical address found */	*var_len = 0;	return NULL;      }    case IPV6IFADMSTATUS:      {	struct ifnet ifnet;	if (if_getifnet(interface, &ifnet) < 0)	    break;	long_return = (ifnet.if_flags & IFF_RUNNING) ? 1 : 2;	return (u_char *)&long_return;      }    case IPV6IFOPERSTATUS:      {	struct ifnet ifnet;	if (if_getifnet(interface, &ifnet) < 0)	    break;	long_return = (ifnet.if_flags & IFF_UP) ? 1 : 2;	return (u_char *)&long_return;      }#if 0 /*untrustable value returned...*/    case IPV6IFLASTCHANGE:      {	struct timeval lastchange;	struct timeval now;	int gotanswer;	gotanswer = 0;	lastchange.tv_sec = lastchange.tv_usec = 0;#ifdef HAVE_NET_IF_MIB_H	if (!gotanswer) {	    struct ifmibdata ifmd;	    if (if_getifmibdata(interface, &ifmd) < 0)		;	    else {		lastchange = ifmd.ifmd_data.ifi_lastchange;		gotanswer++;	    }	}#endif#ifdef STRUCT_IFNET_HAS_IF_LASTCHANGE_TV_SEC	if (!gotanswer) {	    struct ifnet ifnet;	    if (if_getifnet(interface, &ifnet) < 0)		;	    else {		lastchange = ifnet.if_lastchange;		gotanswer++;	    }	}#endif	DEBUGP("lastchange=%d %d\n", lastchange.tv_sec, lastchange.tv_usec);	if (lastchange.tv_sec == 0 && lastchange.tv_usec == 0)	    long_return = 0;	else {	    gettimeofday(&now, (struct timezone *)NULL);	    long_return = (u_long)((now.tv_sec - lastchange.tv_sec) * 100);	    long_return += (u_long)((now.tv_usec - lastchange.tv_usec) / 10000);	}	return (u_char *)&long_return;      }#endif /*0*/#ifdef SIOCGIFSTAT_IN6    case IPV6IFSTATSINRCVS:    case IPV6IFSTATSINHDRERRS:    case IPV6IFSTATSTOOBIGERRS:    case IPV6IFSTATSINNOROUTES:    case IPV6IFSTATSINADDRERRS:    case IPV6IFSTATSINUNKNOWPROTS:    case IPV6IFSTATSINTRUNCATPKTS:    case IPV6IFSTATSINDISCARDS:    case IPV6IFSTATSINDELIVERS:    case IPV6IFSTATSOUTFORWDATAS:    case IPV6IFSTATSOUTREQS:    case IPV6IFSTATSOUTDISCARDS:    case IPV6IFSTATSOUTFRAGOKS:    case IPV6IFSTATSOUTFRAGFAILS:    case IPV6IFSTATSOUTFRAGCREATS:    case IPV6IFSTATSOUTREASMREQS:    case IPV6IFSTATSOUTREASMOKS:    case IPV6IFSTATSOUTREASMFAILS:    case IPV6IFSTATSINMCASTPKTS:    case IPV6IFSTATSOUTMCASTPKTS:      {	struct in6_ifstat *ifs6;	struct in6_ifreq ifr;	int s;	memset(&ifr, 0, sizeof(ifr));	strncpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name));	if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)	    break;	if (ioctl(s, SIOCGIFSTAT_IN6, (caddr_t)&ifr) < 0) {	    extern int errno;	    close(s);	    break;	}	close(s);	ifs6 = &ifr.ifr_ifru.ifru_stat;	switch (vp->magic) {	case IPV6IFSTATSINRCVS:	    long_return = ifs6->ifs6_in_receive;	break;	case IPV6IFSTATSINHDRERRS:	    long_return = ifs6->ifs6_in_hdrerr;	break;	case IPV6IFSTATSTOOBIGERRS:	    long_return = ifs6->ifs6_in_toobig;	break;	case IPV6IFSTATSINNOROUTES:	    long_return = ifs6->ifs6_in_noroute;	break;	case IPV6IFSTATSINADDRERRS:	    long_return = ifs6->ifs6_in_addrerr;	break;	case IPV6IFSTATSINUNKNOWPROTS:	    long_return = ifs6->ifs6_in_protounknown;	break;	case IPV6IFSTATSINTRUNCATPKTS:	    long_return = ifs6->ifs6_in_truncated;	break;	case IPV6IFSTATSINDISCARDS:	    long_return = ifs6->ifs6_in_discard;	break;	case IPV6IFSTATSINDELIVERS:	    long_return = ifs6->ifs6_in_deliver;	break;	case IPV6IFSTATSOUTFORWDATAS:	    long_return = ifs6->ifs6_out_forward;	break;	case IPV6IFSTATSOUTREQS:	    long_return = ifs6->ifs6_out_request;	break;	case IPV6IFSTATSOUTDISCARDS:	    long_return = ifs6->ifs6_out_discard;	break;	case IPV6IFSTATSOUTFRAGOKS:	    long_return = ifs6->ifs6_out_fragok;	break;	case IPV6IFSTATSOUTFRAGFAILS:	    long_return = ifs6->ifs6_out_fragfail;	break;	case IPV6IFSTATSOUTFRAGCREATS:	    long_return = ifs6->ifs6_out_fragcreat;	break;	case IPV6IFSTATSOUTREASMREQS:	    long_return = ifs6->ifs6_reass_reqd;	break;	case IPV6IFSTATSOUTREASMOKS:	    long_return = ifs6->ifs6_reass_ok;	break;	case IPV6IFSTATSOUTREASMFAILS:	    long_return = ifs6->ifs6_reass_fail;	break;	case IPV6IFSTATSINMCASTPKTS:	    long_return = ifs6->ifs6_in_mcast;	break;	case IPV6IFSTATSOUTMCASTPKTS:	    long_return = ifs6->ifs6_out_mcast;	break;	default:	    return NULL;	}	return (u_char *)&long_return;      }#endif    default:	break;    }    return NULL;#endif}u_char *var_icmpv6Entry(    register struct variable *vp,    oid *name,    size_t *length,    int exact,    size_t *var_len,    WriteMethod **write_method){#ifndef HAVE_IF_NAMEINDEX    return NULL;#else    int interface;    int max;    char *p;    max = if_maxifindex();    if (max < 0)	return NULL;    if (header_ipv6_scan(vp, name, length, exact, var_len, write_method, 1, max)	    == MATCH_FAILED) {	return NULL;    }    interface = name[*length - 1];    DEBUGP("interface: %d(%s)\n", interface, if_getname(interface));    if (interface >= max)	return NULL;    switch (vp->magic) {#ifdef SIOCGIFSTAT_ICMP6    case IPV6IFICMPINMSG:    case IPV6IFICMPINERRORS:    case IPV6IFICMPINDSTUNRCHS:    case IPV6IFICMPINADMPROHS:    case IPV6IFICMPINTIMEXCDS:    case IPV6IFICMPINPARMPROBS:    case IPV6IFICMPINPKTTOOBIGS:    case IPV6IFICMPINECHOS:    case IPV6IFICMPINECHOREPS:    case IPV6IFICMPINRTRSLICITS:    case IPV6IFICMPINRTRADVS:    case IPV6IFICMPINNBRSLICITS:    case IPV6IFICMPINNBRADVS:    case IPV6IFICMPINREDIRECTS:    case IPV6IFICMPINGRPMEQERYS:    case IPV6IFICMPINGRPMERSPS:    case IPV6IFICMPINGRPMEREDCS:    case IPV6IFICMPOUTMSG:    case IPV6IFICMPOUTERRORS:    case IPV6IFICMPOUTDSTUNRCHS:    case IPV6IFICMPOUTADMPROHS:

⌨️ 快捷键说明

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