On Tue, Mar 21, 2017 at 09:16:39AM +0100, Antoine Jacoutot wrote:
> On Tue, Mar 21, 2017 at 02:10:48PM +0900, Stefan Sperling wrote:
> > I see no reason to leave WEP enabled if a WPA key is set, and leaving
> > WPA enabled when a WEP key is set.
> > 
> > Several cases of "my wifi suddenly stopped working" turned out to be due
> > to stale WEP keys interfering with WPA. I think it is better to let the
> > kernel handle this transition instead of requiring 'ifconfig -nwkey'.
> 
> I fully agree. I've been annoyed by this countless times :-)
> 

same here


> > Index: ieee80211_ioctl.c
> > ===================================================================
> > RCS file: /cvs/src/sys/net80211/ieee80211_ioctl.c,v
> > retrieving revision 1.50
> > diff -u -p -r1.50 ieee80211_ioctl.c
> > --- ieee80211_ioctl.c       12 Mar 2017 03:13:50 -0000      1.50
> > +++ ieee80211_ioctl.c       21 Mar 2017 05:03:46 -0000
> > @@ -55,6 +55,8 @@ void       ieee80211_node2req(struct ieee8021
> >         const struct ieee80211_node *, struct ieee80211_nodereq *);
> >  void        ieee80211_req2node(struct ieee80211com *,
> >         const struct ieee80211_nodereq *, struct ieee80211_node *);
> > +void        ieee80211_disable_wep(struct ieee80211com *); 
> > +void        ieee80211_disable_rsn(struct ieee80211com *); 
> >  
> >  void
> >  ieee80211_node2req(struct ieee80211com *ic, const struct ieee80211_node 
> > *ni,
> > @@ -166,6 +168,32 @@ ieee80211_req2node(struct ieee80211com *
> >     ni->ni_state = nr->nr_state;
> >  }
> >  
> > +void
> > +ieee80211_disable_wep(struct ieee80211com *ic)
> > +{
> > +   struct ieee80211_key *k;
> > +   int i;
> > +   
> > +   for (i = 0; i < IEEE80211_WEP_NKID; i++) {
> > +           k = &ic->ic_nw_keys[i];
> > +           if (k->k_cipher != IEEE80211_CIPHER_NONE)
> > +                   (*ic->ic_delete_key)(ic, NULL, k);
> > +           memset(k, 0, sizeof(*k));
> > +   }
> > +   ic->ic_flags &= ~IEEE80211_F_WEPON;
> > +}
> > +
> > +void
> > +ieee80211_disable_rsn(struct ieee80211com *ic)
> > +{
> > +   ic->ic_flags &= ~(IEEE80211_F_PSK | IEEE80211_F_RSNON);
> > +   memset(ic->ic_psk, 0, sizeof(ic->ic_psk));
> > +   ic->ic_rsnprotos = 0;
> > +   ic->ic_rsnakms = 0;
> > +   ic->ic_rsngroupcipher = 0;
> > +   ic->ic_rsnciphers = 0;
> > +}
> > +
> >  static int
> >  ieee80211_ioctl_setnwkeys(struct ieee80211com *ic,
> >      const struct ieee80211_nwkey *nwkey)
> > @@ -212,6 +240,8 @@ ieee80211_ioctl_setnwkeys(struct ieee802
> >  
> >     ic->ic_def_txkey = nwkey->i_defkid - 1;
> >     ic->ic_flags |= IEEE80211_F_WEPON;
> > +   if (ic->ic_flags & IEEE80211_F_RSNON)
> > +           ieee80211_disable_rsn(ic);
> >  
> >     return ENETRESET;
> >  }
> > @@ -464,6 +494,8 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
> >             if (psk->i_enabled) {
> >                     ic->ic_flags |= IEEE80211_F_PSK;
> >                     memcpy(ic->ic_psk, psk->i_psk, sizeof(ic->ic_psk));
> > +                   if (ic->ic_flags & IEEE80211_F_WEPON)
> > +                           ieee80211_disable_wep(ic);
> >             } else {
> >                     ic->ic_flags &= ~IEEE80211_F_PSK;
> >                     memset(ic->ic_psk, 0, sizeof(ic->ic_psk));
> > @@ -496,6 +528,8 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
> >                     break;
> >             kr = (struct ieee80211_keyrun *)data;
> >             error = ieee80211_keyrun(ic, kr->i_macaddr);
> > +           if (error == 0 && (ic->ic_flags & IEEE80211_F_WEPON))
> > +                   ieee80211_disable_wep(ic);
> >             break;
> >     case SIOCS80211POWER:
> >             if ((error = suser(curproc, 0)) != 0)
> > 
> 
> -- 
> Antoine
> 

-- 
Gilles Chehade

https://www.poolp.org                                          @poolpOrg

Reply via email to