/********************************************************************************************************* ** 函数名称: 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); }
/********************************************************************************************************* ** 函数名称: if_set_dhcp ** 功能描述: 设置网卡 dhcp 选项 (必须在网卡禁能时设置) ** 输 入 : ifname if name ** en 1: 使能 dhcp 0: 禁能 dhcp ** 输 出 : OK or ERROR ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT if_set_dhcp (const char *ifname, int en) { INT iRet = PX_ERROR; #if LWIP_DHCP > 0 struct netif *pnetif; LWIP_NETIF_LOCK(); /* 进入临界区 */ pnetif = netif_find((char *)ifname); if (pnetif) { if (pnetif->flags & NETIF_FLAG_UP) { _ErrorHandle(EISCONN); } else { if (en) { pnetif->flags2 |= NETIF_FLAG2_DHCP; } else { pnetif->flags2 &= ~NETIF_FLAG2_DHCP; } iRet = ERROR_NONE; } } else { _ErrorHandle(ENXIO); } LWIP_NETIF_UNLOCK(); /* 退出临界区 */ #else _ErrorHandle(ENOSYS); #endif /* LWIP_DHCP > 0 */ return (iRet); }
/********************************************************************************************************* ** 函数名称: if_down ** 功能描述: 关闭网卡 ** 输 入 : ifname if name ** 输 出 : 关闭是否成功 ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT if_down (const char *ifname) { INT iError; struct netif *pnetif; LWIP_NETIF_LOCK(); /* 进入临界区 */ pnetif = netif_find((char *)ifname); if (pnetif) { if (pnetif->flags & NETIF_FLAG_UP) { #if LWIP_DHCP > 0 if (pnetif->dhcp && pnetif->dhcp->pcb) { netifapi_netif_common(pnetif, NULL, dhcp_release); /* 解除 DHCP 租约, 同时停止网卡*/ netifapi_dhcp_stop(pnetif); /* 释放资源 */ } #endif /* LWIP_DHCP > 0 */ netifapi_netif_set_down(pnetif); /* 禁用网卡 */ iError = ERROR_NONE; } else { _ErrorHandle(EALREADY); iError = PX_ERROR; } } else { _ErrorHandle(ENXIO); iError = PX_ERROR; } LWIP_NETIF_UNLOCK(); /* 退出临界区 */ return (iError); }
/********************************************************************************************************* ** 函数名称: if_indextoname ** 功能描述: map a network interface index to its corresponding name ** 输 入 : ifindex if index ** ifname if name buffer at least {IF_NAMESIZE} bytes ** 输 出 : index ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API char *if_indextoname (unsigned ifindex, char *ifname) { struct netif *pnetif; if (!ifname) { errno = EINVAL; } LWIP_NETIF_LOCK(); /* 进入临界区 */ pnetif = (struct netif *)netif_get_by_index(ifindex); if (pnetif) { ifname[0] = pnetif->name[0]; ifname[1] = pnetif->name[1]; ifname[2] = (char)(pnetif->num + '0'); ifname[3] = PX_EOS; } LWIP_NETIF_UNLOCK(); /* 退出临界区 */ if (pnetif) { return (ifname); } else { errno = ENXIO; return (LW_NULL); } }
/********************************************************************************************************* ** 函数名称: netif_add_hook ** 功能描述: 创建网络接口回调函数, 返回网络接口号 (网络上下文中调用) ** 输 入 : pvNetif 网络接口 ** 输 出 : ERR ** 全局变量: ** 调用模块: *********************************************************************************************************/ INT netif_add_hook (PVOID pvNetif) { struct netif *netif = (struct netif *)pvNetif; INT i; if (_G_ulNetifLock == 0) { _G_ulNetifLock = API_SemaphoreMCreate("netif_lock", LW_PRIO_DEF_CEILING, LW_OPTION_DELETE_SAFE | LW_OPTION_INHERIT_PRIORITY | LW_OPTION_OBJECT_GLOBAL, LW_NULL); } LWIP_NETIF_LOCK(); /* 进入临界区 */ for (i = 0; i < __LW_NETIF_MAX_NUM; i++) { if (_G_pnetifArray[i] == LW_NULL) { _G_pnetifArray[i] = netif; netif->num = (UINT8)i; _G_uiNetifNum++; break; } } LWIP_NETIF_UNLOCK(); /* 退出临界区 */ if (i < __LW_NETIF_MAX_NUM) { rt_netif_add_hook(netif); /* 更新路由表有效标志 */ return (ERR_OK); } else { return (ERR_USE); } }
/********************************************************************************************************* ** 函数名称: netif_remove_hook ** 功能描述: 删除网络接口回调函数. (网络上下文中调用) ** 输 入 : pvNetif 网络接口 ** 输 出 : ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID netif_remove_hook (PVOID pvNetif) { struct netif *netif = (struct netif *)pvNetif; INT iNum = (INT)netif->num; rt_netif_remove_hook(netif); /* 更新路由表有效标志 */ if (iNum < __LW_NETIF_MAX_NUM) { LWIP_NETIF_LOCK(); /* 进入临界区 */ _G_pnetifArray[iNum] = LW_NULL; _G_uiNetifNum--; LWIP_NETIF_UNLOCK(); /* 退出临界区 */ } #if LW_CFG_NET_NPF_EN > 0 __npfNetifRemoveHook(netif); #endif /* LW_CFG_NET_NPF_EN > 0 */ #if LW_CFG_LWIP_DHCP > 0 if (netif->dhcp) { dhcp_stop(netif); /* 关闭 DHCP 回收 UDP 控制块 */ dhcp_cleanup(netif); /* 回收 DHCP 内存 */ } #endif /* LW_CFG_LWIP_DHCP > 0 */ #if LW_CFG_LWIP_AUTOIP > 0 if (netif->autoip) { mem_free(netif->autoip); /* 回收 AUTOIP 内存 */ netif->autoip = LW_NULL; } #endif /* LW_CFG_LWIP_AUTOIP > 0 */ }
/********************************************************************************************************* ** 函数名称: netif_get_num ** 功能描述: 获得网络接口数量. ** 输 入 : NONE ** 输 出 : 网络接口数量 ** 全局变量: ** 调用模块: *********************************************************************************************************/ UINT netif_get_num (VOID) { UINT uiNum; LWIP_NETIF_LOCK(); /* 进入临界区 */ uiNum = _G_uiNetifNum; LWIP_NETIF_UNLOCK(); /* 退出临界区 */ return (uiNum); }
/********************************************************************************************************* ** 函数名称: if_nametoindex ** 功能描述: map a network interface name to its corresponding index ** 输 入 : ifname if name ** 输 出 : index ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API unsigned if_nametoindex (const char *ifname) { struct netif *pnetif; unsigned uiIndex = 0; LWIP_NETIF_LOCK(); /* 进入临界区 */ pnetif = netif_find((char *)ifname); if (pnetif) { uiIndex = (unsigned)pnetif->num; } LWIP_NETIF_UNLOCK(); /* 退出临界区 */ return (uiIndex); }
/********************************************************************************************************* ** 函数名称: if_nameindex ** 功能描述: return all network interface names and indexes ** 输 入 : NONE ** 输 出 : An array of structures identifying local interfaces ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API struct if_nameindex *if_nameindex (void) { struct netif *pnetif; int iNum = 1; /* 需要一个空闲的位置 */ struct if_nameindex *pifnameindexArry; LWIP_NETIF_LOCK(); /* 进入临界区 */ for(pnetif = netif_list; pnetif != LW_NULL; pnetif = pnetif->next) { iNum++; } pifnameindexArry = (struct if_nameindex *)__SHEAP_ALLOC(sizeof(struct if_nameindex) * (size_t)iNum); if (pifnameindexArry) { int i = 0; for(pnetif = netif_list; pnetif != LW_NULL; pnetif = pnetif->next) { pifnameindexArry[i].if_index = (unsigned)pnetif->num; pifnameindexArry[i].if_name_buf[0] = pnetif->name[0]; pifnameindexArry[i].if_name_buf[1] = pnetif->name[1]; pifnameindexArry[i].if_name_buf[2] = (char)(pnetif->num + '0'); pifnameindexArry[i].if_name_buf[3] = PX_EOS; pifnameindexArry[i].if_name = pifnameindexArry[i].if_name_buf; i++; } pifnameindexArry[i].if_index = 0; pifnameindexArry[i].if_name_buf[0] = PX_EOS; pifnameindexArry[i].if_name = pifnameindexArry[i].if_name_buf; } else { errno = ENOMEM; } LWIP_NETIF_UNLOCK(); /* 退出临界区 */ return (pifnameindexArry); }
/********************************************************************************************************* ** 函数名称: if_get_dhcp ** 功能描述: 获取网卡 dhcp 选项 ** 输 入 : ifname if name ** 输 出 : 1: 使能 dhcp 0: 禁能 dhcp -1: 网卡名字错误 ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API INT if_get_dhcp (const char *ifname) { INT iRet; struct netif *pnetif; LWIP_NETIF_LOCK(); /* 进入临界区 */ pnetif = netif_find((char *)ifname); if (pnetif) { if (pnetif->flags2 & NETIF_FLAG2_DHCP) { iRet = 1; } else { iRet = 0; } } else { _ErrorHandle(ENXIO); iRet = PX_ERROR; } LWIP_NETIF_UNLOCK(); /* 退出临界区 */ return (iRet); }
/********************************************************************************************************* ** 函数名称: __tshellArp ** 功能描述: 系统命令 "arp" ** 输 入 : iArgC 参数个数 ** ppcArgV 参数表 ** 输 出 : 0 ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT __tshellArp (INT iArgC, PCHAR *ppcArgV) { if (iArgC < 2) { fprintf(stderr, "argments error!\n"); return (-ERROR_TSHELL_EPARAM); } if (lib_strcmp(ppcArgV[1], "-a") == 0) { /* 显示 arp 表 */ INT iFd; CHAR cBuffer[512]; ssize_t sstNum; iFd = open("/proc/net/arp", O_RDONLY); if (iFd < 0) { fprintf(stderr, "can not open /proc/net/arp : %s\n", lib_strerror(errno)); return (PX_ERROR); } do { sstNum = read(iFd, cBuffer, sizeof(cBuffer)); if (sstNum > 0) { write(STDOUT_FILENO, cBuffer, (size_t)sstNum); } } while (sstNum > 0); close(iFd); return (ERROR_NONE); } else if (lib_strcmp(ppcArgV[1], "-s") == 0) { /* 加入一个静态转换关系 */ INT i; INT iTemp[6]; ip_addr_t ipaddr; struct eth_addr ethaddr; err_t err; if (iArgC != 4) { fprintf(stderr, "argments error!\n"); return (-ERROR_TSHELL_EPARAM); } ipaddr.addr = ipaddr_addr(ppcArgV[2]); if (ipaddr.addr == IPADDR_NONE) { fprintf(stderr, "bad inet address : %s\n", ppcArgV[2]); return (-ERROR_TSHELL_EPARAM); } if (sscanf(ppcArgV[3], "%02x:%02x:%02x:%02x:%02x:%02x", &iTemp[0], &iTemp[1], &iTemp[2], &iTemp[3], &iTemp[4], &iTemp[5]) != 6) { fprintf(stderr, "bad physical address : %s\n", ppcArgV[3]); return (-ERROR_TSHELL_EPARAM); } for (i = 0; i < 6; i++) { ethaddr.addr[i] = (u8_t)iTemp[i]; } LOCK_TCPIP_CORE(); err = etharp_add_static_entry(&ipaddr, ðaddr); UNLOCK_TCPIP_CORE(); return (err ? PX_ERROR : ERROR_NONE); } else if (lib_strcmp(ppcArgV[1], "-d") == 0) { /* 删除一个静态转换关系 */ ip_addr_t ipaddr; err_t err; if (iArgC != 3) { /* 删除全部转换关系 */ struct netif *netif; LWIP_NETIF_LOCK(); for (netif = netif_list; netif != LW_NULL; netif = netif->next) { if (netif->flags & NETIF_FLAG_ETHARP) { netifapi_netif_common(netif, etharp_cleanup_netif, LW_NULL); } } LWIP_NETIF_UNLOCK(); return (ERROR_NONE); } ipaddr.addr = ipaddr_addr(ppcArgV[2]); if (ipaddr.addr == IPADDR_NONE) { fprintf(stderr, "bad inet address : %s\n", ppcArgV[2]); return (-ERROR_TSHELL_EPARAM); } LOCK_TCPIP_CORE(); err = etharp_remove_static_entry(&ipaddr); UNLOCK_TCPIP_CORE(); return (err ? PX_ERROR : ERROR_NONE); } else { fprintf(stderr, "argments error!\n"); return (-ERROR_TSHELL_EPARAM); } }
/********************************************************************************************************* ** 函数名称: __tshellIfconfig ** 功能描述: 系统命令 "ifconfig" ** 输 入 : iArgC 参数个数 ** ppcArgV 参数表 ** 输 出 : 0 ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT __tshellIfconfig (INT iArgC, PCHAR *ppcArgV) { struct netif *netif; struct in_addr inaddr; ip_addr_t ipaddr; if (iArgC == 1) { LWIP_NETIF_LOCK(); __netIfShowAll(); /* 打印所有网口信息 */ LWIP_NETIF_UNLOCK(); return (ERROR_NONE); } else if (iArgC == 2) { LWIP_NETIF_LOCK(); __netIfShow(ppcArgV[1], LW_NULL); /* 打印指定网口信息 */ LWIP_NETIF_UNLOCK(); return (ERROR_NONE); } /* * 网络设置 */ if (iArgC >= 4) { if (lib_strcmp(ppcArgV[1], "dns") == 0) { /* * 指定 DNS 设置 */ INT iDnsIndex = 0; sscanf(ppcArgV[2], "%d", &iDnsIndex); if (iDnsIndex >= DNS_MAX_SERVERS) { fprintf(stderr, "argments error!\n"); return (-ERROR_TSHELL_EPARAM); } if (inet_aton(ppcArgV[3], &inaddr) == 0) { /* 获得 IP 地址 */ fprintf(stderr, "address error.\n"); return (-ERROR_TSHELL_EPARAM); } ipaddr.addr = inaddr.s_addr; dns_setserver((u8_t)iDnsIndex, &ipaddr); /* 设置 DNS */ } else { /* * 指定网络接口设置 */ INT iIndex; netif = netif_find(ppcArgV[1]); /* 查询网络接口 */ if (netif == LW_NULL) { fprintf(stderr, "can not find net interface.\n"); return (-ERROR_TSHELL_EPARAM); } for (iIndex = 2; iIndex < (iArgC - 1); iIndex += 2) { /* 连续设置参数 */ if (inet_aton(ppcArgV[iIndex + 1], &inaddr) == 0) { /* 获得 IP 地址 */ fprintf(stderr, "address error.\n"); return (-ERROR_TSHELL_EPARAM); } ipaddr.addr = inaddr.s_addr; __netIfSet(netif, ppcArgV[iIndex], ipaddr); /* 设置网络接口 */ } } } return (ERROR_NONE); }