Re: apply changes immediately to join'd essids

2020-01-14 Thread Stefan Sperling
On Tue, Jan 14, 2020 at 06:12:27PM +0100, Peter Hessler wrote:
> Updated diff
> 
> 

Look good. Thanks!

ok stsp@

> Index: net80211/ieee80211_ioctl.c
> ===
> RCS file: /home/cvs/openbsd/src/sys/net80211/ieee80211_ioctl.c,v
> retrieving revision 1.78
> diff -u -p -u -p -r1.78 ieee80211_ioctl.c
> --- net80211/ieee80211_ioctl.c13 Jan 2020 09:57:25 -  1.78
> +++ net80211/ieee80211_ioctl.c14 Jan 2020 13:52:18 -
> @@ -512,6 +512,8 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
>   case SIOCS80211JOIN:
>   if ((error = suser(curproc)) != 0)
>   break;
> + if (ic->ic_opmode != IEEE80211_M_STA)
> + break;
>   if ((error = copyin(ifr->ifr_data, , sizeof(join))) != 0)
>   break;
>   if (join.i_len > IEEE80211_NWID_LEN) {
> @@ -543,7 +545,13 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
>   if (ic->ic_des_esslen == join.i_len &&
>   memcmp(join.i_nwid, ic->ic_des_essid,
>   join.i_len) == 0) {
> + struct ieee80211_node *ni;
> +
>   ieee80211_deselect_ess(ic);
> + ni = ieee80211_find_node(ic,
> + ic->ic_bss->ni_bssid);
> + if (ni != NULL)
> + ieee80211_free_node(ic, ni);
>   error = ENETRESET;
>   }
>   /* save nwid for auto-join */
> Index: net80211/ieee80211_node.c
> ===
> RCS file: /home/cvs/openbsd/src/sys/net80211/ieee80211_node.c,v
> retrieving revision 1.178
> diff -u -p -u -p -r1.178 ieee80211_node.c
> --- net80211/ieee80211_node.c 29 Dec 2019 14:00:36 -  1.178
> +++ net80211/ieee80211_node.c 14 Jan 2020 13:53:55 -
> @@ -72,7 +72,6 @@ int ieee80211_ess_is_better(struct ieee8
>  void ieee80211_node_set_timeouts(struct ieee80211_node *);
>  void ieee80211_setup_node(struct ieee80211com *, struct ieee80211_node *,
>  const u_int8_t *);
> -void ieee80211_free_node(struct ieee80211com *, struct ieee80211_node *);
>  struct ieee80211_node *ieee80211_alloc_node_helper(struct ieee80211com *);
>  void ieee80211_node_switch_bss(struct ieee80211com *, struct ieee80211_node 
> *);
>  void ieee80211_node_addba_request(struct ieee80211_node *, int);
> Index: net80211/ieee80211_node.h
> ===
> RCS file: /home/cvs/openbsd/src/sys/net80211/ieee80211_node.h,v
> retrieving revision 1.84
> diff -u -p -u -p -r1.84 ieee80211_node.h
> --- net80211/ieee80211_node.h 29 Dec 2019 13:49:22 -  1.84
> +++ net80211/ieee80211_node.h 14 Jan 2020 13:54:18 -
> @@ -533,6 +533,7 @@ void ieee80211_create_ibss(struct ieee80
>   struct ieee80211_channel *);
>  void ieee80211_notify_dtim(struct ieee80211com *);
>  void ieee80211_set_tim(struct ieee80211com *, int, int);
> +void ieee80211_free_node(struct ieee80211com *, struct ieee80211_node *);
>  
>  int ieee80211_node_cmp(const struct ieee80211_node *,
>   const struct ieee80211_node *);
> 
> 
> -- 
> This sentence contradicts itself -- no actually it doesn't.
>   -- Hofstadter
> 
> 



Re: apply changes immediately to join'd essids

2020-01-14 Thread Peter Hessler
On 2020 Jan 14 (Tue) at 13:11:57 +0100 (+0100), Stefan Sperling wrote:
:On Mon, Jan 13, 2020 at 10:38:35PM +0100, Peter Hessler wrote:
:> On 2020 Jan 12 (Sun) at 21:39:19 +0100 (+0100), Peter Hessler wrote:
:> :When we change attributes for a join essid, we should apply the change
:> :immediately instead of waiting to (randomly) switch away and switch
:> :back.
:> 
:> And if we are connected to an AP, remove the node from the cache so we
:> can properly reconnect.
:> 
:> OK?
:> 
:> 
...

:This should call ieee80211_free_node() instead. We should also make
:sure this code runs in station opmode (IEEE80211_M_STA) only.
:

...

Updated diff


Index: net80211/ieee80211_ioctl.c
===
RCS file: /home/cvs/openbsd/src/sys/net80211/ieee80211_ioctl.c,v
retrieving revision 1.78
diff -u -p -u -p -r1.78 ieee80211_ioctl.c
--- net80211/ieee80211_ioctl.c  13 Jan 2020 09:57:25 -  1.78
+++ net80211/ieee80211_ioctl.c  14 Jan 2020 13:52:18 -
@@ -512,6 +512,8 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
case SIOCS80211JOIN:
if ((error = suser(curproc)) != 0)
break;
+   if (ic->ic_opmode != IEEE80211_M_STA)
+   break;
if ((error = copyin(ifr->ifr_data, , sizeof(join))) != 0)
break;
if (join.i_len > IEEE80211_NWID_LEN) {
@@ -543,7 +545,13 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
if (ic->ic_des_esslen == join.i_len &&
memcmp(join.i_nwid, ic->ic_des_essid,
join.i_len) == 0) {
+   struct ieee80211_node *ni;
+
ieee80211_deselect_ess(ic);
+   ni = ieee80211_find_node(ic,
+   ic->ic_bss->ni_bssid);
+   if (ni != NULL)
+   ieee80211_free_node(ic, ni);
error = ENETRESET;
}
/* save nwid for auto-join */
Index: net80211/ieee80211_node.c
===
RCS file: /home/cvs/openbsd/src/sys/net80211/ieee80211_node.c,v
retrieving revision 1.178
diff -u -p -u -p -r1.178 ieee80211_node.c
--- net80211/ieee80211_node.c   29 Dec 2019 14:00:36 -  1.178
+++ net80211/ieee80211_node.c   14 Jan 2020 13:53:55 -
@@ -72,7 +72,6 @@ int ieee80211_ess_is_better(struct ieee8
 void ieee80211_node_set_timeouts(struct ieee80211_node *);
 void ieee80211_setup_node(struct ieee80211com *, struct ieee80211_node *,
 const u_int8_t *);
-void ieee80211_free_node(struct ieee80211com *, struct ieee80211_node *);
 struct ieee80211_node *ieee80211_alloc_node_helper(struct ieee80211com *);
 void ieee80211_node_switch_bss(struct ieee80211com *, struct ieee80211_node *);
 void ieee80211_node_addba_request(struct ieee80211_node *, int);
Index: net80211/ieee80211_node.h
===
RCS file: /home/cvs/openbsd/src/sys/net80211/ieee80211_node.h,v
retrieving revision 1.84
diff -u -p -u -p -r1.84 ieee80211_node.h
--- net80211/ieee80211_node.h   29 Dec 2019 13:49:22 -  1.84
+++ net80211/ieee80211_node.h   14 Jan 2020 13:54:18 -
@@ -533,6 +533,7 @@ void ieee80211_create_ibss(struct ieee80
struct ieee80211_channel *);
 void ieee80211_notify_dtim(struct ieee80211com *);
 void ieee80211_set_tim(struct ieee80211com *, int, int);
+void ieee80211_free_node(struct ieee80211com *, struct ieee80211_node *);
 
 int ieee80211_node_cmp(const struct ieee80211_node *,
const struct ieee80211_node *);


-- 
This sentence contradicts itself -- no actually it doesn't.
-- Hofstadter



Re: apply changes immediately to join'd essids

2020-01-14 Thread Stefan Sperling
On Mon, Jan 13, 2020 at 10:38:35PM +0100, Peter Hessler wrote:
> On 2020 Jan 12 (Sun) at 21:39:19 +0100 (+0100), Peter Hessler wrote:
> :When we change attributes for a join essid, we should apply the change
> :immediately instead of waiting to (randomly) switch away and switch
> :back.
> 
> And if we are connected to an AP, remove the node from the cache so we
> can properly reconnect.
> 
> OK?
> 
> 
> Index: net80211/ieee80211_ioctl.c
> ===
> RCS file: /home/cvs/openbsd/src/sys/net80211/ieee80211_ioctl.c,v
> retrieving revision 1.78
> diff -u -p -u -p -r1.78 ieee80211_ioctl.c
> --- net80211/ieee80211_ioctl.c13 Jan 2020 09:57:25 -  1.78
> +++ net80211/ieee80211_ioctl.c13 Jan 2020 16:16:18 -
> @@ -543,7 +543,13 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
>   if (ic->ic_des_esslen == join.i_len &&
>   memcmp(join.i_nwid, ic->ic_des_essid,
>   join.i_len) == 0) {
> + struct ieee80211_node *ni;
> +
>   ieee80211_deselect_ess(ic);
> + ni = ieee80211_find_node(ic,
> + ic->ic_bss->ni_bssid);
> + if (ni != NULL)
> + ieee80211_release_node(ic, ni);

This should call ieee80211_free_node() instead. We should also make
sure this code runs in station opmode (IEEE80211_M_STA) only.

>   error = ENETRESET;
>   }
>   /* save nwid for auto-join */
> 



Re: apply changes immediately to join'd essids

2020-01-14 Thread Peter Hessler
On 2020 Jan 12 (Sun) at 21:39:19 +0100 (+0100), Peter Hessler wrote:
:When we change attributes for a join essid, we should apply the change
:immediately instead of waiting to (randomly) switch away and switch
:back.

And if we are connected to an AP, remove the node from the cache so we
can properly reconnect.

OK?


Index: net80211/ieee80211_ioctl.c
===
RCS file: /home/cvs/openbsd/src/sys/net80211/ieee80211_ioctl.c,v
retrieving revision 1.78
diff -u -p -u -p -r1.78 ieee80211_ioctl.c
--- net80211/ieee80211_ioctl.c  13 Jan 2020 09:57:25 -  1.78
+++ net80211/ieee80211_ioctl.c  13 Jan 2020 16:16:18 -
@@ -543,7 +543,13 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
if (ic->ic_des_esslen == join.i_len &&
memcmp(join.i_nwid, ic->ic_des_essid,
join.i_len) == 0) {
+   struct ieee80211_node *ni;
+
ieee80211_deselect_ess(ic);
+   ni = ieee80211_find_node(ic,
+   ic->ic_bss->ni_bssid);
+   if (ni != NULL)
+   ieee80211_release_node(ic, ni);
error = ENETRESET;
}
/* save nwid for auto-join */



Re: apply changes immediately to join'd essids

2020-01-12 Thread Stefan Sperling
On Sun, Jan 12, 2020 at 09:39:19PM +0100, Peter Hessler wrote:
> When we change attributes for a join essid, we should apply the change
> immediately instead of waiting to (randomly) switch away and switch
> back.
> 
> Found by martijn@
> 
> OK?
> 
> Index: net80211/ieee80211_ioctl.c
> ===
> RCS file: /home/cvs/openbsd/src/sys/net80211/ieee80211_ioctl.c,v
> retrieving revision 1.77
> diff -u -p -u -p -r1.77 ieee80211_ioctl.c
> --- net80211/ieee80211_ioctl.c11 Nov 2019 18:07:21 -  1.77
> +++ net80211/ieee80211_ioctl.c12 Jan 2020 18:38:44 -
> @@ -540,6 +540,17 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
>   error = ENETRESET;
>   }
>   } else {
> + /* 
> +  * We are reconfiguring the active essid,

Perhaps say "If we are reconfiguring..., reset the interface." instead?
Whether we're reconfiguring depends on the result of the check you're
adding below, while the comment makes it sound as if this decision had
been made further up. Alternatively we could just remove the comment.

> +  * so reset the interface.
> +  */
> + if (ic->ic_des_esslen == join.i_len &&
> + memcmp(join.i_nwid, ic->ic_des_essid,
> + join.i_len) == 0) {
> + ieee80211_deselect_ess(ic);
> + error = ENETRESET;
> + }
> +
>   /* save nwid for auto-join */
>   if (ieee80211_add_ess(ic, ) == 0)
>   ic->ic_flags |= IEEE80211_F_AUTO_JOIN;
>