Exemple #1
0
/*********************************************************************************************************
** 函数名称: 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);
}
Exemple #2
0
/*********************************************************************************************************
** 函数名称: 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);
}
Exemple #3
0
/*********************************************************************************************************
** 函数名称: 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);
}
Exemple #4
0
/*********************************************************************************************************
** 函数名称: 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);
    }
}
Exemple #5
0
/*********************************************************************************************************
** 函数名称: 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);
    }
}
Exemple #6
0
/*********************************************************************************************************
** 函数名称: 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       */
}
Exemple #7
0
/*********************************************************************************************************
** 函数名称: netif_get_num
** 功能描述: 获得网络接口数量.
** 输 入  : NONE
** 输 出  : 网络接口数量
** 全局变量:
** 调用模块:
*********************************************************************************************************/
UINT netif_get_num (VOID)
{
    UINT    uiNum;

    LWIP_NETIF_LOCK();                                                  /*  进入临界区                  */
    uiNum = _G_uiNetifNum;
    LWIP_NETIF_UNLOCK();                                                /*  退出临界区                  */

    return  (uiNum);
}
Exemple #8
0
/*********************************************************************************************************
** 函数名称: 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);
}
Exemple #9
0
/*********************************************************************************************************
** 函数名称: 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);
}
Exemple #10
0
/*********************************************************************************************************
** 函数名称: 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);
}
Exemple #11
0
/*********************************************************************************************************
** 函数名称: __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, &ethaddr);
        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);
    }
}
Exemple #12
0
/*********************************************************************************************************
** 函数名称: __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);
}