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); }
static int enable_nat(const char *interface) { int err; if (interface == NULL) return 0; /* Enable IPv4 forwarding */ err = enable_ip_forward(TRUE); if (err < 0) return err; /* POSTROUTING flush */ err = __connman_iptables_command("-t nat -F POSTROUTING"); if (err < 0) return err; /* Enable masquerading */ err = __connman_iptables_command("-t nat -A POSTROUTING " "-o %s -j MASQUERADE", interface); if (err < 0) return err; return __connman_iptables_commit("nat"); }
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 disable_nat(const char *interface) { int err; /* Disable IPv4 forwarding */ enable_ip_forward(FALSE); /* POSTROUTING flush */ err = __connman_iptables_command("-t nat -F POSTROUTING"); if (err < 0) return; __connman_iptables_commit("nat"); }
void __connman_nat_disable(const char *name) { struct connman_nat *nat; nat = g_hash_table_lookup(nat_hash, name); if (nat == NULL) return; disable_nat(nat); g_hash_table_remove(nat_hash, name); if (g_hash_table_size(nat_hash) == 0) enable_ip_forward(FALSE); }