A peer might get connected through a newly created specific device, thus
the ipconfig needs to be aware of its index so it will set the ip
address on the right interface.
---
include/peer.h | 2 ++
src/peer.c | 17 +++++++++++++++++
2 files changed, 19 insertions(+)
diff --git a/include/peer.h b/include/peer.h
index 260c4af..cdaee49 100644
--- a/include/peer.h
+++ b/include/peer.h
@@ -56,6 +56,8 @@ void connman_peer_set_name(struct connman_peer *peer, const
char *name);
void connman_peer_set_device(struct connman_peer *peer,
struct connman_device *device);
struct connman_device *connman_peer_get_device(struct connman_peer *peer);
+void connman_peer_set_sub_device(struct connman_peer *peer,
+ struct connman_device *device);
int connman_peer_set_state(struct connman_peer *peer,
enum connman_peer_state new_state);
diff --git a/src/peer.c b/src/peer.c
index a532a57..a905f04 100644
--- a/src/peer.c
+++ b/src/peer.c
@@ -43,6 +43,7 @@ struct _peers_notify {
struct connman_peer {
int refcount;
struct connman_device *device;
+ struct connman_device *sub_device;
char *identifier;
char *name;
char *path;
@@ -474,6 +475,15 @@ struct connman_device *connman_peer_get_device(struct
connman_peer *peer)
return peer->device;
}
+void connman_peer_set_sub_device(struct connman_peer *peer,
+ struct connman_device *device)
+{
+ if (!peer || !device || peer->sub_device)
+ return;
+
+ peer->sub_device = device;
+}
+
static void dhcp_callback(struct connman_ipconfig *ipconfig,
struct connman_network *network,
bool success, gpointer data)
@@ -510,9 +520,14 @@ int connman_peer_set_state(struct connman_peer *peer,
case CONNMAN_PEER_STATE_UNKNOWN:
return -EINVAL;
case CONNMAN_PEER_STATE_IDLE:
+ peer->sub_device = NULL;
+ break;
case CONNMAN_PEER_STATE_ASSOCIATION:
break;
case CONNMAN_PEER_STATE_CONFIGURATION:
+ if (peer->sub_device)
+ __connman_ipconfig_set_index(peer->ipconfig,
+ connman_device_get_index(peer->sub_device));
__connman_ipconfig_enable(peer->ipconfig);
err = __connman_dhcp_start(peer->ipconfig,
@@ -525,11 +540,13 @@ int connman_peer_set_state(struct connman_peer *peer,
reply_pending(peer, 0);
break;
case CONNMAN_PEER_STATE_DISCONNECT:
+ peer->sub_device = NULL;
break;
case CONNMAN_PEER_STATE_FAILURE:
reply_pending(peer, ENOTCONN);
__connman_dhcp_stop(peer->ipconfig);
__connman_ipconfig_disable(peer->ipconfig);
+ peer->sub_device = NULL;
break;
};
--
1.8.5.5
_______________________________________________
connman mailing list
[email protected]
https://lists.connman.net/mailman/listinfo/connman