static int bound(void) // udhcpc bound here, also call wanup { char *wan_ifname = safe_getenv("interface"); char *value; char tmp[100], prefix[] = "wanXXXXXXXXXX_"; int unit; if ((unit = wan_ifunit(wan_ifname)) < 0) strcpy(prefix, "wanx_"); else snprintf(prefix, sizeof(prefix), "wan%d_", unit); if ((value = getenv("ip"))) nvram_set(strcat_r(prefix, "ipaddr", tmp), trim_r(value)); if ((value = getenv("subnet"))) nvram_set(strcat_r(prefix, "netmask", tmp), trim_r(value)); if ((value = getenv("router"))) nvram_set(strcat_r(prefix, "gateway", tmp), trim_r(value)); if ((value = getenv("dns"))) nvram_set(strcat_r(prefix, "dns", tmp), trim_r(value)); if ((value = getenv("wins"))) nvram_set(strcat_r(prefix, "wins", tmp), trim_r(value)); nvram_set(strcat_r(prefix, "routes", tmp), getenv("routes")); nvram_set(strcat_r(prefix, "msroutes", tmp), getenv("msroutes")); #if 0 if ((value = getenv("hostname"))) sethostname(trim_r(value), strlen(value) + 1); #endif if ((value = getenv("domain"))) nvram_set(strcat_r(prefix, "domain", tmp), trim_r(value)); if ((value = getenv("lease"))) { nvram_set(strcat_r(prefix, "lease", tmp), trim_r(value)); expires(wan_ifname, atoi(value)); } ifconfig(wan_ifname, IFUP, nvram_safe_get(strcat_r(prefix, "ipaddr", tmp)), nvram_safe_get(strcat_r(prefix, "netmask", tmp))); spinlock_lock(SPINLOCK_DHCPRenew); nvram_set("dhcp_renew", "0"); // for detectWAN spinlock_unlock(SPINLOCK_DHCPRenew); wan_up(wan_ifname); logmessage("dhcp client", "%s IP: %s from %s (prefix: %s)", udhcpstate, nvram_safe_get(strcat_r(prefix, "ipaddr", tmp)), nvram_safe_get(strcat_r(prefix, "gateway", tmp)), prefix); wanmessage(""); dprintf("done\n"); return 0; }
/** * extract the node list from the body of a notification request SIP message * the SIP request will look something like: * KDMQ sip:10.0.0.0:5062 * To: ... * From: ... * Max-Forwards: ... * Content-Length: 22 * * sip:host1:port1;param1=value1 * sip:host2:port2;param2=value2 * ... */ int extract_node_list(dmq_node_list_t* update_list, struct sip_msg* msg) { int content_length, total_nodes = 0; str body; str tmp_uri; dmq_node_t *cur = NULL; char *tmp, *end, *match; if(!msg->content_length) { LM_ERR("no content length header found\n"); return -1; } content_length = get_content_length(msg); if(!content_length) { LM_DBG("content length is 0\n"); return total_nodes; } body.s = get_body(msg); body.len = content_length; tmp = body.s; end = body.s + body.len; /* acquire big list lock */ lock_get(&update_list->lock); while(tmp < end) { match = q_memchr(tmp, '\n', end - tmp); if(match) { match++; } else { /* for the last line - take all of it */ match = end; } /* create the orig_uri from the parsed uri line and trim it */ tmp_uri.s = tmp; tmp_uri.len = match - tmp - 1; tmp = match; /* trim the \r, \n and \0's */ trim_r(tmp_uri); if(!find_dmq_node_uri(update_list, &tmp_uri)) { LM_DBG("found new node %.*s\n", STR_FMT(&tmp_uri)); cur = build_dmq_node(&tmp_uri, 1); if(!cur) { LM_ERR("error creating new dmq node\n"); goto error; } cur->next = update_list->nodes; update_list->nodes = cur; update_list->count++; total_nodes++; } } /* release big list lock */ lock_release(&update_list->lock); return total_nodes; error: lock_release(&update_list->lock); return -1; }
/* * renew: This argument is used when a DHCP lease is renewed. All of * the paramaters are set in enviromental variables. This argument is * used when the interface is already configured, so the IP address, * will not change, however, the other DHCP paramaters, such as the * default gateway, subnet mask, and dns server may change. */ static int renew(void) { char *wan_ifname = safe_getenv("interface"); char *value; char tmp[100], prefix[] = "wanXXXXXXXXXX_"; int unit; if ((unit = wan_ifunit(wan_ifname)) < 0) strcpy(prefix, "wanx_"); else snprintf(prefix, sizeof(prefix), "wan%d_", unit); if (!(value = getenv("subnet")) || !nvram_match(strcat_r(prefix, "netmask", tmp), trim_r(value))) return bound(); if (!(value = getenv("router")) || !nvram_match(strcat_r(prefix, "gateway", tmp), trim_r(value))) return bound(); if ((value = getenv("dns")) && !nvram_match(strcat_r(prefix, "dns", tmp), trim_r(value))) { nvram_set(strcat_r(prefix, "dns", tmp), trim_r(value)); #if 0 update_resolvconf(); #else add_dns(wan_ifname); #endif } if ((value = getenv("wins"))) nvram_set(strcat_r(prefix, "wins", tmp), trim_r(value)); #if 0 if ((value = getenv("hostname"))) sethostname(trim_r(value), strlen(value) + 1); #endif if ((value = getenv("domain"))) nvram_set(strcat_r(prefix, "domain", tmp), trim_r(value)); if ((value = getenv("lease"))) { nvram_set(strcat_r(prefix, "lease", tmp), trim_r(value)); expires(wan_ifname, atoi(value)); } logmessage("dhcp client", "%s IP: %s from %s (prefix: %s)", udhcpstate, nvram_safe_get(strcat_r(prefix, "ipaddr", tmp)), nvram_safe_get(strcat_r(prefix, "gateway", tmp)), prefix); if (unit == 0) update_wan_status(1); wanmessage(""); dprintf("done\n"); return 0; }
/* returns pointer to next header line, and fill hdr_f ; * if at end of header returns pointer to the last crlf (always buf)*/ char* get_sdp_hdr_field(char* buf, char* end, struct hdr_field* hdr) { char* tmp; char *match; if ((*buf)=='\n' || (*buf)=='\r'){ /* double crlf or lflf or crcr */ hdr->type=HDR_EOH_T; return buf; } tmp=parse_hname2(buf, end, hdr); if (hdr->type==HDR_ERROR_T){ LM_ERR("bad header\n"); goto error; } /* eliminate leading whitespace */ tmp=eat_lws_end(tmp, end); if (tmp>=end) { LM_ERR("hf empty\n"); goto error; } /* just skip over it */ hdr->body.s=tmp; /* find end of header */ /* find lf */ do{ match=memchr(tmp, '\n', end-tmp); if (match){ match++; }else { LM_ERR("bad body for <%s>(%d)\n", hdr->name.s, hdr->type); tmp=end; goto error; } tmp=match; }while( match<end &&( (*match==' ')||(*match=='\t') ) ); tmp=match; hdr->body.len=match-hdr->body.s; /* jku: if \r covered by current length, shrink it */ trim_r( hdr->body ); hdr->len=tmp-hdr->name.s; return tmp; error: LM_DBG("error exit\n"); hdr->type=HDR_ERROR_T; hdr->len=tmp-hdr->name.s; return tmp; }
void build_dns6_var(void) { char dns6s[INET6_ADDRSTRLEN*3+4] = {0}; char *dnsnv[3]; if (is_wan_dns6_static() == 1) { dnsnv[0] = nvram_safe_get("ip6_dns1"); dnsnv[1] = nvram_safe_get("ip6_dns2"); dnsnv[2] = nvram_safe_get("ip6_dns3"); if (*dnsnv[0] || *dnsnv[1] || *dnsnv[2]) { snprintf(dns6s, sizeof(dns6s), "%s %s %s", dnsnv[0], dnsnv[1], dnsnv[2]); trim_r(dns6s); } } nvram_set("wan0_dns6", dns6s); }
int store_wan_dns6(char *dns6_new) { char dns6s[INET6_ADDRSTRLEN*3+8] = {0}; char *dns6_old; if (!dns6_new) return 0; snprintf(dns6s, sizeof(dns6s), "%s", dns6_new); trim_r(dns6s); if (!(*dns6s)) return 0; dns6_old = nvram_safe_get("wan0_dns6"); if (strcmp(dns6s, dns6_old) != 0) { nvram_set("wan0_dns6", dns6s); return 1; } return 0; }
int store_wan_dns6(char *dns6_new) { char dns6s[INET6_ADDRSTRLEN*3+8] = {0}; char *dns6_old; if (!dns6_new) return 0; snprintf(dns6s, sizeof(dns6s), "%s", dns6_new); trim_r(dns6s); if (!(*dns6s)) return 0; dns6_old = get_wan_unit_value(0, "dns6"); if (strcmp(dns6s, dns6_old) != 0) { set_wan_unit_value(0, "dns6", dns6s); return 1; } return 0; }
/* returns pointer to next header line, and fill hdr_f ; * if at end of header returns pointer to the last crlf (always buf)*/ char* get_sdp_hdr_field(char* buf, char* end, struct hdr_field* hdr) { char* tmp; char *match; if ((*buf)=='\n' || (*buf)=='\r'){ /* double crlf or lflf or crcr */ hdr->type=HDR_EOH_T; return buf; } tmp=parse_hname2(buf, end, hdr); if (hdr->type==HDR_ERROR_T){ LM_ERR("bad header\n"); goto error; } /* eliminate leading whitespace */ tmp=eat_lws_end(tmp, end); if (tmp>=end) { LM_ERR("hf empty\n"); goto error; } /* if header-field well-known, parse it, find its end otherwise ; * after leaving the hdr->type switch, tmp should be set to the * next header field */ switch(hdr->type){ case HDR_CONTENTTYPE_T: case HDR_CONTENTDISPOSITION_T: /* just skip over it */ hdr->body.s=tmp; /* find end of header */ /* find lf */ do{ match=q_memchr(tmp, '\n', end-tmp); if (match){ match++; }else { LM_ERR("bad body for <%s>(%d)\n", hdr->name.s, hdr->type); tmp=end; goto error; } tmp=match; }while( match<end &&( (*match==' ')||(*match=='\t') ) ); tmp=match; hdr->body.len=match-hdr->body.s; break; default: LM_CRIT("unknown header type %d\n", hdr->type); goto error; } /* jku: if \r covered by current length, shrink it */ trim_r( hdr->body ); hdr->len=tmp-hdr->name.s; return tmp; error: LM_DBG("error exit\n"); hdr->type=HDR_ERROR_T; hdr->len=tmp-hdr->name.s; return tmp; }
void init_syspara(void) { unsigned char buffer[16]; unsigned char *dst; unsigned int bytes; int i; char macaddr[]="00:11:22:33:44:55"; char macaddr2[]="00:11:22:33:44:58"; char country_code[3]; char pin[9]; char productid[13]; char fwver[8]; char blver[20]; unsigned char txbf_para[33]; char ea[ETHER_ADDR_LEN]; nvram_set("buildno", rt_serialno); nvram_set("extendno", rt_extendno); nvram_set("buildinfo", rt_buildinfo); nvram_set("swpjverno", rt_swpjverno); /* /dev/mtd/2, RF parameters, starts from 0x40000 */ dst = buffer; bytes = 6; memset(buffer, 0, sizeof(buffer)); memset(country_code, 0, sizeof(country_code)); memset(pin, 0, sizeof(pin)); memset(productid, 0, sizeof(productid)); memset(fwver, 0, sizeof(fwver)); memset(txbf_para, 0, sizeof(txbf_para)); if (FRead(dst, OFFSET_MAC_ADDR, bytes)<0) { _dprintf("READ MAC address: Out of scope\n"); } else { if (buffer[0]!=0xff) ether_etoa(buffer, macaddr); } #if !defined(RTN14U) // single band if (FRead(dst, OFFSET_MAC_ADDR_2G, bytes)<0) { _dprintf("READ MAC address 2G: Out of scope\n"); } else { if (buffer[0]!=0xff) ether_etoa(buffer, macaddr2); } #endif #if defined(RTN14U) // single band if (!mssid_mac_validate(macaddr)) #else if (!mssid_mac_validate(macaddr) || !mssid_mac_validate(macaddr2)) #endif nvram_set("wl_mssid", "0"); else nvram_set("wl_mssid", "1"); #if defined(RTN14U) // single band nvram_set("et0macaddr", macaddr); nvram_set("et1macaddr", macaddr); #else //TODO: separate for different chipset solution nvram_set("et0macaddr", macaddr); nvram_set("et1macaddr", macaddr2); #endif if (FRead(dst, OFFSET_MAC_GMAC0, bytes)<0) dbg("READ MAC address GMAC0: Out of scope\n"); else { if (buffer[0]==0xff) { if (ether_atoe(macaddr, ea)) FWrite(ea, OFFSET_MAC_GMAC0, 6); } } if (FRead(dst, OFFSET_MAC_GMAC2, bytes)<0) dbg("READ MAC address GMAC2: Out of scope\n"); else { if (buffer[0]==0xff) { if (ether_atoe(macaddr2, ea)) FWrite(ea, OFFSET_MAC_GMAC2, 6); } } /* reserved for Ralink. used as ASUS country code. */ #if ! defined(RTCONFIG_NEW_REGULATION_DOMAIN) dst = (unsigned char*) country_code; bytes = 2; if (FRead(dst, OFFSET_COUNTRY_CODE, bytes)<0) { _dprintf("READ ASUS country code: Out of scope\n"); nvram_set("wl_country_code", ""); } else { chk_valid_country_code(country_code); nvram_set("wl_country_code", country_code); nvram_set("wl0_country_code", country_code); nvram_set("wl1_country_code", country_code); } #else /* ! RTCONFIG_NEW_REGULATION_DOMAIN */ dst = buffer; bytes = MAX_REGSPEC_LEN; memset(dst, 0, MAX_REGSPEC_LEN+1); if(FRead(dst, REGSPEC_ADDR, bytes) < 0) nvram_set("reg_spec", "FCC"); // DEFAULT else { for (i=(MAX_REGSPEC_LEN-1);i>=0;i--) { if ((dst[i]==0xff) || (dst[i]=='\0')) dst[i]='\0'; } if (dst[0]!=0x00) nvram_set("reg_spec", dst); else nvram_set("reg_spec", "FCC"); // DEFAULT } if (FRead(dst, REG2G_EEPROM_ADDR, MAX_REGDOMAIN_LEN)<0 || memcmp(dst,"2G_CH", 5) != 0) { _dprintf("READ ASUS country code: Out of scope\n"); nvram_set("wl_country_code", ""); nvram_set("wl0_country_code", "DB"); nvram_set("wl_reg_2g", "2G_CH14"); } else { for(i = 0; i < MAX_REGDOMAIN_LEN; i++) if(dst[i] == 0xff || dst[i] == 0) break; dst[i] = 0; nvram_set("wl_reg_2g", dst); if (strcmp(dst, "2G_CH11") == 0) nvram_set("wl0_country_code", "US"); else if (strcmp(dst, "2G_CH13") == 0) nvram_set("wl0_country_code", "GB"); else if (strcmp(dst, "2G_CH14") == 0) nvram_set("wl0_country_code", "DB"); else nvram_set("wl0_country_code", "DB"); } if (FRead(dst, REG5G_EEPROM_ADDR, MAX_REGDOMAIN_LEN)<0 || memcmp(dst,"5G_", 3) != 0) { _dprintf("READ ASUS country code: Out of scope\n"); nvram_set("wl_country_code", ""); nvram_set("wl1_country_code", "DB"); nvram_set("wl_reg_5g", "5G_ALL"); } else { for(i = 0; i < MAX_REGDOMAIN_LEN; i++) if(dst[i] == 0xff || dst[i] == 0) break; dst[i] = 0; nvram_set("wl_reg_5g", dst); if (strcmp(dst, "5G_BAND1") == 0) nvram_set("wl1_country_code", "GB"); else if (strcmp(dst, "5G_BAND123") == 0) nvram_set("wl1_country_code", "GB"); else if (strcmp(dst, "5G_BAND14") == 0) nvram_set("wl1_country_code", "US"); else if (strcmp(dst, "5G_BAND24") == 0) nvram_set("wl1_country_code", "TW"); else if (strcmp(dst, "5G_BAND4") == 0) nvram_set("wl1_country_code", "CN"); else nvram_set("wl1_country_code", "DB"); } #endif /* ! RTCONFIG_NEW_REGULATION_DOMAIN */ #if defined(RTN56U) || defined(RTCONFIG_DSL) if (nvram_match("wl_country_code", "BR")) { nvram_set("wl_country_code", "UZ"); nvram_set("wl0_country_code", "UZ"); nvram_set("wl1_country_code", "UZ"); } #endif if (nvram_match("wl_country_code", "HK") && nvram_match("preferred_lang", "")) nvram_set("preferred_lang", "TW"); /* reserved for Ralink. used as ASUS pin code. */ dst = (char*)pin; bytes = 8; if (FRead(dst, OFFSET_PIN_CODE, bytes)<0) { _dprintf("READ ASUS pin code: Out of scope\n"); nvram_set("wl_pin_code", ""); } else { if ((unsigned char)pin[0]!=0xff) nvram_set("secret_code", pin); else nvram_set("secret_code", "12345670"); } dst = buffer; bytes = 16; if (linuxRead(dst, 0x20, bytes)<0) /* The "linux" MTD partition, offset 0x20. */ { fprintf(stderr, "READ firmware header: Out of scope\n"); nvram_set("productid", "unknown"); nvram_set("firmver", "unknown"); } else { strncpy(productid, buffer + 4, 12); productid[12] = 0; sprintf(fwver, "%d.%d.%d.%d", buffer[0], buffer[1], buffer[2], buffer[3]); nvram_set("productid", trim_r(productid)); nvram_set("firmver", trim_r(fwver)); } memset(buffer, 0, sizeof(buffer)); FRead(buffer, OFFSET_BOOT_VER, 4); // sprintf(blver, "%c.%c.%c.%c", buffer[0], buffer[1], buffer[2], buffer[3]); sprintf(blver, "%s-0%c-0%c-0%c-0%c", trim_r(productid), buffer[0], buffer[1], buffer[2], buffer[3]); nvram_set("blver", trim_r(blver)); _dprintf("bootloader version: %s\n", nvram_safe_get("blver")); _dprintf("firmware version: %s\n", nvram_safe_get("firmver")); dst = txbf_para; int count_0xff = 0; if (FRead(dst, OFFSET_TXBF_PARA, 33) < 0) { fprintf(stderr, "READ TXBF PARA address: Out of scope\n"); } else { for (i = 0; i < 33; i++) { if (txbf_para[i] == 0xff) count_0xff++; /* if ((i % 16) == 0) fprintf(stderr, "\n"); fprintf(stderr, "%02x ", (unsigned char) txbf_para[i]); */ } /* fprintf(stderr, "\n"); fprintf(stderr, "TxBF parameter 0xFF count: %d\n", count_0xff); */ } if (count_0xff == 33) nvram_set("wl1_txbf_en", "0"); else nvram_set("wl1_txbf_en", "1"); #if defined (RTCONFIG_WLMODULE_RT3352_INIC_MII) #define EEPROM_INIC_SIZE (512) #define EEPROM_INIT_ADDR 0x48000 #define EEPROM_INIT_FILE "/etc/Wireless/iNIC/iNIC_e2p.bin" { char eeprom[EEPROM_INIC_SIZE]; if(FRead(eeprom, EEPROM_INIT_ADDR, sizeof(eeprom)) < 0) { fprintf(stderr, "FRead(eeprom, 0x%08x, 0x%x) failed\n", EEPROM_INIT_ADDR, sizeof(eeprom)); } else { FILE *fp; char *filepath = EEPROM_INIT_FILE; system("mkdir -p /etc/Wireless/iNIC/"); if((fp = fopen(filepath, "w")) == NULL) { fprintf(stderr, "fopen(%s) failed!!\n", filepath); } else { if(fwrite(eeprom, sizeof(eeprom), 1, fp) < 1) { perror("fwrite(eeprom)"); } fclose(fp); } } } #endif #ifdef RA_SINGLE_SKU #if defined(RTAC52U) { char *reg_spec; reg_spec = nvram_safe_get("reg_spec"); create_SingleSKU("/etc/Wireless/RT2860", "", reg_spec); create_SingleSKU("/etc/Wireless/iNIC", "_5G", reg_spec); } #endif /* RTAC52U */ #endif /* RA_SINGLE_SKU */ { #ifdef RTCONFIG_ODMPID char modelname[16]; FRead(modelname, OFFSET_ODMPID, sizeof(modelname)); modelname[sizeof(modelname)-1] = '\0'; if(modelname[0] != 0 && (unsigned char)(modelname[0]) != 0xff && is_valid_hostname(modelname) && strcmp(modelname, "ASUS")) { nvram_set("odmpid", modelname); } else #endif nvram_unset("odmpid"); } nvram_set("firmver", rt_version); nvram_set("productid", rt_buildname); }
/* Called when we get (possibly part of) a log message (or more than * one log message) from the appliance (which may include qemu, the * BIOS, kernel, etc). */ static void appliance_callback (guestfs_h *g, void *datavp, uint64_t source, int eh, int flags, const char *buf, size_t buf_len, const uint64_t *array, size_t array_len) { struct pass_data *data = datavp; struct event *event; size_t i, len, slen; if (!data->seen_launch) return; /* If the previous log message was incomplete, but time has moved on * a lot, record a new log message anyway, so it gets a new * timestamp. */ if (data->incomplete_log_message >= 0) { struct timespec ts; get_time (&ts); if (timespec_diff (&data->events[data->incomplete_log_message].t, &ts) >= 10000000 /* 10ms */) data->incomplete_log_message = -1; } /* If the previous log message was incomplete then we may need to * append part of the current log message to a previous one. */ if (data->incomplete_log_message >= 0) { len = buf_len; for (i = 0; i < buf_len; ++i) { if (buf[i] == '\n') { len = i; break; } } event = &data->events[data->incomplete_log_message]; slen = strlen (event->message); event->message = realloc (event->message, slen + len + 1); if (event->message == NULL) error (EXIT_FAILURE, errno, "realloc"); memcpy (event->message + slen, buf, len); event->message[slen + len] = '\0'; trim_r (event->message); /* Skip what we just added to the previous incomplete message. */ buf += len; buf_len -= len; if (buf_len == 0) /* still not complete, more to come! */ return; /* Skip the \n in the buffer. */ buf++; buf_len--; data->incomplete_log_message = -1; } /* Add the event, or perhaps multiple events if the message * contains \n characters. */ while (buf_len > 0) { len = buf_len; for (i = 0; i < buf_len; ++i) { if (buf[i] == '\n') { len = i; break; } } event = add_event (data, source); event->message = strndup (buf, len); if (event->message == NULL) error (EXIT_FAILURE, errno, "strndup"); trim_r (event->message); /* Skip what we just added to the event. */ buf += len; buf_len -= len; if (buf_len == 0) { /* Event is incomplete (doesn't end with \n). We'll finish it * in the next callback. */ data->incomplete_log_message = event - data->events; return; } /* Skip the \n in the buffer. */ buf++; buf_len--; } }
void getsyspara(void) { unsigned char buffer[32]; int i; char macaddr[]="00:11:22:33:44:55"; char macaddr2[]="00:11:22:33:44:56"; char macaddr3[]="001122334457"; char macaddr4[]="001122334458"; char ea[ETHER_ADDR_LEN]; char country_code[3]; char pin[9]; char productid[13]; char fwver[8], fwver_sub[16]; char blver[20]; unsigned char txbf_para[33]; /* /dev/mtd/2, RF parameters, starts from 0x40000 */ memset(buffer, 0, sizeof(buffer)); memset(country_code, 0, sizeof(country_code)); memset(pin, 0, sizeof(pin)); memset(productid, 0, sizeof(productid)); memset(fwver, 0, sizeof(fwver)); memset(fwver_sub, 0, sizeof(fwver_sub)); memset(txbf_para, 0, sizeof(txbf_para)); if (FRead(buffer, OFFSET_MAC_ADDR, 6)<0) { dbg("READ MAC address: Out of scope\n"); } else { if (buffer[0]!=0xff) { ether_etoa(buffer, macaddr); ether_etoa2(buffer, macaddr3); } } if (FRead(buffer, OFFSET_MAC_ADDR_2G, 6)<0) { dbg("READ MAC address 2G: Out of scope\n"); } else { if (buffer[0]!=0xff) { ether_etoa(buffer, macaddr2); ether_etoa2(buffer, macaddr4); } } nvram_set("il0macaddr", macaddr); nvram_set("il1macaddr", macaddr2); nvram_set("et0macaddr", macaddr); nvram_set("br0hexaddr", macaddr3); nvram_set("wanhexaddr", macaddr4); if (FRead(buffer, OFFSET_MAC_GMAC0, 6)<0) { dbg("READ MAC address GMAC0: Out of scope\n"); } else { if (buffer[0]==0xff) { if (ether_atoe(macaddr, ea)) FWrite(ea, OFFSET_MAC_GMAC0, 6); } } if (FRead(buffer, OFFSET_MAC_GMAC2, 6)<0) { dbg("READ MAC address GMAC2: Out of scope\n"); } else { if (buffer[0]==0xff) { if (ether_atoe(macaddr2, ea)) FWrite(ea, OFFSET_MAC_GMAC2, 6); } } /* reserved for Ralink. used as ASUS country code. */ if (FRead(country_code, OFFSET_COUNTRY_CODE, 2)<0) { dbg("READ ASUS country code: Out of scope\n"); strcpy(country_code, "GB"); } else { country_code[2] = 0; if ((unsigned char)country_code[0]==0xff) strcpy(country_code, "GB"); } if (strlen(nvram_safe_get("rt_country_code")) == 0) { nvram_set("rt_country_code", country_code); } if (strlen(nvram_safe_get("wl_country_code")) == 0) { nvram_set("wl_country_code", country_code); } if (!strcasecmp(nvram_safe_get("wl_country_code"), "BR")) nvram_set("wl_country_code", "UZ"); /* reserved for Ralink. used as ASUS pin code. */ if (FRead(pin, OFFSET_PIN_CODE, 8)<0) { dbg("READ ASUS pin code: Out of scope\n"); nvram_set("wl_pin_code", ""); } else { if ((unsigned char)pin[0]!=0xff) nvram_set("secret_code", pin); else nvram_set("secret_code", "12345670"); } #if defined(USE_RT3352_MII) #define EEPROM_INIC_SIZE (512) #define EEPROM_INIT_ADDR 0x48000 { char eeprom[EEPROM_INIC_SIZE]; if(FRead(eeprom, EEPROM_INIT_ADDR, sizeof(eeprom)) < 0) { dbg("READ iNIC EEPROM: Out of scope!\n"); } else { FILE *fp; if((fp = fopen("/etc/Wireless/iNIC/iNIC_e2p.bin", "w"))) { fwrite(eeprom, sizeof(eeprom), 1, fp); fclose(fp); } } } #endif /* /dev/mtd/3, firmware, starts from 0x50000 */ if (FRead(buffer, 0x50020, sizeof(buffer))<0) { dbg("READ firmware header: Out of scope\n"); nvram_set("productid", "unknown"); nvram_set("firmver", "unknown"); } else { strncpy(productid, buffer + 4, 12); productid[12] = 0; if(valid_subver(buffer[27])) sprintf(fwver_sub, "%d.%d.%d.%d%c", buffer[0], buffer[1], buffer[2], buffer[3], buffer[27]); else sprintf(fwver_sub, "%d.%d.%d.%d", buffer[0], buffer[1], buffer[2], buffer[3]); #if defined(FWBLDSTR) sprintf(fwver_sub, "%s-%s", fwver_sub, FWBLDSTR); #endif sprintf(fwver, "%d.%d.%d.%d", buffer[0], buffer[1], buffer[2], buffer[3]); nvram_set("productid", trim_r(productid)); nvram_set("firmver", trim_r(fwver)); nvram_set("firmver_sub", trim_r(fwver_sub)); } memset(buffer, 0, sizeof(buffer)); FRead(buffer, OFFSET_BOOT_VER, 4); sprintf(blver, "%s-0%c-0%c-0%c-0%c", trim_r(productid), buffer[0], buffer[1], buffer[2], buffer[3]); nvram_set("blver", trim_r(blver)); int count_0xff = 0; if (FRead(txbf_para, OFFSET_TXBF_PARA, 33) < 0) { dbg("READ TXBF PARA address: Out of scope\n"); } else { for (i = 0; i < 33; i++) { if (txbf_para[i] == 0xff) count_0xff++; } } if (count_0xff == 33) nvram_set("wl_txbf_en", "0"); else nvram_set("wl_txbf_en", "1"); }
int wext_get_scanlist(const char *ifname, char *buf, int *len) { //----------------- int retval = 0; //返回值 int i = 0; int apCount = 0; // 搜索到的AP数量 char data[8192]; // *未知 char ssid_str[256]; // ssid 名字? char header[128]; // *未知 struct iwreq wrq; // 创建ioctl SSA *ssap; // SITE_SURVEY 数组 char tmp[128]; // *未知 (好像没用) char prefix[] = "wlXXXXXXXXXX_" // *未知 memset(data, 0x00, 255); strcpy(data, "SiteSurvey=1"); // *应该是发出的指令 wrq.u.data.length = strlen(data) + 1; wrq.u.data.pointer = data; wrq.u.data.flags = 0; if (wl_ioctl(ifname, RTPRIV_IOCTL_SET, &wrq) < 0) // iwpriv ra0 set SiteSurvey=1 { spinlock_unlock(0); // 是专为防止多处理器并发而引入的一种锁。 dbg("Site Survey fails\n"); return 0; } spinlock_unlock(SPINLOCK_SiteSurvey); // 是专为防止多处理器并发而引入的一种锁。 sleep(5); memset(data, 0, 8192); strcpy(data, ""); wrq.u.data.length = sizeof(data); wrq.u.data.pointer = data; wrq.u.data.flags = 0; if (wl_ioctl(ifname, RTPRIV_IOCTL_GSITESURVEY, &wrq) < 0) // iwpriv ra0 get_site_survey { dbg("errors in getting site survey result\n"); return 0; } memset(header, 0, sizeof(header)); if (wrq.u.data.length > 0) { // 这里应该是已经得到了扫描的结果 ssap=(SSA *)(wrq.u.data.pointer+strlen(header)+1); int len = strlen(wrq.u.data.pointer+strlen(header))-1; char *sp, *op; op = sp = wrq.u.data.pointer+strlen(header)+1; while (*sp && ((len - (sp-op)) >= 0)) { // 这一部分应该是RT-41U 用于显示字符串的部分,应该是可以删除掉这部分代码的吧。 ssap->SiteSurvey[i].channel[3] = '\0'; ssap->SiteSurvey[i].ssid[32] = '\0'; ssap->SiteSurvey[i].bssid[17] = '\0'; ssap->SiteSurvey[i].encryption[8] = '\0'; ssap->SiteSurvey[i].authmode[15] = '\0'; ssap->SiteSurvey[i].signal[8] = '\0'; ssap->SiteSurvey[i].wmode[7] = '\0'; sp+=strlen(header); apCount=++i; } if (apCount) { retval += websWrite(wp, "["); for (i = 0; i < apCount; i++) { dbg("%-4s%-33s%-18s%-9s%-16s%-9s%-8s\n", ssap->SiteSurvey[i].channel, (char*)ssap->SiteSurvey[i].ssid, ssap->SiteSurvey[i].bssid, ssap->SiteSurvey[i].encryption, ssap->SiteSurvey[i].authmode, ssap->SiteSurvey[i].signal, ssap->SiteSurvey[i].wmode ); memset(ssid_str, 0, sizeof(ssid_str)); char_to_ascii(ssid_str, trim_r(ssap->SiteSurvey[i].ssid)); } } } //------------------ return -1; }
/* returns pointer to next header line, and fill hdr_f ; * if at end of header returns pointer to the last crlf (always buf)*/ char* get_hdr_field(char* buf, char* end, struct hdr_field* hdr) { char* tmp; char *match; struct via_body *vb; struct cseq_body* cseq_b; struct to_body* to_b; int integer; if ((*buf)=='\n' || (*buf)=='\r'){ /* double crlf or lflf or crcr */ LM_DBG("found end of header\n"); hdr->type=HDR_EOH_T; return buf; } tmp=parse_hname(buf, end, hdr); if (hdr->type==HDR_ERROR_T){ LM_ERR("bad header\n"); goto error_bad_hdr; } /* eliminate leading whitespace */ tmp=eat_lws_end(tmp, end); if (tmp>=end) { LM_ERR("hf empty\n"); goto error_bad_hdr; } /* if header-field well-known, parse it, find its end otherwise ; * after leaving the hdr->type switch, tmp should be set to the * next header field */ switch(hdr->type){ case HDR_VIA_T: /* keep number of vias parsed -- we want to report it in replies for diagnostic purposes */ via_cnt++; vb=pkg_malloc(sizeof(struct via_body)); if (vb==0){ LM_ERR("out of pkg memory\n"); goto error; } memset(vb,0,sizeof(struct via_body)); hdr->body.s=tmp; tmp=parse_via(tmp, end, vb); if (vb->error==PARSE_ERROR){ LM_ERR("bad via\n"); free_via_list(vb); set_err_info(OSER_EC_PARSER, OSER_EL_MEDIUM, "error parsing Via"); set_err_reply(400, "bad Via header"); goto error; } hdr->parsed=vb; vb->hdr.s=hdr->name.s; vb->hdr.len=hdr->name.len; hdr->body.len=tmp-hdr->body.s; break; case HDR_CSEQ_T: cseq_b=pkg_malloc(sizeof(struct cseq_body)); if (cseq_b==0){ LM_ERR("out of pkg memory\n"); goto error; } memset(cseq_b, 0, sizeof(struct cseq_body)); hdr->body.s=tmp; tmp=parse_cseq(tmp, end, cseq_b); if (cseq_b->error==PARSE_ERROR){ LM_ERR("bad cseq\n"); pkg_free(cseq_b); set_err_info(OSER_EC_PARSER, OSER_EL_MEDIUM, "error parsing CSeq`"); set_err_reply(400, "bad CSeq header"); goto error; } hdr->parsed=cseq_b; hdr->body.len=tmp-hdr->body.s; LM_DBG("cseq <%.*s>: <%.*s> <%.*s>\n", hdr->name.len, ZSW(hdr->name.s), cseq_b->number.len, ZSW(cseq_b->number.s), cseq_b->method.len, cseq_b->method.s); break; case HDR_TO_T: to_b=pkg_malloc(sizeof(struct to_body)); if (to_b==0){ LM_ERR("out of pkg memory\n"); goto error; } memset(to_b, 0, sizeof(struct to_body)); hdr->body.s=tmp; tmp=parse_to(tmp, end,to_b); if (to_b->error==PARSE_ERROR){ LM_ERR("bad to header\n"); pkg_free(to_b); set_err_info(OSER_EC_PARSER, OSER_EL_MEDIUM, "error parsing To header"); set_err_reply(400, "bad header"); goto error; } hdr->parsed=to_b; hdr->body.len=tmp-hdr->body.s; LM_DBG("<%.*s> [%d]; uri=[%.*s] \n", hdr->name.len, ZSW(hdr->name.s), hdr->body.len, to_b->uri.len,ZSW(to_b->uri.s)); LM_DBG("to body [%.*s]\n",to_b->body.len, ZSW(to_b->body.s)); break; case HDR_CONTENTLENGTH_T: hdr->body.s=tmp; tmp=parse_content_length(tmp,end, &integer); if (tmp==0){ LM_ERR("bad content_length header\n"); set_err_info(OSER_EC_PARSER, OSER_EL_MEDIUM, "error parsing Content-Length"); set_err_reply(400, "bad Content-Length header"); goto error; } hdr->parsed=(void*)(long)integer; hdr->body.len=tmp-hdr->body.s; LM_DBG("content_length=%d\n", (int)(long)hdr->parsed); break; case HDR_SUPPORTED_T: case HDR_CONTENTTYPE_T: case HDR_FROM_T: case HDR_CALLID_T: case HDR_CONTACT_T: case HDR_ROUTE_T: case HDR_RECORDROUTE_T: case HDR_PATH_T: case HDR_MAXFORWARDS_T: case HDR_AUTHORIZATION_T: case HDR_EXPIRES_T: case HDR_PROXYAUTH_T: case HDR_PROXYREQUIRE_T: case HDR_UNSUPPORTED_T: case HDR_ALLOW_T: case HDR_EVENT_T: case HDR_ACCEPT_T: case HDR_ACCEPTLANGUAGE_T: case HDR_ORGANIZATION_T: case HDR_PRIORITY_T: case HDR_SUBJECT_T: case HDR_USERAGENT_T: case HDR_CONTENTDISPOSITION_T: case HDR_ACCEPTDISPOSITION_T: case HDR_DIVERSION_T: case HDR_RPID_T: case HDR_REFER_TO_T: case HDR_SESSION_EXPIRES_T: case HDR_MIN_SE_T: case HDR_MIN_EXPIRES_T: case HDR_PPI_T: case HDR_PAI_T: case HDR_PRIVACY_T: case HDR_RETRY_AFTER_T: case HDR_CALL_INFO_T: case HDR_WWW_AUTHENTICATE_T: case HDR_PROXY_AUTHENTICATE_T: case HDR_OTHER_T: /* just skip over it */ hdr->body.s=tmp; /* find end of header */ /* find lf */ do{ match=q_memchr(tmp, '\n', end-tmp); if (match){ match++; }else { LM_ERR("bad body for <%s>(%d)\n", hdr->name.s, hdr->type); tmp=end; goto error_bad_hdr; } tmp=match; }while( match<end &&( (*match==' ')||(*match=='\t') ) ); tmp=match; hdr->body.len=match-hdr->body.s; break; default: LM_CRIT("unknown header type %d\n", hdr->type); goto error; } /* jku: if \r covered by current length, shrink it */ trim_r( hdr->body ); hdr->len=tmp-hdr->name.s; return tmp; error_bad_hdr: set_err_info(OSER_EC_PARSER, OSER_EL_MEDIUM, "error parsing headers"); set_err_reply(400, "bad headers"); error: LM_DBG("error exit\n"); update_stat( bad_msg_hdr, 1); hdr->type=HDR_ERROR_T; hdr->len=tmp-hdr->name.s; return tmp; }
/* returns pointer to next header line, and fill hdr_f ; * if at end of header returns pointer to the last crlf (always buf)*/ char* get_hdr_field(char* buf, char* end, struct hdr_field* hdr) { char* tmp; char *match; struct via_body *vb; struct cseq_body* cseq_b; struct to_body* to_b; int integer; if ((*buf)=='\n' || (*buf)=='\r'){ /* double crlf or lflf or crcr */ DBG("found end of header\n"); hdr->type=HDR_EOH; return buf; } tmp=parse_hname(buf, end, hdr); if (hdr->type==HDR_ERROR){ LOG(L_ERR, "ERROR: get_hdr_field: bad header\n"); goto error; } /* eliminate leading whitespace */ tmp=eat_lws_end(tmp, end); if (tmp>=end) { LOG(L_ERR, "ERROR: get_hdr_field: HF empty\n"); goto error; } /* if header-field well-known, parse it, find its end otherwise ; * after leaving the hdr->type switch, tmp should be set to the * next header field */ switch(hdr->type){ case HDR_VIA: /* keep number of vias parsed -- we want to report it in replies for diagnostic purposes */ via_cnt++; vb=pkg_malloc(sizeof(struct via_body)); if (vb==0){ LOG(L_ERR, "get_hdr_field: out of memory\n"); goto error; } memset(vb,0,sizeof(struct via_body)); hdr->body.s=tmp; tmp=parse_via(tmp, end, vb); if (vb->error==PARSE_ERROR){ LOG(L_ERR, "ERROR: get_hdr_field: bad via\n"); free_via_list(vb); goto error; } hdr->parsed=vb; vb->hdr.s=hdr->name.s; vb->hdr.len=hdr->name.len; hdr->body.len=tmp-hdr->body.s; break; case HDR_CSEQ: cseq_b=pkg_malloc(sizeof(struct cseq_body)); if (cseq_b==0){ LOG(L_ERR, "get_hdr_field: out of memory\n"); goto error; } memset(cseq_b, 0, sizeof(struct cseq_body)); hdr->body.s=tmp; tmp=parse_cseq(tmp, end, cseq_b); if (cseq_b->error==PARSE_ERROR){ LOG(L_ERR, "ERROR: get_hdr_field: bad cseq\n"); pkg_free(cseq_b); goto error; } hdr->parsed=cseq_b; hdr->body.len=tmp-hdr->body.s; DBG("get_hdr_field: cseq <%.*s>: <%.*s> <%.*s>\n", hdr->name.len, ZSW(hdr->name.s), cseq_b->number.len, ZSW(cseq_b->number.s), cseq_b->method.len, cseq_b->method.s); break; case HDR_TO: to_b=pkg_malloc(sizeof(struct to_body)); if (to_b==0){ LOG(L_ERR, "get_hdr_field: out of memory\n"); goto error; } memset(to_b, 0, sizeof(struct to_body)); hdr->body.s=tmp; tmp=parse_to(tmp, end,to_b); if (to_b->error==PARSE_ERROR){ LOG(L_ERR, "ERROR: get_hdr_field: bad to header\n"); pkg_free(to_b); goto error; } hdr->parsed=to_b; hdr->body.len=tmp-hdr->body.s; DBG("DEBUG: get_hdr_field: <%.*s> [%d]; uri=[%.*s] \n", hdr->name.len, ZSW(hdr->name.s), hdr->body.len, to_b->uri.len,ZSW(to_b->uri.s)); DBG("DEBUG: to body [%.*s]\n",to_b->body.len, ZSW(to_b->body.s)); break; case HDR_CONTENTLENGTH: hdr->body.s=tmp; tmp=parse_content_length(tmp,end, &integer); if (tmp==0){ LOG(L_ERR, "ERROR:get_hdr_field: bad content_length header\n"); goto error; } hdr->parsed=(void*)(long)integer; hdr->body.len=tmp-hdr->body.s; DBG("DEBUG: get_hdr_body : content_length=%d\n", (int)(long)hdr->parsed); break; case HDR_SUPPORTED: case HDR_CONTENTTYPE: case HDR_FROM: case HDR_CALLID: case HDR_CONTACT: case HDR_ROUTE: case HDR_RECORDROUTE: case HDR_MAXFORWARDS: case HDR_AUTHORIZATION: case HDR_EXPIRES: case HDR_PROXYAUTH: case HDR_PROXYREQUIRE: case HDR_UNSUPPORTED: case HDR_ALLOW: case HDR_EVENT: case HDR_ACCEPT: case HDR_ACCEPTLANGUAGE: case HDR_ORGANIZATION: case HDR_PRIORITY: case HDR_SUBJECT: case HDR_USERAGENT: case HDR_CONTENTDISPOSITION: case HDR_ACCEPTDISPOSITION: case HDR_DIVERSION: case HDR_RPID: case HDR_OTHER: /* just skip over it */ hdr->body.s=tmp; /* find end of header */ /* find lf */ do{ match=q_memchr(tmp, '\n', end-tmp); if (match){ match++; }else { LOG(L_ERR, "ERROR: get_hdr_field: bad body for <%s>(%d)\n", hdr->name.s, hdr->type); /* abort(); */ tmp=end; goto error; } tmp=match; }while( match<end &&( (*match==' ')||(*match=='\t') ) ); tmp=match; hdr->body.len=match-hdr->body.s; break; default: LOG(L_CRIT, "BUG: get_hdr_field: unknown header type %d\n", hdr->type); goto error; } /* jku: if \r covered by current length, shrink it */ trim_r( hdr->body ); hdr->len=tmp-hdr->name.s; return tmp; error: DBG("get_hdr_field: error exit\n"); hdr->type=HDR_ERROR; hdr->len=tmp-hdr->name.s; return tmp; }
int modem_conf_read(const char* port, modem_conf_t* conf) { char s[0x100], w[0x100]; regmatch_t* pmatch; size_t nmatch; FILE *f; /* default values */ *conf->pin = 0; *conf->puk = 0; *conf->data.apn = 0; *conf->data.apn = 0; conf->data.auth = PPP_NONE; *conf->data.username = 0; *conf->data.password = 0; conf->roaming = 0; conf->operator_number = 0; conf->access_technology = 0; conf->frequency_band = 0; conf->periodical_reset = 0; *conf->mcc_lock = 0; *conf->mnc_lock = 0; *conf->ccid.low = 0; *conf->ccid.high = 0; /* path to config */ snprintf(s, sizeof(s), "/etc/modemd/%s/conf", port); if(!(f = fopen(s, "r"))) { printf("(DD) Waiting configuration for %s port. ", port); perror(s); return(-1); } while(!feof(f)) { if(!fgets(s, sizeof(s), f)) continue; #define CONF_PIN "pin=" #define CONF_PUK "puk=" #define CONF_APN "apn=" #define CONF_AUTH "auth=" #define CONF_USER "username="******"password="******"roaming_enable=yes" #define CONF_OPER "operator_number=" #define CONF_ACT "access_technology=" #define CONF_BAND "frequency_band=" #define CONF_PERIODICAL_RST "periodical_reset=" #define CONF_MCC "mcc=" #define CONF_MNC "mnc=" #define CONF_CCID "ccid=" #define CONF_MSIN "msin=" if(strstr(s, CONF_PIN) == s) { strncpy(conf->pin, s + strlen(CONF_PIN), sizeof(conf->pin) - 1); conf->pin[sizeof(conf->pin) - 1] = 0; trim_r(conf->pin); } else if(strstr(s, CONF_PUK) == s) { strncpy(conf->puk, s + strlen(CONF_PUK), sizeof(conf->puk) - 1); conf->puk[sizeof(conf->puk) - 1] = 0; trim_r(conf->puk); } else if(strstr(s, CONF_APN) == s) { strncpy(conf->data.apn, s + strlen(CONF_APN), sizeof(conf->data.apn) - 1); conf->data.apn[sizeof(conf->data.apn) - 1] = 0; trim_r(conf->data.apn); } else if(strstr(s, CONF_AUTH) == s) { conf->data.auth = atoi(s + strlen(CONF_AUTH)); } else if(strstr(s, CONF_USER) == s) { strncpy(conf->data.username, s + strlen(CONF_USER), sizeof(conf->data.username) - 1); conf->data.username[sizeof(conf->data.username) - 1] = 0; trim_r(conf->data.username); } else if(strstr(s, CONF_PASS) == s) { strncpy(conf->data.password, s + strlen(CONF_PASS), sizeof(conf->data.password) - 1); conf->data.password[sizeof(conf->data.password) - 1] = 0; trim_r(conf->data.password); } else if(strstr(s, CONF_ROAMING)) { conf->roaming = 1; } else if(strstr(s, CONF_OPER) == s) { conf->operator_number = atoi(s + strlen(CONF_OPER)); } else if(strstr(s, CONF_ACT) == s) { conf->access_technology = atoi(s + strlen(CONF_ACT)); } else if(strstr(s, CONF_BAND) == s) { sscanf(s + strlen(CONF_BAND), "%x", (unsigned int*)&conf->frequency_band); } else if(strstr(s, CONF_PERIODICAL_RST) == s) { conf->periodical_reset = atoi(s + strlen(CONF_PERIODICAL_RST)); } else if(strstr(s, CONF_MCC) == s) { strncpy(conf->mcc_lock, s + strlen(CONF_MCC), sizeof(conf->mcc_lock) - 1); conf->mcc_lock[sizeof(conf->mcc_lock) - 1] = 0; trim_r(conf->mcc_lock); } else if(strstr(s, CONF_MNC) == s) { strncpy(conf->mnc_lock, s + strlen(CONF_MCC), sizeof(conf->mnc_lock) - 1); conf->mnc_lock[sizeof(conf->mnc_lock) - 1] = 0; trim_r(conf->mnc_lock); } else if(strstr(s, CONF_CCID) == s) { strncpy(w, s + strlen(CONF_CCID), sizeof(w) - 1); w[sizeof(w) - 1] = 0; trim_r(w); if(!re_parse(w, "(.+),(.+)", &nmatch, &pmatch)) { re_strncpy(conf->ccid.low, sizeof(conf->ccid.low), w, pmatch + 1); re_strncpy(conf->ccid.high, sizeof(conf->ccid.low), w, pmatch + 2); free(pmatch); } } else if(strstr(s, CONF_MSIN) == s) { strncpy(w, s + strlen(CONF_MSIN), sizeof(w) - 1); w[sizeof(w) - 1] = 0; trim_r(w); if(!re_parse(w, "(.+),(.+)", &nmatch, &pmatch)) { re_strncpy(conf->msin.low, sizeof(conf->msin.low), w, pmatch + 1); re_strncpy(conf->msin.high, sizeof(conf->msin.low), w, pmatch + 2); free(pmatch); } } } fclose(f); printf( " PIN: [%s]\n" " PUK: [%s]\n" " APN: [%s]\n" " Auth: %d\n" " Username: [%s]\n" " Password: [%s]\n" " roaming: %d\n" " operator_number: %d\n" "access_technology: %d\n" " periodical_reset: %d\n" " frequency_band: %d\n" " mcc lock: [%s]\n" " mnc lock: [%s]\n" " ccid lock: [%s] - [%s]\n" " msin lock: [%s] - [%s]\n", conf->pin, conf->puk, conf->data.apn, conf->data.auth, conf->data.username, conf->data.password, conf->roaming, conf->operator_number, conf->access_technology, conf->periodical_reset, conf->frequency_band, conf->mcc_lock, conf->mnc_lock, conf->ccid.low, conf->ccid.high, conf->msin.low, conf->msin.high ); return(0); }
/** * extract the node list from the body of a notification request SIP message * the SIP request will look something like: * KDMQ sip:10.0.0.0:5062 * To: ... * From: ... * Max-Forwards: ... * Content-Length: 22 * * sip:host1:port1;param1=value1 * sip:host2:port2;param2=value2 * ... */ int extract_node_list(dmq_node_list_t* update_list, struct sip_msg* msg) { int content_length, total_nodes = 0; str body; str tmp_uri; dmq_node_t *cur = NULL; dmq_node_t *ret, *find; char *tmp, *end, *match; if(!msg->content_length && (parse_headers(msg,HDR_CONTENTLENGTH_F,0)<0 || !msg->content_length)) { LM_ERR("no content length header found\n"); return -1; } content_length = get_content_length(msg); if(!content_length) { LM_DBG("content length is 0\n"); return total_nodes; } body.s = get_body(msg); body.len = content_length; tmp = body.s; end = body.s + body.len; /* acquire big list lock */ lock_get(&update_list->lock); while(tmp < end) { match = q_memchr(tmp, '\n', end - tmp); if(match) { match++; } else { /* for the last line - take all of it */ match = end; } /* create the orig_uri from the parsed uri line and trim it */ tmp_uri.s = tmp; tmp_uri.len = match - tmp - 1; tmp = match; /* trim the \r, \n and \0's */ trim_r(tmp_uri); find = build_dmq_node(&tmp_uri, 0); if(find==NULL) return -1; ret = find_dmq_node(update_list, find); if (!ret) { LM_DBG("found new node %.*s\n", STR_FMT(&tmp_uri)); cur = build_dmq_node(&tmp_uri, 1); if(!cur) { LM_ERR("error creating new dmq node\n"); goto error; } cur->next = update_list->nodes; update_list->nodes = cur; update_list->count++; total_nodes++; } else if (find->params && ret->status != find->status) { LM_DBG("updating status on %.*s from %d to %d\n", STR_FMT(&tmp_uri), ret->status, find->status); ret->status = find->status; total_nodes++; } destroy_dmq_node(find, 0); } /* release big list lock */ lock_release(&update_list->lock); return total_nodes; error: lock_release(&update_list->lock); return -1; }
const char *IxDBC::getFieldName(unsigned int no){ /* * EXEC SQL BEGIN DECLARE SECTION; */ #line 227 "ix_dbc.esql.ec" #line 228 "ix_dbc.esql.ec" int no1; static char name[FIELDNAME_BUFF_SIZE]; int type; int len; short ind; /* * EXEC SQL END DECLARE SECTION; */ #line 233 "ix_dbc.esql.ec" /* * EXEC SQL BEGIN DECLARE SECTION; */ #line 235 "ix_dbc.esql.ec" #line 236 "ix_dbc.esql.ec" char *sysdesc = IX_DESCR; /* * EXEC SQL END DECLARE SECTION; */ #line 237 "ix_dbc.esql.ec" /* ESQL hack :) */ no1=(unsigned int) no + 1; //printf("(((%d)))\n", no); /* * EXEC SQL get descriptor :sysdesc VALUE :no1 :name = NAME, * :name = NAME, * :type = TYPE, * :len = LENGTH, * :ind = INDICATOR; */ #line 242 "ix_dbc.esql.ec" { #line 242 "ix_dbc.esql.ec" static struct hostvar_struct _SQhtab[] = { { 0, 7, 100, sizeof(name), 0 }, { 0, 7, 100, sizeof(name), 0 }, { 0, 1, 102, sizeof(type), 0 }, { 0, 2, 102, sizeof(len), 0 }, { 0, 5, 101, sizeof(ind), 0 }, { 0, 0, 0, 0, 0 } #line 246 "ix_dbc.esql.ec" }; _SQhtab[0].hostaddr = (name); _SQhtab[1].hostaddr = (name); _SQhtab[2].hostaddr = (char *)&type; _SQhtab[3].hostaddr = (char *)&len; _SQhtab[4].hostaddr = (char *)&ind; #line 246 "ix_dbc.esql.ec" _iqgetdesc(sysdesc, no1, _SQhtab, 0); #line 246 "ix_dbc.esql.ec" if (SQLCODE < 0) #line 246 "ix_dbc.esql.ec" ix_err(); #line 246 "ix_dbc.esql.ec" } trim_r(name, FIELDNAME_BUFF_SIZE); //printf(">%2i | %-10s | %3d | %3d | %3d | %s<\n", no, name, type, len, ind, (ind == -1) ? NULL : data); return name; };
const char *IxDBC::getFieldData(unsigned int no){ /* * EXEC SQL BEGIN DECLARE SECTION; */ #line 198 "ix_dbc.esql.ec" #line 199 "ix_dbc.esql.ec" int no1; static char data[FIELD_BUFF_SIZE]; int type; int len; short ind; /* * EXEC SQL END DECLARE SECTION; */ #line 204 "ix_dbc.esql.ec" /* * EXEC SQL BEGIN DECLARE SECTION; */ #line 206 "ix_dbc.esql.ec" #line 207 "ix_dbc.esql.ec" char *sysdesc = IX_DESCR; /* * EXEC SQL END DECLARE SECTION; */ #line 208 "ix_dbc.esql.ec" /* ESQL hack :) */ no1=(unsigned int) no + 1; /* * EXEC SQL get descriptor :sysdesc VALUE :no1 * :type = TYPE, * :len = LENGTH, * :ind = INDICATOR, * :data = DATA; */ #line 213 "ix_dbc.esql.ec" { #line 213 "ix_dbc.esql.ec" static struct hostvar_struct _SQhtab[] = { { 0, 1, 102, sizeof(type), 0 }, { 0, 2, 102, sizeof(len), 0 }, { 0, 5, 101, sizeof(ind), 0 }, { 0, 6, 100, sizeof(data), 0 }, { 0, 0, 0, 0, 0 } #line 217 "ix_dbc.esql.ec" }; _SQhtab[0].hostaddr = (char *)&type; _SQhtab[1].hostaddr = (char *)&len; _SQhtab[2].hostaddr = (char *)&ind; _SQhtab[3].hostaddr = (data); #line 217 "ix_dbc.esql.ec" _iqgetdesc(sysdesc, no1, _SQhtab, 0); #line 217 "ix_dbc.esql.ec" if (SQLCODE < 0) #line 217 "ix_dbc.esql.ec" ix_err(); #line 217 "ix_dbc.esql.ec" } if (ind == -1) return NULL; trim_r(data, FIELD_BUFF_SIZE); return data; };
void init_syspara(void) { unsigned char buffer[16]; unsigned int *src; char *dst; unsigned int bytes; int i; char macaddr[]="00:11:22:33:44:55"; char macaddr2[]="00:11:22:33:44:58"; char country_code[3]; char pin[9]; char productid[13]; char fwver[8]; char blver[20]; unsigned char txbf_para[33]; char ea[ETHER_ADDR_LEN]; nvram_set("buildno", rt_serialno); nvram_set("extendno", rt_extendno); nvram_set("buildinfo", rt_buildinfo); /* /dev/mtd/2, RF parameters, starts from 0x40000 */ dst = buffer; bytes = 6; memset(buffer, 0, sizeof(buffer)); memset(country_code, 0, sizeof(country_code)); memset(pin, 0, sizeof(pin)); memset(productid, 0, sizeof(productid)); memset(fwver, 0, sizeof(fwver)); memset(txbf_para, 0, sizeof(txbf_para)); if (FRead(dst, OFFSET_MAC_ADDR, bytes)<0) { _dprintf("READ MAC address: Out of scope\n"); } else { if (buffer[0]!=0xff) ether_etoa(buffer, macaddr); } if (FRead(dst, OFFSET_MAC_ADDR_2G, bytes)<0) { _dprintf("READ MAC address 2G: Out of scope\n"); } else { if (buffer[0]!=0xff) ether_etoa(buffer, macaddr2); } if (!ralink_mssid_mac_validate(macaddr) || !ralink_mssid_mac_validate(macaddr2)) nvram_set("wl_mssid", "0"); else nvram_set("wl_mssid", "1"); //TODO: separate for different chipset solution nvram_set("et0macaddr", macaddr); nvram_set("et1macaddr", macaddr2); if (FRead(dst, OFFSET_MAC_GMAC0, bytes)<0) dbg("READ MAC address GMAC0: Out of scope\n"); else { if (buffer[0]==0xff) { if (ether_atoe(macaddr, ea)) FWrite(ea, OFFSET_MAC_GMAC0, 6); } } if (FRead(dst, OFFSET_MAC_GMAC2, bytes)<0) dbg("READ MAC address GMAC2: Out of scope\n"); else { if (buffer[0]==0xff) { if (ether_atoe(macaddr2, ea)) FWrite(ea, OFFSET_MAC_GMAC2, 6); } } /* reserved for Ralink. used as ASUS country code. */ dst = country_code; bytes = 2; if (FRead(dst, OFFSET_COUNTRY_CODE, bytes)<0) { _dprintf("READ ASUS country code: Out of scope\n"); nvram_set("wl_country_code", ""); } else { if ((unsigned char)country_code[0]!=0xff) { //for specific power if (country_code[0] ==0x5a && country_code[1] == 0x31) { country_code[0]='U'; country_code[1]='S'; } else if (country_code[0] ==0x5a && country_code[1] == 0x32) { country_code[0]='G'; country_code[1]='B'; } else if (country_code[0] ==0x5a && country_code[1] == 0x33) { country_code[0]='T'; country_code[1]='W'; } else if (country_code[0] ==0x5a && country_code[1] == 0x34) { country_code[0]='C'; country_code[1]='N'; } nvram_set("wl_country_code", country_code); nvram_set("wl0_country_code", country_code); nvram_set("wl1_country_code", country_code); } else { nvram_set("wl_country_code", "DB"); nvram_set("wl0_country_code", "DB"); nvram_set("wl1_country_code", "DB"); } if (!strcasecmp(nvram_safe_get("wl_country_code"), "BR")) { nvram_set("wl_country_code", "UZ"); nvram_set("wl0_country_code", "UZ"); nvram_set("wl1_country_code", "UZ"); } if (nvram_match("wl_country_code", "HK") && nvram_match("preferred_lang", "")) nvram_set("preferred_lang", "TW"); } /* reserved for Ralink. used as ASUS pin code. */ dst = (char*)pin; bytes = 8; if (FRead(dst, OFFSET_PIN_CODE, bytes)<0) { _dprintf("READ ASUS pin code: Out of scope\n"); nvram_set("wl_pin_code", ""); } else { if ((unsigned char)pin[0]!=0xff) nvram_set("secret_code", pin); else nvram_set("secret_code", "12345670"); } src = (unsigned int*) 0x50020; /* /dev/mtd/3, firmware, starts from 0x50000 */ dst = buffer; bytes = 16; if (FRead(dst, (int)src, bytes)<0) { fprintf(stderr, "READ firmware header: Out of scope\n"); nvram_set("productid", "unknown"); nvram_set("firmver", "unknown"); } else { strncpy(productid, buffer + 4, 12); productid[12] = 0; sprintf(fwver, "%d.%d.%d.%d", buffer[0], buffer[1], buffer[2], buffer[3]); nvram_set("productid", trim_r(productid)); nvram_set("firmver", trim_r(fwver)); } memset(buffer, 0, sizeof(buffer)); FRead(buffer, OFFSET_BOOT_VER, 4); // sprintf(blver, "%c.%c.%c.%c", buffer[0], buffer[1], buffer[2], buffer[3]); sprintf(blver, "%s-0%c-0%c-0%c-0%c", trim_r(productid), buffer[0], buffer[1], buffer[2], buffer[3]); nvram_set("blver", trim_r(blver)); _dprintf("bootloader version: %s\n", nvram_safe_get("blver")); _dprintf("firmware version: %s\n", nvram_safe_get("firmver")); dst = txbf_para; int count_0xff = 0; if (FRead(dst, OFFSET_TXBF_PARA, 33) < 0) { fprintf(stderr, "READ TXBF PARA address: Out of scope\n"); } else { for (i = 0; i < 33; i++) { if (txbf_para[i] == 0xff) count_0xff++; /* if ((i % 16) == 0) fprintf(stderr, "\n"); fprintf(stderr, "%02x ", (unsigned char) txbf_para[i]); */ } /* fprintf(stderr, "\n"); fprintf(stderr, "TxBF parameter 0xFF count: %d\n", count_0xff); */ } if (count_0xff == 33) nvram_set("wl1_txbf_en", "0"); else nvram_set("wl1_txbf_en", "1"); #if defined (RTCONFIG_WLMODULE_RT3352_INIC_MII) #define EEPROM_INIC_SIZE (512) #define EEPROM_INIT_ADDR 0x48000 #define EEPROM_INIT_FILE "/etc/Wireless/iNIC/iNIC_e2p.bin" { char eeprom[EEPROM_INIC_SIZE]; if(FRead(eeprom, EEPROM_INIT_ADDR, sizeof(eeprom)) < 0) { fprintf(stderr, "FRead(eeprom, 0x%08x, 0x%x) failed\n", EEPROM_INIT_ADDR, sizeof(eeprom)); } else { FILE *fp; char *filepath = EEPROM_INIT_FILE; system("mkdir -p /etc/Wireless/iNIC/"); if((fp = fopen(filepath, "w")) == NULL) { fprintf(stderr, "fopen(%s) failed!!\n", filepath); } else { if(fwrite(eeprom, sizeof(eeprom), 1, fp) < 1) { perror("fwrite(eeprom)"); } fclose(fp); } } } #endif { #ifdef RTCONFIG_ODMPID char modelname[16]; FRead(modelname, OFFSET_ODMPID, sizeof(modelname)); modelname[sizeof(modelname)-1] = '\0'; if(modelname[0] != 0 && (unsigned char)(modelname[0]) != 0xff && is_valid_hostname(modelname)) { nvram_set("odmpid", modelname); } else #endif nvram_unset("odmpid"); } nvram_set("firmver", rt_version); nvram_set("productid", rt_buildname); }
/* returns pointer to next header line, and fill hdr_f ; * if at end of header returns pointer to the last crlf (always buf)*/ char* get_hdr_field(char* const buf, char* const end, struct hdr_field* const hdr) { char *tmp = 0; char *match; struct via_body *vb; struct cseq_body* cseq_b; struct to_body* to_b; int integer, err; unsigned uval; if(!buf) { DBG("null buffer pointer\n"); goto error; } if ((*buf)=='\n' || (*buf)=='\r') { /* double crlf or lflf or crcr */ DBG("found end of header\n"); hdr->type=HDR_EOH_T; return buf; } tmp=parse_hname(buf, end, hdr); if (hdr->type==HDR_ERROR_T) { LOG(L_ERR, "ERROR: get_hdr_field: bad header\n"); goto error; } /* eliminate leading whitespace */ tmp=eat_lws_end(tmp, end); if (tmp>=end) { LOG(L_ERR, "ERROR: get_hdr_field: HF empty\n"); goto error; } /* if header-field well-known, parse it, find its end otherwise ; * after leaving the hdr->type switch, tmp should be set to the * next header field */ switch(hdr->type) { case HDR_VIA_T: /* keep number of vias parsed -- we want to report it in replies for diagnostic purposes */ via_cnt++; vb=pkg_malloc(sizeof(struct via_body)); if (vb==0) { LOG(L_ERR, "get_hdr_field: out of memory\n"); goto error; } memset(vb,0,sizeof(struct via_body)); hdr->body.s=tmp; tmp=parse_via(tmp, end, vb); if (vb->error==PARSE_ERROR) { LOG(L_ERR, "ERROR: get_hdr_field: bad via\n"); free_via_list(vb); goto error; } hdr->parsed=vb; vb->hdr.s=hdr->name.s; vb->hdr.len=hdr->name.len; hdr->body.len=tmp-hdr->body.s; break; case HDR_CSEQ_T: cseq_b=pkg_malloc(sizeof(struct cseq_body)); if (cseq_b==0) { LOG(L_ERR, "get_hdr_field: out of memory\n"); goto error; } memset(cseq_b, 0, sizeof(struct cseq_body)); hdr->body.s=tmp; tmp=parse_cseq(tmp, end, cseq_b); if (cseq_b->error==PARSE_ERROR) { LOG(L_ERR, "ERROR: get_hdr_field: bad cseq\n"); free_cseq(cseq_b); goto error; } hdr->parsed=cseq_b; hdr->body.len=tmp-hdr->body.s; DBG("get_hdr_field: cseq <%.*s>: <%.*s> <%.*s>\n", hdr->name.len, ZSW(hdr->name.s), cseq_b->number.len, ZSW(cseq_b->number.s), cseq_b->method.len, cseq_b->method.s); break; case HDR_TO_T: to_b=pkg_malloc(sizeof(struct to_body)); if (to_b==0) { LOG(L_ERR, "get_hdr_field: out of memory\n"); goto error; } memset(to_b, 0, sizeof(struct to_body)); hdr->body.s=tmp; tmp=parse_to(tmp, end,to_b); if (to_b->error==PARSE_ERROR) { LOG(L_ERR, "ERROR: get_hdr_field: bad to header\n"); free_to(to_b); goto error; } hdr->parsed=to_b; hdr->body.len=tmp-hdr->body.s; DBG("DEBUG: get_hdr_field: <%.*s> [%d]; uri=[%.*s] \n", hdr->name.len, ZSW(hdr->name.s), hdr->body.len, to_b->uri.len,ZSW(to_b->uri.s)); DBG("DEBUG: to body [%.*s]\n",to_b->body.len, ZSW(to_b->body.s)); break; case HDR_CONTENTLENGTH_T: hdr->body.s=tmp; tmp=parse_content_length(tmp,end, &integer); if (tmp==0) { LOG(L_ERR, "ERROR:get_hdr_field: bad content_length header\n"); goto error; } hdr->parsed=(void*)(long)integer; hdr->body.len=tmp-hdr->body.s; DBG("DEBUG: get_hdr_body : content_length=%d\n", (int)(long)hdr->parsed); break; case HDR_RETRY_AFTER_T: hdr->body.s=tmp; tmp=parse_retry_after(tmp,end, &uval, &err); if (err) { LOG(L_ERR, "ERROR:get_hdr_field: bad retry_after header\n"); goto error; } hdr->parsed=(void*)(unsigned long)uval; hdr->body.len=tmp-hdr->body.s; DBG("DEBUG: get_hdr_body : retry_after=%d\n", (unsigned)(long)hdr->parsed); break; case HDR_IDENTITY_T: case HDR_DATE_T: case HDR_IDENTITY_INFO_T: case HDR_SUPPORTED_T: case HDR_REQUIRE_T: case HDR_CONTENTTYPE_T: case HDR_FROM_T: case HDR_CALLID_T: case HDR_CONTACT_T: case HDR_ROUTE_T: case HDR_RECORDROUTE_T: case HDR_MAXFORWARDS_T: case HDR_AUTHORIZATION_T: case HDR_EXPIRES_T: case HDR_PROXYAUTH_T: case HDR_PROXYREQUIRE_T: case HDR_UNSUPPORTED_T: case HDR_ALLOW_T: case HDR_EVENT_T: case HDR_ACCEPT_T: case HDR_ACCEPTLANGUAGE_T: case HDR_ORGANIZATION_T: case HDR_PRIORITY_T: case HDR_SUBJECT_T: case HDR_USERAGENT_T: case HDR_SERVER_T: case HDR_CONTENTDISPOSITION_T: case HDR_DIVERSION_T: case HDR_RPID_T: case HDR_SIPIFMATCH_T: case HDR_REFER_TO_T: case HDR_SESSIONEXPIRES_T: case HDR_MIN_SE_T: case HDR_SUBSCRIPTION_STATE_T: case HDR_ACCEPTCONTACT_T: case HDR_ALLOWEVENTS_T: case HDR_CONTENTENCODING_T: case HDR_REFERREDBY_T: case HDR_REJECTCONTACT_T: case HDR_REQUESTDISPOSITION_T: case HDR_WWW_AUTHENTICATE_T: case HDR_PROXY_AUTHENTICATE_T: case HDR_PATH_T: case HDR_PRIVACY_T: case HDR_PAI_T: case HDR_PPI_T: case HDR_REASON_T: case HDR_OTHER_T: /* just skip over it */ hdr->body.s=tmp; /* find end of header */ /* find lf */ do { match=q_memchr(tmp, '\n', end-tmp); if (match) { match++; } else { LOG(L_ERR, "ERROR: get_hdr_field: bad body for <%s>(%d)\n", hdr->name.s, hdr->type); /* abort(); */ tmp=end; goto error; } tmp=match; } while( match<end &&( (*match==' ')||(*match=='\t') ) ); tmp=match; hdr->body.len=match-hdr->body.s; break; default: LOG(L_CRIT, "BUG: get_hdr_field: unknown header type %d\n", hdr->type); goto error; } /* jku: if \r covered by current length, shrink it */ trim_r( hdr->body ); hdr->len=tmp-hdr->name.s; return tmp; error: DBG("get_hdr_field: error exit\n"); STATS_BAD_MSG_HDR(); hdr->type=HDR_ERROR_T; hdr->len=tmp-hdr->name.s; return tmp; }
static int wl_scan(int unit) { wl_scan_results_t *list = (wl_scan_results_t*)scan_result; wl_bss_info_t *bi; wl_bss_info_107_t *old_bi; uint i, ap_count = 0; char ssid_str[128], macstr[18]; if (wl_get_scan_results(unit) == NULL) return 0; memset(ap_list, 0, sizeof(ap_list)); if (list->count == 0) return 0; else if (list->version != WL_BSS_INFO_VERSION && list->version != LEGACY_WL_BSS_INFO_VERSION && list->version != LEGACY2_WL_BSS_INFO_VERSION) { /* fprintf(stderr, "Sorry, your driver has bss_info_version %d " "but this program supports only version %d.\n", list->version, WL_BSS_INFO_VERSION); */ return 0; } bi = list->bss_info; for (i = 0; i < list->count; i++) { /* Convert version 107 to 109 */ if (dtoh32(bi->version) == LEGACY_WL_BSS_INFO_VERSION) { old_bi = (wl_bss_info_107_t *)bi; bi->chanspec = CH20MHZ_CHSPEC(old_bi->channel); bi->ie_length = old_bi->ie_length; bi->ie_offset = sizeof(wl_bss_info_107_t); } if (bi->ie_length) { if (ap_count < WLC_MAX_AP_SCAN_LIST_LEN){ ap_list[ap_count].used = TRUE; memcpy(ap_list[ap_count].BSSID, (uint8 *)&bi->BSSID, 6); strncpy((char *)ap_list[ap_count].ssid, (char *)bi->SSID, bi->SSID_len); ap_list[ap_count].ssid[bi->SSID_len] = '\0'; ap_list[ap_count].ssidLen= bi->SSID_len; ap_list[ap_count].ie_buf = (uint8 *)(((uint8 *)bi) + bi->ie_offset); ap_list[ap_count].ie_buflen = bi->ie_length; ap_list[ap_count].channel = (uint8)(bi->chanspec & WL_CHANSPEC_CHAN_MASK); ap_list[ap_count].wep = bi->capability & DOT11_CAP_PRIVACY; ap_count++; } } bi = (wl_bss_info_t*)((int8*)bi + bi->length); } if (ap_count) { if (psta_debug) dbg("%-4s%-33s%-18s\n", "Ch", "SSID", "BSSID"); for (i = 0; i < ap_count; i++) { memset(ssid_str, 0, sizeof(ssid_str)); char_to_ascii(ssid_str, (const char *) trim_r(ap_list[i].ssid)); ether_etoa((const unsigned char *) &ap_list[i].BSSID, macstr); if (psta_debug) dbg("%-4d%-33s%-18s\n", ap_list[i].channel, ap_list[i].ssid, macstr ); } } return ap_count; }