1#ifdef BTN_SETUP
2// * Man in Middle Attack
3//
4//             -Attacker<-
5//            /           \
6//           /             \
7//          V               \
8//         AP  <----x---- Client
9//  ==> the same as
10//         AP  <--------- Anonymous Client
11//  ==> solved by using in very short range
12//
13// * Key generation(Diffie-Hellman)
14//
15// AP
16//	p: random in 100 predefined primes
17//	q: 5
18//	public_ap/private_ap: DH_generate_key(p, q, private)
19//
20// Client
21//	p: random in 100 predfined primses, rand in SSID
22//	q: 5
23//	public_client/private_client: DH_generate_key(p, q, private)
24//
25// * Process
26//
27// (a1) Press Button for 3 seconds
28//
29// (a2) Generate Public Key by using:
30//      CreatePubPrivKey()
31//
32// (a3) Change SSID to
33//      ASUS_OTSx_zzz_iiii
34//      x : setting in default or not
35//      zzz : rand seed for primes number
36//      iiii : default ip, if no dhcp server is provided
37//
38// (c1) Survey AP with OTS....
39// (c2) Generate Public Key by using:
40//			CreatePubPrivKey()
41// (c3) Start Session one with PackSetPubKey
42//	<-----OTSInit(SetPubKey)---------
43// (a4) UnpackSetPubKey
44// (a5) For other connection, set into log
45//
46// (a6) PackSetPubKeyRes
47//	------OTSInitAck(SetPubKeyRes)-->
48// (c4) UnpackSetPubKeyAck
49// (c5) Close Session one socket
50//
51// (a7) CreateSharedKey()		(c6) CreateSharedKey
52// (a8) Set to WPA-PSK w/
53//			CreateSharedKey
54//
55// (c7) Start Session Two w/ PackSetInfoGWQuick
56//	<---- OTSExchange(SetInfoGWQuick)-
57// (a9) UnpackSetInfoGWQuick
58// (a10) For other connection, set into log
59//
60// (a11-1) PackSetInfoGWQuickRes:
61//				 Apply Setting with QuickFlag = None
62//
63//	----- OTSExchangeRes(SetInfoGWQuickRes) -> Client
64// (c8) UnpackSetInfoGWQuickRes
65//
66// (a11-2) PackSetInfoGWQuickRes
67//				 Response Setting with QuickFlag = Wireless
68//
69//	----- OTSExchangeRes(SetInfoGWQuickRes) -> Client
70// (c8) UnpackSetInfoGWQuickRes
71// (c9) close sesson two socket
72//
73// (a12) save setting and reboot
74//
75// * Timer
76// - 120 seconds, button is pressed and no action is performed.
77// - 20 seconds, button is pressed and OTSInit is sent
78//
79// * Functions
80// DH *DH_new();
81// int CreatePubPrivKey(DH *dh, int rand, char *pub, char *priv);
82// int CreateSharedKey(DH *dh, char *pub, char *shared);
83// int DH_free(DH *dh);
84//
85// Fully Support: ASUS cards, WZC
86// Alert to WZC(WPA) : Centrino or other cards in XP SP2
87// Alert to WZC(WEP) : Centrino or other cards in XP SP1
88// Alert to Ethernet : Other cards in 98/ME/.....
89//
90
91#include <stdio.h>
92#include <stdlib.h>
93#include <string.h>
94#include <signal.h>
95#include <unistd.h>
96#include <errno.h>
97#include <sys/fcntl.h>
98#include <dirent.h>
99#include <sys/mount.h>
100#include <bcmnvram.h>
101#include <netconf.h>
102#include <shutils.h>
103#include <rc.h>
104#include <syslog.h>
105#include <iboxcom.h>
106
107#define logs(fmt, arg...) //syslog(LOG_NOTICE, fmt, ##arg)
108#include <openssl/dh.h>
109#include "crypto.c"
110DH *dh;
111
112typedef union {
113    struct sockaddr sa;
114    struct sockaddr_in sa_in;
115} usockaddr;
116
117#ifdef FULL_EZSETUP // Added by Chen-I 20080201
118#define ENCRYPTION 1
119#endif
120
121#define BTNSETUP_INIT_TIMEOUT 		120	// 3 minute
122#define BTNSETUP_EXCHANGE_TIMEOUT 	300    	// 3 minutes
123#define MAX_DHKEY_LEN 192
124#define WEP64_LEN 10
125#define WEP128_LEN 26
126#define WPAPSK_LEN 63
127
128PKT_SET_INFO_GW_QUICK pkt;
129unsigned char pubkey[MAX_DHKEY_LEN];
130unsigned char cpubkey[MAX_DHKEY_LEN];
131unsigned char sharedkey[MAX_DHKEY_LEN];
132char sharedkeystr[MAX_DHKEY_LEN*2+1];
133TEMP_WIRELESS *tw; // Point to sharedkeystr
134
135
136char ssid[32+1];
137int bs_mode;
138time_t bs_time;
139int bs_timeout;
140int bs_auth;
141int bs_encrypt;
142//#define OTS_LOG 1
143//#define OTS_SIMU 1
144
145#ifdef OTS_SIMU
146int ots_simu(int stage)
147{
148	printf("ots check: %d %d\n", stage, atoi(nvram_safe_get("ots_simu_stage")));
149	if(stage==atoi(nvram_safe_get("ots_simu_stage")))
150	{
151		nvram_set("ots_simu_stage", "");
152		return 0;
153        }
154	return 1;
155}
156#endif
157
158#ifdef OTS_LOG
159char ots_buf[1024];
160
161void ots_log(unsigned int flag, int save)
162{
163	if(flag==0)
164	{
165		ots_buf[0]=0;
166		nvram_set("ots_log", "0");
167	}
168	else
169	{
170		if (save>1)
171			sprintf(ots_buf, "%s;[%02x]", nvram_safe_get("ots_log"), flag);
172		else
173			sprintf(ots_buf, "%s;%02x", nvram_safe_get("ots_log"), flag);
174		nvram_set("ots_log", ots_buf);
175	}
176
177	if(save==1) nvram_commit();
178}
179#endif
180
181int is_ots()
182{
183	char *ptr=nvram_safe_get("sharedkeystr");
184
185	if(strlen(ptr)) return 1;
186	else return 0;
187}
188
189#ifdef ENCRYPTION
190#define BLOCKLEN 16
191
192void Encrypt(int klen, unsigned char *key, unsigned char *ptext, int tlen, unsigned char *ctext)
193{
194	unsigned char *pptr, *cptr;
195	int i;
196
197	i = 0;
198	pptr = ptext;
199	cptr = ctext;
200
201	while(1)
202	{
203		aes_encrypt(klen, key, pptr, cptr);
204		i+=16;
205		if(i>=tlen) break;
206		pptr+=16;
207		cptr+=16;
208	}
209}
210
211void Decrypt(int klen, unsigned char *key, unsigned char *ptext, int tlen, unsigned char *ctext)
212{
213	unsigned char *pptr, *cptr;
214	int i;
215
216	i = 0;
217	pptr = ptext;
218	cptr = ctext;
219
220	while(1)
221	{
222		aes_decrypt(klen, key, pptr, cptr);
223		i+=16;
224		if(i>=tlen) break;
225		pptr+=16;
226		cptr+=16;
227	}
228}
229#endif
230
231// some utility
232void nvram_set_ip(char *nvram_name, DWORD ip)
233{
234	struct in_addr in;
235
236	if (ip!=0)
237	{
238		in.s_addr = ip;
239		nvram_set(nvram_name, (char *)inet_ntoa(in));
240	}
241	else nvram_set(nvram_name, "");
242}
243
244void nvram_set_str(char *nvram_name, char *value, int size)
245{
246	char tmpbuf[256];
247
248	tmpbuf[size] = 0;
249	memcpy(tmpbuf, value, size);
250	nvram_set(nvram_name, tmpbuf);
251}
252
253int
254start_sdhcpd(void)
255{
256	FILE *fp;
257	char *dhcpd_argv[] = {"udhcpd", "/tmp/udhcpd.conf", NULL, NULL};
258	char *slease = "/tmp/udhcpd-br0.sleases";
259	pid_t pid;
260
261	if (nvram_match("lan_proto", "dhcp")) return 0;
262	//ifconfig(nvram_safe_get("lan_ifname"), IFUP,
263	//	 nvram_safe_get("lan_ipaddr"), "255.255.255.0");
264	//dprintf("%s %s %s %s\n",
265	//	nvram_safe_get("lan_ifname"),
266	//	nvram_safe_get("dhcp_start"),
267	//	nvram_safe_get("dhcp_end"),
268	//	nvram_safe_get("lan_lease"));
269
270	if (!(fp = fopen("/tmp/udhcpd-br0.leases", "a"))) {
271		perror("/tmp/udhcpd-br0.leases");
272		return errno;
273	}
274	fclose(fp);
275
276	/* Write configuration file based on current information */
277	if (!(fp = fopen("/tmp/udhcpd.conf", "w"))) {
278		perror("/tmp/udhcpd.conf");
279		return errno;
280	}
281
282	fprintf(fp, "pidfile /var/run/udhcpd-br0.pid\n");
283	fprintf(fp, "start %s\n", nvram_safe_get("dhcp_start"));
284	fprintf(fp, "end %s\n", nvram_safe_get("dhcp_end"));
285	fprintf(fp, "interface %s\n", nvram_safe_get("lan_ifname"));
286	fprintf(fp, "remaining yes\n");
287	fprintf(fp, "lease_file /tmp/udhcpd-br0.leases\n");
288	fprintf(fp, "option subnet %s\n", nvram_safe_get("lan_netmask"));
289	fprintf(fp, "option router %s\n", nvram_safe_get("lan_ipaddr"));
290	fprintf(fp, "option lease 3600\n");
291	fclose(fp);
292
293	_eval(dhcpd_argv, NULL, 0, &pid);
294	//dprintf("done\n");
295	return 0;
296}
297
298int btn_setup_get_setting(PKT_SET_INFO_GW_QUICK *pkt)
299{
300	char tmpbuf[256];
301	int ret=0;
302
303	memset(pkt, 0, sizeof(pkt));
304
305	pkt->QuickFlag=QFCAP_WIRELESS;
306	strcpy(tmpbuf, nvram_safe_get("wl_ssid"));
307	memcpy(pkt->WSetting.SSID, tmpbuf, sizeof(pkt->WSetting.SSID));
308
309	if(nvram_match("wl_auth_mode", "open"))
310	{
311		pkt->WSetting.Auth=AUTHENTICATION_OPEN;
312		pkt->WSetting.Encrypt=atoi(nvram_safe_get("wl_wep_x"));
313		if (pkt->WSetting.Encrypt>ENCRYPTION_DISABLE)
314		{
315			pkt->WSetting.DefaultKey = atoi(nvram_safe_get("wl_key"));
316			sprintf(tmpbuf, "wl_key%d", pkt->WSetting.DefaultKey);
317			strcpy(pkt->WSetting.Key, nvram_safe_get(tmpbuf));
318		}
319	}
320	else if(nvram_match("wl_auth_mode", "shared"))
321	{
322		pkt->WSetting.Auth=AUTHENTICATION_SHARED;
323		pkt->WSetting.Encrypt=atoi(nvram_safe_get("wl_wep_x"));
324		if (pkt->WSetting.Encrypt>ENCRYPTION_DISABLE)
325		{
326			pkt->WSetting.DefaultKey = atoi(nvram_safe_get("wl_key"));
327			sprintf(tmpbuf, "wl_key%d", pkt->WSetting.DefaultKey);
328			strcpy(pkt->WSetting.Key, nvram_safe_get(tmpbuf));
329		}
330	}
331	else if(nvram_match("wl_auth_mode", "psk"))	// add "wl_wpa_mode" matching by Jiahao for WL-520gu
332	{
333// 2008.06 James. {
334		/*if(nvram_match("wl_wpa_mode", "1"))
335		{
336			pkt->WSetting.Auth=AUTHENTICATION_WPA_PSK;
337			pkt->WSetting.Encrypt=ENCRYPTION_TKIP;
338		}
339		else if(nvram_match("wl_wpa_mode", "2"))
340		{
341			pkt->WSetting.Auth=AUTHENTICATION_WPA_PSK2;
342			pkt->WSetting.Encrypt=ENCRYPTION_AES;
343		}
344		else
345		{
346			if (nvram_match("wl_crypto", "aes"))
347			{
348				pkt->WSetting.Auth=AUTHENTICATION_WPA_PSK2;
349				pkt->WSetting.Encrypt=ENCRYPTION_AES;
350			}
351			else
352			{
353				pkt->WSetting.Auth=AUTHENTICATION_WPA_PSK;
354				pkt->WSetting.Encrypt=ENCRYPTION_TKIP;
355			}
356		}//*/
357		if(nvram_match("wl_crypto", "aes")){
358			pkt->WSetting.Auth=AUTHENTICATION_WPA_PSK2;
359			pkt->WSetting.Encrypt=ENCRYPTION_AES;
360		}
361		else{
362			pkt->WSetting.Auth=AUTHENTICATION_WPA_PSK;
363			pkt->WSetting.Encrypt=ENCRYPTION_TKIP;
364		}
365// 2008.06 James. }
366		strcpy(tmpbuf, nvram_safe_get("wl_wpa_psk"));
367		memcpy(pkt->WSetting.Key, tmpbuf, sizeof(pkt->WSetting.Key));
368		pkt->WSetting.DefaultKey=DEFAULT_KEY_1;
369	}
370	else goto fail;
371
372	ret = 1;
373fail:
374	return ret;
375}
376
377void btn_setup_save_setting(PKT_SET_INFO_GW_QUICK *pkt)
378{
379	char tmpbuf[256];
380	char sr_name[32];
381	char sr_num[1];
382	char idx = 0, idx1 = 0;
383	char start_num;
384	char end_num;
385	DWORD dhcp_tmp;
386
387	if (pkt->QuickFlag&QFCAP_WIRELESS)
388	{
389	   //printf("Wireless\n");
390	   if (!(pkt->QuickFlag&QFCAP_GET))
391	   {
392		printf("Set\n");
393		// assign automatic generate value
394		if (pkt->WSetting.SSID[0]==0)
395		{
396			strncpy(pkt->WSetting.SSID, tw->u.WirelessStruct.SuggestSSID, sizeof(pkt->WSetting.SSID));
397		}
398		// assign automatic generate value
399		if (pkt->WSetting.Key[0]==0)
400		{
401			strncpy(pkt->WSetting.Key, tw->u.WirelessStruct.SuggestKey, sizeof(pkt->WSetting.Key));
402		}
403
404		if (pkt->WSetting.Encrypt==ENCRYPTION_WEP64)
405			pkt->WSetting.Key[WEP64_LEN] = 0;
406		else if (pkt->WSetting.Encrypt==ENCRYPTION_WEP128)
407			pkt->WSetting.Key[WEP128_LEN] = 0;
408
409		// wireless setting
410		// 1. ssid
411		nvram_set_str("wl_ssid", pkt->WSetting.SSID, sizeof(pkt->WSetting.SSID));
412		memset(tmpbuf, 0, sizeof(tmpbuf));
413		char_to_ascii(tmpbuf,  nvram_safe_get("wl_ssid"));
414		nvram_set_str("wl_ssid2", tmpbuf, sizeof(tmpbuf));
415
416		if (pkt->WSetting.Auth==AUTHENTICATION_OPEN)
417		{
418			nvram_set("wl_auth_mode", "open");
419			if (pkt->WSetting.Encrypt==ENCRYPTION_WEP64||
420			    pkt->WSetting.Encrypt==ENCRYPTION_WEP128)
421			{
422				sprintf(tmpbuf, "%d", pkt->WSetting.Encrypt);
423				nvram_set("wl_wep_x", tmpbuf);
424
425				if(pkt->WSetting.DefaultKey>DEFAULT_KEY_4||
426				   pkt->WSetting.DefaultKey<DEFAULT_KEY_1)
427				   pkt->WSetting.DefaultKey=DEFAULT_KEY_1;
428
429				if(pkt->WSetting.DefaultKey==DEFAULT_KEY_1)
430					nvram_set_str("wl_key1", pkt->WSetting.Key, sizeof(pkt->WSetting.Key));
431				else if(pkt->WSetting.DefaultKey==DEFAULT_KEY_2)
432					nvram_set_str("wl_key2", pkt->WSetting.Key, sizeof(pkt->WSetting.Key));
433				else if(pkt->WSetting.DefaultKey==DEFAULT_KEY_3)
434					nvram_set_str("wl_key3", pkt->WSetting.Key, sizeof(pkt->WSetting.Key));
435				else if(pkt->WSetting.DefaultKey==DEFAULT_KEY_4)
436					nvram_set_str("wl_key4", pkt->WSetting.Key, sizeof(pkt->WSetting.Key));
437				sprintf(tmpbuf,"%d", pkt->WSetting.DefaultKey);
438				nvram_set("wl_key", tmpbuf);
439			}
440			else
441			{
442				nvram_set("wl_key", "1");
443				nvram_set("wl_key1", "");
444				nvram_set("wl_key2", "");
445				nvram_set("wl_key3", "");
446				nvram_set("wl_key4", "");
447			}
448			nvram_set("wl_wpa_psk","");/* Cherry Cho added for removing temporary key used by WSC in 2007/3/8. */
449		}
450		else if(pkt->WSetting.Auth==AUTHENTICATION_SHARED)
451		{
452			nvram_set("wl_auth_mode", "shared");
453			if (pkt->WSetting.Encrypt==ENCRYPTION_WEP64 ||
454			    pkt->WSetting.Encrypt==ENCRYPTION_WEP128)
455			{
456				sprintf(tmpbuf, "%d", pkt->WSetting.Encrypt);
457				nvram_set("wl_wep_x", tmpbuf);
458				if(pkt->WSetting.DefaultKey>DEFAULT_KEY_4 ||
459				   pkt->WSetting.DefaultKey<DEFAULT_KEY_1)
460				   pkt->WSetting.DefaultKey=DEFAULT_KEY_1;
461				if(pkt->WSetting.DefaultKey==DEFAULT_KEY_1)
462					nvram_set_str("wl_key1", pkt->WSetting.Key, sizeof(pkt->WSetting.Key));
463				else if(pkt->WSetting.DefaultKey==DEFAULT_KEY_2)
464					nvram_set_str("wl_key2", pkt->WSetting.Key, sizeof(pkt->WSetting.Key));
465				else if(pkt->WSetting.DefaultKey==DEFAULT_KEY_3)
466					nvram_set_str("wl_key3", pkt->WSetting.Key, sizeof(pkt->WSetting.Key));
467				else if(pkt->WSetting.DefaultKey==DEFAULT_KEY_4)
468					nvram_set_str("wl_key4", pkt->WSetting.Key, sizeof(pkt->WSetting.Key));
469				else goto fail;
470				sprintf(tmpbuf,"%d", pkt->WSetting.DefaultKey);
471				nvram_set("wl_key", tmpbuf);
472			}
473			nvram_set("wl_wpa_psk","");/* Cherry Cho added for removing temporary key used by WSC in 2007/3/8. */
474		}
475		else if(pkt->WSetting.Auth==AUTHENTICATION_WPA_PSK||pkt->WSetting.Auth==AUTHENTICATION_WPA_PSK2)
476		{
477			nvram_set("wl_auth_mode", "psk");
478			if(pkt->WSetting.Auth==AUTHENTICATION_WPA_PSK)
479			{
480				nvram_set("wl_wpa_mode", "1");
481			}
482			else
483			{
484				nvram_set("wl_wpa_mode", "2");
485			}
486			nvram_set("wl_crypto", "tkip+aes");
487			nvram_set("wl_wep_x", "0");
488			nvram_set_str("wl_wpa_psk", pkt->WSetting.Key, WPAPSK_LEN);
489			nvram_set("wl_key", "1");
490			nvram_set("wl_key1", "");
491			nvram_set("wl_key2", "");
492			nvram_set("wl_key3", "");
493			nvram_set("wl_key4", "");
494		}
495		else goto fail;
496
497		nvram_set("x_Setting", "1");
498		nvram_set("x_EZSetup", "1");
499		nvram_set("wsc_config_state", "1");
500	   }
501	}
502
503	if (pkt->QuickFlag&QFCAP_ISP)
504	{
505		// ISP setting
506		if(pkt->ISPSetting.ISPType==ISP_TYPE_DHCPCLIENT)
507		{
508			nvram_set("wan_proto", "dhcp");
509			nvram_set_str("wan_hostname", pkt->ISPSetting.HostName, sizeof(pkt->ISPSetting.HostName));
510			nvram_set_str("wan_hwaddr_x", pkt->ISPSetting.MAC, sizeof(pkt->ISPSetting.MAC));
511			nvram_set_str("wan_heartbeat_x", "", sizeof(pkt->ISPSetting.BPServer));
512		}
513		else if(pkt->ISPSetting.ISPType==ISP_TYPE_PPPOE)
514		{
515			nvram_set("wan_proto", "pppoe");
516			nvram_set_str("wan_pppoe_username", pkt->ISPSetting.UserName, sizeof(pkt->ISPSetting.UserName));
517			nvram_set_str("wan_pppoe_passwd", pkt->ISPSetting.Password, sizeof(pkt->ISPSetting.Password));
518// 2010.03 James. For Russia. {
519			nvram_set_ip("wan_ipaddr", pkt->ISPSetting.IPAddr);
520			nvram_set_ip("wan_netmask", pkt->ISPSetting.Mask);
521			nvram_set_ip("wan_gateway", pkt->ISPSetting.Gateway);
522// 2010.03 James. }
523// 2009.09 James. For Russia. {
524			nvram_set_str("wan_hostname", pkt->ISPSetting.HostName, sizeof(pkt->ISPSetting.HostName));
525			nvram_set_str("wan_hwaddr_x", pkt->ISPSetting.MAC, sizeof(pkt->ISPSetting.MAC));
526			nvram_set_str("wan_heartbeat_x", pkt->ISPSetting.BPServer, sizeof(pkt->ISPSetting.BPServer));
527// 2009.09 James. }
528		}
529		else if(pkt->ISPSetting.ISPType==ISP_TYPE_PPTP)
530		{
531			nvram_set("wan_proto", "pptp");
532			nvram_set_str("wan_pppoe_username", pkt->ISPSetting.UserName, sizeof(pkt->ISPSetting.UserName));
533			nvram_set_str("wan_pppoe_passwd", pkt->ISPSetting.Password, sizeof(pkt->ISPSetting.Password));
534			nvram_set_ip("wan_ipaddr", pkt->ISPSetting.IPAddr);
535			nvram_set_ip("wan_netmask", pkt->ISPSetting.Mask);
536			nvram_set_ip("wan_gateway", pkt->ISPSetting.Gateway);
537// 2009.12 James. For Russia. {
538			if (pkt->ISPSetting.PPTPOption == PPTP_OPTION_NOENCRYPT)
539				nvram_set("wan_pptp_options_x", "-mppc");
540			else if (pkt->ISPSetting.PPTPOption == PPTP_OPTION_MPPE40)
541				nvram_set("wan_pptp_options_x", "+mppe-40");
542			else if (pkt->ISPSetting.PPTPOption == PPTP_OPTION_MPPE56)
543				nvram_set("wan_pptp_options_x", "+mppe-56");
544			else if (pkt->ISPSetting.PPTPOption == PPTP_OPTION_MPPE128)
545				nvram_set("wan_pptp_options_x", "+mppe-128");
546// 2010.03 James. For Russia. {
547			else
548				nvram_set("wan_pptp_options_x", "");
549// 2010.03 James. }
550			nvram_set_str("wan_hostname", pkt->ISPSetting.HostName, sizeof(pkt->ISPSetting.HostName));
551			nvram_set_str("wan_hwaddr_x", pkt->ISPSetting.MAC, sizeof(pkt->ISPSetting.MAC));
552			nvram_set_str("wan_heartbeat_x", pkt->ISPSetting.BPServer, sizeof(pkt->ISPSetting.BPServer));
553			//if ((pkt->ISPSetting.LAN_IPAddr) != 0)
554			//	nvram_set_ip("lan_ipaddr", pkt->ISPSetting.LAN_IPAddr);
555			if ((pkt->ISPSetting.LAN_IPAddr) != 0)
556			{
557				nvram_set_ip("lan_ipaddr", pkt->ISPSetting.LAN_IPAddr);
558				dhcp_tmp = pkt->ISPSetting.LAN_IPAddr;
559				dhcp_tmp = (dhcp_tmp&0x00ffffff);
560				dhcp_tmp = (dhcp_tmp|0x02000000);
561				nvram_set_ip("dhcp_start", dhcp_tmp);
562				dhcp_tmp =(dhcp_tmp|0xfe000000);
563				nvram_set_ip("dhcp_end", dhcp_tmp);
564			}
565// 2009.12 James. }
566		}
567		else if(pkt->ISPSetting.ISPType==ISP_TYPE_L2TP)
568		{
569			nvram_set("wan_proto", "l2tp");
570			nvram_set_str("wan_pppoe_username", pkt->ISPSetting.UserName, sizeof(pkt->ISPSetting.UserName));
571			nvram_set_str("wan_pppoe_passwd", pkt->ISPSetting.Password, sizeof(pkt->ISPSetting.Password));
572			nvram_set_ip("wan_ipaddr", pkt->ISPSetting.IPAddr);
573			nvram_set_ip("wan_netmask", pkt->ISPSetting.Mask);
574			nvram_set_ip("wan_gateway", pkt->ISPSetting.Gateway);
575// 2009.12 James. For Russia. {
576			nvram_set_str("wan_hostname", pkt->ISPSetting.HostName, sizeof(pkt->ISPSetting.HostName));
577			nvram_set_str("wan_hwaddr_x", pkt->ISPSetting.MAC, sizeof(pkt->ISPSetting.MAC));
578			nvram_set_str("wan_heartbeat_x", pkt->ISPSetting.BPServer, sizeof(pkt->ISPSetting.BPServer));
579// 2009.12 James. }
580		}
581		else if(pkt->ISPSetting.ISPType==ISP_TYPE_STATICIP)
582		{
583			nvram_set("wan_proto", "static");
584			nvram_set_ip("wan_ipaddr", pkt->ISPSetting.IPAddr);
585			nvram_set_ip("wan_netmask", pkt->ISPSetting.Mask);
586			nvram_set_ip("wan_gateway", pkt->ISPSetting.Gateway);
587// 2009.12 James. For Russia. {
588			nvram_set_str("wan_hostname", pkt->ISPSetting.HostName, sizeof(pkt->ISPSetting.HostName));
589			nvram_set_str("wan_hwaddr_x", pkt->ISPSetting.MAC, sizeof(pkt->ISPSetting.MAC));
590			nvram_set_str("wan_heartbeat_x", pkt->ISPSetting.BPServer, sizeof(pkt->ISPSetting.BPServer));
591			if ((pkt->ISPSetting.LAN_IPAddr) != 0)
592			{
593				nvram_set_ip("lan_ipaddr", pkt->ISPSetting.LAN_IPAddr);
594				dhcp_tmp = pkt->ISPSetting.LAN_IPAddr;
595				dhcp_tmp = (dhcp_tmp&0x00ffffff);
596				dhcp_tmp = (dhcp_tmp|0x02000000);
597				nvram_set_ip("dhcp_start", dhcp_tmp);
598				dhcp_tmp =(dhcp_tmp|0xfe000000);
599				nvram_set_ip("dhcp_end", dhcp_tmp);
600			}
601// 2009.12 James. }
602		}
603#ifdef BIGPOND
604		else if(pkt->ISPSetting.ISPType==ISP_TYPE_BIGPOND)
605		{
606			nvram_set("wan_proto", "bigpond");
607			nvram_set_str("wan_pppoe_username", pkt->ISPSetting.UserName, sizeof(pkt->ISPSetting.UserName));
608			nvram_set_str("wan_pppoe_passwd", pkt->ISPSetting.Password, sizeof(pkt->ISPSetting.Password));
609			nvram_set_ip("wan_ipaddr", pkt->ISPSetting.IPAddr);
610			nvram_set_str("wan_hostname", pkt->ISPSetting.HostName, sizeof(pkt->ISPSetting.HostName));
611			nvram_set_str("wan_hwaddr_x", pkt->ISPSetting.MAC, sizeof(pkt->ISPSetting.MAC));
612			nvram_set_str("wan_heartbeat_x", pkt->ISPSetting.BPServer, sizeof(pkt->ISPSetting.BPServer));
613		}
614#endif
615
616// 2009.12 James. For Russia. {
617		/*if(pkt->ISPSetting.PPTPOption == PPTP_OPTION_NOENCRYPT)
618			nvram_set("wan_pptp_options_x", "-mppc");
619		else if(pkt->ISPSetting.PPTPOption == PPTP_OPTION_MPPE40)
620			nvram_set("wan_pptp_options_x", "+mppe-40");
621		else if(pkt->ISPSetting.PPTPOption == PPTP_OPTION_MPPE56)
622			nvram_set("wan_pptp_options_x", "+mppe-56");
623		else if(pkt->ISPSetting.PPTPOption == PPTP_OPTION_MPPE128)
624			nvram_set("wan_pptp_options_x", "+mppe-128");
625		else
626			nvram_set("wan_pptp_options_x", "");//*/
627
628		if(pkt->ISPSetting.IPAddr != 0)
629			nvram_set("x_DHCPClient","0");
630		else
631			nvram_set("x_DHCPClient","1");
632
633		if(pkt->ISPSetting.ISPType==ISP_TYPE_STATICIP
634				|| pkt->ISPSetting.ISPType==ISP_TYPE_PPTP
635				|| pkt->ISPSetting.ISPType==ISP_TYPE_PPPOE)
636		{
637			if(pkt->ISPSetting.PacketNum == SR_PACKET_1 || pkt->ISPSetting.PacketNum == SR_PACKET_2)
638			{
639				if(pkt->ISPSetting.PacketNum == SR_PACKET_1)
640				{
641					start_num = 0;
642					if(pkt->ISPSetting.SRNum<13)
643						end_num = pkt->ISPSetting.SRNum;
644					else
645						end_num = 12;
646					idx1 = 0;
647				}
648
649				if(pkt->ISPSetting.PacketNum == SR_PACKET_2)
650				{
651					start_num = 0;
652					end_num = (pkt->ISPSetting.SRNum - 12);
653					idx1 = 12;
654				}
655
656				sprintf(sr_num,"%d",pkt->ISPSetting.SRNum);
657				nvram_set("sr_num_x",sr_num);
658
659				for(idx=start_num;idx<end_num;idx++)
660				{
661					memset(sr_name, 0, sizeof(sr_name));
662					sprintf(sr_name,"%s%d", "sr_if_x", (idx+idx1));
663					nvram_set_str(sr_name, "WAN", 3);
664					sprintf(sr_name,"%s%d", "sr_ipaddr_x", (idx+idx1));
665					nvram_set_ip(sr_name, pkt->ISPSetting.SR_IPAddr[idx]);
666					sprintf(sr_name,"%s%d", "sr_netmask_x", (idx+idx1));
667					nvram_set_ip(sr_name, pkt->ISPSetting.SR_Mask[idx]);
668					sprintf(sr_name,"%s%d", "sr_gateway_x", (idx+idx1));
669					nvram_set(sr_name, "0.0.0.0");
670				}
671			}
672		}
673// 2009.12 James. }
674
675		if (pkt->ISPSetting.DNSServer1==0 && pkt->ISPSetting.DNSServer2==0)
676		{
677			nvram_set("wan_dnsenable_x", "1");
678		}
679		else
680		{
681			nvram_set("wan_dnsenable_x", "0");
682			nvram_set_ip("wan_dns1_x", pkt->ISPSetting.DNSServer1);
683			nvram_set_ip("wan_dns2_x", pkt->ISPSetting.DNSServer2);
684		}
685
686		if(pkt->ISPSetting.DHCPRoute == 0x01)
687			nvram_set("dr_enable_x", "1");
688		else
689			nvram_set("dr_enable_x", "0");
690
691		if(pkt->ISPSetting.MulticastRoute == 0x01)
692			nvram_set("mr_enable_x", "1");
693		else
694			nvram_set("mr_enable_x", "0");
695
696		if(pkt->ISPSetting.StaticRoute == 0x01)
697			nvram_set("sr_enable_x", "1");
698		else
699			nvram_set("sr_enable_x", "0");
700
701		if(pkt->ISPSetting.WANBridgePort == WAN_BRIDGE_NONE)
702			nvram_set("wan_stb_x", "0");
703		else if(pkt->ISPSetting.WANBridgePort == WAN_BRIDGE_LAN1)
704			nvram_set("wan_stb_x", "1");
705		else if(pkt->ISPSetting.WANBridgePort == WAN_BRIDGE_LAN2)
706			nvram_set("wan_stb_x", "2");
707		else if(pkt->ISPSetting.WANBridgePort == WAN_BRIDGE_LAN3)
708			nvram_set("wan_stb_x", "3");
709		else if(pkt->ISPSetting.WANBridgePort == WAN_BRIDGE_LAN4)
710			nvram_set("wan_stb_x", "4");
711		else if(pkt->ISPSetting.WANBridgePort == WAN_BRIDGE_LAN3LAN4)
712			nvram_set("wan_stb_x", "5");
713		else
714			nvram_set("wan_stb_x", "0");
715
716		if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_AUTO)
717			nvram_set("wl_mrate", "0");
718		else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_1)
719			nvram_set("wl_mrate", "1000000");
720		else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_2)
721			nvram_set("wl_mrate", "2000000");
722		else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_5)
723			nvram_set("wl_mrate", "5500000");
724		else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_6)
725			nvram_set("wl_mrate", "6000000");
726		else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_9)
727			nvram_set("wl_mrate", "9000000");
728		else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_11)
729			nvram_set("wl_mrate", "11000000");
730		else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_12)
731			nvram_set("wl_mrate", "12000000");
732		else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_18)
733			nvram_set("wl_mrate", "18000000");
734		else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_24)
735			nvram_set("wl_mrate", "24000000");
736		else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_36)
737			nvram_set("wl_mrate", "36000000");
738		else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_48)
739			nvram_set("wl_mrate", "48000000");
740		else if(pkt->ISPSetting.MulticastRate == MULTICAST_RATE_54)
741			nvram_set("wl_mrate", "54000000");
742		else
743			nvram_set("wl_mrate", "0");
744
745		nvram_set("time_zone", pkt->ISPSetting.TimeZone);
746		nvram_set("x_Setting", "1");
747	}
748	if (pkt->QuickFlag&QFCAP_FINISH)
749	{
750		nvram_set("sharedkeystr", "");
751	}
752	else if(pkt->QuickFlag&QFCAP_REBOOT)
753	{
754	   	nvram_set("sharedkeystr", sharedkeystr);
755	}
756	//convert_asus_values();
757	//nvram_commit();
758fail:
759}
760
761
762int OTSStart(int flag)
763{
764	// stop other service
765
766	if (flag)
767	{
768		//stop_service_main(1);
769		start_sdhcpd();
770		strcpy(sharedkeystr, nvram_safe_get("sharedkeystr"));
771		tw = (TEMP_WIRELESS *)sharedkeystr;
772		nvram_set("sharedkeystr", "");
773		nvram_commit();
774		time(&bs_time);
775		bs_mode=BTNSETUP_DATAEXCHANGE_EXTEND;
776		bs_timeout = BTNSETUP_EXCHANGE_TIMEOUT;
777	}
778	else
779	{
780#ifdef FULL_EZSETUP // Added by Chen-I, 20080201
781		stop_service_main(1);
782		start_sdhcpd();
783
784		BN_register_RAND(ots_rand);
785
786		dh = NULL;
787		dh = DH_init(p1536, 192, 5);
788		if (!DH_generate_key(pubkey,dh)) goto err;
789
790		/* Start button setup process */
791		/* SSID : [ProductID]_OTS[Default]_[Prime]*/
792		if (nvram_match("x_Setting", "1")) // not in default
793			sprintf(ssid, "%s_OTS1", nvram_safe_get("productid"));
794		else sprintf(ssid, "%s_OTS0", nvram_safe_get("productid"));
795
796		/* +++ Cherry Cho modified in 2007/2/12. +++ */
797		/*eval("wlconf","wsec","off");
798		eval("wlconf","auth", "0");
799		eval("wlconf","wpa_auth", "off");
800		eval("wlconf","eap","off");
801		eval("wlconf","ssid", "ASUS_OTS");//*/
802		eval("wl","wsec","off");	// 2008.05 James. use "wl" in WL-500gP V2.
803		eval("wl","auth", "0");
804		eval("wl","wpa_auth", "0");
805		eval("wl","eap","off");
806		eval("wl","ssid", "ASUS_OTS");//*/
807		/* --- Cherry Cho modified in 2007/2/12. --- */
808
809		// reduce power
810		// eval("wl", "txpwr", "1");
811		bs_mode = BTNSETUP_START;
812#else
813		bs_mode = BTNSETUP_DATAEXCHANGE;
814#endif
815		bs_timeout = BTNSETUP_INIT_TIMEOUT;
816		time(&bs_time);
817	}
818	return 1;
819
820err:
821	if (dh)
822	{
823		DH_free(dh);
824		dh=NULL;
825	}
826	return 0;
827}
828
829int
830OTSExchange(int auth, int encrypt)
831{
832	int ret = 0;
833	int i;
834	char SSID[32+1];
835	char Key[64+1];
836
837	if (auth==-1&&encrypt==-1)
838	{
839		return ret;
840	}
841
842	// generate shared key
843	if (!DH_compute_key(sharedkey, cpubkey, MAX_DHKEY_LEN, dh))
844	{
845		goto err;
846	}
847
848	sharedkeystr[0] = 0;
849	for(i=0;i<MAX_DHKEY_LEN;i++)
850	{
851		 sprintf(sharedkeystr, "%s%02X", sharedkeystr, (unsigned char )sharedkey[i]);
852	}
853
854	tw = sharedkeystr;
855	strncpy(SSID, tw->u.WirelessStruct.TempSSID, sizeof(SSID));
856	SSID[32]=0;
857	strncpy(Key, tw->u.WirelessStruct.TempKey, sizeof(Key));
858	Key[64]=0;
859
860#ifdef ENCRYPTION
861	// using layer 3 encryption
862#else
863	if(auth==AUTHENTICATION_SHARED)
864		eval("wl", "auth", "shared");
865	else if(auth==AUTHENTICATION_WPA_PSK)
866		eval("wl", "auth", "psk");
867	else
868		eval("wl", "auth", "open");
869
870	if (encrypt==ENCRYPTION_WEP64)
871	{
872		Key[WEP64_LEN]=0;
873		eval("wl","wep", Key);
874	}
875	else if (encrypt==ENCRYPTION_WEP128)
876	{
877		Key[WEP128_LEN]=0;
878		eval("wl","wep", Key);
879	}
880	else if (encrypt==ENCRYPTION_TKIP)
881	{
882		Key[WPAPSK_LEN] = 0;
883		eval("wl", "tkip", Key);
884	}
885
886	eval("wl","ssid", SSID);
887
888#endif
889	ret = 1;
890	return ret;
891err:
892	if (dh)
893	{
894		DH_free(dh);
895		dh=NULL;
896	}
897	return ret;
898}
899
900static int
901OTS_socket_init( usockaddr* usaP )
902{
903    int listen_fd;
904    int i;
905
906    memset( usaP, 0, sizeof(usockaddr) );
907    usaP->sa.sa_family = AF_INET;
908    usaP->sa_in.sin_addr.s_addr = htonl( INADDR_ANY );
909    usaP->sa_in.sin_port = htons(OTSPORT);
910
911    listen_fd = socket( usaP->sa.sa_family, SOCK_STREAM, 0 );
912
913    if ( listen_fd < 0 )
914    {
915	perror( "socket" );
916	return -1;
917    }
918
919    i = 1;
920    if ( setsockopt( listen_fd, SOL_SOCKET, SO_REUSEADDR, (char*) &i, sizeof(i) ) < 0 )
921	{
922	perror( "setsockopt" );
923	return -1;
924	}
925    if ( bind( listen_fd, &usaP->sa, sizeof(struct sockaddr_in) ) < 0 )
926	{
927	perror( "bind" );
928	return -1;
929	}
930    if ( listen( listen_fd, 5) < 0 )
931	{
932	perror( "listen" );
933	return -1;
934	}
935    return listen_fd;
936}
937
938void OTSFinish(int fd, int flag)
939{
940    	shutdown(fd, 2);
941    	close(fd);
942
943	//if (flag) kill(1, SIGHUP);
944	//else kill(1, SIGTERM);
945	kill(1, SIGTERM);
946}
947
948char pdubuf[INFO_PDU_LENGTH];
949char pdubuf_res[INFO_PDU_LENGTH];
950
951static int
952waitsock(int fd, int sec, int usec)
953{
954	struct timeval tv;
955	fd_set fdvar;
956	int res;
957
958	FD_ZERO(&fdvar);
959	FD_SET(fd, &fdvar);
960	tv.tv_sec = sec;
961	tv.tv_usec = usec;
962	res = select(fd+1, &fdvar, NULL, NULL, &tv);
963
964	return res;
965}
966
967int OTSPacketHandler(int sockfd)
968{
969    IBOX_COMM_PKT_HDR_EX *phdr;
970    IBOX_COMM_PKT_RES_EX *phdr_res;
971    char tmpbuf[INFO_PDU_LENGTH];
972
973    int i, len;
974    char *buf;
975
976    if (waitsock(sockfd, 2, 0)<=0)
977    {
978	syslog(LOG_NOTICE, "Connect Timeout %x\n", bs_mode);
979	close(sockfd);
980	return 0;
981    }
982
983    buf = pdubuf;
984    len = sizeof(pdubuf);
985    /* Parse headers */
986
987    while ((i=read(sockfd, buf, len))&&len>0)
988    {
989	len-=i;
990	buf+=i;
991    }
992
993#ifdef DEBUG
994    dprintf("recv: %x\n", len);
995    for(i=0;i<sizeof(pdubuf);i++)
996    {
997	if(i%16==0) dprintf("\n");
998	dprintf("%02x ", (unsigned char *)pdubuf[i]);
999    }
1000#endif
1001
1002#ifdef ENCRYPTION
1003    phdr = (IBOX_COMM_PKT_HDR_EX *)pdubuf;
1004    phdr_res = (IBOX_COMM_PKT_RES_EX *)pdubuf_res;
1005
1006    if (bs_mode>BTNSETUP_START &&
1007       !( bs_mode==BTNSETUP_DATAEXCHANGE &&
1008	phdr->ServiceID==NET_SERVICE_ID_IBOX_INFO &&//Second Chance,2005/07/18
1009        phdr->PacketType==NET_PACKET_TYPE_CMD &&
1010        (phdr->OpCode==NET_CMD_ID_EZPROBE || phdr->OpCode==NET_CMD_ID_SETKEY_EX)
1011	)
1012)
1013    {
1014    	Decrypt(sizeof(tw->u.WirelessStruct.TempKey),
1015		tw->u.WirelessStruct.TempKey,
1016		pdubuf, INFO_PDU_LENGTH,
1017		tmpbuf);
1018
1019    	phdr = (IBOX_COMM_PKT_HDR_EX *)tmpbuf;
1020    	phdr_res = (IBOX_COMM_PKT_RES_EX *)pdubuf_res;
1021    }
1022    else
1023    {
1024    	phdr = (IBOX_COMM_PKT_HDR_EX *)pdubuf;
1025    	phdr_res = (IBOX_COMM_PKT_RES_EX *)pdubuf_res;
1026    }
1027#else
1028    phdr = (IBOX_COMM_PKT_HDR_EX *)pdubuf;
1029    phdr_res = (IBOX_COMM_PKT_RES_EX *)pdubuf_res;
1030#endif
1031
1032    //syslog(LOG_NOTICE, "Data Packet XXX %x %x %x %x\n", phdr->ServiceID, phdr->PacketType, bs_mode, phdr->OpCode);
1033
1034    if (phdr->ServiceID==NET_SERVICE_ID_IBOX_INFO &&
1035        phdr->PacketType==NET_PACKET_TYPE_CMD)
1036    {
1037	phdr_res->ServiceID=NET_SERVICE_ID_IBOX_INFO;
1038	phdr_res->PacketType=NET_PACKET_TYPE_RES;
1039	phdr_res->OpCode =phdr->OpCode;
1040	phdr_res->Info = phdr->Info;
1041	memcpy(phdr_res->MacAddress, phdr->MacAddress, sizeof(phdr_res->MacAddress));
1042#ifdef OTS_LOG
1043	if (phdr->OpCode!=NET_CMD_ID_EZPROBE)
1044		ots_log(phdr->OpCode+0x90, 0);
1045#endif
1046	//syslog(LOG_NOTICE, "Data Packet %x %x\n", bs_mode, phdr->OpCode);
1047
1048	switch(phdr->OpCode)
1049	{
1050		case NET_CMD_ID_EZPROBE:
1051		{
1052		     PKT_EZPROBE_INFO *ezprobe_res;
1053
1054		     ezprobe_res = (PKT_EZPROBE_INFO *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX));
1055
1056		     ezprobe_res->isNotDefault = atoi(nvram_safe_get("x_Setting")) | atoi(nvram_safe_get("wsc_config_state")); // for EZSetup to coexist w/ WSC
1057		     ezprobe_res->isSetByOts = atoi(nvram_safe_get("x_EZSetup"));
1058		     ezprobe_res->isWAN = is_phyconnected(nvram_safe_get("wan_ifname"));
1059		     ezprobe_res->isDHCP = 0;
1060		     ezprobe_res->isPPPOE = 0;
1061
1062		     if (nvram_match("wl_auth_mode", "shared"))
1063				ezprobe_res->Auth = AUTHENTICATION_SHARED;
1064		     else if (nvram_match("wl_auth_mode", "psk"))
1065				ezprobe_res->Auth = AUTHENTICATION_WPA_PSK;
1066		     else if (nvram_match("wl_auth_mode", "wpa"))
1067				ezprobe_res->Auth = AUTHENTICATION_WPA;
1068		     else if (nvram_match("wl_auth_mode", "radius"))
1069				ezprobe_res->Auth = AUTHENTICATION_8021X;
1070		     else ezprobe_res->Auth = AUTHENTICATION_OPEN;
1071
1072		     if (nvram_match("wl_macmode", "allow"))
1073				ezprobe_res->Acl = ACL_MODE_ACCEPT;
1074		     else if (nvram_match("wl_macmode", "deny"))
1075				ezprobe_res->Acl = ACL_MODE_REJECT;
1076		     else ezprobe_res->Acl = ACL_MODE_DISABLE;
1077
1078		     if (nvram_match("wl_mode_x", "1"))
1079				ezprobe_res->Wds = WDS_MODE_WDS_ONLY;
1080		     else if (nvram_match("wl_mode_x", "2"))
1081				ezprobe_res->Wds = WDS_MODE_HYBRID;
1082		     else ezprobe_res->Wds = WDS_MODE_AP_ONLY;
1083
1084		     strcpy(ezprobe_res->ProductID, nvram_safe_get("productid"));
1085		     strcpy(ezprobe_res->FirmwareVersion, nvram_safe_get("firmver"));
1086		     time(&bs_time); // reset timer only
1087		     bs_auth=-1;
1088		     bs_encrypt=-1;
1089
1090#ifdef OTS_SIMU
1091		     if(!ots_simu(1)) return INFO_PDU_LENGTH;
1092#endif
1093		     send(sockfd, pdubuf_res, sizeof(pdubuf_res), NULL);
1094		     return INFO_PDU_LENGTH;
1095		}
1096		case NET_CMD_ID_SETKEY_EX:
1097		{
1098		     PKT_SET_INFO_GW_QUICK_KEY *pkey;
1099		     PKT_SET_INFO_GW_QUICK_KEY *pkey_res;
1100
1101		     if (bs_mode!=BTNSETUP_START
1102			&& bs_mode != BTNSETUP_DATAEXCHANGE // allow second change, 2005/07/18, Chen-I
1103			)
1104		     {
1105		     	  bs_auth=-1;
1106		     	  bs_encrypt=-1;
1107		  	  return 0;
1108                     }
1109
1110		     pkey=(PKT_SET_INFO_GW_QUICK_KEY *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX));
1111		     pkey_res = (PKT_SET_INFO_GW_QUICK_KEY *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX));
1112
1113		     if(pkey->KeyLen==0) return 0;
1114		     else memcpy(cpubkey, pkey->Key, MAX_DHKEY_LEN);
1115
1116		     bs_mode = BTNSETUP_DATAEXCHANGE;
1117		     time(&bs_time);
1118		     bs_timeout=BTNSETUP_EXCHANGE_TIMEOUT;
1119		     bs_auth=pkey->Auth;
1120		     bs_encrypt=pkey->Encrypt;
1121		     pkey_res->Auth = pkey->Auth;
1122		     pkey_res->Encrypt = pkey->Encrypt;
1123		     pkey_res->KeyLen = MAX_DHKEY_LEN;
1124		     memcpy(pkey_res->Key, pubkey, MAX_DHKEY_LEN);
1125#ifdef OTS_SIMU
1126		     if(!ots_simu(2)) return INFO_PDU_LENGTH;
1127#endif
1128		     send(sockfd, pdubuf_res, sizeof(pdubuf_res), NULL);
1129		     return INFO_PDU_LENGTH;
1130		}
1131		case NET_CMD_ID_QUICKGW_EX:
1132		{
1133		     PKT_SET_INFO_GW_QUICK *gwquick;
1134		     PKT_SET_INFO_GW_QUICK *gwquick_res;
1135
1136		     if (bs_mode!=BTNSETUP_DATAEXCHANGE && bs_mode!=BTNSETUP_DATAEXCHANGE_EXTEND)
1137		     {
1138			 return 0;
1139                     }
1140#ifdef ENCRYPTION
1141		     gwquick=(PKT_SET_INFO_GW_QUICK *)(tmpbuf+sizeof(IBOX_COMM_PKT_HDR_EX));
1142#else
1143		     gwquick=(PKT_SET_INFO_GW_QUICK *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX));
1144#endif
1145
1146		     gwquick_res = (PKT_SET_INFO_GW_QUICK *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX));
1147
1148		     //printf("Flag: %x\n", gwquick->QuickFlag);
1149		     btn_setup_save_setting(gwquick);
1150
1151#ifdef OTS_LOG
1152	if (phdr->OpCode!=NET_CMD_ID_EZPROBE)
1153		ots_log(phdr->OpCode + gwquick->QuickFlag, 2);
1154#endif
1155
1156		     if((gwquick->QuickFlag&QFCAP_WIRELESS)&&
1157			(gwquick->QuickFlag&QFCAP_GET)) // get setting
1158		     {
1159			 btn_setup_get_setting(gwquick_res);
1160		     	 gwquick_res->QuickFlag = QFCAP_WIRELESS;
1161		     }
1162		     else
1163		     {
1164			 memcpy(gwquick_res, gwquick, sizeof(PKT_SET_INFO_GW_QUICK));
1165		     }
1166
1167		     if((gwquick->QuickFlag&QFCAP_FINISH)) // finish
1168		     {
1169		     	 bs_mode = BTNSETUP_FINISH;
1170		     	 bs_timeout=0;
1171#ifdef OTS_SIMU
1172		     	 if(!ots_simu(3)) return INFO_PDU_LENGTH;
1173#endif
1174		     }
1175		     else if((gwquick->QuickFlag&QFCAP_REBOOT)) //reboot
1176		     {
1177			 bs_mode = BTNSETUP_DATAEXCHANGE_FINISH;
1178		     	 bs_timeout=BTNSETUP_EXCHANGE_TIMEOUT;
1179#ifdef OTS_SIMU
1180		     	 if(!ots_simu(4)) return INFO_PDU_LENGTH;
1181#endif
1182		     }
1183		     else
1184		     {
1185#ifdef OTS_SIMU
1186		     	 if(!ots_simu(5)) return INFO_PDU_LENGTH;
1187#endif
1188                     }
1189		     time(&bs_time);
1190
1191#ifdef OTS_LOG
1192	if (phdr->OpCode!=NET_CMD_ID_EZPROBE)
1193		ots_log(phdr->OpCode + gwquick->QuickFlag, 3);
1194#endif
1195
1196
1197#ifdef ENCRYPTION
1198		     Encrypt(sizeof(tw->u.WirelessStruct.TempKey),
1199				tw->u.WirelessStruct.TempKey,
1200				pdubuf_res, INFO_PDU_LENGTH,
1201				tmpbuf);
1202		     i=send(sockfd, tmpbuf, INFO_PDU_LENGTH, 0);
1203
1204#else
1205		     i=send(sockfd, pdubuf_res, INFO_PDU_LENGTH, 0);
1206#endif
1207
1208#ifdef OTS_LOG
1209	 	     if(i>=0) ots_log(i, 4);
1210		     else ots_log(errno, 4);
1211#endif
1212
1213		     return INFO_PDU_LENGTH;
1214		}
1215		default:
1216			return 0;
1217	}
1218    }
1219    return 0;
1220}
1221
1222int
1223start_ots(void)
1224{
1225	char *ots_argv[] = {"ots", NULL};
1226	pid_t pid;
1227
1228	_eval(ots_argv, NULL, 0, &pid);
1229	return 0;
1230}
1231
1232int
1233stop_ots(void)
1234{
1235	int ret1 = eval("killall", "ots");
1236	dprintf("done\n");
1237	return(ret1);
1238}
1239
1240int
1241ots_main(int argc, char *argv[])
1242{
1243	FILE *fp;
1244    	usockaddr usa;
1245    	int listen_fd;
1246    	int conn_fd;
1247    	socklen_t sz = sizeof(usa);
1248    	IBOX_COMM_PKT_HDR*  phdr;
1249    	int                 iLen , iRes , iCount , iRcv;
1250    	int                 fromlen;
1251    	char                *hdr;
1252    	char                pdubuf[INFO_PDU_LENGTH];
1253    	struct sockaddr_in  from_addr;
1254	time_t now;
1255	int flag=0;
1256	int ret;
1257
1258	/* write pid */
1259	if ((fp=fopen("/var/run/ots.pid", "w"))!=NULL)
1260	{
1261		fprintf(fp, "%d", getpid());
1262		fclose(fp);
1263	}
1264
1265	if (nvram_invmatch("sharedkeystr", ""))
1266	{
1267		OTSStart(1);
1268	}
1269	else
1270	{
1271#ifdef OTS_LOG
1272		ots_log(0, 0);
1273#endif
1274		OTSStart(0);
1275	}
1276
1277	/* Initialize listen socket */
1278    	if ((listen_fd = OTS_socket_init(&usa)) < 0) {
1279		fprintf(stderr, "can't bind to any address\n" );
1280		return 0;
1281    	}
1282
1283    	/* Loop forever handling requests */
1284    	for (;;)
1285    	{
1286    		ret=waitsock(listen_fd, bs_timeout, 0);
1287
1288#ifdef FULL_EZSETUP
1289		if (ret==0) goto finish;
1290		else if(ret<0) continue;
1291#else
1292		if (ret<=0) continue;
1293#endif
1294
1295		if ((conn_fd = accept(listen_fd, &usa.sa, &sz)) < 0) {
1296			perror("accept");
1297#ifdef OTS_LOG
1298			ots_log(bs_mode+0x10, 0);
1299#endif
1300			continue;
1301			//return errno;
1302		}
1303
1304		if (!OTSPacketHandler(conn_fd))
1305		{
1306			syslog(LOG_NOTICE, "Error Packets: %x %x %x", bs_mode, bs_auth, bs_encrypt);
1307		}
1308
1309		if (bs_mode==BTNSETUP_DATAEXCHANGE)
1310		{
1311		      if(!OTSExchange(bs_auth, bs_encrypt))
1312		      {
1313			  //continue;
1314		      }
1315		}
1316		else if(bs_mode==BTNSETUP_DATAEXCHANGE_FINISH)
1317		{
1318		      sleep(2);
1319		      flag = 1;
1320		      goto finish;
1321		}
1322		time(&now);
1323		if (bs_mode>=BTNSETUP_FINISH) goto finish;
1324#ifdef FULL_EZSETUP // Added by Chen-I 200802012
1325		if ((now-bs_time)>bs_timeout) goto finish;
1326#endif
1327    	}
1328finish:
1329	if (bs_mode==BTNSETUP_FINISH)
1330	{
1331#ifdef OTS_LOG
1332		ots_log(bs_mode + 0x30, 0);
1333#endif
1334		if (dh)
1335		{
1336			DH_free(dh);
1337			dh=NULL;
1338		}
1339#ifdef FULL_EZSETUP
1340    		shutdown(listen_fd, 2);
1341    		close(listen_fd);
1342		nvram_set("bs_mode", "1");
1343		bs_mode=BTNSETUP_NONE;
1344		sleep(2);
1345
1346		stop_wan();
1347		stop_dhcpd();
1348		convert_asus_values(1);
1349		nvram_commit();
1350		start_dhcpd();
1351		start_wan();
1352#else
1353		convert_asus_values(1);
1354		nvram_commit();
1355		OTSFinish(listen_fd, flag);
1356#endif
1357	}
1358	else
1359	{
1360#ifdef OTS_LOG
1361		ots_log(bs_mode + 0x40, 1);
1362#endif
1363		if (dh)
1364		{
1365			DH_free(dh);
1366			dh=NULL;
1367		}
1368
1369		convert_asus_values(1);
1370		nvram_commit();
1371		OTSFinish(listen_fd, flag);
1372	}
1373    	return 1;
1374}
1375#endif
1376