doubao_chat/apps/common/net/iperf_test.c

533 lines
23 KiB
C

#include <stdlib.h>
#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