From: Gustavo F. Padovan <pado...@profusion.mobi>

---
 src/manager.c   |    3 ++-
 src/tethering.c |   55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/src/manager.c b/src/manager.c
index f73330c..06a66b3 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -649,7 +649,8 @@ static GDBusMethodTable manager_methods[] = {
        { "UnregisterCounter", "o",     "",      unregister_counter },
        { "CreateSession",     "a{sv}o", "o",    create_session     },
        { "DestroySession",    "o",     "",      destroy_session    },
-       { "RequestPrivateNetwork",    "",     "h", request_private_network,
+       { "RequestPrivateNetwork",    "",     "hssss",
+                                               request_private_network,
                                                G_DBUS_METHOD_FLAG_ASYNC },
        { "ReleasePrivateNetwork",    "",     "",
                                                release_private_network },
diff --git a/src/tethering.c b/src/tethering.c
index d191d44..e47d8d8 100644
--- a/src/tethering.c
+++ b/src/tethering.c
@@ -3,6 +3,7 @@
  *  Connection Manager
  *
  *  Copyright (C) 2007-2010  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2011 ProFUSION embedded systems
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -52,6 +53,12 @@
 
 #define DEFAULT_MTU    1500
 
+#define PRIVATE_NETWORK_IP "192.168.219.1"
+#define PRIVATE_NETWORK_PEER_IP "192.168.219.2"
+#define PRIVATE_NETWORK_NETMASK "255.255.255.0"
+#define PRIVATE_NETWORK_PRIMARY_DNS BRIDGE_DNS
+#define PRIVATE_NETWORK_SECONDARY_DNS "8.8.4.4"
+
 static char *default_interface = NULL;
 static volatile gint tethering_enabled;
 static GDHCPServer *tethering_dhcp_server = NULL;
@@ -66,6 +73,10 @@ struct connman_private_network {
        char *interface;
        int index;
        guint iface_watch;
+       const char *server_ip;
+       const char *peer_ip;
+       const char *primary_dns;
+       const char *secondary_dns;
 };
 
 const char *__connman_tethering_get_bridge(void)
@@ -391,11 +402,47 @@ static void setup_tun_interface(unsigned int flags, 
unsigned change,
                void *data)
 {
        struct connman_private_network *pn = data;
+       unsigned char prefixlen;
+       DBusMessage *reply;
+       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;
+       }
+
        g_dbus_send_reply(connection, pn->msg, DBUS_TYPE_UNIX_FD, &pn->fd,
-                                                       DBUS_TYPE_INVALID);
+                                       DBUS_TYPE_STRING, &pn->server_ip,
+                                       DBUS_TYPE_STRING, &pn->peer_ip,
+                                       DBUS_TYPE_STRING, &pn->primary_dns,
+                                       DBUS_TYPE_STRING, &pn->secondary_dns,
+                                       DBUS_TYPE_INVALID);
+       return;
+
+error:
+       reply = __connman_error_failed(pn->msg, -err);
+       g_dbus_send_message(connection, reply);
+
+       g_hash_table_remove(pn_hash, pn->owner);
 }
 
 static void remove_private_network(gpointer user_data)
@@ -406,6 +453,8 @@ static void remove_private_network(gpointer user_data)
 
        connman_rtnl_remove_watch(pn->iface_watch);
 
+       disable_nat(default_interface);
+
        if (pn->watch > 0) {
                g_dbus_remove_watch(connection, pn->watch);
                pn->watch = 0;
@@ -463,6 +512,10 @@ int __connman_private_network_request(DBusMessage *msg, 
const char *owner)
        pn->fd = fd;
        pn->interface = iface;
        pn->index = index;
+       pn->server_ip = PRIVATE_NETWORK_IP;
+       pn->peer_ip = PRIVATE_NETWORK_PEER_IP;
+       pn->primary_dns = PRIVATE_NETWORK_PRIMARY_DNS;
+       pn->secondary_dns = PRIVATE_NETWORK_SECONDARY_DNS;
 
        pn->iface_watch = connman_rtnl_add_newlink_watch(index,
                                                setup_tun_interface, pn);
-- 
1.7.1

_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to