mirror of
https://github.com/xushoucai/RTL8710_SDK_GCC_VERSION.git
synced 2025-07-31 20:21:04 +00:00
GCC SDK RTL8710 basic version (including the window platform cygwin installation and Ubuntu platform Linux Installation routines),
including cross compilation of the installation, compile, link, run, debug, and so on. SDK implementation of the function: 1, WiFi connection settings (including AP mode and STA mode). 2, peripheral resource control (including GPIO, SPI, UART, IIC, etc.). 3, the user uses the sample method.
This commit is contained in:
parent
36b1b0dcd9
commit
1d3357d3b0
2094 changed files with 779991 additions and 0 deletions
928
component/common/utilities/tcptest.c
Normal file
928
component/common/utilities/tcptest.c
Normal file
|
|
@ -0,0 +1,928 @@
|
|||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "main.h"
|
||||
|
||||
#include <lwip/sockets.h>
|
||||
#include <lwip/raw.h>
|
||||
#include <lwip/icmp.h>
|
||||
#include <lwip/inet_chksum.h>
|
||||
#include <platform/platform_stdlib.h>
|
||||
|
||||
#define PER_SECOND_REPORT 1
|
||||
#define BSD_STACK_SIZE 2048
|
||||
#define DEFAULT_PORT 5001
|
||||
#define DEFAULT_TIME 10
|
||||
#define SERVER_BUF_SIZE 1500
|
||||
#define CLIENT_BUF_SIZE 1460
|
||||
#define KB 1024
|
||||
#define MB 1048576//1024*1024
|
||||
#define DEFAULT_TCP_BANDWIDTH 131072 //128*1024Bytes = 1Mbits
|
||||
#define DEFAULT_UDP_BANDWIDTH 131072 //128*1024Bytes = 1Mbits
|
||||
#define DEFAULT_UDP_TOS_VALUE 96 // BE=96
|
||||
|
||||
|
||||
struct iperf_data_t{
|
||||
char server_ip[16];
|
||||
int server_fd;
|
||||
int client_fd;
|
||||
uint16_t port;
|
||||
unsigned char start;
|
||||
unsigned int buf_size;
|
||||
uint32_t time;
|
||||
uint64_t total_size;
|
||||
uint64_t bandwidth;
|
||||
uint8_t tos_value;
|
||||
};
|
||||
|
||||
struct iperf_data_t tcp_server_data,tcp_client_data,udp_server_data,udp_client_data;
|
||||
|
||||
xTaskHandle g_tcp_server_task = NULL;
|
||||
xTaskHandle g_tcp_client_task = NULL;
|
||||
xTaskHandle g_udp_client_task = NULL;
|
||||
xTaskHandle g_udp_server_task = NULL;
|
||||
unsigned char g_tcp_terminate = 0;
|
||||
unsigned char g_udp_terminate = 0;
|
||||
|
||||
int tcp_client_func(struct iperf_data_t iperf_data)
|
||||
{
|
||||
struct sockaddr_in ser_addr;
|
||||
char *buffer = NULL;
|
||||
int i=0;
|
||||
uint32_t start_time, end_time, report_start_time;
|
||||
uint64_t total_size=0,report_size=0;
|
||||
|
||||
buffer = pvPortMalloc(iperf_data.buf_size);
|
||||
if(!buffer){
|
||||
printf("\n\r[ERROR] %s: Alloc buffer failed",__func__);
|
||||
goto Exit2;
|
||||
}
|
||||
//filling the buffer
|
||||
for (i = 0; i < iperf_data.buf_size; i++){
|
||||
buffer[i] = (char)(i % 10);
|
||||
}
|
||||
|
||||
//create socket
|
||||
if( (iperf_data.client_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
|
||||
printf("\n\r[ERROR] %s: Create TCP socket failed",__func__);
|
||||
goto Exit2;
|
||||
}
|
||||
|
||||
//initialize value in dest
|
||||
memset(&ser_addr, 0, sizeof(ser_addr));
|
||||
ser_addr.sin_family = AF_INET;
|
||||
ser_addr.sin_port = htons(iperf_data.port);
|
||||
ser_addr.sin_addr.s_addr = inet_addr(iperf_data.server_ip);
|
||||
|
||||
printf("\n\r%s: Server IP=%s, port=%d", __func__,iperf_data.server_ip, iperf_data.port);
|
||||
printf("\n\r%s: Create socket fd = %d", __func__,iperf_data.client_fd);
|
||||
|
||||
//Connecting to server
|
||||
if( connect(iperf_data.client_fd, (struct sockaddr*)&ser_addr, sizeof(ser_addr)) < 0){
|
||||
printf("\n\r[ERROR] %s: Connect to server failed",__func__);
|
||||
goto Exit1;
|
||||
}
|
||||
printf("\n\r%s: Connect to server successfully",__func__);
|
||||
if(iperf_data.total_size == 0){
|
||||
start_time = xTaskGetTickCount();
|
||||
end_time = start_time;
|
||||
report_start_time = start_time;
|
||||
while ( ((end_time - start_time) <= (configTICK_RATE_HZ * iperf_data.time)) && (!g_tcp_terminate) ) {
|
||||
if( send(iperf_data.client_fd, buffer, iperf_data.buf_size,0) <= 0){
|
||||
printf("\n\r[ERROR] %s: TCP client send data error",__func__);
|
||||
goto Exit1;
|
||||
}
|
||||
total_size+=iperf_data.buf_size;
|
||||
report_size+=iperf_data.buf_size;
|
||||
end_time = xTaskGetTickCount();
|
||||
if(((end_time - report_start_time) >= (configTICK_RATE_HZ * 1)) && ((end_time - report_start_time) <= (configTICK_RATE_HZ * 2))) {
|
||||
#if PER_SECOND_REPORT
|
||||
printf("\n\r%s: Send %d KBytes in %d ms, %d Kbits/sec",__func__, (uint32_t)(report_size/KB),(uint32_t)(end_time-report_start_time),((uint32_t)(report_size*8)/(end_time - report_start_time)));
|
||||
#endif
|
||||
report_start_time = end_time;
|
||||
report_size = 0;
|
||||
}
|
||||
else if( (iperf_data.bandwidth!=0) && (report_size >= iperf_data.bandwidth) ){
|
||||
while((end_time - report_start_time) < configTICK_RATE_HZ){
|
||||
end_time = xTaskGetTickCount();
|
||||
}
|
||||
#if PER_SECOND_REPORT
|
||||
printf("\n\r%s: Send %d KBytes in %d ms, %d Kbits/sec",__func__, (uint32_t)(report_size/KB),(uint32_t)(end_time-report_start_time),((uint32_t)(report_size*8)/(end_time - report_start_time)));
|
||||
#endif
|
||||
report_start_time = end_time;
|
||||
report_size = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
start_time = xTaskGetTickCount();
|
||||
end_time = start_time;
|
||||
report_start_time = start_time;
|
||||
while ( (total_size < iperf_data.total_size) && (!g_tcp_terminate) ) {
|
||||
if( send(iperf_data.client_fd, buffer, iperf_data.buf_size,0) <= 0){
|
||||
printf("\n\r[ERROR] %s: TCP client send data error",__func__);
|
||||
goto Exit1;
|
||||
}
|
||||
total_size+=iperf_data.buf_size;
|
||||
report_size+=iperf_data.buf_size;
|
||||
end_time = xTaskGetTickCount();
|
||||
if(((end_time - report_start_time) >= (configTICK_RATE_HZ * 1)) && ((end_time - report_start_time) <= (configTICK_RATE_HZ * 2))) {
|
||||
#if PER_SECOND_REPORT
|
||||
printf("\n\r%s: Send %d KBytes in %d ms, %d Kbits/sec",__func__, (uint32_t)(report_size/KB),(uint32_t)(end_time-report_start_time),((uint32_t)(report_size*8)/(end_time - report_start_time)));
|
||||
#endif
|
||||
report_start_time = end_time;
|
||||
report_size = 0;
|
||||
}
|
||||
else if( (iperf_data.bandwidth!=0) && (report_size >= iperf_data.bandwidth) ){
|
||||
while((end_time - report_start_time) < configTICK_RATE_HZ){
|
||||
end_time = xTaskGetTickCount();
|
||||
}
|
||||
#if PER_SECOND_REPORT
|
||||
printf("\n\r%s: Send %d KBytes in %d ms, %d Kbits/sec",__func__, (uint32_t)(report_size/KB),(uint32_t)(end_time-report_start_time),((uint32_t)(report_size*8)/(end_time - report_start_time)));
|
||||
#endif
|
||||
report_start_time = end_time;
|
||||
report_size = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("\n\r%s: [END] Totally send %d KBytes in %d ms, %d Kbits/sec",__func__, (uint32_t)(total_size/KB),(uint32_t)(end_time-start_time),((uint32_t)(total_size*8)/(end_time - start_time)));
|
||||
|
||||
Exit1:
|
||||
closesocket(iperf_data.client_fd);
|
||||
Exit2:
|
||||
printf("\n\r%s: Close client socket",__func__);
|
||||
if(buffer)
|
||||
vPortFree(buffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int tcp_server_func(struct iperf_data_t iperf_data)
|
||||
{
|
||||
struct sockaddr_in ser_addr , client_addr;
|
||||
char *buffer = NULL;
|
||||
int addrlen = sizeof(struct sockaddr_in);
|
||||
int n = 1;
|
||||
int recv_size=0;
|
||||
uint64_t total_size=0,report_size=0;
|
||||
uint32_t start_time, report_start_time, report_end_time;
|
||||
|
||||
buffer = pvPortMalloc(iperf_data.buf_size);
|
||||
if(!buffer){
|
||||
printf("\n\r[ERROR] %s: Alloc buffer failed",__func__);
|
||||
goto Exit3;
|
||||
}
|
||||
|
||||
//create socket
|
||||
if((iperf_data.server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
|
||||
printf("\n\r[ERROR] %s: Create socket failed",__func__);
|
||||
goto Exit3;
|
||||
}
|
||||
|
||||
printf("\n\r%s: Create socket fd = %d", __func__,iperf_data.server_fd);
|
||||
|
||||
setsockopt( iperf_data.server_fd, SOL_SOCKET, SO_REUSEADDR, (const char *) &n, sizeof( n ) );
|
||||
|
||||
//initialize structure dest
|
||||
memset(&ser_addr, 0, sizeof(ser_addr));
|
||||
ser_addr.sin_family = AF_INET;
|
||||
ser_addr.sin_port = htons(iperf_data.port);
|
||||
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
|
||||
// binding the TCP socket to the TCP server address
|
||||
if( bind(iperf_data.server_fd, (struct sockaddr*)&ser_addr, sizeof(ser_addr)) < 0){
|
||||
printf("\n\r[ERROR] %s: Bind socket failed",__func__);
|
||||
goto Exit2;
|
||||
}
|
||||
printf("\n\r%s: Bind socket successfully",__func__);
|
||||
|
||||
//Make it listen to socket with max 20 connections
|
||||
if( listen(iperf_data.server_fd, 20) != 0){
|
||||
printf("\n\r[ERROR] %s: Listen socket failed",__func__);
|
||||
goto Exit2;
|
||||
}
|
||||
printf("\n\r%s: Listen port %d",__func__,iperf_data.port);
|
||||
|
||||
Restart:
|
||||
if( (iperf_data.client_fd = accept(iperf_data.server_fd, (struct sockaddr*)&client_addr, &addrlen)) < 0){
|
||||
printf("\n\r[ERROR] %s: Accept TCP client socket error!",__func__);
|
||||
goto Exit2;
|
||||
}
|
||||
printf("\n\r%s: Accept connection successfully",__func__);
|
||||
|
||||
start_time = xTaskGetTickCount();
|
||||
report_start_time = start_time;
|
||||
while (!g_tcp_terminate) {
|
||||
recv_size = recv(iperf_data.client_fd, buffer, iperf_data.buf_size, 0); //MSG_DONTWAIT MSG_WAITALL
|
||||
if( recv_size < 0){
|
||||
printf("\n\r[ERROR] %s: Receive data failed",__func__);
|
||||
goto Exit1;
|
||||
}
|
||||
else if(recv_size == 0){
|
||||
printf("\n\r%s: [END] Totally receive %d KBytes in %d ms, %d Kbits/sec",__func__, (uint32_t) (total_size/KB),(uint32_t) (report_end_time-start_time),((uint32_t)(total_size*8)/(report_end_time - start_time)));
|
||||
total_size=0;
|
||||
close(iperf_data.client_fd);
|
||||
goto Restart;
|
||||
}
|
||||
report_end_time = xTaskGetTickCount();
|
||||
total_size+=recv_size;
|
||||
report_size+=recv_size;
|
||||
if(((report_end_time - report_start_time) >= (configTICK_RATE_HZ * 1)) && ((report_end_time - report_start_time) <= (configTICK_RATE_HZ * 2))) {
|
||||
#if PER_SECOND_REPORT
|
||||
printf("\n\r%s: Receive %d KBytes in %d ms, %d Kbits/sec",__func__, (uint32_t) (report_size/KB),(uint32_t) (report_end_time-report_start_time),((uint32_t)(report_size*8)/(report_end_time - report_start_time)));
|
||||
#endif
|
||||
report_start_time = report_end_time;
|
||||
report_size = 0;
|
||||
}
|
||||
else if((report_end_time - report_start_time) > (configTICK_RATE_HZ * 2)){
|
||||
report_start_time = report_end_time;
|
||||
start_time = report_end_time;
|
||||
report_size = 0;
|
||||
}
|
||||
}
|
||||
printf("\n\r%s: [END] Totally receive %d KBytes in %d ms, %d Kbits/sec",__func__, (uint32_t) (total_size/KB),(uint32_t) (report_end_time-start_time),((uint32_t)(total_size*8)/(report_end_time - start_time)));
|
||||
|
||||
Exit1:
|
||||
// close the connected socket after receiving from connected TCP client
|
||||
close(iperf_data.client_fd);
|
||||
|
||||
Exit2:
|
||||
// close the listening socket
|
||||
close(iperf_data.server_fd);
|
||||
|
||||
Exit3:
|
||||
if(buffer)
|
||||
vPortFree(buffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int udp_client_func(struct iperf_data_t iperf_data)
|
||||
{
|
||||
struct sockaddr_in ser_addr;
|
||||
char *buffer = NULL;
|
||||
int i=0;
|
||||
int addrlen = sizeof(struct sockaddr_in);
|
||||
uint32_t start_time, end_time, bandwidth_time;
|
||||
uint64_t total_size=0, bandwidth_size=0;
|
||||
|
||||
|
||||
buffer = pvPortMalloc(iperf_data.buf_size);
|
||||
if(!buffer){
|
||||
printf("\n\r[ERROR] %s: Alloc buffer failed",__func__);
|
||||
goto Exit2;
|
||||
}
|
||||
|
||||
//filling the buffer
|
||||
for (i = 0; i < iperf_data.buf_size; i++){
|
||||
buffer[i] = (char)(i % 10);
|
||||
}
|
||||
|
||||
//create socket
|
||||
if( (iperf_data.client_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){
|
||||
printf("\n\r[ERROR] %s: Create UDP socket failed",__func__);
|
||||
goto Exit2;
|
||||
}
|
||||
|
||||
//initialize value in dest
|
||||
memset(&ser_addr, 0, sizeof(ser_addr));
|
||||
ser_addr.sin_family = AF_INET;
|
||||
ser_addr.sin_port = htons(iperf_data.port);
|
||||
ser_addr.sin_addr.s_addr = inet_addr(iperf_data.server_ip);
|
||||
|
||||
printf("\n\r%s: Server IP=%s, port=%d", __func__,iperf_data.server_ip, iperf_data.port);
|
||||
printf("\n\r%s: Create socket fd = %d", __func__,iperf_data.client_fd);
|
||||
|
||||
lwip_setsockopt(iperf_data.client_fd,IPPROTO_IP,IP_TOS,&iperf_data.tos_value,sizeof(iperf_data.tos_value));
|
||||
|
||||
if(iperf_data.total_size == 0){
|
||||
start_time = xTaskGetTickCount();
|
||||
end_time = start_time;
|
||||
bandwidth_time = start_time;
|
||||
while ( ((end_time - start_time) <= (configTICK_RATE_HZ * iperf_data.time)) && (!g_udp_terminate) ) {
|
||||
if( sendto(iperf_data.client_fd, buffer, iperf_data.buf_size,0,(struct sockaddr*)&ser_addr, addrlen) < 0){
|
||||
//printf("\n\r[ERROR] %s: UDP client send data error",__func__);
|
||||
}else{
|
||||
total_size+=iperf_data.buf_size;
|
||||
bandwidth_size+=iperf_data.buf_size;
|
||||
}
|
||||
|
||||
if((end_time - bandwidth_time) >= (configTICK_RATE_HZ*1)){
|
||||
#if PER_SECOND_REPORT
|
||||
printf("\n\r%s: Send %d KBytes in %d ms, %d Kbits/sec",__func__,(uint32_t)( bandwidth_size/KB),(uint32_t)(end_time-bandwidth_time),((uint32_t)(bandwidth_size*8)/(end_time - bandwidth_time)));
|
||||
#endif
|
||||
bandwidth_time = end_time;
|
||||
bandwidth_size = 0;
|
||||
}else{
|
||||
if(bandwidth_size >= iperf_data.bandwidth){
|
||||
while((end_time - bandwidth_time) < configTICK_RATE_HZ){
|
||||
end_time = xTaskGetTickCount();
|
||||
}
|
||||
#if PER_SECOND_REPORT
|
||||
printf("\n\r%s: Send %d KBytes in %d ms, %d Kbits/sec",__func__, (uint32_t)(bandwidth_size/KB),(uint32_t)(end_time-bandwidth_time),((uint32_t)(bandwidth_size*8)/(end_time - bandwidth_time)));
|
||||
#endif
|
||||
bandwidth_time = end_time;
|
||||
bandwidth_size = 0;
|
||||
}
|
||||
}
|
||||
|
||||
end_time = xTaskGetTickCount();
|
||||
}
|
||||
}
|
||||
else{
|
||||
start_time = xTaskGetTickCount();
|
||||
end_time = start_time;
|
||||
bandwidth_time = start_time;
|
||||
while ( (total_size < iperf_data.total_size) && (!g_udp_terminate) ) {
|
||||
if( sendto(iperf_data.client_fd, buffer, iperf_data.buf_size,0,(struct sockaddr*)&ser_addr, addrlen) < 0){
|
||||
//printf("\n\r[ERROR] %s: UDP client send data error",__func__);
|
||||
}else{
|
||||
total_size+=iperf_data.buf_size;
|
||||
bandwidth_size+=iperf_data.buf_size;
|
||||
}
|
||||
if((end_time - bandwidth_time) >= (configTICK_RATE_HZ*1)){
|
||||
#if PER_SECOND_REPORT
|
||||
printf("\n\r%s: Send %d KBytes in %d ms, %d Kbits/sec",__func__, (uint32_t)(bandwidth_size/KB),(uint32_t)(end_time-bandwidth_time),((uint32_t)(bandwidth_size*8)/(end_time - bandwidth_time)));
|
||||
#endif
|
||||
bandwidth_time = end_time;
|
||||
bandwidth_size = 0;
|
||||
}else{
|
||||
if(bandwidth_size >= iperf_data.bandwidth){
|
||||
while((end_time - bandwidth_time) < (configTICK_RATE_HZ*1)){
|
||||
end_time = xTaskGetTickCount();
|
||||
}
|
||||
#if PER_SECOND_REPORT
|
||||
printf("\n\r%s: Send %d KBytes in %d ms, %d Kbits/sec",__func__, (uint32_t)(bandwidth_size/KB),(uint32_t)(end_time-bandwidth_time),((uint32_t)(bandwidth_size*8)/(end_time - bandwidth_time)));
|
||||
#endif
|
||||
bandwidth_time = end_time;
|
||||
bandwidth_size = 0;
|
||||
}
|
||||
}
|
||||
end_time = xTaskGetTickCount();
|
||||
}
|
||||
}
|
||||
printf("\n\r%s: [END] Totally send %d KBytes in %d ms, %d Kbits/sec",__func__, (uint32_t)(total_size/KB),(uint32_t)(end_time-start_time),((uint32_t)(total_size*8)/(end_time - start_time)));
|
||||
|
||||
Exit1:
|
||||
close(iperf_data.client_fd);
|
||||
Exit2:
|
||||
printf("\n\r%s: Close client socket",__func__);
|
||||
if(buffer)
|
||||
vPortFree(buffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int udp_server_func(struct iperf_data_t iperf_data)
|
||||
{
|
||||
int server_fd;
|
||||
struct sockaddr_in ser_addr , client_addr;
|
||||
char *buffer = NULL;
|
||||
int addrlen = sizeof(struct sockaddr_in);
|
||||
int n = 1;
|
||||
uint32_t start_time, report_start_time, report_end_time;
|
||||
int recv_size=0;
|
||||
uint64_t total_size=0,report_size=0;
|
||||
|
||||
buffer = pvPortMalloc(iperf_data.buf_size);
|
||||
if(!buffer){
|
||||
printf("\n\r[ERROR] %s: Alloc buffer failed",__func__);
|
||||
goto Exit2;
|
||||
}
|
||||
|
||||
//create socket
|
||||
if((iperf_data.server_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0){
|
||||
printf("\n\r[ERROR] %s: Create socket failed",__func__);
|
||||
goto Exit2;
|
||||
}
|
||||
|
||||
printf("\n\r%s: Create socket fd = %d, port = %d", __func__,iperf_data.server_fd,iperf_data.port);
|
||||
|
||||
setsockopt( iperf_data.server_fd, SOL_SOCKET, SO_REUSEADDR, (const char *) &n, sizeof( n ) );
|
||||
|
||||
//initialize structure dest
|
||||
memset(&ser_addr, 0, sizeof(ser_addr));
|
||||
ser_addr.sin_family = AF_INET;
|
||||
ser_addr.sin_port = htons(iperf_data.port);
|
||||
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
|
||||
// binding the TCP socket to the TCP server address
|
||||
if( bind(iperf_data.server_fd, (struct sockaddr*)&ser_addr, sizeof(ser_addr)) < 0){
|
||||
printf("\n\r[ERROR] %s: Bind socket failed",__func__);
|
||||
goto Exit1;
|
||||
}
|
||||
|
||||
printf("\n\r%s: Bind socket successfully",__func__);
|
||||
|
||||
start_time = xTaskGetTickCount();
|
||||
report_start_time = start_time;
|
||||
|
||||
while (!g_udp_terminate) {
|
||||
recv_size = recvfrom(iperf_data.server_fd,buffer,iperf_data.buf_size,0,(struct sockaddr *) &client_addr,&addrlen);
|
||||
if( recv_size < 0){
|
||||
printf("\n\r[ERROR] %s: Receive data failed",__func__);
|
||||
goto Exit1;
|
||||
}
|
||||
// ack data to client
|
||||
// Not send ack to prevent send fail due to limited skb, but it will have warning at iperf client
|
||||
//sendto(server_fd,buffer,ret,0,(struct sockaddr*)&client_addr,sizeof(client_addr));
|
||||
|
||||
report_end_time = xTaskGetTickCount();
|
||||
total_size+=recv_size;
|
||||
report_size+=recv_size;
|
||||
if(((report_end_time - report_start_time) >= (configTICK_RATE_HZ * 1)) && ((report_end_time - report_start_time) <= (configTICK_RATE_HZ * 2))) {
|
||||
#if PER_SECOND_REPORT
|
||||
printf("\n\r%s: Receive %d KBytes in %d ms, %d Kbits/sec",__func__,(uint32_t) (report_size/KB),(uint32_t)(report_end_time-report_start_time),((uint32_t)(report_size*8)/(report_end_time - report_start_time)));
|
||||
#endif
|
||||
report_start_time = report_end_time;
|
||||
report_size = 0;
|
||||
}
|
||||
else if((report_end_time - report_start_time) > (configTICK_RATE_HZ * 2)){
|
||||
report_start_time = report_end_time;
|
||||
start_time = report_end_time;
|
||||
report_size = 0;
|
||||
}
|
||||
}
|
||||
printf("\n\r%s: [END] Totally receive %d KBytes in %d ms, %d Kbits/sec",__func__,(uint32_t) (total_size/KB),(uint32_t)(report_end_time-start_time),((uint32_t)(total_size*8)/(report_end_time - start_time)));
|
||||
|
||||
Exit1:
|
||||
// close the listening socket
|
||||
close(iperf_data.server_fd);
|
||||
|
||||
Exit2:
|
||||
if(buffer)
|
||||
vPortFree(buffer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void tcp_client_handler(void *param)
|
||||
{
|
||||
vTaskDelay(100);
|
||||
if(tcp_client_data.port == 0)
|
||||
tcp_client_data.port = DEFAULT_PORT;
|
||||
if(tcp_client_data.time == 0)
|
||||
tcp_client_data.time = DEFAULT_TIME;
|
||||
if(tcp_client_data.buf_size == 0)
|
||||
tcp_client_data.buf_size = CLIENT_BUF_SIZE;
|
||||
|
||||
printf("\n\rTCP: Start TCP client!");
|
||||
tcp_client_func(tcp_client_data);
|
||||
|
||||
#if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
|
||||
printf("\n\rMin available stack size of %s = %d * %d bytes\n\r", __FUNCTION__, uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
|
||||
#endif
|
||||
printf("\n\rTCP: TCP client stopped!");
|
||||
g_tcp_client_task = NULL;
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
|
||||
static void tcp_server_handler(void *param)
|
||||
{
|
||||
vTaskDelay(100);
|
||||
if(tcp_server_data.port == 0)
|
||||
tcp_server_data.port = DEFAULT_PORT;
|
||||
if(tcp_server_data.buf_size == 0)
|
||||
tcp_server_data.buf_size = SERVER_BUF_SIZE;
|
||||
|
||||
printf("\n\rTCP: Start TCP server!");
|
||||
tcp_server_func(tcp_server_data);
|
||||
|
||||
#if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
|
||||
printf("\n\rMin available stack size of %s = %d * %d bytes\n\r", __FUNCTION__, uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
|
||||
#endif
|
||||
printf("\n\rTCP: TCP server stopped!");
|
||||
g_tcp_server_task = NULL;
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
|
||||
void udp_client_handler(void *param)
|
||||
{
|
||||
vTaskDelay(100);
|
||||
if(udp_client_data.port == 0)
|
||||
udp_client_data.port = DEFAULT_PORT;
|
||||
if(udp_client_data.time == 0)
|
||||
udp_client_data.time = DEFAULT_TIME;
|
||||
if(udp_client_data.bandwidth == 0)
|
||||
udp_client_data.bandwidth = DEFAULT_UDP_BANDWIDTH;
|
||||
if(udp_client_data.buf_size == 0)
|
||||
udp_client_data.buf_size = CLIENT_BUF_SIZE;
|
||||
if(udp_client_data.tos_value == 0)
|
||||
udp_client_data.tos_value = DEFAULT_UDP_TOS_VALUE;
|
||||
|
||||
printf("\n\rUDP: Start UDP client!");
|
||||
udp_client_func(udp_client_data);
|
||||
|
||||
#if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
|
||||
printf("\n\rMin available stack size of %s = %d * %d bytes", __FUNCTION__, uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
|
||||
#endif
|
||||
|
||||
printf("\n\rUDP: UDP client stopped!");
|
||||
g_udp_client_task = NULL;
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
|
||||
void udp_server_handler(void *param)
|
||||
{
|
||||
vTaskDelay(100);
|
||||
if(udp_server_data.port == 0)
|
||||
udp_server_data.port = DEFAULT_PORT;
|
||||
if(udp_server_data.buf_size == 0)
|
||||
udp_server_data.buf_size = SERVER_BUF_SIZE;
|
||||
|
||||
printf("\n\rUDP: Start UDP server!");
|
||||
udp_server_func(udp_server_data);
|
||||
|
||||
#if defined(INCLUDE_uxTaskGetStackHighWaterMark) && (INCLUDE_uxTaskGetStackHighWaterMark == 1)
|
||||
printf("\n\rMin available stack size of %s = %d * %d bytes", __FUNCTION__, uxTaskGetStackHighWaterMark(NULL), sizeof(portBASE_TYPE));
|
||||
#endif
|
||||
|
||||
printf("\n\rUDP: UDP server stopped!");
|
||||
g_udp_server_task = NULL;
|
||||
vTaskDelete(NULL);
|
||||
}
|
||||
|
||||
uint64_t km_parser(char *buf, int len)
|
||||
{
|
||||
uint64_t ret=0;
|
||||
int keyword_num=0;
|
||||
char num_str[17] = "\0";
|
||||
uint64_t num;
|
||||
|
||||
if(len>16)
|
||||
return ret;
|
||||
|
||||
while((buf[keyword_num] != '\0')&&(keyword_num<len)){
|
||||
if((buf[keyword_num] == 'k')||(buf[keyword_num] == 'K')){
|
||||
strncpy(num_str,buf,keyword_num);
|
||||
num = strtol(num_str,NULL,10);
|
||||
ret = num * KB;
|
||||
break;
|
||||
}
|
||||
else if((buf[keyword_num] == 'm')||(buf[keyword_num] == 'M')){
|
||||
strncpy(num_str,buf,keyword_num);
|
||||
num = strtol(num_str,NULL,10);
|
||||
ret = num * MB;
|
||||
break;
|
||||
}
|
||||
keyword_num++;
|
||||
if(keyword_num == len){
|
||||
strncpy(num_str,buf,keyword_num);
|
||||
num = strtol(num_str,NULL,10);
|
||||
ret = num;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void cmd_tcp(int argc, char **argv)
|
||||
{
|
||||
int argv_count = 2;
|
||||
|
||||
if(argc < 2)
|
||||
goto Exit;
|
||||
|
||||
g_tcp_terminate = 0;
|
||||
|
||||
while(argv_count<=argc){
|
||||
//first operation
|
||||
if(argv_count == 2){
|
||||
if(strcmp(argv[argv_count-1], "-s") == 0){
|
||||
if(g_tcp_server_task){
|
||||
printf("\n\rTCP: TCP Server is already running.");
|
||||
return;
|
||||
}else{
|
||||
memset(&tcp_server_data,0,sizeof(struct iperf_data_t));
|
||||
tcp_server_data.start = 1;
|
||||
argv_count++;
|
||||
}
|
||||
}
|
||||
else if(strcmp(argv[argv_count-1], "stop") == 0){
|
||||
if(argc == 2){
|
||||
vTaskDelay(100);
|
||||
g_tcp_terminate = 1;
|
||||
tcp_server_data.start = 0;
|
||||
tcp_client_data.start = 0;
|
||||
|
||||
if(g_tcp_server_task){
|
||||
if(tcp_server_data.server_fd >=0){
|
||||
close(tcp_server_data.server_fd);
|
||||
}
|
||||
if(tcp_server_data.client_fd >=0){
|
||||
close(tcp_server_data.client_fd);
|
||||
}
|
||||
printf("\n\rTCP server stopped!\n");
|
||||
vTaskDelete(g_tcp_server_task);
|
||||
g_tcp_server_task = NULL;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
else if(strcmp(argv[argv_count-1], "-c") == 0){
|
||||
if(g_tcp_client_task){
|
||||
printf("\n\rTCP: TCP client is already running. Please enter \"ATWT=stop\" to stop it.");
|
||||
return;
|
||||
}else{
|
||||
if(argc < (argv_count+1))
|
||||
goto Exit;
|
||||
memset(&tcp_client_data,0,sizeof(struct iperf_data_t));
|
||||
tcp_client_data.start = 1;
|
||||
strncpy(tcp_client_data.server_ip, argv[2], (strlen(argv[2])>16)?16:strlen(argv[2]));
|
||||
argv_count+=2;
|
||||
}
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(strcmp(argv[argv_count-1], "-t") == 0){
|
||||
if(argc < (argv_count+1))
|
||||
goto Exit;
|
||||
if(tcp_client_data.start){
|
||||
tcp_client_data.time = atoi(argv[argv_count]);
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
argv_count+=2;
|
||||
}
|
||||
else if(strcmp(argv[argv_count-1], "-p") == 0){
|
||||
if(argc < (argv_count+1))
|
||||
goto Exit;
|
||||
if(tcp_server_data.start){
|
||||
tcp_server_data.port = (uint16_t) atoi(argv[argv_count]);
|
||||
}
|
||||
else if(tcp_client_data.start){
|
||||
tcp_client_data.port = (uint16_t) atoi(argv[argv_count]);
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
argv_count+=2;
|
||||
}
|
||||
else if(strcmp(argv[argv_count-1], "-n") == 0){
|
||||
if(argc < (argv_count+1))
|
||||
goto Exit;
|
||||
if(tcp_client_data.start){
|
||||
tcp_client_data.total_size = km_parser(argv[argv_count],strlen(argv[argv_count]));
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
argv_count+=2;
|
||||
}
|
||||
else if(strcmp(argv[argv_count-1], "-d") == 0){
|
||||
if(tcp_client_data.start){
|
||||
tcp_client_data.bandwidth = DEFAULT_TCP_BANDWIDTH;
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
argv_count+=2;
|
||||
}
|
||||
else if(strcmp(argv[argv_count-1], "-l") == 0){
|
||||
if(argc < (argv_count+1))
|
||||
goto Exit;
|
||||
if(tcp_server_data.start){
|
||||
tcp_server_data.buf_size = atoi(argv[argv_count]);
|
||||
}
|
||||
else if(tcp_client_data.start){
|
||||
tcp_client_data.buf_size = atoi(argv[argv_count]);
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
argv_count+=2;
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(tcp_server_data.start && (NULL == g_tcp_server_task)){
|
||||
if(xTaskCreate(tcp_server_handler, "tcp_server_handler", BSD_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1 + PRIORITIE_OFFSET, &g_tcp_server_task) != pdPASS)
|
||||
printf("\n\rTCP ERROR: Create TCP server task failed.");
|
||||
}
|
||||
if(tcp_client_data.start && (NULL == g_tcp_client_task)){
|
||||
if(xTaskCreate(tcp_client_handler, "tcp_client_handler", BSD_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1 + PRIORITIE_OFFSET, &g_tcp_client_task) != pdPASS)
|
||||
printf("\n\rTCP ERROR: Create TCP client task failed.");
|
||||
}
|
||||
|
||||
return;
|
||||
Exit:
|
||||
printf("\n\r[ATWT] Command format ERROR!\n");
|
||||
printf("\n\r[ATWT] Usage: ATWT=[-s|-c,host|stop],[options]\n");
|
||||
printf("\n\r Client/Server:\n");
|
||||
printf(" \r stop terminate client & server\n");
|
||||
printf(" \r -l # length of buffer to read or write (default 1460 Bytes)\n");
|
||||
printf(" \r -p # server port to listen on/connect to (default 5001)\n");
|
||||
printf("\n\r Server specific:\n");
|
||||
printf(" \r -s run in server mode\n");
|
||||
printf("\n\r Client specific:\n");
|
||||
printf(" \r -c <host> run in client mode, connecting to <host>\n");
|
||||
printf(" \r -d Do a bidirectional test simultaneously\n");
|
||||
printf(" \r -t # time in seconds to transmit for (default 10 secs)\n");
|
||||
printf(" \r -n #[KM] number of bytes to transmit (instead of -t)\n");
|
||||
printf("\n\r Example:\n");
|
||||
printf(" \r ATWT=-s,-p,5002\n");
|
||||
printf(" \r ATWT=-c,192.168.1.2,-t,100,-p,5002\n");
|
||||
return;
|
||||
}
|
||||
|
||||
void cmd_udp(int argc, char **argv)
|
||||
{
|
||||
int argv_count = 2;
|
||||
uint8_t tos_value = 0;
|
||||
|
||||
if(argc < 2)
|
||||
goto Exit;
|
||||
|
||||
g_udp_terminate = 0;
|
||||
|
||||
while(argv_count<=argc){
|
||||
//first operation
|
||||
if(argv_count == 2){
|
||||
if(strcmp(argv[argv_count-1], "-s") == 0){
|
||||
if(g_udp_server_task){
|
||||
printf("\n\rUDP: UDP Server is already running.");
|
||||
return;
|
||||
}else{
|
||||
memset(&udp_server_data,0,sizeof(struct iperf_data_t));
|
||||
udp_server_data.start = 1;
|
||||
argv_count++;
|
||||
}
|
||||
}
|
||||
else if(strcmp(argv[argv_count-1], "stop") == 0){
|
||||
if(argc == 2){
|
||||
vTaskDelay(100);
|
||||
g_udp_terminate = 1;
|
||||
udp_server_data.start = 0;
|
||||
udp_client_data.start = 0;
|
||||
|
||||
if(g_udp_server_task){
|
||||
if(udp_server_data.server_fd >=0){
|
||||
close(udp_server_data.server_fd);
|
||||
}
|
||||
printf("\n\rUDP server stopped!\n");
|
||||
vTaskDelete(g_udp_server_task);
|
||||
g_udp_server_task = NULL;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
else if(strcmp(argv[argv_count-1], "-c") == 0){
|
||||
if(g_udp_client_task){
|
||||
printf("\n\rUDP: UDP client is already running. Please enter \"ATWU=stop\" to stop it.");
|
||||
return;
|
||||
}else{
|
||||
if(argc < (argv_count+1))
|
||||
goto Exit;
|
||||
memset(&udp_client_data,0,sizeof(struct iperf_data_t));
|
||||
udp_client_data.start = 1;
|
||||
strncpy(udp_client_data.server_ip, argv[2], (strlen(argv[2])>16)?16:strlen(argv[2]));
|
||||
argv_count+=2;
|
||||
}
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(strcmp(argv[argv_count-1], "-t") == 0){
|
||||
if(argc < (argv_count+1))
|
||||
goto Exit;
|
||||
if(udp_client_data.start){
|
||||
udp_client_data.time = atoi(argv[argv_count]);
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
argv_count+=2;
|
||||
}
|
||||
else if(strcmp(argv[argv_count-1], "-p") == 0){
|
||||
if(argc < (argv_count+1))
|
||||
goto Exit;
|
||||
if(udp_server_data.start){
|
||||
udp_server_data.port = (uint16_t) atoi(argv[argv_count]);
|
||||
}
|
||||
else if(udp_client_data.start){
|
||||
udp_client_data.port = (uint16_t) atoi(argv[argv_count]);
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
argv_count+=2;
|
||||
}
|
||||
else if(strcmp(argv[argv_count-1], "-n") == 0){
|
||||
if(argc < (argv_count+1))
|
||||
goto Exit;
|
||||
if(udp_client_data.start){
|
||||
udp_client_data.total_size = km_parser(argv[argv_count],strlen(argv[argv_count]));
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
argv_count+=2;
|
||||
}
|
||||
else if(strcmp(argv[argv_count-1], "-b") == 0){
|
||||
if(argc < (argv_count+1))
|
||||
goto Exit;
|
||||
if(udp_client_data.start){
|
||||
udp_client_data.bandwidth = km_parser(argv[argv_count],strlen(argv[argv_count]));
|
||||
udp_client_data.bandwidth = udp_client_data.bandwidth/8;//bits to Bytes
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
argv_count+=2;
|
||||
}
|
||||
else if(strcmp(argv[argv_count-1], "-d") == 0){
|
||||
if(udp_client_data.start){
|
||||
udp_client_data.bandwidth = DEFAULT_UDP_BANDWIDTH;
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
argv_count+=1;
|
||||
}
|
||||
#if CONFIG_WLAN
|
||||
else if(strcmp(argv[argv_count-1], "-S") == 0){ //for wmm test
|
||||
if(argc < (argv_count+1))
|
||||
goto Exit;
|
||||
if(udp_client_data.start){
|
||||
if(atoi(argv[argv_count]) >= 0 && atoi(argv[argv_count]) <= 255){
|
||||
tos_value = (uint8_t) atoi(argv[argv_count]);
|
||||
wext_set_tos_value(WLAN0_NAME, &tos_value);
|
||||
udp_client_data.tos_value = tos_value;
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
argv_count+=2;
|
||||
}
|
||||
#endif
|
||||
else if(strcmp(argv[argv_count-1], "-l") == 0){
|
||||
if(argc < (argv_count+1))
|
||||
goto Exit;
|
||||
if(udp_server_data.start){
|
||||
udp_server_data.buf_size = atoi(argv[argv_count]);
|
||||
}
|
||||
else if(udp_client_data.start){
|
||||
udp_client_data.buf_size = atoi(argv[argv_count]);
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
argv_count+=2;
|
||||
}
|
||||
else{
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(udp_server_data.start && (NULL == g_udp_server_task)){
|
||||
if(xTaskCreate(udp_server_handler, "udp_server_handler", BSD_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1 + PRIORITIE_OFFSET, &g_udp_server_task) != pdPASS)
|
||||
printf("\r\nUDP ERROR: Create UDP server task failed.");
|
||||
}
|
||||
|
||||
if(udp_client_data.start && (NULL == g_udp_client_task)){
|
||||
if(xTaskCreate(udp_client_handler, "udp_client_handler", BSD_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1 + PRIORITIE_OFFSET, &g_udp_client_task) != pdPASS)
|
||||
printf("\r\nUDP ERROR: Create UDP client task failed.");
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
Exit:
|
||||
printf("\n\r[ATWU] Command format ERROR!\n");
|
||||
printf("\n\r[ATWU] Usage: ATWU=[-s|-c,host|stop][options]\n");
|
||||
printf("\n\r Client/Server:\n");
|
||||
printf(" \r stop terminate client & server\n");
|
||||
printf(" \r -l # length of buffer to read or write (default 1460 Bytes)\n");
|
||||
printf(" \r -p # server port to listen on/connect to (default 5001)\n");
|
||||
printf("\n\r Server specific:\n");
|
||||
printf(" \r -s run in server mode\n");
|
||||
printf("\n\r Client specific:\n");
|
||||
printf(" \r -b #[KM] for UDP, bandwidth to send at in bits/sec (default 1 Mbit/sec)\n");
|
||||
printf(" \r -c <host> run in client mode, connecting to <host>\n");
|
||||
printf(" \r -d Do a bidirectional test simultaneously\n");
|
||||
printf(" \r -t # time in seconds to transmit for (default 10 secs)\n");
|
||||
printf(" \r -n #[KM] number of bytes to transmit (instead of -t)\n");
|
||||
#if CONFIG_WLAN
|
||||
printf(" \r -S # set the IP 'type of service'\n");
|
||||
#endif
|
||||
printf("\n\r Example:\n");
|
||||
printf(" \r ATWU=-s,-p,5002\n");
|
||||
printf(" \r ATWU=-c,192.168.1.2,-t,100,-p,5002\n");
|
||||
return;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue