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

📄 ipv6.c

📁 ucd-snmp源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
    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;}#ifdef TCP6u_char *var_tcp6(    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, tcb6;    struct tcp6cb tcp6cb;    int found, hitnext;    static int tcp6statemap[TCP6_NSTATES];    static int initialized = 0;#if defined(__FreeBSD__) && __FreeBSD__ >= 3    char *sysctl_buf;    struct xinpgen *xig, *oxig;#endif /* defined(__FreeBSD__) && __FreeBSD__ >= 3 */    if (!initialized) {	tcp6statemap[TCP6S_CLOSED] = 1;	tcp6statemap[TCP6S_LISTEN] = 2;	tcp6statemap[TCP6S_SYN_SENT] = 3;	tcp6statemap[TCP6S_SYN_RECEIVED] = 4;	tcp6statemap[TCP6S_ESTABLISHED] = 5;	tcp6statemap[TCP6S_CLOSE_WAIT] = 8;	tcp6statemap[TCP6S_FIN_WAIT_1] = 6;	tcp6statemap[TCP6S_CLOSING] = 10;	tcp6statemap[TCP6S_LAST_ACK] = 9;	tcp6statemap[TCP6S_FIN_WAIT_2] = 7;	tcp6statemap[TCP6S_TIME_WAIT] = 11;	initialized++;    }    DEBUGMSGTL(("mibII/ipv6", "var_tcp6: "));    DEBUGMSGOID(("mibII/ipv6", name, *length));    DEBUGMSG(("mibII/ipv6"," %d\n", exact));#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3)    if (!auto_nlist("tcb6", (char *)&tcb6, sizeof(tcb6)))	return NULL;    p = (caddr_t)tcb6.in6p_next;#else    {	const char *tcblist = "net.inet.tcp.pcblist";	int len;	if (sysctlbyname(tcblist, 0, &len, 0, 0) < 0)	    return NULL;	if ((sysctl_buf = malloc(len)) == NULL)	    return NULL;	if (sysctlbyname(tcblist, 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));    while(#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3)	  p && (u_long)p != auto_nlist_value("tcb6")#else	  xig->xig_len > sizeof(struct xinpgen)#endif	  ) {	DEBUGP("looping: p=%x\n", p);#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3)	if (klookup((u_long)p, (char *)&in6pcb, sizeof(in6pcb)) < 0) {	    DEBUGP("klookup fail for in6pcb at %x\n", p);	    break;        }#else	in6pcb = ((struct xinpcb *)xig)->xi_inp;#endif	if (klookup((u_long)in6pcb.in6p_ppcb, (char *)&tcp6cb, sizeof(tcp6cb))		< 0) {	    DEBUGP("klookup fail for tcp6cb at %x\n", in6pcb.in6p_ppcb);	    break;        }	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);	for (i = 0; i < sizeof(struct in6_addr); i++)	    newname[j++] = in6pcb.in6p_faddr.s6_addr[i];	newname[j++] = ntohs(in6pcb.in6p_fport);	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*/	newname[j++] = tcp6statemap[tcp6cb.t_state];    DEBUGMSGTL(("mibII/ipv6", "var_tcp6 newname: "));    DEBUGMSGOID(("mibII/ipv6", newname, *length));    DEBUGMSG(("mibII/ipv6", "\nvar_tcp6 oldname: "));    DEBUGMSGOID(("mibII/ipv6", name, *length));    DEBUGMSG(("mibII/ipv6"," %d\n", exact));#if 1	/* this is very odd but sometimes happen, and cause infinite loop */	if (ntohs(in6pcb.in6p_lport) == 0)		goto skip;#endif	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 TCP6 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 TCP6 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;		}	    }	}skip:#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    DEBUGP("found=%d\n", found);    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 */    DEBUGP("magic=%d\n", vp->magic);    switch (vp->magic) {    case IPV6TCPLOCALADDR:	*var_len = sizeof(struct in6_addr);	return (u_char *)&in6pcb.in6p_laddr.s6_addr[0];    case IPV6TCPLOCALPORT:	long_return = ntohs(in6pcb.in6p_lport);	return (u_char *)&long_return;    case IPV6TCPREMOTEADDR:	*var_len = sizeof(struct in6_addr);	return (u_char *)&in6pcb.in6p_faddr.s6_addr[0];    case IPV6TCPREMOTEPORT:	long_return = ntohs(in6pcb.in6p_fport);	return (u_char *)&long_return;    case IPV6TCPIFINDEX:	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;    case IPV6TCPCONNSTATE:	long_return = tcp6statemap[tcp6cb.t_state];	return (u_char *)&long_return;    default:	break;    }    ERROR_MSG("");    return NULL;}#elseu_char *var_tcp6(    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, tcb6;    struct tcpcb tcpcb;    int found, hitnext;    static int tcpstatemap[TCP_NSTATES];    static int initialized = 0;#if defined(__FreeBSD__) && __FreeBSD__ >= 3

⌨️ 快捷键说明

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