doubao_chat/apps/common/example/wifi/raw_txrx/kcp_test.c

219 lines
5.4 KiB
C

#include "app_config.h"
#include "wifi/wifi_connect.h"
#include "system/includes.h"
#include "kcp/ikcp.h"
#ifdef USE_WIFI_RAW_KCP_TEST
#define KCP_SEM_TIMEOUT 150
static ikcpcb *kcp_hdl;
static int ikcp_sem_del(void *psem)
{
return os_sem_del(psem, OS_DEL_ALWAYS);
}
static int ikcp_sem_post(void *psem)
{
/* if (os_sem_query(psem) == 0) { */
// os_sem_set(psem,0);
os_sem_post(psem);
/* } */
return 0;
}
static int ikcp_sem_pend(void *psem, int timeout)
{
return os_sem_pend(psem, timeout);
}
static int ikcp_mutex_lock(void *mutex)
{
return os_mutex_pend(mutex, 0);
}
static void ikcp_mutex_unlock(void *mutex)
{
os_mutex_post(mutex);
}
static void ikcp_mutex_del(void *mutex)
{
os_mutex_del(mutex, OS_DEL_ALWAYS);
}
static void ikcp_writelog(struct IKCPCB *kcp, char *fmt, va_list va, void *user)
{
puts("IKCP_DBG: ");
vprintf(fmt, va);
puts("\n");
}
static unsigned int iclock(void)
{
return timer_get_ms();
}
static int *udp_output(const char *buf, int len, struct IKCPCB *kcp, void *user)
{
memcpy(wifi_get_payload_ptr(), buf, len);
wifi_send_data(len, WIFI_TXRATE_1M);
return 0;
}
static void kcp_udp_create(u32 conv)
{
kcp_hdl = ikcp_create(conv, (void *)NULL);
kcp_hdl->output = (int (*)(const char *, int, struct IKCPCB *, void *))udp_output;
ikcp_wndsize(kcp_hdl, 256, 512); //set snd recv windows size
ikcp_nodelay(kcp_hdl, 0, 1, 2, 0); //set kcp mode
ikcp_setmtu(kcp_hdl, 2510, 2510);
// ikcp_set_writelog(kcp_hdl, ikcp_writelog, IKCP_LOG_OUTPUT|IKCP_LOG_INPUT|IKCP_LOG_SEND|IKCP_LOG_RECV|IKCP_LOG_IN_DATA|\
// IKCP_LOG_IN_ACK|IKCP_LOG_IN_PROBE|IKCP_LOG_IN_WINS|IKCP_LOG_OUT_DATA|IKCP_LOG_OUT_ACK |IKCP_LOG_OUT_PROBE|IKCP_LOG_OUT_WINS);
OS_MUTEX *pmutex = (OS_MUTEX *)malloc(sizeof(OS_MUTEX));
os_mutex_create(pmutex);
ikcp_set_mutex_lock_func(kcp_hdl, ikcp_mutex_lock, ikcp_mutex_unlock, ikcp_mutex_del, pmutex);
OS_SEM *psendsem = (OS_SEM *)malloc(sizeof(OS_SEM));
os_sem_create(psendsem, 0);
ikcp_set_send_block(kcp_hdl, 0, ikcp_sem_post, ikcp_sem_pend, ikcp_sem_del, KCP_SEM_TIMEOUT, psendsem);
OS_SEM *precvsem = (OS_SEM *)malloc(sizeof(OS_SEM));
os_sem_create(precvsem, 0);
ikcp_set_recv_block(kcp_hdl, 0, ikcp_sem_post, ikcp_sem_pend, ikcp_sem_del, KCP_SEM_TIMEOUT, precvsem);
ikcp_update(kcp_hdl, iclock);
}
static void kcp_send_test(void *p)
{
puts("kcp_send test \r\n\r\n ");
#define KCP_TEST_SEND_BUF_SIZE 123*1024+4567
int time_hdl = 0;
unsigned int total_send = 0;
int ret;
char *send_buf;
unsigned int send_len;
kcp_udp_create(0x56444c4a);
send_buf = (char *)malloc(KCP_TEST_SEND_BUF_SIZE);
for (ret = 0; ret < KCP_TEST_SEND_BUF_SIZE; ret++) {
send_buf[ret] = ret;
}
while (1) {
/*os_time_dly(1);*/
if (time_lapse((u32 *)(&time_hdl), 1 * 1000)) {
printf(" KCP_SEND RATE = %d KB/S \r\n", total_send / 1024 / 1);
total_send = 0;
}
send_len = 48;
ret = ikcp_send(kcp_hdl, (const char *)send_buf, send_len);
if (!ret) {
/*puts("SEND_OK ");*/
total_send += send_len;
// ikcp_flush(kcp_hdl,iclock);
ikcp_update(kcp_hdl, iclock);
} else {
puts("*");
}
}
}
static void kcp_recv_test(void *p)
{
puts("kcp_recv test \r\n");
#define KCP_TEST_RECV_BUF_SIZE 100*1024
int time_hdl = 0;
unsigned int total_recv = 0;
char *recv_buf;
int nread;
kcp_udp_create(0x56444c4a);
recv_buf = malloc(KCP_TEST_RECV_BUF_SIZE);
while (1) {
if (time_lapse((u32 *)(&time_hdl), 1 * 1000)) {
printf(" KCP_RECV RATE = %d KB/S \r\n", total_recv / 1024 / 1);
total_recv = 0;
}
nread = ikcp_recv(kcp_hdl, recv_buf, KCP_TEST_RECV_BUF_SIZE);
if (nread > 0) {
total_recv += nread;
printf("^^ ikcp_recv size = %d\r\n", nread);
// hexdump(recv_buf, nread);
} else {
puts("*");
}
}
free(recv_buf);
}
static void wifi_rx_cb(void *rxwi, struct ieee80211_frame *wh, void *data, u32 len, void *priv)
{
static const u8 pkg_head_fill_magic[] = {
/*dst*/ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,/*src*/ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88,/*BSSID*/ 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, /*Seq,Frag num*/0x88, 0x88,
};
if (len < 25 || memcmp(&((u8 *)data)[28], pkg_head_fill_magic, sizeof(pkg_head_fill_magic))) {
return;
}
u8 *payload = &((u8 *)data)[48];
u32 payload_len = len - 24;
/*printf("WIFI_RX LEN = %d\r\n", payload_len);*/
/*put_buf(payload, payload_len);*/
ikcp_input(kcp_hdl, payload, payload_len);
ikcp_update(kcp_hdl, iclock);
}
static void c_main(void *priv)
{
while (!wifi_is_on()) {
os_time_dly(10);
}
os_time_dly(10);
wifi_set_smp_cfg_just_monitor_mode(1);
wifi_enter_smp_cfg_mode(); //进入混杂模式
wifi_set_frame_cb(wifi_rx_cb, NULL); //注册接收802.11数据帧回调
//配置WIFI RF 通信信道
wifi_set_channel(1);
//配置底层重传次数
wifi_set_long_retry(0);
wifi_set_short_retry(0);
thread_fork("kcp_send_tst", 15, 0x2000, 0, NULL, kcp_send_test, (void *)NULL);
/*thread_fork("kcp_recv_tst", 15, 0x2000, 0, NULL, kcp_recv_test, (void *)NULL);*/
}
late_initcall(c_main);
#endif //USE_WIFI_RAW_KCP_TEST