|
|
@@ -14,6 +14,7 @@
|
|
|
#include "luat_airlink.h"
|
|
|
#include "luat_mem.h"
|
|
|
#include "luat_netdrv_whale.h"
|
|
|
+#include "luat_netdrv_event.h"
|
|
|
#include "luat_ulwip.h"
|
|
|
|
|
|
#define LUAT_LOG_TAG "netdrv.whale"
|
|
|
@@ -32,7 +33,6 @@ extern luat_airlink_dev_info_t g_airlink_self_dev_info;
|
|
|
static err_t luat_netif_init(struct netif *netif);
|
|
|
static err_t netif_output(struct netif *netif, struct pbuf *p);
|
|
|
static int netif_ip_event_cb(lua_State *L, void* ptr);
|
|
|
-static int whale_dhcp(luat_netdrv_t* drv, void* userdata, int enable);
|
|
|
|
|
|
void luat_netdrv_whale_dataout(luat_netdrv_t* drv, void* userdata, uint8_t* buff, uint16_t len) {
|
|
|
// TODO 发送到spi slave task
|
|
|
@@ -87,8 +87,8 @@ void luat_netdrv_whale_boot(luat_netdrv_t* drv, void* userdata) {
|
|
|
memset(netdrv->netif, 0, sizeof(struct netif));
|
|
|
}
|
|
|
luat_netdrv_whale_t* cfg = (luat_netdrv_whale_t*)userdata;
|
|
|
- cfg->ulwip.netif = netdrv->netif;
|
|
|
- cfg->ulwip.adapter_index = cfg->id;
|
|
|
+ drv->ulwip->netif = netdrv->netif;
|
|
|
+ drv->ulwip->adapter_index = cfg->id;
|
|
|
|
|
|
netif_add(netdrv->netif, IP4_ADDR_ANY, IP4_ADDR_ANY, IP4_ADDR_ANY, netdrv, luat_netif_init, luat_netdrv_netif_input_main);
|
|
|
|
|
|
@@ -97,20 +97,15 @@ void luat_netdrv_whale_boot(luat_netdrv_t* drv, void* userdata) {
|
|
|
// 默认是down的就行
|
|
|
}
|
|
|
else if (netdrv->id == NW_ADAPTER_INDEX_LWIP_GP_GW) {
|
|
|
- // 这里要分情况, 如果本身带4G模块, 那么就up, 否则就是down
|
|
|
- // 通过devinfo等途径, 通知对端netif的开启与关闭
|
|
|
- #if defined(LUAT_USE_MOBILE) && !defined(LUAT_USE_DRV_MOBILE)
|
|
|
- netif_set_up(netdrv->netif);
|
|
|
- #endif
|
|
|
}
|
|
|
else {
|
|
|
- netif_set_up(netdrv->netif);
|
|
|
+ // 其他的设备, 直接设置成up和link up
|
|
|
+ netif_set_link_up(netdrv->netif);
|
|
|
}
|
|
|
if (netdrv->id == NW_ADAPTER_INDEX_LWIP_WIFI_STA) {
|
|
|
- cfg->dhcp = 1;
|
|
|
- cfg->ulwip.dhcp_enable = 1;
|
|
|
+ drv->ulwip->dhcp_enable = 1;
|
|
|
}
|
|
|
- netif_set_link_up(netdrv->netif);
|
|
|
+ netif_set_up(netdrv->netif);
|
|
|
net_lwip2_set_netif(netdrv->id, netdrv->netif);
|
|
|
net_lwip2_register_adapter(netdrv->id);
|
|
|
// LLOGD("luat_netdrv_whale_boot 执行完成");
|
|
|
@@ -157,109 +152,34 @@ static err_t luat_netif_init(struct netif *netif) {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int netif_ip_event_cb(lua_State *L, void* ptr) {
|
|
|
- rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
|
|
|
- char buff[32] = {0};
|
|
|
- luat_netdrv_t* netdrv = luat_netdrv_get(msg->arg1);
|
|
|
- if (netdrv == NULL) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- lua_getglobal(L, "sys_pub");
|
|
|
- if (lua_isfunction(L, -1)) {
|
|
|
- if (msg->arg2 == 0) {
|
|
|
- LLOGD("IP_LOSE %d", netdrv->id);
|
|
|
- lua_pushstring(L, "IP_LOSE");
|
|
|
- lua_pushinteger(L, netdrv->id);
|
|
|
- lua_call(L, 2, 0);
|
|
|
- }
|
|
|
- else {
|
|
|
- ipaddr_ntoa_r(&netdrv->netif->ip_addr, buff, 32);
|
|
|
- LLOGD("IP_READY %d %s", netdrv->id, buff);
|
|
|
- lua_pushstring(L, "IP_READY");
|
|
|
- lua_pushstring(L, buff);
|
|
|
- lua_pushinteger(L, netdrv->id);
|
|
|
- lua_call(L, 3, 0);
|
|
|
- }
|
|
|
- }
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-typedef struct tmpptr {
|
|
|
- luat_netdrv_t* drv;
|
|
|
- uint8_t updown;
|
|
|
-}tmpptr_t;
|
|
|
-
|
|
|
-static void _luat_netdrv_whale_ipevent(tmpptr_t* ptr) {
|
|
|
- luat_netdrv_t* drv = ptr->drv;
|
|
|
- uint8_t updown = ptr->updown;
|
|
|
- rtos_msg_t msg = {0};
|
|
|
- void* userdata = NULL;
|
|
|
- luat_netdrv_whale_t* cfg = (luat_netdrv_whale_t*)drv->userdata;
|
|
|
- if (updown) {
|
|
|
- netif_set_up(drv->netif);
|
|
|
- if (cfg->ulwip.netif == NULL) {
|
|
|
- cfg->ulwip.netif = drv->netif;
|
|
|
- }
|
|
|
- if (cfg->dhcp) {
|
|
|
- // LLOGD("dhcp启动 %p", cfg->ulwip.netif);
|
|
|
- ip_addr_set_ip4_u32(&cfg->ulwip.netif->ip_addr, 0);
|
|
|
- ip_addr_set_ip4_u32(&cfg->ulwip.netif->gw, 0);
|
|
|
- ulwip_dhcp_client_start(&cfg->ulwip);
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- luat_netdrv_netif_set_down(drv->netif);
|
|
|
- if (cfg->dhcp) {
|
|
|
- // LLOGD("dhcp停止");
|
|
|
- ip_addr_set_ip4_u32(&cfg->ulwip.netif->ip_addr, 0);
|
|
|
- ip_addr_set_ip4_u32(&cfg->ulwip.netif->gw, 0);
|
|
|
- ulwip_dhcp_client_stop(&cfg->ulwip);
|
|
|
- }
|
|
|
- }
|
|
|
- network_adapter_info* info = network_adapter_fetch(drv->id, &userdata);
|
|
|
- if (info == NULL || info->check_ready == NULL) {
|
|
|
- // LLOGI("网络适配器(%d)不存在, 或者没有check_ready函数", adapter_index);
|
|
|
- return;
|
|
|
- }
|
|
|
- int ready = info->check_ready(userdata);
|
|
|
- net_lwip2_set_link_state(drv->id, ready);
|
|
|
- msg.arg1 = drv->id;
|
|
|
- msg.arg2 = ready;
|
|
|
- msg.ptr = NULL;
|
|
|
- msg.handler = netif_ip_event_cb;
|
|
|
- luat_msgbus_put(&msg, 0);
|
|
|
-}
|
|
|
-
|
|
|
-void luat_netdrv_whale_ipevent(luat_netdrv_t* drv, uint8_t updown) {
|
|
|
- if (drv == NULL || drv->netif == NULL) {
|
|
|
- return;
|
|
|
- }
|
|
|
- tmpptr_t ptr = {
|
|
|
- .drv = drv,
|
|
|
- .updown = updown,
|
|
|
- };
|
|
|
- tcpip_callback_with_block(_luat_netdrv_whale_ipevent, &ptr, 1);
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
luat_netdrv_t* luat_netdrv_whale_create(luat_netdrv_whale_t* tmp) {
|
|
|
// LLOGD("创建Whale设备");
|
|
|
luat_netdrv_t* netdrv = luat_heap_malloc(sizeof(luat_netdrv_t));
|
|
|
- if (netdrv == NULL) {
|
|
|
+ ulwip_ctx_t* ulwip = luat_heap_malloc(sizeof(ulwip_ctx_t));
|
|
|
+ luat_netdrv_whale_t* cfg = luat_heap_malloc(sizeof(luat_netdrv_whale_t));
|
|
|
+ if (netdrv == NULL || ulwip == NULL || cfg == NULL) {
|
|
|
+ if (netdrv)
|
|
|
+ luat_heap_free(netdrv);
|
|
|
+ if (ulwip)
|
|
|
+ luat_heap_free(ulwip);
|
|
|
+ if (cfg)
|
|
|
+ luat_heap_free(cfg);
|
|
|
return NULL;
|
|
|
}
|
|
|
+ memset(ulwip, 0, sizeof(ulwip_ctx_t));
|
|
|
+ memset(netdrv, 0, sizeof(luat_netdrv_t));
|
|
|
// 把配置信息拷贝一份
|
|
|
- luat_netdrv_whale_t* cfg = luat_heap_malloc(sizeof(luat_netdrv_whale_t));
|
|
|
memcpy(cfg, tmp, sizeof(luat_netdrv_whale_t));
|
|
|
|
|
|
// 初始化netdrv
|
|
|
- memset(netdrv, 0, sizeof(luat_netdrv_t));
|
|
|
netdrv->id = cfg->id;
|
|
|
netdrv->netif = NULL;
|
|
|
netdrv->dataout = luat_netdrv_whale_dataout;
|
|
|
netdrv->boot = luat_netdrv_whale_boot;
|
|
|
netdrv->userdata = cfg;
|
|
|
- netdrv->dhcp = whale_dhcp;
|
|
|
+ netdrv->dhcp = luat_netdrv_dhcp_opt;
|
|
|
+ netdrv->ulwip = ulwip;
|
|
|
+ ulwip->adapter_index = netdrv->id;
|
|
|
return netdrv;
|
|
|
}
|
|
|
|
|
|
@@ -291,21 +211,4 @@ luat_netdrv_t* luat_netdrv_whale_setup(luat_netdrv_conf_t* conf) {
|
|
|
return drv;
|
|
|
}
|
|
|
|
|
|
-static int whale_dhcp(luat_netdrv_t* drv, void* userdata, int enable) {
|
|
|
- luat_netdrv_whale_t* cfg = (luat_netdrv_whale_t*)userdata;
|
|
|
- if (cfg->dhcp == enable) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- cfg->dhcp = (uint8_t)enable;
|
|
|
- cfg->ulwip.dhcp_enable = enable;
|
|
|
- if (cfg->ulwip.netif == NULL) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- if (enable) {
|
|
|
- ulwip_dhcp_client_start(&cfg->ulwip);
|
|
|
- }
|
|
|
- else {
|
|
|
- ulwip_dhcp_client_stop(&cfg->ulwip);
|
|
|
- }
|
|
|
- return 0;
|
|
|
-}
|
|
|
+
|