On 2016-08-11 14:02, Eduardo Abinader wrote:
> When netifd failed to load a valid configuration, after an invalid one,
> it was not possible to setup the wireless device. This patch
> aims to track this situation and behave acordingly, by keeping
> track of failed setup without affecting autostart behavior. Also
> block the restart of the wdev, when not applied.
> 
> Signed-off-by: Eduardo Abinader <eduardoabina...@gmail.com>
> ---
>  wireless.c | 26 ++++++++++++++++++++------
>  wireless.h |  1 +
>  2 files changed, 21 insertions(+), 6 deletions(-)
> 
> diff --git a/wireless.c b/wireless.c
> index 34dd328..1212a77 100644
> --- a/wireless.c
> +++ b/wireless.c
> @@ -287,7 +287,7 @@ __wireless_device_set_up(struct wireless_device *wdev)
>       if (wdev->disabled)
>               return;
>  
> -     if (wdev->state != IFS_DOWN || config_init)
> +     if ((wdev->config_state != IFC_RELOAD) && (wdev->state != IFS_DOWN || 
> config_init))
>               return;
>  
>       free(wdev->prev_config);
This part looks like it should be dropped now.

> @@ -313,11 +313,15 @@ wdev_handle_config_change(struct wireless_device *wdev)
>  
>       switch(state) {
>       case IFC_NORMAL:
> -     case IFC_RELOAD:
> -             wdev->config_state = IFC_NORMAL;
>               if (wdev->autostart)
>                       __wireless_device_set_up(wdev);
>               break;
> +     case IFC_RELOAD:
> +             if (wdev->autostart || wdev->retry_setup_failed)
> +                     __wireless_device_set_up(wdev);
You can move the wdev->retry_setup_failed (and maybe even autostart)
check to __wireless_device_set_up to avoid having to repeat it.

> +
> +             wdev->config_state = IFC_NORMAL;
> +             break;
>       case IFC_REMOVE:
>               wireless_device_free(wdev);
>               break;
> @@ -388,6 +392,13 @@ wireless_device_mark_up(struct wireless_device *wdev)
>  
>       D(WIRELESS, "Wireless device '%s' is now up\n", wdev->name);
>       wdev->state = IFS_UP;
> +
> +     if (wdev->retry_setup_failed) {
> +             wdev->retry_setup_failed = false;
> +
> +             /* a new chance is given, if a previous setup failed */
> +             wdev->autostart = true;
> +     }
>       vlist_for_each_element(&wdev->interfaces, vif, node)
>               wireless_interface_handle_link(vif, true);
>  }

> @@ -398,9 +409,10 @@ wireless_device_retry_setup(struct wireless_device *wdev)
>       if (wdev->state == IFS_TEARDOWN || wdev->state == IFS_DOWN || 
> wdev->cancel)
>               return;
>  
> -     if (--wdev->retry < 0)
> +     if (--wdev->retry < 0) {
>               wdev->autostart = false;
> -
> +             wdev->retry_setup_failed = true;
Please remove the wdev->autostart = false assignment here, and also the
wdev->autostart = true line in the chunk above.

> @@ -681,6 +693,7 @@ wireless_device_create(struct wireless_driver *drv, const 
> char *name, struct blo
>       wdev->config_state = IFC_NORMAL;
>       wdev->name = strcpy(name_buf, name);
>       wdev->config = data;
> +     wdev->retry_setup_failed = false;
>       wdev->config_autostart = true;
>       wdev->autostart = wdev->config_autostart;
>       INIT_LIST_HEAD(&wdev->script_proc);
> @@ -991,6 +1004,7 @@ wireless_start_pending(void)
>       struct wireless_device *wdev;
>  
>       vlist_for_each_element(&wireless_devices, wdev, node)
> -             if (wdev->autostart)
> +             if (wdev->autostart && wdev->state == IFS_DOWN)
Why did you make this change?

- Felix

_______________________________________________
Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev

Reply via email to