533 lines
23 KiB
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
|
|
|