int connman_peer_set_state(struct connman_peer *peer, enum connman_peer_state new_state) { enum connman_peer_state old_state = peer->state; int err; DBG("peer (%s) old state %d new state %d", peer->name, old_state, new_state); if (old_state == new_state) return -EALREADY; switch (new_state) { case CONNMAN_PEER_STATE_UNKNOWN: return -EINVAL; case CONNMAN_PEER_STATE_IDLE: if (is_connecting(peer) || is_connected(peer)) return peer_disconnect(peer); peer->sub_device = NULL; break; case CONNMAN_PEER_STATE_ASSOCIATION: break; case CONNMAN_PEER_STATE_CONFIGURATION: if (peer->connection_master) err = start_dhcp_server(peer); else err = start_dhcp_client(peer); if (err < 0) return connman_peer_set_state(peer, CONNMAN_PEER_STATE_FAILURE); break; case CONNMAN_PEER_STATE_READY: reply_pending(peer, 0); break; case CONNMAN_PEER_STATE_DISCONNECT: if (peer->connection_master) stop_dhcp_server(peer); peer->connection_master = false; peer->sub_device = NULL; break; case CONNMAN_PEER_STATE_FAILURE: if (manage_peer_error(peer) == 0) return 0; break; }; peer->state = new_state; state_changed(peer); return 0; }
static void network_ifconf_dhcp( int timeout ) { start_dhcp_client(timeout); }