static void update_default_interface(struct connman_service *service) { GHashTableIter iter; gpointer key, value; char *interface; int err; interface = connman_service_get_interface(service); DBG("interface %s", interface); g_free(default_interface); default_interface = interface; g_hash_table_iter_init(&iter, nat_hash); while (g_hash_table_iter_next(&iter, &key, &value) == TRUE) { const char *name = key; struct connman_nat *nat = value; disable_nat(nat); err = enable_nat(nat); if (err < 0) DBG("Failed to enable nat for %s", name); } }
int __connman_nat_enable(const char *name, const char *address, unsigned char prefixlen) { struct connman_nat *nat; int err; if (g_hash_table_size(nat_hash) == 0) { err = enable_ip_forward(TRUE); if (err < 0) return err; } nat = g_try_new0(struct connman_nat, 1); if (nat == NULL) { if (g_hash_table_size(nat_hash) == 0) enable_ip_forward(FALSE); return -ENOMEM; } if(address != NULL) nat->address = g_strdup(address); else nat->address = NULL; nat->prefixlen = prefixlen; g_hash_table_replace(nat_hash, g_strdup(name), nat); return enable_nat(nat); }
void __connman_tethering_set_enabled(void) { int err; DBG("enabled %d", tethering_enabled + 1); if (g_atomic_int_exchange_and_add(&tethering_enabled, 1) == 0) { const char *dns; err = create_bridge(BRIDGE_NAME); if (err < 0) return; err = enable_bridge(BRIDGE_NAME); if (err < 0 && err != -EALREADY) { remove_bridge(BRIDGE_NAME); return; } dns = BRIDGE_IP; if (__connman_dnsproxy_add_listener(BRIDGE_NAME) < 0) { connman_error("Can't add listener %s to DNS proxy", BRIDGE_NAME); dns = BRIDGE_DNS; } tethering_dhcp_server = dhcp_server_start(BRIDGE_NAME, BRIDGE_IP, BRIDGE_SUBNET, BRIDGE_IP_START, BRIDGE_IP_END, 24 * 3600, dns); if (tethering_dhcp_server == NULL) { disable_bridge(BRIDGE_NAME); remove_bridge(BRIDGE_NAME); return; } enable_nat(default_interface); DBG("tethering started"); } }
void __connman_tethering_update_interface(const char *interface) { DBG("interface %s", interface); g_free(default_interface); if (interface == NULL) { disable_nat(interface); default_interface = NULL; return; } default_interface = g_strdup(interface); if (!g_atomic_int_get(&tethering_enabled)) return; enable_nat(interface); }
int __connman_nat_enable(const char *name, const char *address, unsigned char prefixlen) { struct connman_nat *nat; int err; if (g_hash_table_size(nat_hash) == 0) { err = enable_ip_forward(true); if (err < 0) return err; } nat = g_try_new0(struct connman_nat, 1); if (!nat) goto err; nat->fw = __connman_firewall_create(); if (!nat->fw) goto err; nat->address = g_strdup(address); nat->prefixlen = prefixlen; g_hash_table_replace(nat_hash, g_strdup(name), nat); return enable_nat(nat); err: if (nat) { if (nat->fw) __connman_firewall_destroy(nat->fw); g_free(nat); } if (g_hash_table_size(nat_hash) == 0) enable_ip_forward(false); return -ENOMEM; }
static void setup_tun_interface(unsigned int flags, unsigned change, void *data) { struct connman_private_network *pn = data; unsigned char prefixlen; DBusMessageIter array, dict; int err; DBG("index %d flags %d change %d", pn->index, flags, change); if (flags & IFF_UP) return; prefixlen = __connman_ipconfig_netmask_prefix_len(PRIVATE_NETWORK_NETMASK); if ((__connman_inet_modify_address(RTM_NEWADDR, NLM_F_REPLACE | NLM_F_ACK, pn->index, AF_INET, pn->server_ip, pn->peer_ip, prefixlen, NULL)) < 0) { DBG("address setting failed"); return; } connman_inet_ifup(pn->index); err = enable_nat(default_interface); if (err < 0) { connman_error("failed to enable NAT on %s", default_interface); goto error; } dbus_message_iter_init_append(pn->reply, &array); dbus_message_iter_append_basic(&array, DBUS_TYPE_OBJECT_PATH, &pn->path); connman_dbus_dict_open(&array, &dict); connman_dbus_dict_append_basic(&dict, "ServerIPv4", DBUS_TYPE_STRING, &pn->server_ip); connman_dbus_dict_append_basic(&dict, "PeerIPv4", DBUS_TYPE_STRING, &pn->peer_ip); connman_dbus_dict_append_basic(&dict, "PrimaryDNS", DBUS_TYPE_STRING, &pn->primary_dns); connman_dbus_dict_append_basic(&dict, "SecondaryDNS", DBUS_TYPE_STRING, &pn->secondary_dns); connman_dbus_dict_close(&array, &dict); dbus_message_iter_append_basic(&array, DBUS_TYPE_UNIX_FD, &pn->fd); g_dbus_send_message(connection, pn->reply); return; error: pn->reply = __connman_error_failed(pn->msg, -err); g_dbus_send_message(connection, pn->reply); g_hash_table_remove(pn_hash, pn->path); }