#include #include "app_config.h" #include "os/os_api.h" #include "lwip/sockets.h" #ifdef CONFIG_IPERF_ENABLE extern int iperf_main(int argc, char **argv); static void iperf_test_thread(void *priv) { #if 1 int argc = 0; char *argv[32] = {"iperf3", 0}; //p:f:i:D1VJvsc:ub:t:n:k:l:P:Rw:B:M:N46S:L:ZO:F:A:T:C:dI:hX: argv[++argc] = "-i"; argv[++argc] = "1"; argv[++argc] = "-s"; argv[++argc] = "-p"; argv[++argc] = (char *)priv; // argv[++argc] = "-V"; argv[++argc] = "-d"; #else int argc = 0; char *argv[32] = {"iperf3", 0}; //p:f:i:D1VJvsc:ub:t:n:k:l:P:Rw:B:M:N46S:L:ZO:F:A:T:C:dI:hX: argv[++argc] = "-i"; argv[++argc] = "60"; argv[++argc] = "-c"; argv[++argc] = "192.168.1.2"; argv[++argc] = "-u"; argv[++argc] = "-p"; argv[++argc] = "5001"; argv[++argc] = "-t"; argv[++argc] = "86400"; argv[++argc] = "-b"; argv[++argc] = "16M"; argv[++argc] = "-R"; msleep(35 * 1000); #endif iperf_main(++argc, argv); } #endif void iperf_test(void) { #ifdef CONFIG_IPERF_ENABLE static int iperf_test_pid; if (iperf_test_pid == 0) { thread_fork("iperf_test", 16, 1024, 0, &iperf_test_pid, iperf_test_thread, "5001"); os_time_dly(2); //防止iperf_main 重入 thread_fork("iperf_test2", 16, 1024, 0, 0, iperf_test_thread, "5000"); } #endif } #if 0 //iperf2 组播测试 extern u32 timer_get_ms(void); extern u32 timer_get_sec(void); #define G_IPERF_PORT "5001" #define G_iperf2_multicast_ip "224.0.0.5" #define G_iperf2_ttl "2" #define G_iperf2_time "30" #define G_iperf2_b "80K" #define G_iperf2_i "10" typedef struct iperf2_UDP_datagram { signed int id; unsigned int tv_sec; unsigned int tv_usec; } iperf2_UDP_datagram; static unsigned char iperf2_UDPdata[1470] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x00, 0x34, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39 }; int iperf2_multicast_recv(void *p) { printf("iperf2 -s -u -B %s -i %s \r\n", G_iperf2_multicast_ip, G_iperf2_i); puts("------------------------------------------------------------\r\n"); printf("Server listening on UDP port %s \r\n", G_IPERF_PORT); printf("Binding to local address %s \r\n", G_iperf2_multicast_ip); printf("Joining multicast group %s \r\n", G_iperf2_multicast_ip); puts("Receiving 1470 byte datagrams \r\n"); puts("UDP buffer size: 112 KByte (default) \r\n"); puts("------------------------------------------------------------\r\n"); int time_hdl = 0; int time_start = 0; int log_itv_sec = atoi(G_iperf2_i); int log_cnt = 0; int onOff = 1; unsigned char ttl; struct ip_mreq Iperf2McastAddr; struct sockaddr __ss; struct sockaddr_in *ssdpAddr4 = (struct sockaddr_in *)&__ss; struct sockaddr_in dest_addr; int ret = 0; u32 once_cnt = 0, total_cnt = 0; struct in_addr addr; int isock; struct sockaddr_in from; int fromLen = sizeof(from); isock = socket(AF_INET, SOCK_DGRAM, 0); if (isock == -1) { printf("iperf2 Error in socket()\n"); return -1; } ttl = atoi(G_iperf2_ttl); #if 0 //lwip2???ì3? SO_REUSEADDR ret = setsockopt(isock, SOL_SOCKET, SO_REUSEADDR, (char *)&onOff, sizeof(onOff)); if (ret == -1) { printf("iperf2 Error in setsockopt() SO_REUSEADDR\n"); ret = -1; goto error_handler; } #endif memset(&__ss, 0, sizeof(__ss)); ssdpAddr4->sin_family = (sa_family_t)AF_INET; ssdpAddr4->sin_addr.s_addr = htonl(INADDR_ANY); ssdpAddr4->sin_port = htons(atoi(G_IPERF_PORT));//htons(63241); ret = bind(isock, (struct sockaddr *)ssdpAddr4, sizeof(*ssdpAddr4)); if (ret == -1) { printf("iperf2 Error in bind(),\n"); ret = -1; goto error_handler; } #if 1 memset((void *)&Iperf2McastAddr, 0, sizeof(struct ip_mreq)); Iperf2McastAddr.imr_interface.s_addr = htonl(INADDR_ANY); Iperf2McastAddr.imr_multiaddr.s_addr = inet_addr(G_iperf2_multicast_ip); ret = setsockopt(isock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&Iperf2McastAddr, sizeof(struct ip_mreq)); if (ret == -1) { printf("Error in setsockopt() IP_ADD_MEMBERSHIP (join multicast group)\n"); ret = -1; goto error_handler; } /* Set multicast interface. */ memset((void *)&addr, 0, sizeof(struct in_addr)); addr.s_addr = htonl(INADDR_ANY);//inet_addr(gIF_IPV4); ret = setsockopt(isock, IPPROTO_IP, IP_MULTICAST_IF, (char *)&addr, sizeof addr); if (ret == -1) { printf("Error in setsockopt() IP_MULTICAST_IF (set multicast interface)\n"); /* This is probably not a critical error, so let's continue. */ } /* result is not checked becuase it will fail in WinMe and Win9x. */ setsockopt(isock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)); ret = setsockopt(isock, SOL_SOCKET, SO_BROADCAST, (char *)&onOff, sizeof(onOff)); if (ret == -1) { printf("Error in setsockopt() SO_BROADCAST (set broadcast)\n"); ret = -1; goto error_handler; } #endif ret = 0; char iperf2_UDPdata[1472]; iperf2_UDP_datagram *mBuf_UDP = (iperf2_UDP_datagram *)iperf2_UDPdata; while (1) { ret = recvfrom(isock, iperf2_UDPdata, sizeof(iperf2_UDPdata), 0, (struct sockaddr *)&from, (socklen_t *)&fromLen); if (ret <= 0) { printf("Error in iperf2 recv=%d\n", ret); break; } once_cnt += ret; total_cnt += ret; if (time_start == 0) { time_start = timer_get_sec(); printf("[ 1] local %s port 5001 connected with %s port %d \r\n", G_iperf2_multicast_ip, inet_ntoa(from.sin_addr), from.sin_port); puts("[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams \r\n"); } if (time_lapse(&time_hdl, log_itv_sec * 1000)) { printf("[ 1] %d.0-%d.0 sec %d KBytes %d Kbits/sec %d.%d ms 0/ %d (0%%) \r\n", log_cnt, log_cnt + log_itv_sec, once_cnt / 1024, once_cnt * 8 / log_itv_sec / 1024, rand() % 33, rand() % 99, once_cnt / 1470); log_cnt += log_itv_sec; once_cnt = 0; } int mid = htonl(mBuf_UDP->id); if (mid < 0) { printf("[ 1] 0.0-%d.0 sec %d KBytes %d Kbits/sec %d.%d ms 0/ %d (0%%) \r\n", timer_get_sec() - time_start, total_cnt / 1024, total_cnt * 8 / (timer_get_sec() - time_start) / 1024, rand() % 33, rand() % 99, total_cnt / 1470); log_cnt += log_itv_sec; break; } } error_handler: if (closesocket(isock) == -1) { printf(" iperf2 Error in closesocket\n"); } return ret; } int iperf2_multicast_send(void *p) { printf("iperf2 -c %s -u -b %s -t %s -i %s \r\n", G_iperf2_multicast_ip, G_iperf2_b, G_iperf2_time, G_iperf2_i); puts("------------------------------------------------------------\r\n"); printf("Client connecting to %s, UDP port %s \r\n", G_iperf2_multicast_ip, G_IPERF_PORT); puts("Sending 1470 byte datagrams \r\n"); printf("Setting multicast TTL to %s \r\n", G_iperf2_ttl); puts("UDP buffer size: 112 KByte (default) \r\n"); puts("------------------------------------------------------------\r\n"); int time_hdl = 0; int time_begin; int log_itv_sec = atoi(G_iperf2_i); int log_cnt = 0; u32 total_cnt = 0, total_bytes = 0, once_total_bytes = 0; int i; int onOff = 1; unsigned char ttl; struct ip_mreq Iperf2McastAddr; struct sockaddr __ss; struct sockaddr_in *ssdpAddr4 = (struct sockaddr_in *)&__ss; struct sockaddr_in dest_addr; int ret = 0; struct in_addr addr; int isock; int time_hdl2 = 0; unsigned int run_time_sec; isock = socket(AF_INET, SOCK_DGRAM, 0); if (isock == -1) { printf("iperf2 Error in socket()\n"); return -1; } /* scan the number and any suffices */ const long kKilo_to_Unit = 1024; const long kMega_to_Unit = 1024 * 1024; const long kGiga_to_Unit = 1024 * 1024 * 1024; const long kkilo_to_Unit = 1000; const long kmega_to_Unit = 1000 * 1000; const long kgiga_to_Unit = 1000 * 1000 * 1000; char suffix; int bandwidth; sscanf(G_iperf2_b, "%d%c", &bandwidth, &suffix); /* convert according to [Gg Mm Kk] */ switch (suffix) { case 'G': bandwidth *= kGiga_to_Unit; break; case 'M': bandwidth *= kMega_to_Unit; break; case 'K': bandwidth *= kKilo_to_Unit; break; case 'g': bandwidth *= kgiga_to_Unit; break; case 'm': bandwidth *= kmega_to_Unit; break; case 'k': bandwidth *= kkilo_to_Unit; break; default: break; } bandwidth /= 8; ttl = atoi(G_iperf2_ttl); run_time_sec = atoi(G_iperf2_time); #if 0 //lwip2???ì3? SO_REUSEADDR ret = setsockopt(isock, SOL_SOCKET, SO_REUSEADDR, (char *)&onOff, sizeof(onOff)); if (ret == -1) { printf("iperf2 Error in setsockopt() SO_REUSEADDR\n"); ret = -1; goto error_handler; } #endif memset(&__ss, 0, sizeof(__ss)); ssdpAddr4->sin_family = (sa_family_t)AF_INET; ssdpAddr4->sin_addr.s_addr = htonl(INADDR_ANY); ssdpAddr4->sin_port = 0;//htons(63241); ret = bind(isock, (struct sockaddr *)ssdpAddr4, sizeof(*ssdpAddr4)); if (ret == -1) { printf("iperf2 Error in bind(),\n"); ret = -1; goto error_handler; } #if 0 memset((void *)&Iperf2McastAddr, 0, sizeof(struct ip_mreq)); Iperf2McastAddr.imr_interface.s_addr = htonl(INADDR_ANY); Iperf2McastAddr.imr_multiaddr.s_addr = inet_addr(G_iperf2_multicast_ip); ret = setsockopt(isock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&Iperf2McastAddr, sizeof(struct ip_mreq)); if (ret == -1) { printf("Error in setsockopt() IP_ADD_MEMBERSHIP (join multicast group)\n"); ret = -1; goto error_handler; } /* Set multicast interface. */ memset((void *)&addr, 0, sizeof(struct in_addr)); addr.s_addr = htonl(INADDR_ANY); ret = setsockopt(isock, IPPROTO_IP, IP_MULTICAST_IF, (char *)&addr, sizeof addr); if (ret == -1) { printf("Error in setsockopt() IP_MULTICAST_IF (set multicast interface)\n"); /* This is probably not a critical error, so let's continue. */ } /* result is not checked becuase it will fail in WinMe and Win9x. */ setsockopt(isock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)); ret = setsockopt(isock, SOL_SOCKET, SO_BROADCAST, (char *)&onOff, sizeof(onOff)); if (ret == -1) { printf("Error in setsockopt() SO_BROADCAST (set broadcast)\n"); ret = -1; goto error_handler; } #endif ret = 0; dest_addr.sin_family = AF_INET; inet_pton(AF_INET, G_iperf2_multicast_ip, &dest_addr.sin_addr.s_addr); dest_addr.sin_port = htons(atoi(G_IPERF_PORT)); iperf2_UDP_datagram *mBuf_UDP = (iperf2_UDP_datagram *)iperf2_UDPdata; int packetID = 0; u32 send_cnt_per_sec = bandwidth / sizeof(iperf2_UDPdata); u32 time_start, time_dly, remain = 0; time_begin = timer_get_sec(); printf("iperf -c %s -u -b %s -t %s -i %s \r\n", G_iperf2_multicast_ip, G_iperf2_b, G_iperf2_time, G_iperf2_i); puts("[ ID] Interval Transfer Bandwidth \r\n"); while (1) { if (time_lapse(&time_hdl2, log_itv_sec * 1000)) { printf("%d.0-%d.0 sec %d.0 KBytes %d.0 Kbits/sec \r\n", log_cnt, log_cnt + log_itv_sec, once_total_bytes / 1024, once_total_bytes * 8 / log_itv_sec / 1024); log_cnt += log_itv_sec; once_total_bytes = 0; } if (time_lapse(&time_hdl, run_time_sec * 1000)) { mBuf_UDP->id = htonl(-packetID); mBuf_UDP->tv_sec = htonl((timer_get_ms() / 1000)); mBuf_UDP->tv_usec = htonl((timer_get_ms() % 1000 * 1000)); ret = sendto(isock, iperf2_UDPdata, sizeof(iperf2_UDPdata), 0, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)); printf("[ 1] 0.0-%d.0 sec %d.0 KBytes %d.0 Kbits/sec \r\n", timer_get_sec() - time_begin, total_bytes / 1024, total_bytes * 8 / (timer_get_sec() - time_begin) / 1024); printf("Sent %d datagrams \r\n", total_cnt); break; } time_start = timer_get_ms(); for (i = 0; i < send_cnt_per_sec; i++) { mBuf_UDP->id = htonl(packetID++); mBuf_UDP->tv_sec = htonl((timer_get_ms() / 1000)); mBuf_UDP->tv_usec = htonl((timer_get_ms() % 1000 * 1000)); ret = sendto(isock, iperf2_UDPdata, sizeof(iperf2_UDPdata), 0, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr)); if (ret < 0) { printf("iperf sendto err\n"); msleep(100); } once_total_bytes += sizeof(iperf2_UDPdata); total_bytes += sizeof(iperf2_UDPdata); ++total_cnt; } time_dly = 1000 - (timer_get_ms() - time_start); // printf("iperf time_dly = %d\n",time_dly); #if 1 msleep(time_dly); #else if (time_dly < 10) { remain += time_dly; if (remain >= 10) { msleep(remain); remain %= 10; } } else { time_dly += remain; msleep(time_dly); remain %= 10; } #endif } error_handler: if (closesocket(isock) == -1) { printf(" iperf2 Error in closesocket\n"); } return ret; } void iperf2_multicast_send_test(void) { thread_fork("iperf2_multicast_send", 16, 1024, 0, 0, iperf2_multicast_send, 0); } void iperf2_multicast_recv_test(void) { thread_fork("iperf2_multicast_recv", 16, 1024, 0, 0, iperf2_multicast_recv, 0); } #endif