int dhcp6c_main(int argc, char **argv) { int ipv6_type, dns6_auto, lan6_auto, is_need_notify_radvd; char *dns6_new, *lan_addr6_new; char addr6s[INET6_ADDRSTRLEN]; // char *wan_ifname = safe_getenv("interface"); ipv6_type = get_ipv6_type(); if (ipv6_type != IPV6_NATIVE_DHCP6) return 0; is_need_notify_radvd = 0; lan6_auto = nvram_get_int("ip6_lan_auto"); if (lan6_auto) { lan_addr6_new = get_ifaddr6(IFNAME_BR, 0, addr6s); if (store_lan_addr6(lan_addr6_new)) is_need_notify_radvd = 1; } dns6_auto = nvram_get_int("ip6_dns_auto"); if (dns6_auto) { dns6_new = getenv("new_domain_name_servers"); if (store_wan_dns6(dns6_new)) { update_resolvconf(0, 0); is_need_notify_radvd = 1; } } if (is_need_notify_radvd || !pids("radvd")) reload_radvd(); return 0; }
void restart_radvd(void) { if (is_lan_radv_on() == 1) reload_radvd(); else stop_radvd(); }
void wan6_up(char *wan_ifname) { int ipv6_type, start_radvd_now; char *wan_addr6, *wan_gate6, *wan_addr4; ipv6_type = get_ipv6_type(); if (ipv6_type == IPV6_DISABLED) return; stop_dhcp6c(); build_dns6_var(); control_if_ipv6_dad(IFNAME_BR, 1); start_radvd_now = 1; if (ipv6_type == IPV6_6IN4 || ipv6_type == IPV6_6TO4 || ipv6_type == IPV6_6RD) { wan_addr4 = nvram_safe_get("wan0_ipaddr"); wan_addr6 = nvram_safe_get("wan0_addr6"); start_sit_tunnel(ipv6_type, wan_addr4, wan_addr6); } else { control_if_ipv6_dad(wan_ifname, 1); if (ipv6_type == IPV6_NATIVE_STATIC) { wan_addr6 = nvram_safe_get("wan0_addr6"); wan_gate6 = nvram_safe_get("wan0_gate6"); control_if_ipv6_radv(wan_ifname, 0); clear_if_addr6(wan_ifname); if (*wan_addr6) doSystem("ip -6 addr add %s dev %s", wan_addr6, wan_ifname); if (*wan_gate6) { doSystem("ip -6 route add %s dev %s", wan_gate6, wan_ifname); doSystem("ip -6 route add default via %s metric %d", wan_gate6, 1); } } else { doSystem("ip -6 route add default dev %s metric %d", wan_ifname, 2048); control_if_ipv6_autoconf(wan_ifname, nvram_invmatch("ip6_wan_dhcp", "1")); control_if_ipv6_radv(wan_ifname, 1); /* wait for interface ready */ sleep(2); start_dhcp6c(wan_ifname); if (nvram_match("ip6_lan_auto", "1")) start_radvd_now = 0; } } if (start_radvd_now) reload_radvd(); }