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; }
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; }