static int cmd_ipconfig_show(struct vmm_chardev *cdev, int argc, char **argv) { u8 buf[4]; char str[30]; char *p; vmm_cprintf(cdev, "Network stack Configuration:\n"); p = netstack_get_name(); vmm_cprintf(cdev, " TCP/IP stack name : %s\n", p); netstack_get_ipaddr(buf); p = ip4addr_to_str(str, buf); vmm_cprintf(cdev, " IP address : %s\n", p); netstack_get_ipmask(buf); p = ip4addr_to_str(str, buf); vmm_cprintf(cdev, " IP netmask : %s\n", p); netstack_get_gatewayip(buf); p = ip4addr_to_str(str, buf); vmm_cprintf(cdev, " Gateway IP address : %s\n", p); netstack_get_hwaddr(buf); p = ethaddr_to_str(str, buf); vmm_cprintf(cdev, " HW address : %s\n", p); return VMM_OK; }
static int cmd_ping_exec(struct vmm_chardev *cdev, int argc, char **argv) { u16 sent, rcvd, count = 1, size = 56; struct netstack_echo_reply reply; char ip_addr_str[20]; u32 rtt_usecs, rtt_msecs; u64 min_rtt = -1, max_rtt = 0, avg_rtt = 0; u8 ipaddr[4]; if((argc < 2) || (argc > 4)) { cmd_ping_usage(cdev); return VMM_EFAIL; } if(argc > 2) { count = atoi(argv[2]); } if(argc > 3) { size = atoi(argv[3]); } str2ipaddr(ipaddr, argv[1]); vmm_cprintf(cdev, "PING (%s) %d(%d) bytes of data.\n", argv[1], size, (size + IP4_HLEN + ICMP_HLEN)); netstack_prefetch_arp_mapping(ipaddr); for(sent=0, rcvd=0; sent<count; sent++) { if (!netstack_send_echo(ipaddr, size, sent, &reply)) { if (reply.rtt < min_rtt) min_rtt = reply.rtt; if (reply.rtt > max_rtt) max_rtt = reply.rtt; avg_rtt += reply.rtt; rtt_msecs = udiv64(reply.rtt, 1000); rtt_usecs = umod64(reply.rtt, 1000); ip4addr_to_str(ip_addr_str, (const u8 *)&reply.ripaddr); vmm_cprintf(cdev, "%d bytes from %s: seq=%d " "ttl=%d time=%d.%03dms\n", reply.len, ip_addr_str, reply.seqno, reply.ttl, rtt_msecs, rtt_usecs); rcvd++; } } if (min_rtt == -1) { min_rtt = 0; } if (rcvd) { avg_rtt = udiv64(avg_rtt, rcvd); } else { avg_rtt = 0; } vmm_cprintf(cdev, "\n----- %s ping statistics -----\n", argv[1]); vmm_cprintf(cdev, "%d packets transmitted, %d packets received\n", sent, rcvd); vmm_cprintf(cdev, "round-trip min/avg/max = "); rtt_msecs = udiv64(min_rtt, 1000); rtt_usecs = umod64(min_rtt, 1000); vmm_cprintf(cdev, "%d.%03d/", rtt_msecs, rtt_usecs); rtt_msecs = udiv64(avg_rtt, 1000); rtt_usecs = umod64(avg_rtt, 1000); vmm_cprintf(cdev, "%d.%03d/", rtt_msecs, rtt_usecs); rtt_msecs = udiv64(max_rtt, 1000); rtt_usecs = umod64(max_rtt, 1000); vmm_cprintf(cdev, "%d.%03d ms\n", rtt_msecs, rtt_usecs); return VMM_OK; }