void restart_radvd(void) { if (is_lan_radv_on() == 1) reload_radvd(); else stop_radvd(); }
void full_restart_ipv6(int ipv6_type_old) { int ipv6_type = get_ipv6_type(); int ipv6_toggled = ((ipv6_type == IPV6_DISABLED || ipv6_type_old == IPV6_DISABLED) && (ipv6_type != ipv6_type_old)) ? 1 : 0; if (ipv6_toggled) { stop_lltd(); stop_httpd(); } stop_upnp(); stop_radvd(); stop_dhcp6c(); stop_dns_dhcpd(); if (ipv6_type == IPV6_DISABLED) { hwnat_configure(); clear_all_route6(); clear_all_addr6(); clear_if_neigh6(IFNAME_BR); stop_sit_tunnel(); reset_lan6_vars(); reset_wan6_vars(); control_if_ipv6_all(0); update_resolvconf(0, 1); restart_firewall(); start_dns_dhcpd(0); } else { control_if_ipv6_all(1); clear_all_addr6(); reset_lan6_vars(); reload_lan_addr6(); full_restart_wan(); if (!is_dns_dhcpd_run()) start_dns_dhcpd(0); } if (ipv6_toggled) { start_httpd(0); start_lltd(); } }
void wan6_down(char *wan_ifname) { int ipv6_type; char *wan6_ifname; ipv6_type = get_ipv6_type(); if (ipv6_type == IPV6_DISABLED) return; stop_radvd(); stop_dhcp6c(); control_if_ipv6_radv(wan_ifname, 0); control_if_ipv6_autoconf(wan_ifname, 0); if (ipv6_type == IPV6_6IN4 || ipv6_type == IPV6_6TO4 || ipv6_type == IPV6_6RD) { wan6_ifname = IFNAME_SIT; if (is_interface_exist(IFNAME_SIT)) doSystem("ip link set dev %s down", IFNAME_SIT); } else { wan6_ifname = wan_ifname; } // clear WAN routes6 clear_if_route6(wan6_ifname); // clear WAN addr6 clear_if_addr6(wan6_ifname); // delete SIT tunnel stop_sit_tunnel(); // clear DNS6 for resolv.conf nvram_set("wan0_dns6", ""); }
void * cli_thread(void * arg) { int fd = (int)arg; char buffer[BUF_SIZE]; size_t blen; int i; char * p; int command = 0; int selector = 0; #define CMD_START 1 #define CMD_STOP 2 #define CMD_GET 3 #define SEL_AN1 1 #define SEL_AN2 2 for (blen = read(fd, buffer, sizeof(buffer) - 1); blen > 0 && blen < sizeof(buffer); blen = read(fd, buffer, sizeof(buffer) - 1)) { buffer[blen] = '\0'; debug("Incoming raw command: %s", buffer); command = 0; selector = 0; p = buffer; for (i = 0; i < blen; i++) { if (buffer[i] == '|' || buffer[i] == '\n') { buffer[i] = '\0'; if (strcmp(p, "START") == 0) command = CMD_START; else if (strcmp(p, "STOP") == 0) command = CMD_STOP; else if (strcmp(p, "GET") == 0) command = CMD_GET; break; } } if (i < blen - 1) { p = &buffer[i+1]; for (i = 0; i < blen; i++) { if (buffer[i] == '|' || buffer[i] == '\n') { buffer[i] = '\0'; } } if (strcmp(p, "radvd-an1") == 0) selector = SEL_AN1; else if (strcmp(p, "radvd-an2") == 0) selector = SEL_AN2; } if (command == 0 || (selector == 0 && command != CMD_GET)) { error(-1, "Invalid command: c %d s %d", command, selector); continue; } debug("Incoming command: %s %s", (command == CMD_START) ? "/start/" : (command == CMD_STOP) ? "/stop/" : "/get/", (selector == SEL_AN1) ? "/AN1/" : (selector == SEL_AN2) ? "/AN2/" : "//"); switch(command) { case CMD_START: switch(selector) { case SEL_AN1: start_radvd(an1_args, &an1_pid); break; case SEL_AN2: start_radvd(an2_args, &an2_pid); break; } break; case CMD_STOP: switch(selector) { case SEL_AN1: stop_radvd(&an1_pid); break; case SEL_AN2: stop_radvd(&an2_pid); break; } break; case CMD_GET: break; } memset(buffer, 0, sizeof(buffer)); snprintf(buffer, sizeof(buffer), "STATUS|radvd-an1|%s|radvd-an2|%s", (an1_pid == 0) ? "stopped" : "running", (an2_pid == 0) ? "stopped" : "running"); debug("Status after command: %s", buffer); write(fd, buffer, strlen(buffer)); } if (blen == 0) debug("Connection closed"); else error(blen, "Connection error (read)"); return NULL; }