void wireless_send_event(struct net_device * dev, unsigned int cmd, union iwreq_data * wrqu, char * extra) { printf("wireless_send_event[0x%x]",cmd); if(cmd == IWEVCUSTOM) { printf("[0x%x] %s\r\n",wrqu->data.flags,extra); switch (wrqu->data.flags) { case IW_STA_LINKUP_EVENT_FLAG: netifapi_netif_common(&wireless_netif, netif_set_link_up, NULL); #if LWIP_DHCP printf("dhcp_start...\r\n"); netifapi_netif_common(&wireless_netif, NULL, dhcp_start); #endif break; case IW_STA_LINKDOWN_EVENT_FLAG: netifapi_netif_common(&wireless_netif, netif_set_link_down, NULL); #if LWIP_DHCP netifapi_netif_common(&wireless_netif, dhcp_stop, NULL); netifapi_netif_common(&wireless_netif, netif_set_down, NULL); netifapi_netif_set_addr(&wireless_netif, IP_ADDR_ANY, IP_ADDR_ANY, IP_ADDR_ANY); #endif break; } } }
/********************************************************************************************************* ** 函数名称: __tshellIfUp ** 功能描述: 系统命令 "ifup" ** 输 入 : iArgC 参数个数 ** ppcArgV 参数表 ** 输 出 : 0 ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT __tshellIfUp (INT iArgC, PCHAR *ppcArgV) { struct netif *netif; BOOL bUseDHCP = LW_FALSE; /* 是否使用自动获取 IP */ BOOL bShutDownDHCP = LW_FALSE; /* 是否强制关闭 DHCP */ if (iArgC < 2) { fprintf(stderr, "argments error!\n"); return (-ERROR_TSHELL_EPARAM); } else if (iArgC > 2) { if (lib_strcmp(ppcArgV[2], "-dhcp") == 0) { bUseDHCP = LW_TRUE; /* 使用 DHCP 启动 */ } else if (lib_strcmp(ppcArgV[2], "-nodhcp") == 0) { bShutDownDHCP = LW_TRUE; } } netif = netif_find(ppcArgV[1]); /* 查询网络接口 */ if (netif == LW_NULL) { fprintf(stderr, "can not find net interface.\n"); return (-ERROR_TSHELL_EPARAM); } if (netif_is_up(netif)) { /* 网卡是否已经启动 */ #if LWIP_DHCP > 0 /* 首先关闭网卡 */ if (netif->dhcp && netif->dhcp->pcb) { netifapi_netif_common(netif, NULL, dhcp_release); /* 解除 DHCP 租约 */ netifapi_dhcp_stop(netif); /* 释放资源 */ } #endif /* LWIP_DHCP > 0 */ netifapi_netif_set_down(netif); /* 禁用网卡 */ } netifapi_netif_set_up(netif); /* 启动网卡 */ #if LWIP_DHCP > 0 if (bUseDHCP) { netif->flags2 |= NETIF_FLAG2_DHCP; /* 使用 DHCP 启动 */ } else if (bShutDownDHCP) { netif->flags2 &= ~NETIF_FLAG2_DHCP; /* 强制关闭 DHCP */ } if (netif->flags2 & NETIF_FLAG2_DHCP) { ip_addr_t inaddrNone; lib_bzero(&inaddrNone, sizeof(ip_addr_t)); netifapi_netif_set_addr(netif, &inaddrNone, &inaddrNone, &inaddrNone); /* 所有地址设置为 0 */ printf("DHCP client starting...\n"); if (netifapi_dhcp_start(netif) < ERR_OK) { printf("DHCP client serious error.\n"); } else { printf("DHCP client start.\n"); } } #endif /* LWIP_DHCP > 0 */ printf("net interface \"%s\" set up.\n", ppcArgV[1]); return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: if_up ** 功能描述: 打开网卡 ** 输 入 : ifname if name ** 输 出 : 网卡是否打开 ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT if_up (const char *ifname) { INT iError; struct netif *pnetif; LWIP_NETIF_LOCK(); /* 进入临界区 */ pnetif = netif_find((char *)ifname); if (pnetif) { if (!(pnetif->flags & NETIF_FLAG_UP)) { netifapi_netif_set_up(pnetif); #if LWIP_DHCP > 0 if (pnetif->flags2 & NETIF_FLAG2_DHCP) { ip_addr_t inaddrNone; lib_bzero(&inaddrNone, sizeof(ip_addr_t)); netifapi_netif_set_addr(pnetif, &inaddrNone, &inaddrNone, &inaddrNone); netifapi_dhcp_start(pnetif); } #endif /* LWIP_DHCP > 0 */ iError = ERROR_NONE; } else { _ErrorHandle(EALREADY); iError = PX_ERROR; } } else { _ErrorHandle(ENXIO); iError = PX_ERROR; } LWIP_NETIF_UNLOCK(); /* 退出临界区 */ return (iError); }
/********************************************************************************************************* ** 函数名称: __netIfSet ** 功能描述: 设置指定网络接口信息 (ip v4) ** 输 入 : netif 网络接口 ** pcItem 设置项目名称 ** ipaddr 地址信息 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ static VOID __netIfSet (struct netif *netif, CPCHAR pcItem, ip_addr_t ipaddr) { ip_addr_t ipaddrInet; ip_addr_t ipaddrMask; ip_addr_t ipaddrGw; if (netif == LW_NULL) { return; } ipaddrInet = netif->ip_addr; ipaddrMask = netif->netmask; ipaddrGw = netif->gw; if (lib_strcmp(pcItem, "inet") == 0) { netifapi_netif_set_addr(netif, &ipaddr, &ipaddrMask, &ipaddrGw); } else if (lib_strcmp(pcItem, "netmask") == 0) { netifapi_netif_set_addr(netif, &ipaddrInet, &ipaddr, &ipaddrGw); } else if (lib_strcmp(pcItem, "gateway") == 0) { netifapi_netif_set_addr(netif, &ipaddrInet, &ipaddrMask, &ipaddr); } else { fprintf(stderr, "argments error!\n"); } }
/** * LwIP system initialization */ int lwip_system_init(void) { rt_err_t rc; struct rt_semaphore done_sem; /* set default netif to NULL */ netif_default = RT_NULL; rc = rt_sem_init(&done_sem, "done", 0, RT_IPC_FLAG_FIFO); if (rc != RT_EOK) { LWIP_ASSERT("Failed to create semaphore", 0); return -1; } tcpip_init(tcpip_init_done_callback, (void *)&done_sem); /* waiting for initialization done */ if (rt_sem_take(&done_sem, RT_WAITING_FOREVER) != RT_EOK) { rt_sem_detach(&done_sem); return -1; } rt_sem_detach(&done_sem); /* set default ip address */ #if !LWIP_DHCP if (netif_default != RT_NULL) { struct ip_addr ipaddr, netmask, gw; IP4_ADDR(&ipaddr, RT_LWIP_IPADDR0, RT_LWIP_IPADDR1, RT_LWIP_IPADDR2, RT_LWIP_IPADDR3); IP4_ADDR(&gw, RT_LWIP_GWADDR0, RT_LWIP_GWADDR1, RT_LWIP_GWADDR2, RT_LWIP_GWADDR3); IP4_ADDR(&netmask, RT_LWIP_MSKADDR0, RT_LWIP_MSKADDR1, RT_LWIP_MSKADDR2, RT_LWIP_MSKADDR3); netifapi_netif_set_addr(netif_default, &ipaddr, &netmask, &gw); } #endif rt_kprintf("lwIP-%d.%d.%d initialized!\n", LWIP_VERSION_MAJOR, LWIP_VERSION_MINOR, LWIP_VERSION_REVISION); return 0; }
/** * LwIP system initialization */ void lwip_system_init(void) { rt_err_t rc; struct rt_semaphore done_sem; rc = rt_sem_init(&done_sem, "done", 0, RT_IPC_FLAG_FIFO); if(rc != RT_EOK) { LWIP_ASSERT("Failed to create semaphore", 0); return; } tcpip_init(tcpip_init_done_callback,(void *)&done_sem); /* waiting for initialization done */ if (rt_sem_take(&done_sem, RT_WAITING_FOREVER) != RT_EOK) { rt_sem_detach(&done_sem); return; } rt_sem_detach(&done_sem); /* set default ip address */ #if !LWIP_DHCP { struct ip_addr ipaddr, netmask, gw; IP4_ADDR(&ipaddr, RT_LWIP_IPADDR0, RT_LWIP_IPADDR1, RT_LWIP_IPADDR2, RT_LWIP_IPADDR3); IP4_ADDR(&gw, RT_LWIP_GWADDR0, RT_LWIP_GWADDR1, RT_LWIP_GWADDR2, RT_LWIP_GWADDR3); IP4_ADDR(&netmask, RT_LWIP_MSKADDR0, RT_LWIP_MSKADDR1, RT_LWIP_MSKADDR2, RT_LWIP_MSKADDR3); netifapi_netif_set_addr(netif_default, &ipaddr, &netmask, &gw); } #endif }
err_t tls_netif2_set_addr(ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t *gw) { return netifapi_netif_set_addr(nif->next, ipaddr, netmask, gw); }