static int enable_bridge(const char *name) { int err, index; index = connman_inet_ifindex(name); if (index < 0) return index; err = __connman_inet_modify_address(RTM_NEWADDR, NLM_F_REPLACE | NLM_F_ACK, index, AF_INET, BRIDGE_IP, NULL, 24, BRIDGE_BCAST); if (err < 0) return err; return connman_inet_ifup(index); }
int __connman_bridge_enable(const char *name, const char *gateway, const char *broadcast) { int err, index; index = connman_inet_ifindex(name); if (index < 0) return index; err = __connman_inet_modify_address(RTM_NEWADDR, NLM_F_REPLACE | NLM_F_ACK, index, AF_INET, gateway, NULL, 24, broadcast); if (err < 0) return err; return connman_inet_ifup(index); }
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); }
static int start_dhcp_server(struct connman_peer *peer) { const char *start_ip, *end_ip; GDHCPServerError dhcp_error; const char *broadcast; const char *gateway; const char *subnet; int prefixlen; int index; int err; DBG(""); err = -ENOMEM; if (peer->sub_device) index = connman_device_get_index(peer->sub_device); else index = connman_device_get_index(peer->device); peer->ip_pool = __connman_ippool_create(index, 2, 1, NULL, NULL); if (!peer->ip_pool) goto error; gateway = __connman_ippool_get_gateway(peer->ip_pool); subnet = __connman_ippool_get_subnet_mask(peer->ip_pool); broadcast = __connman_ippool_get_broadcast(peer->ip_pool); start_ip = __connman_ippool_get_start_ip(peer->ip_pool); end_ip = __connman_ippool_get_end_ip(peer->ip_pool); prefixlen = connman_ipaddress_calc_netmask_len(subnet); err = __connman_inet_modify_address(RTM_NEWADDR, NLM_F_REPLACE | NLM_F_ACK, index, AF_INET, gateway, NULL, prefixlen, broadcast); if (err < 0) goto error; peer->dhcp_server = g_dhcp_server_new(G_DHCP_IPV4, index, &dhcp_error); if (!peer->dhcp_server) goto error; g_dhcp_server_set_debug(peer->dhcp_server, dhcp_server_debug, "Peer DHCP server"); g_dhcp_server_set_lease_time(peer->dhcp_server, 3600); g_dhcp_server_set_option(peer->dhcp_server, G_DHCP_SUBNET, subnet); g_dhcp_server_set_option(peer->dhcp_server, G_DHCP_ROUTER, gateway); g_dhcp_server_set_option(peer->dhcp_server, G_DHCP_DNS_SERVER, NULL); g_dhcp_server_set_ip_range(peer->dhcp_server, start_ip, end_ip); err = g_dhcp_server_start(peer->dhcp_server); if (err < 0) goto error; g_timeout_add_seconds(0, dhcp_server_started, connman_peer_ref(peer)); return 0; error: stop_dhcp_server(peer); return err; }
static void setup_tun_interface(unsigned int flags, unsigned change, void *data) { struct connman_private_network *pn = data; unsigned char prefixlen; DBusMessageIter array, dict; const char *server_ip; const char *peer_ip; const char *subnet_mask; int err; DBG("index %d flags %d change %d", pn->index, flags, change); if (flags & IFF_UP) return; subnet_mask = __connman_ippool_get_subnet_mask(pn->pool); server_ip = __connman_ippool_get_start_ip(pn->pool); peer_ip = __connman_ippool_get_end_ip(pn->pool); prefixlen = connman_ipaddress_calc_netmask_len(subnet_mask); if ((__connman_inet_modify_address(RTM_NEWADDR, NLM_F_REPLACE | NLM_F_ACK, pn->index, AF_INET, server_ip, peer_ip, prefixlen, NULL)) < 0) { DBG("address setting failed"); return; } connman_inet_ifup(pn->index); err = __connman_nat_enable(BRIDGE_NAME, server_ip, prefixlen); if (err < 0) { connman_error("failed to enable NAT"); 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, &server_ip); connman_dbus_dict_append_basic(&dict, "PeerIPv4", DBUS_TYPE_STRING, &peer_ip); if (pn->primary_dns) connman_dbus_dict_append_basic(&dict, "PrimaryDNS", DBUS_TYPE_STRING, &pn->primary_dns); if (pn->secondary_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); }