Beispiel #1
0
int arpResolve(pcs *pc, u_int ip, u_char *dmac)
{
	int i, c;
	struct packet *m;
	int waittime = 1000;
	struct timeval tv;
		
	c = 0;

	for (i = 0; i < POOL_SIZE; i++) {
		if (pc->ipmac4[i].ip == ip && 
		    (time_tick - pc->ipmac4[i].timeout) <= 120 &&
		    !etherIsZero(pc->ipmac4[i].mac)) {
			memcpy(dmac, pc->ipmac4[i].mac, ETH_ALEN);
			return 1;
		}
	}

	while (c++ < 3){
		m = arp(pc, ip);
		if (m == NULL) {
			printf("out of memory\n");
			return 0;
		}
		enq(&pc->oq, m);
		gettimeofday(&(tv), (void*)0);
		while (!timeout(tv, waittime)) {
			delay_ms(1);
			for (i = 0; i < POOL_SIZE; i++) {
				if (pc->ipmac4[i].ip == ip && 
				    (time_tick - pc->ipmac4[i].timeout) <= 120 &&
				    !etherIsZero(pc->ipmac4[i].mac)) {
					memcpy(dmac, pc->ipmac4[i].mac, ETH_ALEN);
					return 1;
				}
			}	
		}
	}
	return 0;
}
Beispiel #2
0
int show_ipv6(int argc, char **argv)
{
	int i, j, k;
	char buf[128];
	char buf6[INET6_ADDRSTRLEN + 1];
	struct in6_addr ipaddr;
	struct in_addr in;
	int off1, off2, off3;
	int max6 = 0;
	int id = -1;
	
	printf("\n");
	if (argc == 3) {
		if (!strncmp(argv[2], "all", strlen(argv[2]))) {
			for (i = 0; i < num_pths; i++) {
				if (vpc[i].ip6.ip.addr32[0] != 0 || vpc[i].ip6.ip.addr32[1] != 0 || 
				    vpc[i].ip6.ip.addr32[2] != 0 || vpc[i].ip6.ip.addr32[3] != 0) {
					memset(buf6, 0, INET6_ADDRSTRLEN + 1);
					
					memcpy(ipaddr.s6_addr, vpc[i].ip6.ip.addr8, 16);
					vinet_ntop6(AF_INET6, &ipaddr, buf6, INET6_ADDRSTRLEN + 1);
		
					j = sprintf(buf, "%s/%d", buf6, vpc[i].ip6.cidr);
					if (j > max6)
						max6 = j;
				}
			}
	
			memset(buf, 0, sizeof(buf));
			memset(buf, ' ', sizeof(buf) - 1);
			off1 = 7;
			off2 = off1 + max6 + 2;
			off3 = off2 + 17 + 2;
			
			j = sprintf(buf, "NAME");
			buf[j] = ' ';
			j = sprintf(buf + off1, "IP/MASK");
			buf[j + off1] = ' ';
			j = sprintf(buf + off2, "ROUTER LINK-LAYER");
			buf[j + off2] = ' ';
			j = sprintf(buf + off3, "MTU");
			printf("%s\n", buf);

			for (i = 0; i < num_pths; i++) {
				memset(buf, 0, sizeof(buf));
				memset(buf, ' ', sizeof(buf) - 1);
				if (strcmp(vpc[i].xname, "VPCS")== 0)
					j = sprintf(buf, "%s%d", vpc[i].xname, i + 1);
				else
					j = sprintf(buf, "%s", vpc[i].xname);
				buf[j] = ' ';
						
				memset(buf6, 0, INET6_ADDRSTRLEN + 1);
				memcpy(ipaddr.s6_addr, vpc[i].link6.ip.addr8, 16);
				vinet_ntop6(AF_INET6, &ipaddr, buf6, INET6_ADDRSTRLEN + 1);
				sprintf(buf + 7, "%s/%d", buf6, vpc[i].link6.cidr); 
				j = printf("%s", buf);
				
				if (vpc[i].ip6.ip.addr32[0] != 0 || vpc[i].ip6.ip.addr32[1] != 0 || 
				    vpc[i].ip6.ip.addr32[2] != 0 || vpc[i].ip6.ip.addr32[3] != 0) {	
					memset(buf6, 0, INET6_ADDRSTRLEN + 1);
					
					memcpy(ipaddr.s6_addr, vpc[i].ip6.ip.addr8, 16);
					vinet_ntop6(AF_INET6, &ipaddr, buf6, INET6_ADDRSTRLEN + 1);
			
					printf("\n");
					for (k = 0; k < off1; k++)
						printf(" ");
					j = printf("%s/%d", buf6, vpc[i].ip6.cidr);
					j += off1;
					
				}
				for (k = j; k < off2; k++)
					printf(" ");
				
				if (etherIsZero(vpc[i].ip6.gmac)) {
					j = sprintf(buf, "                 ");
				} else {
					j = 0;
					for (k = 0; k < 6; k++)
						j += sprintf(buf + k * 3, "%2.2x:", vpc[i].ip6.gmac[k]);
					
				}
				buf[j - 1] = ' ';
				if (vpc[i].ip6.mtu)
					j += sprintf(buf + j, " %4.4d", vpc[i].ip6.mtu);
				else
					j += sprintf(buf + j, "     ");
				//buf[j] = ' ';
				printf("%s\n", buf);
			}
			return 1;
		}
		if (strlen(argv[2]) == 1 && digitstring(argv[2])){
			id = argv[2][0] - '1';
		}	
	} else if (argc == 2)
		id = pcid;
	
	if (id != -1) {
		printf("NAME              : %s[%d]\n", vpc[id].xname, id + 1);
		
		printf("LINK-LOCAL SCOPE  : ");
		memset(buf6, 0, INET6_ADDRSTRLEN + 1);
		memcpy(ipaddr.s6_addr, vpc[id].link6.ip.addr8, 16);
		vinet_ntop6(AF_INET6, &ipaddr, buf6, INET6_ADDRSTRLEN + 1);
		printf("%s/%d\n", buf6, vpc[id].link6.cidr); 
		
		printf("GLOBAL SCOPE      : ");
		
		if (vpc[id].ip6.ip.addr32[0] != 0 || vpc[id].ip6.ip.addr32[1] != 0 || 
		    vpc[id].ip6.ip.addr32[2] != 0 || vpc[id].ip6.ip.addr32[3] != 0) {	
			memset(buf6, 0, INET6_ADDRSTRLEN + 1);
			memcpy(ipaddr.s6_addr, vpc[id].ip6.ip.addr8, 16);
			vinet_ntop6(AF_INET6, &ipaddr, buf6, INET6_ADDRSTRLEN + 1);
			printf("%s/%d", buf6, vpc[id].ip6.cidr);
		}
		printf("\n");		
		printf("ROUTER LINK-LAYER : ");
		if (!etherIsZero(vpc[id].ip6.gmac)) 
			PRINT_MAC(vpc[id].ip6.gmac);
		printf("\n");
		printf("MAC               : ");
		PRINT_MAC(vpc[id].ip4.mac);
		printf("\n");
		printf("LPORT             : %d\n", vpc[id].lport);
		in.s_addr = vpc[id].rhost;
		printf("RHOST:PORT        : %s:%d\n", inet_ntoa(in), vpc[id].rport);
		printf("MTU:              : ");
		if (vpc[id].ip6.mtu)
			printf("%d", vpc[id].ip6.mtu);
		printf("\n");
		return 1;
	}

	argv[argc - 1 ] = "?";
	help_show(argc, argv);

	return 1;
}