Hi Marcel: Please ignore the patch, I found current git has already has the fix. In __connman_network_connect(), the connected network will be disconnected before connect to new network. I think the issue only exists on 0.19 version. I will double check the latest git when I copy with the bugs in the following days.
>-----Original Message----- >From: [email protected] [mailto:[email protected]] On >Behalf Of Xu, Martin >Sent: 2009年6月3日 17:06 >To: [email protected] >Cc: Liu, Bing Wei >Subject: Re: [connman] old IP and Route should be cleared when new service >connection failed > >Hi Marcel: >The patch can fix the issue, please review it. >When connect to new service, the patch will find the ready service on the same >device. If found, disconnect it firstly. >I have verified the patch, it can work fine. > > >diff --git a/src/service.c b/src/service.c >index aa89d5d..e7ad577 100644 >--- a/src/service.c >+++ b/src/service.c >@@ -372,9 +372,40 @@ static gboolean connect_timeout(gpointer user_data) > return FALSE; > } > >+struct find_data_device { >+ struct connman_device *device; >+ struct connman_service *service; >+}; >+ >+static void compare_device(gpointer value, gpointer user_data) >+{ >+ struct connman_service *service = value; >+ struct find_data_device *data = user_data; >+ >+ if (data->service != NULL) >+ return; >+ >+ if (service->device == data->device && >+ service->state == CONNMAN_SERVICE_STATE_READY) >+ data->service = service; >+} >+ >+static struct connman_service *get_ready_service_from_device( >+ struct >connman_device *device) >+{ >+ struct find_data_device data = { .device = device, .service = NULL }; >+ >+ DBG("device 0x%p", device); >+ >+ g_sequence_foreach(service_list, compare_device, &data); >+ >+ return data.service; >+} >+ > static DBusMessage *connect_service(DBusConnection *conn, > DBusMessage *msg, void *user_data) > { >+ struct connman_service *ready_service = NULL; > struct connman_service *service = user_data; > > DBG("service %p", service); >@@ -385,6 +416,8 @@ static DBusMessage *connect_service(DBusConnection *conn, > if (service->state == CONNMAN_SERVICE_STATE_READY) > return __connman_error_already_connected(msg); > >+ ready_service = get_ready_service_from_device(service->device); >+ > if (service->network != NULL) { > int err; > >@@ -394,6 +427,10 @@ static DBusMessage *connect_service(DBusConnection *conn, > connman_network_set_string(service->network, > "WiFi.Passphrase", service->passphrase); > >+ if (ready_service != NULL) >+ if (ready_service->network != NULL) >+ __connman_network_disconnect(service->network); >+ > err = __connman_network_connect(service->network); > if (err < 0 && err != -EINPROGRESS) > return __connman_error_failed(msg, -err); >@@ -408,6 +445,10 @@ static DBusMessage *connect_service(DBusConnection *conn, > if (service->favorite == FALSE) > return __connman_error_no_carrier(msg); > >+ if (ready_service != NULL) >+ if (ready_service->device != NULL) >+ __connman_device_disconnect(service->device); >+ > if (__connman_device_connect(service->device) < 0) > return __connman_error_failed(msg, EINVAL); > >@@ -1207,6 +1248,8 @@ struct connman_service >*__connman_service_create_from_network(struct connman_net > > update_from_network(service, network); > >+ service->device = connman_network_get_device(network); >+ > service_register(service); > > done: > >-----Original Message----- >From: [email protected] [mailto:[email protected]] On >Behalf Of Marcel Holtmann >Sent: 2009年6月1日 22:34 >To: [email protected] >Cc: Liu, Bing Wei >Subject: Re: [connman] old IP and Route should be cleared when new service >connection failed > >Hi Martin, > >> I found that when you connect new service(wifi service), if the association >failed, the IP address and route table may mess up. The failed association may >broken the original association, but not clear the original IP and Route table. >So the original IP/Route is still there. Consequently, Carrick will show >strange >network states. >> I think we can disconnect the original service before connect to new one to >resolve the issue. Or to clear the original connection and route after new >connection failed. >> The related Carrick bug is: #2737 > >this makes sense and is similar to previous DHCP element registration >issues I have seen, but never was able to pin-point them. I will be >earliest looking into this next week. So feel free to sent patches. > >Regards > >Marcel > > >_______________________________________________ >connman mailing list >[email protected] >https://lists.moblin.org/mailman/listinfo/connman >_______________________________________________ >connman mailing list >[email protected] >https://lists.moblin.org/mailman/listinfo/connman _______________________________________________ connman mailing list [email protected] http://lists.connman.net/listinfo/connman
