00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "contiki-net.h"
00037 #include "ctk/ctk.h"
00038 #include "cfs/cfs.h"
00039 #include "net/dhcpc.h"
00040
00041 static struct ctk_window window;
00042
00043 static struct ctk_button requestbutton =
00044 {CTK_BUTTON(4, 1, 18, "Request IP address")};
00045 static struct ctk_label statuslabel =
00046 {CTK_LABEL(0, 3, 14, 1, "")};
00047 static struct ctk_label ipaddrlabel =
00048 {CTK_LABEL(0, 5, 10, 1, "IP address")};
00049 static char ipaddr[16];
00050 static struct ctk_textentry ipaddrtextentry =
00051 {CTK_TEXTENTRY(11, 5, 15, 1, ipaddr, 15)};
00052 static struct ctk_label netmasklabel =
00053 {CTK_LABEL(0, 7, 10, 1, "Netmask")};
00054 static char netmask[16];
00055 static struct ctk_textentry netmasktextentry =
00056 {CTK_TEXTENTRY(11, 7, 15, 1, netmask, 15)};
00057 static struct ctk_label gatewaylabel =
00058 {CTK_LABEL(0, 9, 10, 1, "Gateway")};
00059 static char gateway[16];
00060 static struct ctk_textentry gatewaytextentry =
00061 {CTK_TEXTENTRY(11, 9, 15, 1, gateway, 15)};
00062 #if WITH_DNS
00063 static struct ctk_label dnsserverlabel =
00064 {CTK_LABEL(0, 11, 10, 1, "DNS server")};
00065 static char dnsserver[16];
00066 static struct ctk_textentry dnsservertextentry =
00067 {CTK_TEXTENTRY(11, 11, 15, 1, dnsserver, 15)};
00068 #endif
00069 static struct ctk_button savebutton =
00070 {CTK_BUTTON(0, 13, 12, "Save & close")};
00071 static struct ctk_button cancelbutton =
00072 {CTK_BUTTON(20, 13, 6, "Cancel")};
00073
00074 PROCESS(dhcp_process, "DHCP client");
00075
00076 AUTOSTART_PROCESSES(&dhcp_process);
00077
00078
00079 static char *
00080 makebyte(u8_t byte, char *str)
00081 {
00082 if(byte >= 100) {
00083 *str++ = (byte / 100 ) % 10 + '0';
00084 }
00085 if(byte >= 10) {
00086 *str++ = (byte / 10) % 10 + '0';
00087 }
00088 *str++ = (byte % 10) + '0';
00089
00090 return str;
00091 }
00092
00093 static void
00094 makeaddr(uip_ipaddr_t *addr, char *str)
00095 {
00096 str = makebyte(addr->u8[0], str);
00097 *str++ = '.';
00098 str = makebyte(addr->u8[1], str);
00099 *str++ = '.';
00100 str = makebyte(addr->u8[2], str);
00101 *str++ = '.';
00102 str = makebyte(addr->u8[3], str);
00103 *str++ = 0;
00104 }
00105
00106 static void
00107 makestrings(void)
00108 {
00109 uip_ipaddr_t addr, *addrptr;
00110
00111 uip_gethostaddr(&addr);
00112 makeaddr(&addr, ipaddr);
00113
00114 uip_getnetmask(&addr);
00115 makeaddr(&addr, netmask);
00116
00117 uip_getdraddr(&addr);
00118 makeaddr(&addr, gateway);
00119
00120 #if WITH_DNS
00121 addrptr = resolv_getserver();
00122 if(addrptr != NULL) {
00123 makeaddr(addrptr, dnsserver);
00124 }
00125 #endif
00126 }
00127
00128 static void
00129 nullterminate(char *cptr)
00130 {
00131
00132
00133 for(; *cptr != ' ' && *cptr != 0; ++cptr);
00134 *cptr = 0;
00135 }
00136
00137 static void
00138 apply_tcpipconfig(void)
00139 {
00140 int file = cfs_open("contiki.cfg", CFS_READ);
00141 int size = cfs_read(file, uip_buf, 100);
00142 cfs_close(file);
00143
00144 nullterminate(ipaddr);
00145 uiplib_ipaddrconv(ipaddr, (uip_ipaddr_t *)&uip_buf[0]);
00146
00147 nullterminate(netmask);
00148 uiplib_ipaddrconv(netmask, (uip_ipaddr_t *)&uip_buf[4]);
00149
00150 nullterminate(gateway);
00151 uiplib_ipaddrconv(gateway, (uip_ipaddr_t *)&uip_buf[8]);
00152
00153 #if WITH_DNS
00154 nullterminate(dnsserver);
00155 uiplib_ipaddrconv(dnsserver, (uip_ipaddr_t *)&uip_buf[12]);
00156 #endif
00157
00158 file = cfs_open("contiki.cfg", CFS_WRITE);
00159 cfs_write(file, uip_buf, size);
00160 cfs_close(file);
00161 }
00162
00163 static void
00164 set_statustext(char *text)
00165 {
00166 ctk_label_set_text(&statuslabel, text);
00167 CTK_WIDGET_REDRAW(&statuslabel);
00168 }
00169
00170 static void
00171 app_quit(void)
00172 {
00173 ctk_window_close(&window);
00174 process_exit(&dhcp_process);
00175 LOADER_UNLOAD();
00176 }
00177
00178 PROCESS_THREAD(dhcp_process, ev, data)
00179 {
00180 PROCESS_BEGIN();
00181
00182 ctk_window_new(&window, 29, 14, "DHCP client");
00183
00184 CTK_WIDGET_ADD(&window, &requestbutton);
00185 CTK_WIDGET_ADD(&window, &statuslabel);
00186 CTK_WIDGET_ADD(&window, &ipaddrlabel);
00187 CTK_WIDGET_ADD(&window, &ipaddrtextentry);
00188 CTK_WIDGET_ADD(&window, &netmasklabel);
00189 CTK_WIDGET_ADD(&window, &netmasktextentry);
00190 CTK_WIDGET_ADD(&window, &gatewaylabel);
00191 CTK_WIDGET_ADD(&window, &gatewaytextentry);
00192 #if WITH_DNS
00193 CTK_WIDGET_ADD(&window, &dnsserverlabel);
00194 CTK_WIDGET_ADD(&window, &dnsservertextentry);
00195 #endif
00196 CTK_WIDGET_ADD(&window, &savebutton);
00197 CTK_WIDGET_ADD(&window, &cancelbutton);
00198
00199 CTK_WIDGET_FOCUS(&window, &requestbutton);
00200
00201 ctk_window_open(&window);
00202
00203
00204 process_post(PROCESS_CURRENT(), PROCESS_EVENT_MSG, NULL);
00205
00206 dhcpc_init(uip_ethaddr.addr, sizeof(uip_ethaddr.addr));
00207
00208 while(1) {
00209 PROCESS_WAIT_EVENT();
00210
00211 if(ev == PROCESS_EVENT_MSG) {
00212 makestrings();
00213 ctk_window_redraw(&window);
00214 } else if(ev == tcpip_event) {
00215 dhcpc_appcall(ev, data);
00216 } else if(ev == ctk_signal_button_activate) {
00217 if(data == (process_data_t)&requestbutton) {
00218 dhcpc_request();
00219 set_statustext("Requesting...");
00220 }
00221 if(data == (process_data_t)&savebutton) {
00222 apply_tcpipconfig();
00223 app_quit();
00224 }
00225 if(data == (process_data_t)&cancelbutton) {
00226 app_quit();
00227 }
00228 } else if(
00229 #if CTK_CONF_WINDOWCLOSE
00230 ev == ctk_signal_window_close ||
00231 #endif
00232 ev == PROCESS_EVENT_EXIT) {
00233 app_quit();
00234 }
00235 }
00236
00237 PROCESS_END();
00238 }
00239
00240 void
00241 dhcpc_configured(const struct dhcpc_state *s)
00242 {
00243 uip_sethostaddr(&s->ipaddr);
00244 uip_setnetmask(&s->netmask);
00245 uip_setdraddr(&s->default_router);
00246 #if WITH_DNS
00247 resolv_conf(&s->dnsaddr);
00248 #endif
00249
00250 set_statustext("Configured.");
00251 process_post(PROCESS_CURRENT(), PROCESS_EVENT_MSG, NULL);
00252 }
00253
00254 void
00255 dhcpc_unconfigured(const struct dhcpc_state *s)
00256 {
00257 static uip_ipaddr_t nulladdr;
00258
00259 uip_sethostaddr(&nulladdr);
00260 uip_setnetmask(&nulladdr);
00261 uip_setdraddr(&nulladdr);
00262 #if WITH_DNS
00263 resolv_conf(&nulladdr);
00264 #endif
00265
00266 set_statustext("Unconfigured.");
00267 process_post(PROCESS_CURRENT(), PROCESS_EVENT_MSG, NULL);
00268 }
00269