> Date: Sat, 26 Sep 2015 19:21:28 +0200
> From: Stefan Sperling <s...@stsp.name>
> 
> On Sat, Sep 26, 2015 at 11:32:06AM -0400, Ted Unangst wrote:
> > can we please use memcpy in new code?
> 
> Sure. New diff below.
> 
> Also uses less pointless casts in net/if.c as requested by guenther@

ok kettenis@

> Index: dev/pci/if_iwm.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
> retrieving revision 1.49
> diff -u -p -r1.49 if_iwm.c
> --- dev/pci/if_iwm.c  26 Sep 2015 10:52:09 -0000      1.49
> +++ dev/pci/if_iwm.c  26 Sep 2015 15:06:42 -0000
> @@ -2803,8 +2803,10 @@ iwm_run_init_mvm_ucode(struct iwm_softc 
>                       printf("%s: failed to read nvm\n", DEVNAME(sc));
>                       return error;
>               }
> -             memcpy(&sc->sc_ic.ic_myaddr,
> -                 &sc->sc_nvm.hw_addr, ETHER_ADDR_LEN);
> +
> +             if (IEEE80211_ADDR_EQ(etheranyaddr, sc->sc_ic.ic_myaddr))
> +                     IEEE80211_ADDR_COPY(sc->sc_ic.ic_myaddr,
> +                         sc->sc_nvm.hw_addr);
>  
>               sc->sc_scan_cmd_len = sizeof(struct iwm_scan_cmd)
>                   + sc->sc_capa_max_probe_len
> @@ -4634,7 +4636,8 @@ iwm_mvm_ack_rates(struct iwm_softc *sc, 
>       uint8_t ofdm = 0;
>       int i;
>  
> -     if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
> +     if (ni->ni_chan == IEEE80211_CHAN_ANYC ||
> +         IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
>               for (i = 0; i <= IWM_LAST_CCK_RATE; i++) {
>                       cck |= (1 << i);
>                       if (lowest_present_cck > i)
> @@ -4998,11 +5001,6 @@ iwm_auth(struct iwm_softc *sc)
>       if (error)
>               return error;
>  
> -     if ((error = iwm_mvm_mac_ctxt_add(sc, in)) != 0) {
> -             DPRINTF(("%s: failed to add MAC\n", DEVNAME(sc)));
> -             return error;
> -     }
> -
>       if ((error = iwm_mvm_phy_ctxt_changed(sc, &sc->sc_phyctxt[0],
>           in->in_ni.ni_chan, 1, 1)) != 0) {
>               DPRINTF(("%s: failed add phy ctxt\n", DEVNAME(sc)));
> @@ -5455,6 +5453,7 @@ int
>  iwm_init_hw(struct iwm_softc *sc)
>  {
>       struct ieee80211com *ic = &sc->sc_ic;
> +     struct iwm_node *in = (struct iwm_node *)ic->ic_bss;
>       int error, i, qid;
>  
>       if ((error = iwm_preinit(sc)) != 0)
> @@ -5518,6 +5517,12 @@ iwm_init_hw(struct iwm_softc *sc)
>               iwm_enable_txq(sc, qid, qid);
>       }
>  
> +     /* Add the MAC context. */
> +     if ((error = iwm_mvm_mac_ctxt_add(sc, in)) != 0) {
> +             printf("%s: failed to add MAC\n", DEVNAME(sc));
> +             goto error;
> +     }
> +
>       return 0;
>  
>   error:
> @@ -5754,6 +5759,11 @@ iwm_ioctl(struct ifnet *ifp, u_long cmd,
>                       error = 0;
>               break;
>  
> +     case SIOCSIFLLADDR:
> +             IEEE80211_ADDR_COPY(sc->sc_ic.ic_myaddr,
> +                 ((struct arpcom *)ifp)->ac_enaddr);
> +             break;
> +
>       default:
>               error = ieee80211_ioctl(ifp, cmd, data);
>       }
> @@ -6370,9 +6380,14 @@ iwm_preinit(struct iwm_softc *sc)
>               memset(&ic->ic_sup_rates[IEEE80211_MODE_11A], 0,
>                   sizeof(ic->ic_sup_rates[IEEE80211_MODE_11A]));
>  
> -     /* Reattach net80211 so MAC address and channel map are picked up. */
> -     ieee80211_ifdetach(ifp);
> -     ieee80211_ifattach(ifp);
> +     /* Configure channel information obtained from firmware. */
> +     ieee80211_channel_init(ifp);
> +
> +     /* Configure MAC address. */
> +     error = if_setlladdr(ifp, ic->ic_myaddr);
> +     if (error)
> +             printf("%s: could not set MAC address (error %d)\n",
> +                 DEVNAME(sc), error);
>  
>       ic->ic_node_alloc = iwm_node_alloc;
>  
> Index: net/if.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if.c,v
> retrieving revision 1.380
> diff -u -p -r1.380 if.c
> --- net/if.c  13 Sep 2015 18:15:03 -0000      1.380
> +++ net/if.c  26 Sep 2015 17:08:55 -0000
> @@ -1568,6 +1568,18 @@ if_put(struct ifnet *ifp)
>       atomic_dec_int(&ifp->if_refcnt);
>  }
>  
> +int
> +if_setlladdr(struct ifnet *ifp, const uint8_t *lladdr)
> +{
> +     if (ifp->if_sadl == NULL)
> +             return (EINVAL);
> +
> +     memcpy(((struct arpcom *)ifp)->ac_enaddr, lladdr, ETHER_ADDR_LEN);
> +     memcpy(LLADDR(ifp->if_sadl), lladdr, ETHER_ADDR_LEN);
> +
> +     return (0);
> +}
> +
>  /*
>   * Interface ioctls.
>   */
> @@ -1969,11 +1981,7 @@ ifioctl(struct socket *so, u_long cmd, c
>               case IFT_CARP:
>               case IFT_XETHER:
>               case IFT_ISO88025:
> -                     bcopy((caddr_t)ifr->ifr_addr.sa_data,
> -                         (caddr_t)((struct arpcom *)ifp)->ac_enaddr,
> -                         ETHER_ADDR_LEN);
> -                     bcopy((caddr_t)ifr->ifr_addr.sa_data,
> -                         LLADDR(sdl), ETHER_ADDR_LEN);
> +                     if_setlladdr(ifp, ifr->ifr_addr.sa_data);
>                       error = (*ifp->if_ioctl)(ifp, cmd, data);
>                       if (error == ENOTTY)
>                               error = 0;
> Index: net/if.h
> ===================================================================
> RCS file: /cvs/src/sys/net/if.h,v
> retrieving revision 1.167
> diff -u -p -r1.167 if.h
> --- net/if.h  11 Sep 2015 13:02:28 -0000      1.167
> +++ net/if.h  26 Sep 2015 17:00:07 -0000
> @@ -469,6 +469,7 @@ void      ifnewlladdr(struct ifnet *);
>  void if_congestion(void);
>  int  if_congested(void);
>  __dead void  unhandled_af(int);
> +int  if_setlladdr(struct ifnet *, const uint8_t *);
>  
>  #endif /* _KERNEL */
>  
> Index: net/if_ethersubr.c
> ===================================================================
> RCS file: /cvs/src/sys/net/if_ethersubr.c,v
> retrieving revision 1.226
> diff -u -p -r1.226 if_ethersubr.c
> --- net/if_ethersubr.c        17 Sep 2015 04:53:27 -0000      1.226
> +++ net/if_ethersubr.c        26 Sep 2015 13:41:28 -0000
> @@ -121,8 +121,10 @@ didn't get a copy, you may request one f
>  #include <netmpls/mpls.h>
>  #endif /* MPLS */
>  
> -u_char etherbroadcastaddr[ETHER_ADDR_LEN] =
> +u_int8_t etherbroadcastaddr[ETHER_ADDR_LEN] =
>      { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
> +u_int8_t etheranyaddr[ETHER_ADDR_LEN] =
> +    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
>  #define senderr(e) { error = (e); goto bad;}
>  
>  int
> Index: net80211/ieee80211.c
> ===================================================================
> RCS file: /cvs/src/sys/net80211/ieee80211.c,v
> retrieving revision 1.45
> diff -u -p -r1.45 ieee80211.c
> --- net80211/ieee80211.c      11 Sep 2015 13:02:28 -0000      1.45
> +++ net80211/ieee80211.c      26 Sep 2015 13:41:28 -0000
> @@ -72,24 +72,12 @@ void ieee80211_setbasicrates(struct ieee
>  int ieee80211_findrate(struct ieee80211com *, enum ieee80211_phymode, int);
>  
>  void
> -ieee80211_ifattach(struct ifnet *ifp)
> +ieee80211_channel_init(struct ifnet *ifp)
>  {
>       struct ieee80211com *ic = (void *)ifp;
>       struct ieee80211_channel *c;
>       int i;
>  
> -     memcpy(((struct arpcom *)ifp)->ac_enaddr, ic->ic_myaddr,
> -             ETHER_ADDR_LEN);
> -     ether_ifattach(ifp);
> -
> -     ifp->if_output = ieee80211_output;
> -
> -#if NBPFILTER > 0
> -     bpfattach(&ic->ic_rawbpf, ifp, DLT_IEEE802_11,
> -         sizeof(struct ieee80211_frame_addr4));
> -#endif
> -     ieee80211_crypto_attach(ifp);
> -
>       /*
>        * Fill in 802.11 available channel set, mark
>        * all available channels as active, and pick
> @@ -130,6 +118,26 @@ ieee80211_ifattach(struct ifnet *ifp)
>               ic->ic_curmode = IEEE80211_MODE_AUTO;
>       ic->ic_des_chan = IEEE80211_CHAN_ANYC;  /* any channel is ok */
>       ic->ic_scan_lock = IEEE80211_SCAN_UNLOCKED;
> +}
> +
> +void
> +ieee80211_ifattach(struct ifnet *ifp)
> +{
> +     struct ieee80211com *ic = (void *)ifp;
> +
> +     memcpy(((struct arpcom *)ifp)->ac_enaddr, ic->ic_myaddr,
> +             ETHER_ADDR_LEN);
> +     ether_ifattach(ifp);
> +
> +     ifp->if_output = ieee80211_output;
> +
> +#if NBPFILTER > 0
> +     bpfattach(&ic->ic_rawbpf, ifp, DLT_IEEE802_11,
> +         sizeof(struct ieee80211_frame_addr4));
> +#endif
> +     ieee80211_crypto_attach(ifp);
> +
> +     ieee80211_channel_init(ifp);
>  
>       /* IEEE 802.11 defines a MTU >= 2290 */
>       ifp->if_capabilities |= IFCAP_VLAN_MTU;
> Index: net80211/ieee80211_var.h
> ===================================================================
> RCS file: /cvs/src/sys/net80211/ieee80211_var.h,v
> retrieving revision 1.63
> diff -u -p -r1.63 ieee80211_var.h
> --- net80211/ieee80211_var.h  11 Sep 2015 13:02:28 -0000      1.63
> +++ net80211/ieee80211_var.h  26 Sep 2015 13:41:28 -0000
> @@ -380,6 +380,7 @@ extern struct ieee80211com_head ieee8021
>  
>  void ieee80211_ifattach(struct ifnet *);
>  void ieee80211_ifdetach(struct ifnet *);
> +void ieee80211_channel_init(struct ifnet *);
>  void ieee80211_media_init(struct ifnet *, ifm_change_cb_t, ifm_stat_cb_t);
>  int  ieee80211_media_change(struct ifnet *);
>  void ieee80211_media_status(struct ifnet *, struct ifmediareq *);
> Index: netinet/if_ether.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/if_ether.h,v
> retrieving revision 1.59
> diff -u -p -r1.59 if_ether.h
> --- netinet/if_ether.h        13 Sep 2015 10:42:32 -0000      1.59
> +++ netinet/if_ether.h        26 Sep 2015 13:41:28 -0000
> @@ -186,6 +186,7 @@ struct sockaddr_inarp {
>  
>  #ifdef       _KERNEL
>  extern u_int8_t etherbroadcastaddr[ETHER_ADDR_LEN];
> +extern u_int8_t etheranyaddr[ETHER_ADDR_LEN];
>  extern u_int8_t ether_ipmulticast_min[ETHER_ADDR_LEN];
>  extern u_int8_t ether_ipmulticast_max[ETHER_ADDR_LEN];
>  extern struct niqueue arpintrq;
> 
> 

Reply via email to