193 lines
6.8 KiB
C
193 lines
6.8 KiB
C
|
||
#include "uip.h"
|
||
#include "uip_arp.h"
|
||
#include "tapdev.h"
|
||
#include "os/os_compat.h"
|
||
#include "uip_timer.h"
|
||
#include "dhcpc.h"
|
||
#include "tcp_demo.h"
|
||
#include "udp_demo.h"
|
||
|
||
|
||
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
|
||
|
||
void UipPro(void)
|
||
{
|
||
u8 i;
|
||
static struct timer periodic_timer, arp_timer;
|
||
static u8 timer_ok = 0;
|
||
|
||
if (timer_ok == 0) { //仅初始化一次
|
||
timer_ok = 1;
|
||
timer_set(&periodic_timer, CLOCK_SECOND / 2); //创建1个0.5秒的定时器
|
||
timer_set(&arp_timer, CLOCK_SECOND * 10); //创建1个10秒的定时器
|
||
}
|
||
|
||
if (uip_len > 0) { //有数据
|
||
//处理IP数据包(只有校验通过的IP包才会被接收)
|
||
if (BUF->type == htons(UIP_ETHTYPE_IP)) { //是否是IP包?
|
||
uip_arp_ipin(); //去除以太网头结构,更新ARP表
|
||
uip_input(); //IP包处理
|
||
//当上面的函数执行后,如果需要发送数据,则全局变量 uip_len > 0
|
||
//需要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量)
|
||
if (uip_len > 0) { //需要回应数据
|
||
uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求
|
||
tapdev_send();//发送数据到以太网
|
||
}
|
||
} else if (BUF->type == htons(UIP_ETHTYPE_ARP)) { //处理arp报文,是否是ARP请求包?
|
||
uip_arp_arpin();
|
||
|
||
//当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0
|
||
//需要发送的数据在uip_buf, 长度是uip_len(这是2个全局变量)
|
||
if (uip_len > 0) {
|
||
tapdev_send(); //需要发送数据,则通过tapdev_send发送
|
||
}
|
||
}
|
||
} else if (timer_expired(&periodic_timer)) { //0.5秒定时器超时
|
||
timer_reset(&periodic_timer); //复位0.5秒定时器
|
||
|
||
//轮流处理每个TCP连接, UIP_CONNS缺省是40个
|
||
for (i = 0; i < UIP_CONNS; i++) {
|
||
uip_periodic(i); //处理TCP通信事件
|
||
|
||
//当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0
|
||
//需要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量)
|
||
if (uip_len > 0) {
|
||
uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求
|
||
tapdev_send();//发送数据到以太网
|
||
}
|
||
}
|
||
|
||
#if UIP_UDP //UIP_UDP
|
||
|
||
//轮流处理每个UDP连接, UIP_UDP_CONNS缺省是10个
|
||
for (i = 0; i < UIP_UDP_CONNS; i++) {
|
||
uip_udp_periodic(i); //处理UDP通信事件
|
||
|
||
//当上面的函数执行后,如果需要发送数据,则全局变量uip_len>0
|
||
//需要发送的数据在uip_buf, 长度是uip_len (这是2个全局变量)
|
||
if (uip_len > 0) {
|
||
uip_arp_out();//加以太网头结构,在主动连接时可能要构造ARP请求
|
||
tapdev_send();//发送数据到以太网
|
||
}
|
||
}
|
||
|
||
#endif
|
||
|
||
//每隔10秒调用1次ARP定时器函数 用于定期ARP处理,ARP表10秒更新一次,旧的条目会被抛弃
|
||
if (timer_expired(&arp_timer)) {
|
||
timer_reset(&arp_timer);
|
||
uip_arp_timer();
|
||
}
|
||
}
|
||
}
|
||
static void uip_task(void *prive)
|
||
{
|
||
static u8 init_flog = 0;
|
||
u8_t tcp_server_tsta = 0xff;
|
||
u8_t tcp_client_tsta = 0xff;
|
||
u8_t udp_server_tsta = 0xff;
|
||
u8_t udp_client_tsta = 0xff;
|
||
static struct timer arp_timer;
|
||
DEBUG_PRINTF(">>>>>>>>>>>>uip_test");
|
||
|
||
while (1) {
|
||
|
||
UipPro();//该函数需要放在循环里面处理数据
|
||
|
||
if (DHCP_ok_flog) { //DHCP已经获取到了动态分配的IP
|
||
if (!init_flog) { //初始化配置进行一次
|
||
init_flog = 1;
|
||
tcp_server_connect();
|
||
/*tcp_client_connect();*/
|
||
/*udp_server_connect();*/ //需要开关宏定义USE_UDP_CLIENT USE_UDP_SERVER
|
||
/*udp_client_connect();*/
|
||
}
|
||
}
|
||
|
||
if (tcp_server_tsta != tcp_server_sta) { //TCP Server状态改变
|
||
if (tcp_server_sta & (1 << 7)) {
|
||
printf("TCP Server Connected\r\n");
|
||
} else {
|
||
printf("TCP Server Disconnected\r\n");
|
||
}
|
||
if (tcp_server_sta & (1 << 6)) { //收到新数据
|
||
printf("TCP Server RX:%s\r\n", tcp_server_rx_databuf); //打印数据
|
||
tcp_send_data(" TCP Server TX Successfully!\r\n");
|
||
tcp_server_sta &= ~(1 << 6); //标记数据已经被处理
|
||
}
|
||
tcp_server_tsta = tcp_server_sta;
|
||
}
|
||
|
||
if (tcp_client_tsta != tcp_client_sta) { //TCP Client状态改变
|
||
if (tcp_client_sta & (1 << 7)) {
|
||
printf("TCP Client Connected\r\n");
|
||
} else {
|
||
printf("TCP Client Disconnected\r\n");
|
||
}
|
||
if (tcp_client_sta & (1 << 6)) { //收到新数据
|
||
printf("TCP Client RX:%s\r\n", tcp_client_rx_databuf); //打印数据
|
||
tcp_send_data("TCP Client TX Successfully!\r\n");
|
||
tcp_client_sta &= ~(1 << 6); //标记数据已经被处理
|
||
}
|
||
tcp_client_tsta = tcp_client_sta;
|
||
}
|
||
|
||
if (udp_server_tsta != udp_server_sta) { //UDP Server状态改变
|
||
if (udp_server_sta & (1 << 7)) {
|
||
printf("UDP Server Connected\r\n");
|
||
} else {
|
||
printf("UDP Server Disconnected\r\n");
|
||
}
|
||
if (udp_server_sta & (1 << 6)) { //收到新数据
|
||
printf("UDP Server RX:%s\r\n", udp_server_rx_databuf); //打印数据
|
||
udp_send_data(" UDP Server TX Successfully!\r\n");
|
||
udp_server_sta &= ~(1 << 6); //标记数据已经被处理
|
||
}
|
||
udp_server_tsta = udp_server_sta;
|
||
}
|
||
|
||
if (udp_client_tsta != udp_client_sta) { //UDP Client状态改变
|
||
if (udp_client_sta & (1 << 7)) {
|
||
printf("UDP Client Connected\r\n");
|
||
} else {
|
||
printf("UDP Client Disconnected\r\n");
|
||
}
|
||
if (udp_client_sta & (1 << 6)) { //收到新数据
|
||
printf("UDP Client RX:%s\r\n", udp_client_rx_databuf); //打印数据
|
||
udp_send_data(" UDP Client TX Successfully!\r\n");
|
||
udp_client_sta &= ~(1 << 6); //标记数据已经被处理
|
||
}
|
||
udp_client_tsta = udp_client_sta;
|
||
}
|
||
|
||
os_time_dly(1);
|
||
}
|
||
}
|
||
|
||
/*测试程序入口*/
|
||
void uip_test(void)
|
||
{
|
||
thread_fork("uip_task", 20, 512, 0, NULL, uip_task, NULL);
|
||
}
|
||
|
||
int uip_test_main(char *mac)
|
||
{
|
||
uip_ipaddr_t ipaddr;
|
||
|
||
uip_ipaddr(ipaddr, 0, 0, 0, 0); //初始化IP让DHCP去获取IP
|
||
uip_sethostaddr(ipaddr);
|
||
uip_ipaddr(ipaddr, 0, 0, 0, 0);
|
||
uip_setnetmask(ipaddr);
|
||
|
||
dhcpc_init(mac, 6);
|
||
printf("dhcp init ok");
|
||
dhcpc_request();
|
||
|
||
uip_test();
|
||
|
||
return 0 ;
|
||
|
||
}
|
||
|