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

📄 ipv6.c

📁 非常不错的网管开发包
💻 C
📖 第 1 页 / 共 4 页
字号:
#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 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;#endif}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*//*------------------------------------------------------------*//* IPv6 stack dependent part */#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_maxifindex();	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:

⌨️ 快捷键说明

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