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

📄 ipv6.c

📁 非常不错的网管开发包
💻 C
📖 第 1 页 / 共 4 页
字号:
    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:    case IPV6IFICMPOUTTIMEXCDS:    case IPV6IFICMPOUTPARMPROBS:    case IPV6IFICMPOUTPKTTOOBIGS:    case IPV6IFICMPOUTECHOS:    case IPV6IFICMPOUTECHOREPS:    case IPV6IFICMPOUTRTRSLICITS:    case IPV6IFICMPOUTRTRADVS:    case IPV6IFICMPOUTNBRSLICITS:    case IPV6IFICMPOUTNBRADVS:    case IPV6IFICMPOUTREDIRECTS:    case IPV6IFICMPOUTGRPMEQERYS:    case IPV6IFICMPOUTGRPMERSPS:    case IPV6IFICMPOUTGRPMEREDCS:      {	struct icmp6_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_ICMP6, (caddr_t)&ifr) < 0) {	    extern int errno;	    close(s);	    break;	}	close(s);	ifs6 = &ifr.ifr_ifru.ifru_icmp6stat;	switch (vp->magic) {	case IPV6IFICMPINMSG:	    long_return = ifs6->ifs6_in_msg;		break;	case IPV6IFICMPINERRORS:	    long_return = ifs6->ifs6_in_error;		break;	case IPV6IFICMPINDSTUNRCHS:	    long_return = ifs6->ifs6_in_dstunreach;	break;	case IPV6IFICMPINADMPROHS:	    long_return = ifs6->ifs6_in_adminprohib;	break;	case IPV6IFICMPINTIMEXCDS:	    long_return = ifs6->ifs6_in_timeexceed;	break;	case IPV6IFICMPINPARMPROBS:	    long_return = ifs6->ifs6_in_paramprob;	break;	case IPV6IFICMPINPKTTOOBIGS:	    long_return = ifs6->ifs6_in_pkttoobig;	break;	case IPV6IFICMPINECHOS:	    long_return = ifs6->ifs6_in_echo;		break;	case IPV6IFICMPINECHOREPS:	    long_return = ifs6->ifs6_in_echoreply;	break;	case IPV6IFICMPINRTRSLICITS:	    long_return = ifs6->ifs6_in_routersolicit;	break;	case IPV6IFICMPINRTRADVS:	    long_return = ifs6->ifs6_in_routeradvert;	break;	case IPV6IFICMPINNBRSLICITS:	    long_return = ifs6->ifs6_in_neighborsolicit; break;	case IPV6IFICMPINNBRADVS:	    long_return = ifs6->ifs6_in_neighboradvert;	break;	case IPV6IFICMPINREDIRECTS:	    long_return = ifs6->ifs6_in_redirect;	break;	case IPV6IFICMPINGRPMEQERYS:	    long_return = ifs6->ifs6_in_mldquery;	break;	case IPV6IFICMPINGRPMERSPS:	    long_return = ifs6->ifs6_in_mldreport;	break;	case IPV6IFICMPINGRPMEREDCS:	    long_return = ifs6->ifs6_in_mlddone;	break;	case IPV6IFICMPOUTMSG:	    long_return = ifs6->ifs6_out_msg;		break;	case IPV6IFICMPOUTERRORS:	    long_return = ifs6->ifs6_out_error;		break;	case IPV6IFICMPOUTDSTUNRCHS:	    long_return = ifs6->ifs6_out_dstunreach;	break;	case IPV6IFICMPOUTADMPROHS:	    long_return = ifs6->ifs6_out_adminprohib;	break;	case IPV6IFICMPOUTTIMEXCDS:	    long_return = ifs6->ifs6_out_timeexceed;	break;	case IPV6IFICMPOUTPARMPROBS:	    long_return = ifs6->ifs6_out_paramprob;	break;	case IPV6IFICMPOUTPKTTOOBIGS:	    long_return = ifs6->ifs6_out_pkttoobig;	break;	case IPV6IFICMPOUTECHOS:	    long_return = ifs6->ifs6_out_echo;		break;	case IPV6IFICMPOUTECHOREPS:	    long_return = ifs6->ifs6_out_echoreply;	break;	case IPV6IFICMPOUTRTRSLICITS:	    long_return = ifs6->ifs6_out_routersolicit;	break;	case IPV6IFICMPOUTRTRADVS:	    long_return = ifs6->ifs6_out_routeradvert;	break;	case IPV6IFICMPOUTNBRSLICITS:	    long_return = ifs6->ifs6_out_neighborsolicit; break;	case IPV6IFICMPOUTNBRADVS:	    long_return = ifs6->ifs6_out_neighboradvert; break;	case IPV6IFICMPOUTREDIRECTS:	    long_return = ifs6->ifs6_out_redirect;	break;	case IPV6IFICMPOUTGRPMEQERYS:	    long_return = ifs6->ifs6_out_mldquery;	break;	case IPV6IFICMPOUTGRPMERSPS:	    long_return = ifs6->ifs6_out_mldreport;	break;	case IPV6IFICMPOUTGRPMEREDCS:	    long_return = ifs6->ifs6_out_mlddone;	break;	default:	    return NULL;	}	return (u_char *)&long_return;      }#endif    default:	break;    }    return NULL;#endif}u_char *var_udp6(    register struct variable *vp,    oid *name,    size_t *length,    int exact,    size_t *var_len,    WriteMethod **write_method){    oid newname[MAX_OID_LEN];    oid tmp1[MAX_OID_LEN], tmp2[MAX_OID_LEN];    int result;    int i, j;    caddr_t p;    static struct in6pcb in6pcb, udb6;    int found, hitnext;#if defined(__FreeBSD__) && __FreeBSD__ >= 3    char *sysctl_buf;    struct xinpgen *xig, *oxig;#endif /* defined(__FreeBSD__) && __FreeBSD__ >= 3 */    DEBUGMSGTL(("mibII/ipv6", "var_udp6: "));    DEBUGMSGOID(("mibII/ipv6", name, *length));    DEBUGMSG(("mibII/ipv6"," %d\n", exact));#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3)    if (!auto_nlist("udb6", (char *)&udb6, sizeof(udb6)))	return NULL;    p = (caddr_t)udb6.in6p_next;#else    {	const char *udblist = "net.inet.udp.pcblist";	int len;	if (sysctlbyname(udblist, 0, &len, 0, 0) < 0)	    return NULL;	if ((sysctl_buf = malloc(len)) == NULL)	    return NULL;	if (sysctlbyname(udblist, sysctl_buf, &len, 0, 0) < 0) {	    free(sysctl_buf);	    return NULL;	}	oxig = (struct xinpgen *)sysctl_buf;	xig = (struct xinpgen *)((char *)oxig + oxig->xig_len);    }#endif    found = hitnext = 0;    memcpy((char *)newname, (char *)vp->name, (int)vp->namelen * sizeof(oid));    DEBUGP("start: p=%x\n", p);    while (#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3)	   p && (u_long)p != auto_nlist_value("udb6")#else	   xig->xig_len > sizeof(struct xinpgen)#endif	   ) {	DEBUGP("looping: p=%x\n", p);#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3)	klookup((u_long)p, (char *)&in6pcb, sizeof(in6pcb));#else	in6pcb = ((struct xinpcb *)xig)->xi_inp;#endif	j = (int)vp->namelen;	for (i = 0; i < sizeof(struct in6_addr); i++)	    newname[j++] = in6pcb.in6p_laddr.s6_addr[i];	newname[j++] = ntohs(in6pcb.in6p_lport);	if (IN6_IS_ADDR_LINKLOCAL(&in6pcb.in6p_laddr))	    newname[j++] = ntohs(*(u_int16_t *)&in6pcb.in6p_laddr.s6_addr[2]);	else	    newname[j++] = 0;	/*XXX*/    DEBUGMSGTL(("mibII/ipv6", "var_udp6 new: %d %d ", (int)vp->namelen, j));    DEBUGMSGOID(("mibII/ipv6", newname, j));    DEBUGMSG(("mibII/ipv6"," %d\n", exact));	if (exact) {	    result = snmp_oid_compare(name, *length, newname, j);	    if (result == 0) {		found++;		break;	    }	} else {	    /*	     * tcb entries may not be ordered as SNMP scanning code expect.	     * Therefore, we'll do a guess...	     * 1. "name" has the previously matched entry.	     *    If "name" is UDP6 MIBs, take the item that is right next	     *    to the item exactly matches to "name".	     * 2. Otherwise, it is the very first time we entered to UDP6 MIBs.	     */	    memcpy(tmp1, name, vp->namelen * sizeof(oid));	    memcpy(tmp2, newname, vp->namelen * sizeof(oid));	    tmp1[vp->namelen] = 0;	    tmp2[vp->namelen] = 0;	    if (*length == j	     && snmp_oid_compare(tmp1, vp->namelen, tmp2, vp->namelen) == 0) {		if (!hitnext) {		    result = snmp_oid_compare(name, *length, newname, j);		    if (result == 0)			hitnext++;		} else {		    found++;		    break;		}	    } else {		if (snmp_oid_compare(name, *length, newname, j) < 0) {		    found++;		    break;		}	    }	}#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3)	p = (caddr_t)in6pcb.in6p_next;#else	xig = (struct xinpgen *)((char *)xig + xig->xig_len);#endif    }#if defined(__FreeBSD__) && __FreeBSD__ >= 3    free(sysctl_buf);#endif /* defined(__FreeBSD__) && __FreeBSD__ >= 3 */    if (!found)	return NULL;    *length = j;    memcpy((char *)name, (char *)newname, *length * sizeof(oid));    *write_method = 0;    *var_len = sizeof(long);	/* default to 'long' results */    /* try looking into the kernel variable */    switch (vp->magic) {    case IPV6UDPLOCALADDRESS:	*var_len = sizeof(struct in6_addr);	return in6pcb.in6p_laddr.s6_addr;    case IPV6UDPLOCALPORT:	long_return = ntohs(in6pcb.in6p_lport);	return (u_char *)&long_return;    case IPV6UDPIFINDEX:	if (IN6_IS_ADDR_LINKLOCAL(&in6pcb.in6p_laddr))	    long_return = ntohs(*(u_int16_t *)&in6pcb.in6p_laddr.s6_addr[2]);	else	    long_return = 0;	/*XXX*/	return (u_char *)&long_return;    default:	break;    }    ERROR_MSG("");    return NULL;}

⌨️ 快捷键说明

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