/*************************************************************************** * Function: Tcpip_stack_init * * Description: This function is init ip stack. * * Input: * ipaddr: * netmask: * gateway: * Output: * * Return: * netif: Init IP Stack OK * NULL : Init IP Statck Fail Because no memory * Date : 2014-6-4 ****************************************************************************/ struct netif *Tcpip_stack_init() { #if TLS_CONFIG_APSTA struct netif *nif4apsta = NULL; #endif /*Register Ethernet Rx Data callback From wifi*/ tls_ethernet_data_rx_callback(ethernetif_input); #if TLS_CONFIG_APSTA tls_ethernet_ip_rx_callback(alg_input); #endif /* Setup lwIP. */ tcpip_init(NULL, NULL); #if TLS_CONFIG_APSTA /* add net info for apsta's ap */ nif4apsta = (struct netif *)tls_mem_alloc(sizeof(struct netif)); if (nif4apsta == NULL) return NULL; #endif /*Add Net Info to Netif, default */ nif = (struct netif *)tls_mem_alloc(sizeof(struct netif)); if (nif == NULL) { #if TLS_CONFIG_APSTA tls_mem_free(nif4apsta); #endif return NULL; } #if TLS_CONFIG_APSTA memset(nif4apsta, 0, sizeof(struct netif)); nif->next = nif4apsta; netifapi_netif_add(nif4apsta, IPADDR_ANY, IPADDR_ANY, IPADDR_ANY, NULL, ethernetif_init, tcpip_input); netif_set_status_callback(nif4apsta, netif_status_changed); #endif memset(nif, 0, sizeof(struct netif)); netifapi_netif_add(nif, IPADDR_ANY,IPADDR_ANY,IPADDR_ANY,NULL,ethernetif_init,tcpip_input); netifapi_netif_set_default(nif); dl_list_init(&netif_status_event.list); netif_set_status_callback(nif, netif_status_changed); tls_wifi_status_change_cb_register(wifi_status_changed); return nif; }
/* Keep old drivers compatible in RT-Thread */ Int32 eth_device_init_with_flag(struct eth_device *dev, char *name, UInt8 flags) { struct netif* netif; netif = (struct netif*) malloc (sizeof(struct netif)); if (netif == NULL) { printf("malloc netif failed\n"); return -RT_ERROR; } memset(netif, 0, sizeof(struct netif)); /* set netif */ dev->netif = netif; /* device flags, which will be set to netif flags when initializing */ dev->flags = flags; /* link changed status of device */ dev->link_changed = 0x00; dev->parent.type = RT_Device_Class_NetIf; /* register to RT-Thread device manager */ rt_device_register(&(dev->parent), name, RT_DEVICE_FLAG_RDWR); rt_sem_init(&(dev->tx_ack), name, 0, RT_IPC_FLAG_FIFO); /* set name */ netif->name[0] = name[0]; netif->name[1] = name[1]; /* set hw address to 6 */ netif->hwaddr_len = 6; /* maximum transfer unit */ netif->mtu = ETHERNET_MTU; /* get hardware MAC address */ rt_device_control(&(dev->parent), NIOCTL_GADDR, netif->hwaddr); /* set output */ netif->output = etharp_output; netif->linkoutput = ethernetif_linkoutput; /* if tcp thread has been started up, we add this netif to the system */ if (rt_thread_find("tcpip") != NULL) { struct ip_addr ipaddr, netmask, gw; #if !LWIP_DHCP 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); #else IP4_ADDR(&ipaddr, 0, 0, 0, 0); IP4_ADDR(&gw, 0, 0, 0, 0); IP4_ADDR(&netmask, 0, 0, 0, 0); #endif netifapi_netif_add(netif, &ipaddr, &netmask, &gw, dev, eth_netif_device_init, tcpip_input); } return RT_EOK; }