#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <enet/enet.h>
#include <fcntl.h>
#include <net/route.h>
#include <enet_flash.h>
#ifndef ENET_AGENTD_PORT
#define ENET_AGENTD_PORT 13364
#endif
extern int admin_site_survey(SITESURVEY *sites);
extern int get_ap_info(WLANINFO *wlaninfo);
extern int enet_avs_msg_port;
extern int enet_disable_all_leds;
extern int g_link_status;
extern int has_no_wireless;
#ifdef ENET_SUPPORT_WLAN
extern int getRegionCountryNum(int a, int b);
#endif
extern void enet_form_set_date_time(int year,int mon,int day,int hour,int min,int sec);
extern void enet_set_essid_any();
extern void enet_restore_essid();
void getRegionCountryRange(int cr, int *a, int *b);
int saveCountryRegionFlash(int CountryRegion);
int saveMACFlash(unsigned char *mac);
static unsigned char mynodeid[6];
static pthread_t ledctl_handle;
static inline u8 atoh(char c)
{
unsigned x;
switch (c) {
case 'F': case 'f': return 15;
case 'E': case 'e': return 14;
case 'D': case 'd': return 13;
case 'C': case 'c': return 12;
case 'B': case 'b': return 11;
case 'A': case 'a': return 10;
}
x = c - '0';
return (x >= 0 && x <= 9) ? x : 0;
}
static int check_tcpcfg(TCPCFG *cfg)
{
unsigned char nodenum[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
if (!memcmp(cfg->NodeID, nodenum, 6) || !memcmp(cfg->NodeID, mynodeid, 6)) {
if (cfg->edicfg[3] + cfg->edicfg[1] == cfg->edicfg[2] && cfg->edicfg[0] == 0)
return 1;
else
return 0;
}
else
return 0;
}
static void SetTCPCfgPkt(TCPCFG *cfg, unsigned char command, unsigned char *nodenum)
{
bzero(cfg, sizeof(TCPCFG));
memcpy(cfg->NodeID, nodenum, 6);
cfg->edicfg[0] = RESPONSE;
cfg->edicfg[1] = command;
cfg->edicfg[2] = 0xff;
cfg->edicfg[3] = 0xff - command;
}
static void Set_IC_NAME(IC_NAME *ic, enet_t *enet)
{
int a, b;
in_addr_t ip;
bzero(ic, sizeof(IC_NAME));
memcpy(ic->IC_Name, enet->model_name, sizeof(enet->model_name));
//memcpy(ic->IC_IP, &enet->lan.ip, sizeof(in_addr_t));
memset(ic->IC_IP, 0, sizeof(ic->IC_IP));
if (enet_get_ip(ENET_LAN_BRIDGE, &ip) > 0)
memcpy(ic->IC_IP, &ip, sizeof(in_addr_t));
#ifdef ENET_SUPPORT_WLAN
getRegionCountryRange(enet->wl_g.CountryRegion, &a, &b);
#endif
ic->IC_Reserved0[0] = a; // Tester: Wireless Channel a-b
ic->IC_Reserved0[1] = b; // Tester: Wireless Channel a-b
ic->IC_Reserved0[2] = FIRMWARE_VERSION_A; // Tester: Firmware Version A.B
ic->IC_Reserved0[3] = FIRMWARE_VERSION_B; // Tester: Firmware Version A.B
ic->IC_VendorID = enet->model; // Tester: Model (0:Edmiax 1:GLP 2:DDC 3:ICT) (in enet.h)
ic->IC_SubVendorID = enet->type; // Tester: Type (0:IC1000 1:IC1000WG 2:IC3000, 3:IC3000WG 6:IC1500 7:IC1500WG 8:IC1500S)
ic->IC_DeviceType = IC_DeviceType_IPCamera; // Admin:
ic->IC_DeviceModel = enet->type + 1; // Admin: IC_DeviceModel_IC1500WG;
ic->IC_Setted = enet->IC_Setted;
//memcpy(ic->IC_Reserved1, "5678", 4); //
//ic->IC_Reserved1[0] = 4;
//ic->IC_Reserved1[1] = 5;
//ic->IC_Reserved1[2] = 6;
//ic->IC_Reserved1[3] = 7;
}
static void Set_IC_SETTING(IC_SETTING *icsetting, enet_t *enet)
{
char tmp[32];
char firmware_version[5]={0,0,0,0,0};
in_addr_t netmask;
struct in_addr gw;
in_addr_t dns;
memcpy(icsetting->email, enet->email.rcpt, 32); //enet_smtp.h : #define MAX_EMAIL_LEN 64
memcpy(icsetting->emailserver, &enet->email.server, 32); icsetting->emailserver[31] = 0;
memcpy(icsetting->IC_SUBNET, &enet->lan.mask, sizeof(in_addr_t));
memcpy(icsetting->IC_GATEWAY, &enet->lan.gateway, sizeof(in_addr_t));
memcpy(icsetting->IC_DNS, &enet->dns1, sizeof(in_addr_t));
icsetting->IC_PORT = htons(enet_avs_msg_port);
icsetting->IC_WEB_PORT = htons(enet->httpd_port);
if (enet->avs.video.width == 640 && enet->avs.video.height == 480)
{
icsetting->IC_Resolution = 3;
}
else if (enet->avs.video.width == 320 && enet->avs.video.height == 240)
{
icsetting->IC_Resolution = 2;
}
sscanf(enet_firmware_version(), "%s %s", firmware_version, tmp);
memcpy(icsetting->IC_FirmwareVer, firmware_version, 5);
//memcpy(icsetting->IC_Password, enet->passwd, 5); obsolete
strncpy(icsetting->IC_LongPassword, enet->passwd, IPCAM_PASSWD_LEN);
icsetting->IC_DDNS_ENABLE = (int) enet->ddns.enable;
memcpy(icsetting->IC_DDNS_DOMAIN, enet->ddns.host, 32); icsetting->IC_DDNS_DOMAIN[32] = 0;
memcpy(icsetting->IC_DDNS_ACCOUNT, enet->ddns.login, 0x11);
memcpy(icsetting->IC_DDNS_PASSWORD, enet->ddns.passwd, 0x11);
icsetting->IC_UPNP_ENABLE = (int) enet->upnp_enable;
memcpy(icsetting->IC_Name, enet->model_name, sizeof(enet->model_name)); //enet:32
icsetting->IC_DHCP_ENABLE = (int) enet->lan.dhcp_enable;
icsetting->IC_PPPOE_ENABLE = (int) enet->pppoe.enable;
#if defined AGENTED_SUPPORT_MD
icsetting->m_IC_MD_3010.IC_MD_enable = enet->avs.md.enable;
//enet_debug("enet.avs.md.enable is %d",icsetting->IC_MD_enable);
icsetting->m_IC_MD_3010.IC_MD_email = enet->avs.md.email;
icsetting->m_IC_MD_3010.IC_MD_ftp = enet->avs.md.ftp;
memcpy(icsetting->m_IC_MD_3010.IC_MD_title , enet->avs.md.title , MAX_TITLE_LEN-1 );
icsetting->m_IC_MD_3010.IC_MD_title[MAX_TITLE_LEN-1] = '\0';
icsetting->m_IC_MD_3010.IC_MD_length = htonl(enet->avs.md.length);
// enet_debug("icsetting->IC_MD_length is %d",icsetting->IC_MD_length);
// enet_debug("enet->avs.md.length is %d",enet->avs.md.length);
icsetting->m_IC_MD_3010.IC_MD_delay = htonl(enet->avs.md.delay);
// icsetting->IC_MD_delay = enet->avs.md.delay;
// enet_debug("icsetting->IC_MD_delay is %d",icsetting->IC_MD_delay);
// enet_debug("enet->avs.md.delay is %d",enet->avs.md.delay);
#endif
}
static void Set_MyNodeID()
{
enet_t enet;
enet_load(&enet);
memcpy(mynodeid, enet.lan.mac, 6);
}
static void dispatch(unsigned char *buf, int buf_len, int sock, struct sockaddr_in *agentd_svr)
{
enet_t enet;
TCPCFG cfg, cfgret;
IC_NAME ic;
IC_SETTING icsetting;
IC_CONFIG icconfig;
WLANINFO wlaninfo;
SITESURVEY sites[20];
IC_LED icled;
unsigned char cmd;
unsigned char send_buf[1024], tmpbuf[64];
char tftp_cmd[128];
int ap_num = 0, i;
int rval, need_reboot = 0;
unsigned char CountryRegion = 0;
static unsigned char need_save = 0; // in order to save time, we only save setting to flash when need_save is 1.
EMAIL_AUTH email_auth;
FTP_SETTING ftp;
PPPOE_SETTING pppoe;
TEST_EMAIL testmail;
USERS users;
DATETIME datetime;
//struct in_addr ntp_addr;
int WepKeyLen = 0;
enet_runtime_t *rt;
char *userid = NULL; //for user account management
//enet_debug("UDP packet from %s (port:%d)", inet_ntoa(agentd_svr->sin_addr), ntohs(agentd_svr->sin_port));
rval = 0;
memcpy(&cfg, buf, sizeof(cfg));
if (check_tcpcfg(&cfg)){
cmd = cfg.edicfg[1];
enet_load(&enet);
bzero(send_buf, 1024);
switch (cmd) {
case RESET :
enet_debug("recv cmd: %d RESET", cmd);
system("/sbin/reboot");
break;
case READ_SETTING :
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
case READ_SETTING_MANUAL :
//if (agentd_svr->sin_addr.s_addr == INADDR_BROADCAST)
// enet_debug("recv cmd: %d READ_SETTING", cmd);
//else
// enet_debug("recv cmd: %d READ_SETTING_MANUAL", cmd);
bzero(&icsetting, sizeof(IC_SETTING));
Set_IC_SETTING(&icsetting, &enet);
//enet_debug("enet.passwd:%s", enet.passwd);
SetTCPCfgPkt(&cfgret, cmd, mynodeid);
memcpy(send_buf, &cfgret, sizeof(TCPCFG));
memcpy(send_buf + sizeof(TCPCFG), &icsetting, sizeof(IC_SETTING));
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(IC_SETTING), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
usleep(10000);
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(IC_SETTING), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
usleep(10000);
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(IC_SETTING), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
break;
case SET_CONFIG :
/*
neo@acelink 2008/09/11: Apply to new Admin utility
*/
//enet_debug("recv cmd: %d SET_CONFIG", cmd);
bzero(&icconfig, sizeof(IC_CONFIG));
memcpy(&icconfig, buf, sizeof(IC_CONFIG));
/* save configutation */
memcpy(enet.model_name, icconfig.IC_Name, sizeof(enet.model_name)); // enet: 32
strncpy(enet.passwd, icconfig.IC_LongPassword, IPCAM_PASSWD_LEN);
umSetUserPassword((char *) enet.login, (char *) enet.passwd); // for httpd server
enet.lan.dhcp_enable = (bool) icconfig.IC_DHCP_ENABLE;
if (!enet.lan.dhcp_enable) {
memcpy(&enet.lan.ip, icconfig.IC_IP, sizeof(in_addr_t));
memcpy(&enet.lan.mask, icconfig.IC_SUBNET, sizeof(in_addr_t));
memcpy(&enet.lan.gateway, icconfig.IC_GATEWAY, sizeof(in_addr_t));
memcpy(&enet.dns1, icconfig.IC_DNS, sizeof(in_addr_t));
}
enet.IC_Setted = 1;
need_reboot = 0;
if (enet.httpd_port != ntohs(icconfig.IC_WEB_PORT))
need_reboot = 1;
enet.httpd_port = ntohs(icconfig.IC_WEB_PORT);
if (need_reboot == 1) {
enet_save_apply(&enet);
enet_reboot();
}
enet_save_apply(&enet);
//alert admin refresh info
cmd = READ_SETTING;
bzero(&icsetting, sizeof(IC_SETTING));
Set_IC_SETTING(&icsetting, &enet);
SetTCPCfgPkt(&cfgret, cmd, mynodeid);
memcpy(send_buf, &cfgret, sizeof(TCPCFG));
memcpy(send_buf + sizeof(TCPCFG), &icsetting, sizeof(IC_SETTING));
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(IC_SETTING), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
usleep(10000);
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(IC_SETTING), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
usleep(10000);
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(IC_SETTING), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
break;
case SEARCH_IPCAM :
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
case SEARCH_MANUAL :
//if (agentd_svr->sin_addr.s_addr == INADDR_BROADCAST)
// enet_debug("recv cmd: %d SEARCH_IPCAM", cmd);
//else
// enet_debug("recv cmd: %d SEARCH_MANUAL", cmd);
Set_IC_NAME(&ic, &enet);
SetTCPCfgPkt(&cfgret, cmd, mynodeid);
memcpy(send_buf, &cfgret, sizeof(TCPCFG));
memcpy(send_buf + sizeof(TCPCFG), &ic, sizeof(IC_NAME));
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(IC_NAME), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
usleep(10000);
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(IC_NAME), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
usleep(10000);
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(IC_NAME), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
if (need_save == 1) {
//enet_debug("save setting.....");
need_save = 0;
enet_save_apply(&enet);
}
break;
case FIRMWARE_UPGRADE :
enet_debug("recv cmd: %d FIRMWARE_UPGRADE", cmd);
enet_attach_runtime((void**)&rt);
enet_avs_src_stop(&rt->avs_svr.src);
enet_avs_ctl_stop(&rt->avs_svr.ctl);
enet_detach_runtime((void**)&rt);
sprintf(tftp_cmd, "/usr/bin/tftp get %s:newimg.bin", inet_ntoa(agentd_svr->sin_addr));
system(tftp_cmd);
enet_reboot();
break;
case FACTORY_DEFAULT :
enet_debug("recv cmd: %d FACTORY_DEFAULT", cmd);
enet_reset();
break;
#ifdef ENET_SUPPORT_WLAN
case GETWLAN_COMMAND :
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
case GETWLAN_COMMAND_MANUAL :
//if (agentd_svr->sin_addr.s_addr == INADDR_BROADCAST)
// enet_debug("recv cmd: %d GETWLAN_COMMAND", cmd);
//else
// enet_debug("recv cmd: %d GETWLAN_COMMAND_MANUAL", cmd);
// ref enet_wireless.h
bzero(&wlaninfo, sizeof(WLANINFO));
memcpy(wlaninfo.SSID, enet.wl_g.ssid, 32);
wlaninfo.SSID[32] = '\0';
switch (enet.wl_g.auth)
{
case 0 : // None
wlaninfo.auth_mode = 0;
wlaninfo.Encryption = 0;
break;
case 1 : // Open
wlaninfo.auth_mode = 1;
if (enet.wl_g.encry == 0) // None
wlaninfo.Encryption = 0;
else if (enet.wl_g.encry == 1) // WEP
{
wlaninfo.Encryption = enet.wl_g.wep_keysize + 1;
wlaninfo.Key_Format = 1 - enet.wl_g.wep_keytype;
}
break;
case 2 : // Shared
wlaninfo.auth_mode = 2;
wlaninfo.Encryption = enet.wl_g.wep_keysize + 1;
wlaninfo.Key_Format = 1 - enet.wl_g.wep_keytype;
break;
case 3 : // WPAPSK
wlaninfo.auth_mode = 3;
if (enet.wl_g.encry == 2)
wlaninfo.Encryption = 3;
else if (enet.wl_g.encry == 3)
wlaninfo.Encryption = 4;
break;
case 4 : // WPA2PSK
wlaninfo.auth_mode = 4;
if (enet.wl_g.encry == 2)
wlaninfo.Encryption = 3;
else if (enet.wl_g.encry == 3)
wlaninfo.Encryption = 4;
break;
case 5 : // WPANone
wlaninfo.auth_mode = 5;
if (enet.wl_g.encry == 2)
wlaninfo.Encryption = 3;
else if (enet.wl_g.encry == 3)
wlaninfo.Encryption = 4;
break;
}
/*
if (enet.wl_g.auth == 0 || (enet.wl_g.auth == 1 && enet.wl_g.encry == 0)) //( None or (Open&&None))
wlaninfo.Encryption = 0;
else
wlaninfo.Encryption = (enet.wl_g.wep_keysize == WL_WEP_64_BITS) ? 1 : 2;
*/
//enet_debug("Encryption:%d", wlaninfo.Encryption);
wlaninfo.Key_Format = enet.wl_g.wep_keytype == 0 ? 1 : 0; // 0 : ASCII, 1: HEX (enet: 0:hex 1:ascii)
wlaninfo.Default_Key = enet.wl_g.defkey;
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
if (enet.wl_g.wep_keysize == WL_WEP_64_BITS && enet.wl_g.wep_keytype == 1) { //ACSII 64 bit
// Key 1
sprintf(wlaninfo.Key[0], "%02X%02X%02X%02X%02X",
enet.wl_g.wepkey1[0], enet.wl_g.wepkey1[1],enet.wl_g.wepkey1[2],enet.wl_g.wepkey1[3],enet.wl_g.wepkey1[4]);
// Key 2
sprintf(wlaninfo.Key[1], "%02X%02X%02X%02X%02X",
enet.wl_g.wepkey2[0], enet.wl_g.wepkey2[1],enet.wl_g.wepkey2[2],enet.wl_g.wepkey2[3],enet.wl_g.wepkey2[4]);
// Key 3
sprintf(wlaninfo.Key[2], "%02X%02X%02X%02X%02X",
enet.wl_g.wepkey3[0], enet.wl_g.wepkey3[1],enet.wl_g.wepkey3[2],enet.wl_g.wepkey3[3],enet.wl_g.wepkey3[4]);
// Key 4
sprintf(wlaninfo.Key[3], "%02X%02X%02X%02X%02X",
enet.wl_g.wepkey4[0], enet.wl_g.wepkey4[1],enet.wl_g.wepkey4[2],enet.wl_g.wepkey4[3],enet.wl_g.wepkey4[4]);
}
if (enet.wl_g.wep_keysize == WL_WEP_128_BITS && enet.wl_g.wep_keytype == 1) { //ACSII 128 bit
// Key 1
sprintf(wlaninfo.Key[0], "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
enet.wl_g.wepkey1[0], enet.wl_g.wepkey1[1],enet.wl_g.wepkey1[2],enet.wl_g.wepkey1[3],enet.wl_g.wepkey1[4],
enet.wl_g.wepkey1[5], enet.wl_g.wepkey1[6],enet.wl_g.wepkey1[7],enet.wl_g.wepkey1[8],enet.wl_g.wepkey1[9],
enet.wl_g.wepkey1[10], enet.wl_g.wepkey1[11],enet.wl_g.wepkey1[12]);
// Key 2
sprintf(wlaninfo.Key[1], "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
enet.wl_g.wepkey2[0], enet.wl_g.wepkey2[1],enet.wl_g.wepkey2[2],enet.wl_g.wepkey2[3],enet.wl_g.wepkey2[4],
enet.wl_g.wepkey2[5], enet.wl_g.wepkey2[6],enet.wl_g.wepkey2[7],enet.wl_g.wepkey2[8],enet.wl_g.wepkey2[9],
enet.wl_g.wepkey2[10], enet.wl_g.wepkey2[11],enet.wl_g.wepkey2[12]);
// Key 3
sprintf(wlaninfo.Key[2], "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
enet.wl_g.wepkey3[0], enet.wl_g.wepkey3[1],enet.wl_g.wepkey3[2],enet.wl_g.wepkey3[3],enet.wl_g.wepkey3[4],
enet.wl_g.wepkey3[5], enet.wl_g.wepkey3[6],enet.wl_g.wepkey3[7],enet.wl_g.wepkey3[8],enet.wl_g.wepkey3[9],
enet.wl_g.wepkey3[10], enet.wl_g.wepkey3[11],enet.wl_g.wepkey3[12]);
// Key 4
sprintf(wlaninfo.Key[3], "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
enet.wl_g.wepkey4[0], enet.wl_g.wepkey4[1],enet.wl_g.wepkey4[2],enet.wl_g.wepkey4[3],enet.wl_g.wepkey4[4],
enet.wl_g.wepkey4[5], enet.wl_g.wepkey4[6],enet.wl_g.wepkey4[7],enet.wl_g.wepkey4[8],enet.wl_g.wepkey4[9],
enet.wl_g.wepkey4[10], enet.wl_g.wepkey4[11],enet.wl_g.wepkey4[12]);
}
if (enet.wl_g.wep_keysize == WL_WEP_64_BITS && enet.wl_g.wep_keytype == 0) { // HEX 64 bit
memcpy(wlaninfo.Key[0], enet.wl_g.wepkey1, 10);
memcpy(wlaninfo.Key[1], enet.wl_g.wepkey2, 10);
memcpy(wlaninfo.Key[2], enet.wl_g.wepkey3, 10);
memcpy(wlaninfo.Key[3], enet.wl_g.wepkey4, 10);
}
if (enet.wl_g.wep_keysize == WL_WEP_128_BITS && enet.wl_g.wep_keytype == 0) { // HEX 128 bit
memcpy(wlaninfo.Key[0], enet.wl_g.wepkey1, 26);
memcpy(wlaninfo.Key[1], enet.wl_g.wepkey2, 26);
memcpy(wlaninfo.Key[2], enet.wl_g.wepkey3, 26);
memcpy(wlaninfo.Key[3], enet.wl_g.wepkey4, 26);
}
/*
enet_debug("enet key1:%s.", enet.wl_g.wepkey1);
enet_debug("enet key2:%s.", enet.wl_g.wepkey2);
enet_debug("enet key3:%s.", enet.wl_g.wepkey3);
enet_debug("enet key4:%s.", enet.wl_g.wepkey4);
enet_debug("wlaninfo.Key[0]:%s.", wlaninfo.Key[0]);
enet_debug("wlaninfo.Key[1]:%s.", wlaninfo.Key[1]);
enet_debug("wlaninfo.Key[2]:%s.", wlaninfo.Key[2]);
enet_debug("wlaninfo.Key[3]:%s.", wlaninfo.Key[3]);
*/
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
memcpy(wlaninfo.WPA_KEY, enet.wl_g.wpakey, 64);
wlaninfo.WPA_KEY[64] = 0;
//check if already connected to AP
get_ap_info(&wlaninfo);
//enet_debug("wlaninfo.WPA_KEY:%s.", wlaninfo.WPA_KEY);
if (enet.wl_g.enable == 0 || has_no_wireless) //wireless is disabled
wlaninfo.Network_Type = 0;
else
wlaninfo.Network_Type = (enet.wl_g.mode == WL_MODE_STA_INFRA) ? 2 : 1;
//enet_debug("wlaninfo.Network_Type:%d", wlaninfo.Network_Type);
SetTCPCfgPkt(&cfgret, cmd, mynodeid);
memcpy(send_buf, &cfgret, sizeof(TCPCFG));
memcpy(send_buf + sizeof(TCPCFG), &wlaninfo, sizeof(WLANINFO));
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(WLANINFO), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
usleep(10000);
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(WLANINFO), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
usleep(10000);
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(WLANINFO), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
break;
case SITESURVEY_COMMAND :
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
case SITESURVEY_COMMAND_MANUAL :
//if (agentd_svr->sin_addr.s_addr == INADDR_BROADCAST)
// enet_debug("recv cmd: %d SITESURVEY_COMMAND", cmd);
//else
// enet_debug("recv cmd: %d SITESURVEY_COMMAND_MANUAL", cmd);
/*
STATUS_WLAN = 0,
STATUS_LAN = 1
*/
if (enet.wl_g.enable == 0 || g_link_status == 1) {
enet_set_essid_any(); // modify configuration file
//system("/sbin/ifconfig ra0 up"); obsoleted, admin doesn't user this command anymore
}
for (i = 0 ; i < 3 ; i++) {
ap_num = admin_site_survey(sites);
if (ap_num > 0) break;
sleep(1);
}
if (enet.wl_g.enable == 0 || g_link_status == 1) {
//system("/sbin/ifconfig ra0 down"); obsoleted, obsoleted, admin doesn't user this command anymore
enet_restore_essid(&(enet.wl_g)); // restore configuration file
}
if (ap_num > 0)
{
ap_num = (ap_num > 20) ? 20 : ap_num;
SetTCPCfgPkt(&cfgret, cmd, mynodeid);
memcpy(send_buf, &cfgret, sizeof(TCPCFG));
memcpy(send_buf + sizeof(TCPCFG), sites, sizeof(SITESURVEY)*ap_num);
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(SITESURVEY)*ap_num, 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
//usleep(10000);
//sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(SITESURVEY)*ap_num, 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
//usleep(10000);
//sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(SITESURVEY)*ap_num, 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
}
else
{
SetTCPCfgPkt(&cfgret, cmd, mynodeid);
memcpy(send_buf, &cfgret, sizeof(TCPCFG));
sendto(sock, send_buf, sizeof(TCPCFG), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
//usleep(10000);
//sendto(sock, send_buf, sizeof(TCPCFG), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
//usleep(10000);
//sendto(sock, send_buf, sizeof(TCPCFG), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
}
break;
#endif
case LED_ON_OFF_COMMAND :
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
case LED_ON_OFF_COMMAND_MANUAL :
break;
case READ_EMAIL_AUTH :
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
case READ_EMAIL_AUTH_MANUAL :
//if (agentd_svr->sin_addr.s_addr == INADDR_BROADCAST)
// enet_debug("recv cmd: %d READ_EMAIL_AUTH", cmd);
//else
// enet_debug("recv cmd: %d READ_EMAIL_AUTH_MANUAL", cmd);
memset(&email_auth, 0, sizeof(email_auth));
email_auth.emailauth = enet.email.email_auth;
memcpy(email_auth.emailaccount, enet.email.username, 32);
memcpy(email_auth.emailpassword, enet.email.passwd, 32);
memcpy(email_auth.emailsender, enet.email.retn, 32);
SetTCPCfgPkt(&cfgret, cmd, mynodeid);
memcpy(send_buf, &cfgret, sizeof(TCPCFG));
memcpy(send_buf + sizeof(TCPCFG), &email_auth, sizeof(email_auth));
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(email_auth), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
usleep(10000);
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(email_auth), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
usleep(10000);
sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(email_auth), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in)); //server maxinum only read 1024 bytes!
break;
case SET_EMAIL_AUTH :
//enet_debug("recv cmd: %d SET_EMAIL_AUTH", cmd);
memset(&email_auth, 0, sizeof(email_auth));
memcpy(&email_auth, buf + sizeof(TCPCFG), sizeof(email_auth));
enet.email.email_auth = email_auth.emailauth;
memcpy(enet.email.username, email_auth.emailaccount, 32);
memcpy(enet.email.passwd, email_auth.emailpassword, 32);
memcpy(enet.email.retn, email_auth.emailsender, 32);
//enet_debug("%d %s %s %s", enet.email.email_auth, enet.email.username, enet.email.passwd, email_auth.emailsender);
//enet_save_apply(&enet);
enet_save_to_rt(&enet);
enet_apply();
need_save = 1;
break;
case SEND_TEST_EMAIL :
//enet_debug("recv cmd: %d SEND_TEST_EMAIL", cmd);
memset(&testmail, 0, sizeof(testmail));
memcpy(&testmail, buf, sizeof(testmail));
enet.email.email_auth = testmail.email_auth;
memcpy(enet.email.username, testmail.email_account, 32);
memcpy(enet.email.passwd, testmail.email_password, 32);
memcpy(enet.email.retn, testmail.email_sender, 32);
memcpy(enet.email.rcpt, testmail.email_receive, 32);
memcpy(enet.email.server, testmail.email_server, 32);
//enet_save_apply(&enet);
enet_save_to_rt(&enet);
enet_apply();
enet_test_email();
need_save = 1;
break;
case READ_FTP_SETTING :
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
case READ_FTP_SETTING_MANUAL :
//if (agentd_svr->sin_addr.s_addr == INADDR_BROADCAST)
// enet_debug("recv cmd: %d READ_FTP_SETTING", cmd);
//else
// enet_debug("recv cmd: %d READ_FTP_SETTING_MANUAL", cmd);
memset(&ftp, 0, sizeof(ftp));
SetTCPCfgPkt(&ftp.header, cmd, mynodeid);
memcpy(ftp.Server, enet.avs.ftp.server, 64);
ftp.Port = enet.avs.ftp.port;
ftp.Port = htonl(ftp.Port);
memcpy(ftp.UserName, enet.avs.ftp.user, 32);
memcpy(ftp.Password, enet.avs.ftp.passwd, 32);
memcpy(ftp.Folder, enet.avs.ftp.path, 128);
ftp.Passive = enet.avs.ftp.passive;
memcpy(send_buf, &ftp, sizeof(FTP_SETTING));
sendto(sock, send_buf, sizeof(FTP_SETTING), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
usleep(10000);
sendto(sock, send_buf, sizeof(FTP_SETTING), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
usleep(10000);
sendto(sock, send_buf, sizeof(FTP_SETTING), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
break;
case SET_FTP_SETTING :
//enet_debug("recv cmd: %d SET_FTP_SETTING", cmd);
memset(&ftp, 0, sizeof(FTP_SETTING));
memcpy(&ftp, buf, sizeof(FTP_SETTING));
memcpy(enet.avs.ftp.server,ftp.Server, 64);
enet.avs.ftp.port = ntohl(ftp.Port);
memcpy(enet.avs.ftp.user, ftp.UserName, 32);
memcpy(enet.avs.ftp.passwd, ftp.Password, 32);
memcpy(enet.avs.ftp.path, ftp.Folder, 128);
enet.avs.ftp.passive = ftp.Passive;
//enet_save_apply(&enet);
enet_save_to_rt(&enet);
enet_apply();
need_save = 1;
break;
case READ_PPPOE_SETTING :
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
case READ_PPPOE_SETTING_MANUAL :
//if (agentd_svr->sin_addr.s_addr == INADDR_BROADCAST)
// enet_debug("recv cmd: %d READ_PPPOE_SETTING", cmd);
//else
// enet_debug("recv cmd: %d READ_PPPOE_SETTING_MANUAL", cmd);
memset(&pppoe, 0, sizeof(pppoe));
SetTCPCfgPkt(&pppoe.header, cmd, mynodeid);
pppoe.MTU = htonl(enet.pppoe.mtu);
memcpy(pppoe.UserName, enet.pppoe.username, 64);
memcpy(pppoe.Password, enet.pppoe.passwd, 64);
memcpy(send_buf, &pppoe, sizeof(PPPOE_SETTING));
sendto(sock, send_buf, sizeof(PPPOE_SETTING), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
usleep(10000);
sendto(sock, send_buf, sizeof(PPPOE_SETTING), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
usleep(10000);
sendto(sock, send_buf, sizeof(PPPOE_SETTING), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
break;
case SET_PPPOE_SETTING :
//enet_debug("recv cmd: %d SET_PPPOE_SETTING", cmd);
memset(&pppoe, 0, sizeof(PPPOE_SETTING));
memcpy(&pppoe, buf, sizeof(PPPOE_SETTING));
enet.pppoe.mtu = ntohl(pppoe.MTU);
memcpy(enet.pppoe.username, pppoe.UserName, 64);
memcpy(enet.pppoe.passwd, pppoe.Password, 64);
//enet_save_apply(&enet);
enet_save_to_rt(&enet);
enet_apply();
need_save = 1;
break;
case GET_USERS :
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
case GET_USERS_MANUAL :
//if (agentd_svr->sin_addr.s_addr == INADDR_BROADCAST)
// enet_debug("recv cmd: %d GET_USERS", cmd);
//else
// enet_debug("recv cmd: %d GET_USERS_MANUAL", cmd);
memset(&users, 0, sizeof(users));
SetTCPCfgPkt(&users.header, cmd, mynodeid);
for (i = 0 ; i < 4 ; i++)
{
strncpy(users.users[i], enet.users[i].login, IPCAM_LOGIN_LEN);
strncpy(users.passwd[i], enet.users[i].passwd, IPCAM_PASSWD_LEN);
if (enet.users[i].enabled)
users.check |= 1 << i;
//enet_debug("%s %s %X", users.users[i], users.passwd[i], users.check);
}
memcpy(send_buf, &users, sizeof(users));
sendto(sock, send_buf, sizeof(users), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
usleep(10000);
sendto(sock, send_buf, sizeof(users), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
usleep(10000);
sendto(sock, send_buf, sizeof(users), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
break;
case SET_USERS :
//enet_debug("recv cmd: %d SET_USERS", cmd);
// delete all normal users first
userid = umGetFirstUser();
while (userid) {
if (!strcmp(umGetUserGroup(userid), "guest")) {
if (umDeleteUser(userid) == 0) {
userid = umGetFirstUser();
}
}
else
userid = umGetNextUser(userid);
}
memset(&users, 0, sizeof(users));
memcpy(&users, buf, sizeof(users));
for (i = 0 ; i < 4 ; i++)
{
strncpy(enet.users[i].login, users.users[i], IPCAM_LOGIN_LEN);
strncpy(enet.users[i].passwd, users.passwd[i], IPCAM_PASSWD_LEN);
if (users.check & 1 << i)
{
enet.users[i].enabled = 1;
umAddUser(users.users[i], users.passwd[i], "guest", 0, 0);
}
else
enet.users[i].enabled = 0;
//enet_debug("%s %s %X", enet.users[i].login, enet.users[i].passwd, enet.users[i].enabled);
}
//enet_save_apply(&enet);
enet_save_to_rt(&enet);
enet_apply();
need_save = 1;
break;
case READ_TIME_SETTING :
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
case READ_TIME_SETTING_MANUAL :
//if (agentd_svr->sin_addr.s_addr == INADDR_BROADCAST)
// enet_debug("recv cmd: %d READ_TIME_SETTING", cmd);
//else
// enet_debug("recv cmd: %d READ_TIME_SETTING_MANUAL", cmd);
enet_load(&enet);
memset(&datetime, 0, sizeof(datetime));
SetTCPCfgPkt(&datetime.header, cmd, mynodeid);
datetime.timezone = htonl(enet.ntp.tz);
//ntp_addr.s_addr = enet.ntp.ntpserver;
//strcpy(datetime.server, inet_ntoa(ntp_addr));
strncpy(datetime.server, enet.ntp.ntpservername, 31); datetime.server[31] = 0;
//enet_debug("ntp server:%s", datetime.server);
datetime.mode = enet.ntp.mode;
memcpy(send_buf, &datetime, sizeof(datetime));
sendto(sock, send_buf, sizeof(datetime), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
usleep(10000);
sendto(sock, send_buf, sizeof(datetime), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
usleep(10000);
sendto(sock, send_buf, sizeof(datetime), 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
break;
case SET_TIME_SETTING :
//enet_debug("recv cmd: %d SET_TIME_SETTING", cmd);
enet_load(&enet);
memset(&datetime, 0, sizeof(datetime));
memcpy(&datetime, buf, sizeof(datetime));
datetime.timezone = ntohl(datetime.timezone);
if (datetime.mode == 0) //manual
{
enet.ntp.mode = 0;
//enet_debug("datetime.timezone:%d", datetime.timezone);
for (i = 0; i < num_enet_tz; i++) {
if (enet_tz[i].tz == datetime.timezone) {
enet.ntp.tz = enet_tz[i].tz;
enet.ntp.mw = enet_tz[i].mw;
}
}
enet_form_set_date_time(ntohl(datetime.year),
ntohl(datetime.month),
ntohl(datetime.day),
ntohl(datetime.hour),
ntohl(datetime.minutes),
ntohl(datetime.second));
}
else if (datetime.mode == 1) // ntp
{
//enet.ntp.ntpserver = inet_addr(datetime.server);
strcpy(enet.ntp.ntpservername, datetime.server);
for (i = 0; i < num_enet_tz; i++) {
if (enet_tz[i].tz == datetime.timezone) {
enet.ntp.tz = enet_tz[i].tz;
enet.ntp.mw = enet_tz[i].mw;
}
}
enet.ntp.mode = 1;
//enet_sync_ntp(); this blocks too long
}
//enet_save_apply(&enet);
enet_save_to_rt(&enet);
enet_apply();
need_save = 1;
break;
default:
//enet_debug("recv cmd: %d Unknown command!", cmd);
break;
}
}
else {
/*
* check special case (Tester �M��)
*/
// Tester: set Domain Channel (Wireless Country Region)
if (buf[6] == 0x06 && buf[7] == 0x00 && buf[8] == 0xF9 && buf[9] == 0xFF && buf[10] == 0x00 && buf[11] == 0x02)
{
enet_debug("recv cmd: set Domain Channel");
enet_load(&enet);
bzero(&cfgret, sizeof(TCPCFG));
memset(cfgret.NodeID, 0xFF, 6);
cfgret.edicfg[0] = 0x06;
cfgret.edicfg[1] = RESPONSE;
cfgret.edicfg[2] = 0xff - 0x06;
cfgret.edicfg[3] = 0xff - RESPONSE;
memcpy(send_buf, &cfgret, sizeof(TCPCFG));
memcpy(send_buf + 12, "PASS", sizeof(TCPCFG));
//enet_debug("Channel: %d-%d", buf[12], buf[13]);
#ifdef ENET_SUPPORT_WLAN
if (getRegionCountryNum(buf[12], buf[13]) >= 0)
{
CountryRegion = getRegionCountryNum(buf[12], buf[13]);
// enet_debug("CountryRegion:%d", CountryRegion);
enet.wl_g.CountryRegion = CountryRegion;
enet_save_apply(&enet);
// save CountryRegion to flash for reset-to-default
if (saveCountryRegionFlash(CountryRegion) != HW_SETTING_LENGTH)
memcpy(send_buf + 12, "FAIL", sizeof(TCPCFG));
}
else
#endif
memcpy(send_buf + 12, "FAIL", sizeof(TCPCFG));
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
sendto(sock, send_buf, 16, 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
}
else if (buf[6] == 0x01 && buf[7] == 0x00 && buf[8] == 0xFE && buf[9] == 0xFF) // Tester: Upgrade FW
{
enet_debug("Tester: Upgrade FW");
enet_load(&enet);
sprintf(tftp_cmd, "/usr/bin/tftp get %s:run.bin", inet_ntoa(agentd_svr->sin_addr));
system(tftp_cmd);
bzero(&cfgret, sizeof(TCPCFG));
memset(cfgret.NodeID, 0xFF, 6);
cfgret.edicfg[0] = 0x01;
cfgret.edicfg[1] = RESPONSE;
cfgret.edicfg[2] = 0xff - 0x01;
cfgret.edicfg[3] = 0xff - RESPONSE;
memcpy(send_buf, &cfgret, sizeof(TCPCFG));
memcpy(send_buf + 12, "PASS", sizeof(TCPCFG));
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
sendto(sock, send_buf, 16, 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
enet_reboot();
}
else // Tester: set Ethernet MAC ID
{
long command = *((long*)buf);
enet_load(&enet);
command = ntohl(command);
if (command == 22) {
enet_debug("MAC: %X %X %X %X %X %X\n", buf[20], buf[21], buf[22], buf[23], buf[24], buf[25]);
if (saveMACFlash(&buf[20]) == HW_SETTING_LENGTH) {
enet_t enet;
enet_factory(&enet);
enet_save(&enet);
//enet_save_apply(&enet);
Set_MyNodeID();
// write anything
memset(send_buf, 0xEE, 20);
agentd_svr->sin_addr.s_addr = INADDR_BROADCAST;
sendto(sock, send_buf, 16, 0, (struct sockaddr *)agentd_svr, sizeof(struct sockaddr_in));
}
}
}
}
}
/**
* Start the agent and its threads
*/
static void *agentd_thread(void *args)
{
int sock;
int rval, fromlen;
unsigned char recv_buf[MAX_SIZE];
struct sockaddr_in svr;
struct sockaddr_in agentd_svr_addr;
enet_agentd_t *agentd = (enet_agentd_t *) args;
int t = 1;
enet_t enet;
TCPCFG cfgret;
IC_SETTING icsetting;
IC_NAME ic;
unsigned char cmd;
unsigned char send_buf[1024];
fd_set readfds;
struct timeval timeout;
enet_debug("enet agentd started PID:%d", getpid());
Set_MyNodeID(); // mynodeid == mac address
enet_load(&enet);
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0){
enet_perror("socket()");
return NULL;
}
// neo@acelink: send a search reponse packet to alert admin-program
t = 1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &t, sizeof(int));
memset(&svr, 0x0, sizeof(svr));
svr.sin_family = AF_INET;
svr.sin_addr.s_addr = INADDR_BROADCAST;
svr.sin_port = htons(ENET_AGENTD_PORT);
bzero(send_buf, 1024);
bzero(&icsetting, sizeof(IC_SETTING));
cmd = SEARCH_IPCAM;
Set_IC_NAME(&ic, &enet);
SetTCPCfgPkt(&cfgret, cmd, mynodeid);
memcpy(send_buf, &cfgret, sizeof(TCPCFG));
memcpy(send_buf + sizeof(TCPCFG), &ic, sizeof(IC_NAME));
rval = sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(IC_NAME), 0, (struct sockaddr *)&svr, sizeof(svr));
usleep(10000);
rval = sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(IC_NAME), 0, (struct sockaddr *)&svr, sizeof(svr));
usleep(10000);
rval = sendto(sock, send_buf, sizeof(TCPCFG) + sizeof(IC_NAME), 0, (struct sockaddr *)&svr, sizeof(svr));
close(sock);
// neo@acelink --end
memset(&svr, 0x0, sizeof(svr));
svr.sin_family = AF_INET;
svr.sin_addr.s_addr = INADDR_ANY;
svr.sin_port = htons(ENET_AGENTD_PORT);
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0){
enet_perror("socket()");
return NULL;
}
t = 1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &t, sizeof(int));
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &t, sizeof(int));
rval = bind(sock, (struct sockaddr *)&svr, sizeof(svr));
if (rval < 0){
enet_perror("bind()");
close(sock);
return NULL;
}
while (agentd->running){
FD_ZERO(&readfds);
FD_SET(sock, &readfds);
timeout.tv_sec = 0;
timeout.tv_usec = 50000;
if ((rval = select(sock+1, &readfds, NULL, NULL, &timeout)) > 0) {
if (FD_ISSET(sock, &readfds)) {
fromlen = sizeof(agentd_svr_addr);
rval = recvfrom(sock, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&agentd_svr_addr, &fromlen);
if (rval < 0)
enet_perror("recvfrom()");
if(rval > 0){
dispatch(recv_buf, rval, sock, &agentd_svr_addr);
}
}
}
else if (rval < 0) {
//enet_perror("agentd:");
agentd->running = 0;
}
}
close(sock);
enet_debug("enet_agentd end...");
return NULL;
}
void write_proc_led(int led, int status)
{
/*
led: POWER_LED :("0")
NETWORK_LED :("1")
status:
LED_OFF (0)
LED_ON (1)
LED_BLINK (2)
LED_RANDOM_BLINK (3)
*/
FILE *f = fopen("/proc/led", "w");
if (f) {
//fprintf(f, "%d", val);
fprintf(f, "%d %d", led, status);
fclose(f);
}
}
// keep LAN/WLAN LED on or off
static void *led_thread(void *args)
{
enet_agentd_t *agentd = (enet_agentd_t *) args;
return NULL;
}
void enet_agentd_init(void *obj)
{
enet_runtime_t *rt = (enet_runtime_t *) obj;
enet_agentd_t *agentd = &rt->agentd;
memset(agentd, 0x0, sizeof(*agentd));
}
void enet_agentd_start(void *obj)
{
enet_runtime_t *rt = (enet_runtime_t *) obj;
enet_agentd_t *agentd = &rt->agentd;
if (agentd->running)
return;
agentd->running = 1;
pthread_create(&agentd->thread, NULL, agentd_thread, agentd);
pthread_create(&ledctl_handle, NULL, led_thread, agentd);
}
void enet_agentd_cleanup(void *obj)
{
enet_agentd_stop(obj);
}
void enet_agentd_restart(void *obj)
{
enet_agentd_stop(obj);
enet_agentd_start(obj);
}
void enet_agentd_stop(void *obj)
{
enet_runtime_t *rt = (enet_runtime_t *) obj;
enet_agentd_t *agentd = &rt->agentd;
if (!agentd->running)
return;
agentd->running = 0;
pthread_join(agentd->thread, NULL);
pthread_join(ledctl_handle, NULL);
}
bool enet_agentd_isrunning(void *obj)
{
enet_runtime_t *rt = (enet_runtime_t *) obj;
enet_agentd_t *agentd = &rt->agentd;
return agentd->running;
}
//////////////////////////////////////////////////////////////////////////////
int saveCountryRegionFlash(int CountryRegion)
{
int fh;
int rval = -1;
unsigned char val = CountryRegion;
char buf[HW_SETTING_LENGTH];
if ((fh = open (FLASH_DEVICE_NAME_HWINFO, O_RDWR)) < 0){
fprintf(stderr, "Can't read from flash memory!");
return -1;
}
else {
read(fh, buf, HW_SETTING_LENGTH);
buf[6] = val;
lseek(fh, 0, SEEK_SET);
rval = write(fh, buf, HW_SETTING_LENGTH);
close(fh);
}
if (rval != HW_SETTING_LENGTH)
{
enet_debug("saveCountryRegionFlash(): write flash error!");
perror("");
}
return rval;
}
int saveMACFlash(unsigned char *mac)
{
int fh;
unsigned char mac_addr[6];
int i, rval = -1;
char buf[HW_SETTING_LENGTH];
for (i = 0 ; i < 6 ; i++) {
mac_addr[i] = *(mac+i);
fprintf(stderr, "%02X\n", mac_addr[i]);
}
if ((fh = open (FLASH_DEVICE_NAME_HWINFO, O_RDWR)) < 0){
fprintf(stderr, "Can't read from flash memory!");
}
else {
read(fh, buf, HW_SETTING_LENGTH);
memcpy(buf, mac_addr, 6);
lseek(fh, 0, SEEK_SET);
rval = write(fh, buf, HW_SETTING_LENGTH);
close(fh);
}
if (rval != HW_SETTING_LENGTH)
{
enet_debug("saveMACFlash(): write flash error!");
perror("");
}
return rval;
}
void getRegionCountryRange(int cr, int *a, int *b)
{
#ifdef RT2500
switch (cr)
{
case 0 : *a = 1 ; *b = 11; break;
case 1 : *a = 1 ; *b = 11; break;
case 2 : *a = 1 ; *b = 13; break;
case 3 : *a = 10 ; *b = 11; break;
case 4 : *a = 10 ; *b = 13; break;
case 5 : *a = 14 ; *b = 14; break;
case 6 : *a = 1 ; *b = 14; break;
case 7 : *a = 3 ; *b = 9; break;
}
#elif defined (RT2561) || defined (RT2860)
switch (cr)
{
case 0 : *a = 1 ; *b = 11; break;
case 1 : *a = 1 ; *b = 13; break;
case 2 : *a = 10 ; *b = 11; break;
case 3 : *a = 10 ; *b = 13; break;
case 4 : *a = 14 ; *b = 14; break;
case 5 : *a = 1 ; *b = 14; break;
case 6 : *a = 3 ; *b = 9; break;
}
#endif
}