⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netconf.c

📁 一个小的RTOS具有UIP网络功能
💻 C
字号:
/* * Copyright (c) 2002, Adam Dunkels. * All rights reserved.  * * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * 2. Redistributions in binary form must reproduce the above *    copyright notice, this list of conditions and the following *    disclaimer in the documentation and/or other materials provided *    with the distribution.  * 3. All advertising materials mentioning features or use of this *    software must display the following acknowledgement: *        This product includes software developed by Adam Dunkels.  * 4. The name of the author may not be used to endorse or promote *    products derived from this software without specific prior *    written permission.   * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.   * * This file is part of the Contiki desktop environment * * $Id: netconf.c,v 1.10 2003/08/24 22:41:31 adamdunkels Exp $ * */#include "uip_main.h"#include "uip.h"#include "uip_arp.h"#include "resolv.h"#include "ctk.h"#include "ctk-draw.h"#include "dispatcher.h"#include "loader.h"/* TCP/IP configuration window. */static struct ctk_window tcpipwindow;#ifdef WITH_ETHERNETstatic struct ctk_label ipaddrlabel =  {CTK_LABEL(0, 1, 10, 1, "IP address")};static char ipaddr[17];static struct ctk_textentry ipaddrtextentry =  {CTK_TEXTENTRY(11, 1, 16, 1, ipaddr, 16)};static struct ctk_label netmasklabel =  {CTK_LABEL(0, 3, 10, 1, "Netmask")};static char netmask[17];static struct ctk_textentry netmasktextentry =  {CTK_TEXTENTRY(11, 3, 16, 1, netmask, 16)};static struct ctk_label gatewaylabel =  {CTK_LABEL(0, 5, 10, 1, "Gateway")};static char gateway[17];static struct ctk_textentry gatewaytextentry =  {CTK_TEXTENTRY(11, 5, 16, 1, gateway, 16)};static struct ctk_label dnsserverlabel =  {CTK_LABEL(0, 7, 10, 1, "DNS server")};static char dnsserver[17];static struct ctk_textentry dnsservertextentry =  {CTK_TEXTENTRY(11, 7, 16, 1, dnsserver, 16)};#else /* WITH_ETHERNET */static struct ctk_label ipaddrlabel =  {CTK_LABEL(0, 2, 10, 1, "IP address")};static char ipaddr[17];static struct ctk_textentry ipaddrtextentry =  {CTK_TEXTENTRY(11, 2, 16, 1, ipaddr, 16)};static struct ctk_label dnsserverlabel =  {CTK_LABEL(0, 4, 10, 1, "DNS server")};static char dnsserver[17];static struct ctk_textentry dnsservertextentry =  {CTK_TEXTENTRY(11, 4, 16, 1, dnsserver, 16)};#endif /* WITH_ETHERNET */static struct ctk_button tcpipclosebutton =  {CTK_BUTTON(0, 9, 2, "Ok")};static DISPATCHER_SIGHANDLER(netconf_sighandler, s, data);static struct dispatcher_proc p =  {DISPATCHER_PROC("Network config", NULL, netconf_sighandler, NULL)};static ek_id_t id;static void makestrings(void);/*-----------------------------------------------------------------------------------*/LOADER_INIT_FUNC(netconf_init, arg){  arg_free(arg);      if(id == EK_ID_NONE) {    id = dispatcher_start(&p);        /* Create TCP/IP configuration window. */    ctk_window_new(&tcpipwindow, 30, 10, "TCP/IP config");    if(ctk_desktop_width(tcpipwindow.desktop) < 30) {      ctk_window_move(&tcpipwindow, 0,		      (ctk_desktop_height(tcpipwindow.desktop) - 10) / 2 - 2);    } else {      ctk_window_move(&tcpipwindow,		      (ctk_desktop_width(tcpipwindow.desktop) - 30) / 2,		      (ctk_desktop_height(tcpipwindow.desktop) - 10) / 2 - 2);    }    #ifdef WITH_ETHERNET    CTK_WIDGET_ADD(&tcpipwindow, &ipaddrlabel);      CTK_WIDGET_ADD(&tcpipwindow, &ipaddrtextentry);    CTK_WIDGET_ADD(&tcpipwindow, &netmasklabel);    CTK_WIDGET_ADD(&tcpipwindow, &netmasktextentry);    CTK_WIDGET_ADD(&tcpipwindow, &gatewaylabel);    CTK_WIDGET_ADD(&tcpipwindow, &gatewaytextentry);    CTK_WIDGET_ADD(&tcpipwindow, &dnsserverlabel);    CTK_WIDGET_ADD(&tcpipwindow, &dnsservertextentry);#else    CTK_WIDGET_ADD(&tcpipwindow, &ipaddrlabel);      CTK_WIDGET_ADD(&tcpipwindow, &ipaddrtextentry);    CTK_WIDGET_ADD(&tcpipwindow, &dnsserverlabel);    CTK_WIDGET_ADD(&tcpipwindow, &dnsservertextentry);  #endif /* WITH_ETHERNET */        CTK_WIDGET_ADD(&tcpipwindow, &tcpipclosebutton);        CTK_WIDGET_FOCUS(&tcpipwindow, &ipaddrtextentry);      /* Fill the configuration strings with values from the current       configuration */    makestrings();        dispatcher_listen(ctk_signal_button_activate);    dispatcher_listen(ctk_signal_window_close);  }  ctk_window_open(&tcpipwindow);}/*-----------------------------------------------------------------------------------*/static char *makebyte(u8_t byte, char *str){  if(byte >= 100) {    *str++ = (byte / 100 ) % 10 + '0';  }  if(byte >= 10) {    *str++ = (byte / 10) % 10 + '0';  }  *str++ = (byte % 10) + '0';  return str;}/*-----------------------------------------------------------------------------------*/static voidmakeaddr(u16_t *addr, char *str){  str = makebyte(HTONS(addr[0]) >> 8, str);  *str++ = '.';  str = makebyte(HTONS(addr[0]) & 0xff, str);  *str++ = '.';  str = makebyte(HTONS(addr[1]) >> 8, str);  *str++ = '.';  str = makebyte(HTONS(addr[1]) & 0xff, str);  *str++ = 0;}/*-----------------------------------------------------------------------------------*/static voidmakestrings(void){  u16_t addr[2], *addrptr;#ifdef WITH_UIP  uip_gethostaddr(addr);  makeaddr(addr, ipaddr);  #ifdef WITH_ETHERNET    uip_getnetmask(addr);  makeaddr(addr, netmask);    uip_getdraddr(addr);  makeaddr(addr, gateway);#endif /* WITH_ETHERNET */  addrptr = resolv_getserver();  if(addrptr != NULL) {    makeaddr(addrptr, dnsserver);  }  #endif /* WITH_UIP */}/*-----------------------------------------------------------------------------------*/static voidnullterminate(char *cptr){  /* Find the first space character in the ipaddr and put a zero there     to end the string. */  for(; *cptr != ' ' && *cptr != 0; ++cptr);  *cptr = 0;}/*-----------------------------------------------------------------------------------*/static voidapply_tcpipconfig(void){  u16_t addr[2];#ifdef WITH_UIP  nullterminate(ipaddr);  if(uip_main_ipaddrconv(ipaddr, (unsigned char *)addr)) {    uip_sethostaddr(addr);  }  #ifdef WITH_ETHERNET  nullterminate(netmask);  if(uip_main_ipaddrconv(netmask, (unsigned char *)addr)) {    uip_setnetmask(addr);  }  nullterminate(gateway);  if(uip_main_ipaddrconv(gateway, (unsigned char *)addr)) {    uip_setdraddr(addr);  }#endif /* WITH_ETHERNET */    nullterminate(dnsserver);  if(uip_main_ipaddrconv(dnsserver, (unsigned char *)addr)) {    resolv_conf(addr);  }#endif /* WITH_UIP */}/*-----------------------------------------------------------------------------------*/static voidnetconf_quit(void){  dispatcher_exit(&p);  id = EK_ID_NONE;  LOADER_UNLOAD();}/*-----------------------------------------------------------------------------------*/staticDISPATCHER_SIGHANDLER(netconf_sighandler, s, data){  DISPATCHER_SIGHANDLER_ARGS(s, data);    if(s == ctk_signal_button_activate) {       if(data == (ek_data_t)&tcpipclosebutton) {      apply_tcpipconfig();      ctk_window_close(&tcpipwindow);      netconf_quit();      /*      ctk_desktop_redraw(tcpipwindow.desktop);*/    }  } else if(s == ctk_signal_window_close ||	    s == dispatcher_signal_quit) {    ctk_window_close(&tcpipwindow);    netconf_quit();  }}/*-----------------------------------------------------------------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -