Thus it is possible to know our local IP as well as the Peer's remote IP
to start contacting it directly.
---
src/peer.c | 67 +++++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 42 insertions(+), 25 deletions(-)
diff --git a/src/peer.c b/src/peer.c
index 81fc1d2..5e9006f 100644
--- a/src/peer.c
+++ b/src/peer.c
@@ -66,9 +66,12 @@ struct connman_peer {
bool connection_master;
struct connman_ippool *ip_pool;
GDHCPServer *dhcp_server;
+ uint32_t lease_ip;
GSList *services;
};
+static void settings_changed(struct connman_peer *peer);
+
static void stop_dhcp_server(struct connman_peer *peer)
{
DBG("");
@@ -88,6 +91,24 @@ static void dhcp_server_debug(const char *str, void *data)
connman_info("%s: %s\n", (const char *) data, str);
}
+static void lease_added(unsigned char *mac, uint32_t ip)
+{
+ GList *list, *start;
+
+ start = list = g_hash_table_get_values(peers_table);
+ for (; list; list = list->next) {
+ struct connman_peer *temp = list->data;
+
+ if (!memcmp(temp->iface_address, mac, ETH_ALEN)) {
+ temp->lease_ip = ip;
+ settings_changed(temp);
+ break;
+ }
+ }
+
+ g_list_free(start);
+}
+
static gboolean dhcp_server_started(gpointer data)
{
struct connman_peer *peer = data;
@@ -148,6 +169,8 @@ static int start_dhcp_server(struct connman_peer *peer)
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);
+ g_dhcp_server_set_lease_added_cb(peer->dhcp_server, lease_added);
+
err = g_dhcp_server_start(peer->dhcp_server);
if (err < 0)
goto error;
@@ -255,39 +278,33 @@ static bool allow_property_changed(struct connman_peer
*peer)
return true;
}
-static void append_dhcp_server_ipv4(DBusMessageIter *iter, void *user_data)
+static void append_ipv4(DBusMessageIter *iter, void *user_data)
{
struct connman_peer *peer = user_data;
- const char *str = "dhcp";
- const char *gateway;
- const char *subnet;
+ char trans[INET_ADDRSTRLEN+1] = {};
+ const char *local = "";
+ const char *remote = "";
- if (!peer->ip_pool)
+ if (!is_connected(peer))
return;
- gateway = __connman_ippool_get_gateway(peer->ip_pool);
- subnet = __connman_ippool_get_subnet_mask(peer->ip_pool);
+ if (peer->connection_master) {
+ struct in_addr addr;
- connman_dbus_dict_append_basic(iter, "Method", DBUS_TYPE_STRING, &str);
- connman_dbus_dict_append_basic(iter, "Address",
- DBUS_TYPE_STRING, &gateway);
- connman_dbus_dict_append_basic(iter, "Netmask",
- DBUS_TYPE_STRING, &subnet);
- connman_dbus_dict_append_basic(iter, "Gateway",
- DBUS_TYPE_STRING, &gateway);
-}
+ addr.s_addr = peer->lease_ip;
+ inet_ntop(AF_INET, &addr, trans, INET_ADDRSTRLEN);
-static void append_ipv4(DBusMessageIter *iter, void *user_data)
-{
- struct connman_peer *peer = user_data;
-
- if (!is_connected(peer))
- return;
+ local = __connman_ippool_get_gateway(peer->ip_pool);
+ remote = trans;
+ } else if (peer->ipconfig) {
+ local = __connman_ipconfig_get_local(peer->ipconfig);
+ remote = __connman_ipconfig_get_gateway(peer->ipconfig);
+ }
- if (peer->connection_master)
- append_dhcp_server_ipv4(iter, peer);
- else if (peer->ipconfig)
- __connman_ipconfig_append_ipv4(peer->ipconfig, iter);
+ connman_dbus_dict_append_basic(iter, "Local",
+ DBUS_TYPE_STRING, &local);
+ connman_dbus_dict_append_basic(iter, "Remote",
+ DBUS_TYPE_STRING, &remote);
}
static void append_peer_service(DBusMessageIter *iter,
--
2.0.4
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman