240 lines
7.3 KiB
C
240 lines
7.3 KiB
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. 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.2 2006/08/21 21:42:40 oliverschmidt Exp $
|
|
*
|
|
*/
|
|
|
|
#include "contiki-net.h"
|
|
#include "ctk/ctk.h"
|
|
|
|
|
|
/* TCP/IP configuration window. */
|
|
static struct ctk_window tcpipwindow;
|
|
|
|
#ifdef WITH_ETHERNET
|
|
static 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")};
|
|
|
|
PROCESS(netconf_process, "Network configurator");
|
|
|
|
static void makestrings(void);
|
|
|
|
/*-----------------------------------------------------------------------------------*/
|
|
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 void
|
|
makeaddr(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 void
|
|
makestrings(void)
|
|
{
|
|
u16_t addr[2], *addrptr;
|
|
|
|
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);
|
|
}
|
|
}
|
|
/*-----------------------------------------------------------------------------------*/
|
|
static void
|
|
nullterminate(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 void
|
|
apply_tcpipconfig(void)
|
|
{
|
|
u16_t addr[2];
|
|
|
|
nullterminate(ipaddr);
|
|
if(uiplib_ipaddrconv(ipaddr, (unsigned char *)addr)) {
|
|
uip_sethostaddr(addr);
|
|
}
|
|
|
|
#ifdef WITH_ETHERNET
|
|
nullterminate(netmask);
|
|
if(uiplib_ipaddrconv(netmask, (unsigned char *)addr)) {
|
|
uip_setnetmask(addr);
|
|
}
|
|
|
|
nullterminate(gateway);
|
|
if(uiplib_ipaddrconv(gateway, (unsigned char *)addr)) {
|
|
uip_setdraddr(addr);
|
|
}
|
|
#endif /* WITH_ETHERNET */
|
|
|
|
nullterminate(dnsserver);
|
|
if(uiplib_ipaddrconv(dnsserver, (unsigned char *)addr)) {
|
|
resolv_conf(addr);
|
|
}
|
|
}
|
|
/*-----------------------------------------------------------------------------------*/
|
|
static void
|
|
netconf_quit(void)
|
|
{
|
|
process_exit(&netconf_process);
|
|
LOADER_UNLOAD();
|
|
}
|
|
/*-----------------------------------------------------------------------------------*/
|
|
PROCESS_THREAD(netconf_process, ev, data)
|
|
{
|
|
|
|
PROCESS_BEGIN();
|
|
|
|
|
|
/* 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();
|
|
|
|
ctk_window_open(&tcpipwindow);
|
|
|
|
while(1) {
|
|
PROCESS_WAIT_EVENT();
|
|
|
|
if(ev == ctk_signal_button_activate) {
|
|
if(data == (process_data_t)&tcpipclosebutton) {
|
|
apply_tcpipconfig();
|
|
ctk_window_close(&tcpipwindow);
|
|
netconf_quit();
|
|
/* ctk_desktop_redraw(tcpipwindow.desktop);*/
|
|
}
|
|
} else if(ev == ctk_signal_window_close ||
|
|
ev == PROCESS_EVENT_EXIT) {
|
|
ctk_window_close(&tcpipwindow);
|
|
netconf_quit();
|
|
}
|
|
}
|
|
|
|
PROCESS_END();
|
|
}
|
|
/*-----------------------------------------------------------------------------------*/
|