With this change, 32-bit ifconfig is expected to work. I've done most of my testing on a different compat ABI in CheriBSD, but am happy to receive reports one way or another. If you find edge cases, please file bug reports and I'll take a look at them. -- Brooks ----- Forwarded message from Brooks Davis <brooks_at_FreeBSD.org> ----- Date: Fri, 30 Mar 2018 18:50:13 +0000 (UTC) From: Brooks Davis <brooks_at_FreeBSD.org> To: src-committers_at_freebsd.org, svn-src-all_at_freebsd.org, svn-src-head_at_freebsd.org Subject: svn commit: r331797 - in head/sys: dev/an dev/ath dev/cxgbe dev/if_ndis dev/iwi dev/ixl dev/mlx4/mlx4_en dev/mlx5/mlx5_en dev/mwl dev/nxge dev/oce dev/qlnx/qlnxe dev/sbni dev/sfxge dev/vxge net net... Author: brooks Date: Fri Mar 30 18:50:13 2018 New Revision: 331797 URL: https://svnweb.freebsd.org/changeset/base/331797 Log: Use an accessor function to access ifr_data. This fixes 32-bit compat (no ioctl command defintions are required as struct ifreq is the same size). This is believed to be sufficent to fully support ifconfig on 32-bit systems. Reviewed by: kib Obtained from: CheriBSD MFC after: 1 week Relnotes: yes Sponsored by: DARPA, AFRL Differential Revision: https://reviews.freebsd.org/D14900 Modified: head/sys/dev/an/if_an.c head/sys/dev/ath/if_ath_ioctl.c head/sys/dev/cxgbe/t4_main.c head/sys/dev/if_ndis/if_ndis.c head/sys/dev/iwi/if_iwi.c head/sys/dev/ixl/ixl_pf_main.c head/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c head/sys/dev/mwl/if_mwl.c head/sys/dev/nxge/if_nxge.c head/sys/dev/oce/oce_if.c head/sys/dev/qlnx/qlnxe/qlnx_os.c head/sys/dev/sbni/if_sbni.c head/sys/dev/sfxge/sfxge.c head/sys/dev/vxge/vxge.c head/sys/net/if.c head/sys/net/if.h head/sys/net/if_gif.c head/sys/net/if_gre.c head/sys/net/if_ipsec.c head/sys/net/if_spppsubr.c head/sys/net/if_var.h head/sys/net/if_vlan.c head/sys/net/iflib.c head/sys/net80211/ieee80211_ioctl.c head/sys/netinet/ip_carp.c head/sys/netpfil/pf/if_pfsync.c head/sys/security/mac/mac_net.c Modified: head/sys/dev/an/if_an.c ============================================================================== --- head/sys/dev/an/if_an.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/an/if_an.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -1934,7 +1934,8 _at__at_ an_ioctl(struct ifnet *ifp, u_long command, caddr_t da error = 0; break; case SIOCGAIRONET: - error = copyin(ifr->ifr_data, &sc->areq, sizeof(sc->areq)); + error = copyin(ifr_data_get_ptr(ifr), &sc->areq, + sizeof(sc->areq)); if (error != 0) break; AN_LOCK(sc); _at__at_ -1963,13 +1964,15 _at__at_ an_ioctl(struct ifnet *ifp, u_long command, caddr_t da break; } AN_UNLOCK(sc); - error = copyout(&sc->areq, ifr->ifr_data, sizeof(sc->areq)); + error = copyout(&sc->areq, ifr_data_get_ptr(ifr), + sizeof(sc->areq)); break; case SIOCSAIRONET: if ((error = priv_check(td, PRIV_DRIVER))) goto out; AN_LOCK(sc); - error = copyin(ifr->ifr_data, &sc->areq, sizeof(sc->areq)); + error = copyin(ifr_data_get_ptr(ifr), &sc->areq, + sizeof(sc->areq)); if (error != 0) break; an_setdef(sc, &sc->areq); _at__at_ -1978,7 +1981,8 _at__at_ an_ioctl(struct ifnet *ifp, u_long command, caddr_t da case SIOCGPRIVATE_0: /* used by Cisco client utility */ if ((error = priv_check(td, PRIV_DRIVER))) goto out; - error = copyin(ifr->ifr_data, &l_ioctl, sizeof(l_ioctl)); + error = copyin(ifr_data_get_ptr(ifr), &l_ioctl, + sizeof(l_ioctl)); if (error) goto out; mode = l_ioctl.command; _at__at_ -1996,13 +2000,15 _at__at_ an_ioctl(struct ifnet *ifp, u_long command, caddr_t da AN_UNLOCK(sc); if (!error) { /* copy out the updated command info */ - error = copyout(&l_ioctl, ifr->ifr_data, sizeof(l_ioctl)); + error = copyout(&l_ioctl, ifr_data_get_ptr(ifr), + sizeof(l_ioctl)); } break; case SIOCGPRIVATE_1: /* used by Cisco client utility */ if ((error = priv_check(td, PRIV_DRIVER))) goto out; - error = copyin(ifr->ifr_data, &l_ioctl, sizeof(l_ioctl)); + error = copyin(ifr_data_get_ptr(ifr), &l_ioctl, + sizeof(l_ioctl)); if (error) goto out; l_ioctl.command = 0; Modified: head/sys/dev/ath/if_ath_ioctl.c ============================================================================== --- head/sys/dev/ath/if_ath_ioctl.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/ath/if_ath_ioctl.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -267,12 +267,12 _at__at_ ath_ioctl(struct ieee80211com *ic, u_long cmd, void *d rt->info[sc->sc_txrix].dot11Rate &~ IEEE80211_RATE_BASIC; if (rt->info[sc->sc_txrix].phy & IEEE80211_T_HT) sc->sc_stats.ast_tx_rate |= IEEE80211_RATE_MCS; - return copyout(&sc->sc_stats, - ifr->ifr_data, sizeof (sc->sc_stats)); + return copyout(&sc->sc_stats, ifr_data_get_ptr(ifr), + sizeof (sc->sc_stats)); } case SIOCGATHAGSTATS: - return copyout(&sc->sc_aggr_stats, - ifr->ifr_data, sizeof (sc->sc_aggr_stats)); + return copyout(&sc->sc_aggr_stats, ifr_data_get_ptr(ifr), + sizeof (sc->sc_aggr_stats)); case SIOCZATHSTATS: { int error; Modified: head/sys/dev/cxgbe/t4_main.c ============================================================================== --- head/sys/dev/cxgbe/t4_main.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/cxgbe/t4_main.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -1800,7 +1800,7 _at__at_ fail: case SIOCGI2C: { struct ifi2creq i2c; - rc = copyin(ifr->ifr_data, &i2c, sizeof(i2c)); + rc = copyin(ifr_data_get_ptr(ifr), &i2c, sizeof(i2c)); if (rc != 0) break; if (i2c.dev_addr != 0xA0 && i2c.dev_addr != 0xA2) { _at__at_ -1818,7 +1818,7 _at__at_ fail: i2c.offset, i2c.len, &i2c.data[0]); end_synchronized_op(sc, 0); if (rc == 0) - rc = copyout(&i2c, ifr->ifr_data, sizeof(i2c)); + rc = copyout(&i2c, ifr_data_get_ptr(ifr), sizeof(i2c)); break; } Modified: head/sys/dev/if_ndis/if_ndis.c ============================================================================== --- head/sys/dev/if_ndis/if_ndis.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/if_ndis/if_ndis.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -2975,11 +2975,12 _at__at_ ndis_80211ioctl(struct ieee80211com *ic, u_long cmd, v switch (cmd) { case SIOCGDRVSPEC: case SIOCSDRVSPEC: - error = copyin(ifr->ifr_data, &oid, sizeof(oid)); + error = copyin(ifr_data_get_ptr(ifr), &oid, sizeof(oid)); if (error) break; oidbuf = malloc(oid.len, M_TEMP, M_WAITOK | M_ZERO); - error = copyin(ifr->ifr_data + sizeof(oid), oidbuf, oid.len); + error = copyin((caddr_t)ifr_data_get_ptr(ifr) + sizeof(oid), + oidbuf, oid.len); } if (error) { _at__at_ -3001,7 +3002,7 _at__at_ ndis_80211ioctl(struct ieee80211com *ic, u_long cmd, v NDIS_UNLOCK(sc); break; } - error = copyin(ifr->ifr_data, &evt, sizeof(evt)); + error = copyin(ifr_data_get_ptr(ifr), &evt, sizeof(evt)); if (error) { NDIS_UNLOCK(sc); break; _at__at_ -3012,14 +3013,15 _at__at_ ndis_80211ioctl(struct ieee80211com *ic, u_long cmd, v break; } error = copyout(&sc->ndis_evt[sc->ndis_evtcidx], - ifr->ifr_data, sizeof(uint32_t) * 2); + ifr_data_get_ptr(ifr), sizeof(uint32_t) * 2); if (error) { NDIS_UNLOCK(sc); break; } if (sc->ndis_evt[sc->ndis_evtcidx].ne_len) { error = copyout(sc->ndis_evt[sc->ndis_evtcidx].ne_buf, - ifr->ifr_data + (sizeof(uint32_t) * 2), + (caddr_t)ifr_data_get_ptr(ifr) + + (sizeof(uint32_t) * 2), sc->ndis_evt[sc->ndis_evtcidx].ne_len); if (error) { NDIS_UNLOCK(sc); _at__at_ -3041,10 +3043,11 _at__at_ ndis_80211ioctl(struct ieee80211com *ic, u_long cmd, v switch (cmd) { case SIOCGDRVSPEC: case SIOCSDRVSPEC: - error = copyout(&oid, ifr->ifr_data, sizeof(oid)); + error = copyout(&oid, ifr_data_get_ptr(ifr), sizeof(oid)); if (error) break; - error = copyout(oidbuf, ifr->ifr_data + sizeof(oid), oid.len); + error = copyout(oidbuf, + (caddr_t)ifr_data_get_ptr(ifr) + sizeof(oid), oid.len); } free(oidbuf, M_TEMP); Modified: head/sys/dev/iwi/if_iwi.c ============================================================================== --- head/sys/dev/iwi/if_iwi.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/iwi/if_iwi.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -2059,7 +2059,7 _at__at_ iwi_ioctl(struct ieee80211com *ic, u_long cmd, void *d switch (cmd) { case SIOCGIWISTATS: /* XXX validate permissions/memory/etc? */ - error = copyout(&sc->sc_linkqual, ifr->ifr_data, + error = copyout(&sc->sc_linkqual, ifr_data_get_ptr(ifr), sizeof(struct iwi_notif_link_quality)); break; case SIOCZIWISTATS: Modified: head/sys/dev/ixl/ixl_pf_main.c ============================================================================== --- head/sys/dev/ixl/ixl_pf_main.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/ixl/ixl_pf_main.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -5174,7 +5174,7 _at__at_ ixl_ioctl(struct ifnet * ifp, u_long command, caddr_t if (!pf->has_i2c) return (ENOTTY); - error = copyin(ifr->ifr_data, &i2c, sizeof(i2c)); + error = copyin(ifr_data_get_ptr(ifr), &i2c, sizeof(i2c)); if (error != 0) break; if (i2c.dev_addr != 0xA0 && i2c.dev_addr != 0xA2) { _at__at_ -5191,7 +5191,7 _at__at_ ixl_ioctl(struct ifnet * ifp, u_long command, caddr_t i2c.dev_addr, &i2c.data[i])) return (EIO); - error = copyout(&i2c, ifr->ifr_data, sizeof(i2c)); + error = copyout(&i2c, ifr_data_get_ptr(ifr), sizeof(i2c)); break; } #endif Modified: head/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c ============================================================================== --- head/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/mlx4/mlx4_en/mlx4_en_netdev.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -2058,7 +2058,7 _at__at_ out: case SIOCGI2C: { struct ifi2creq i2c; - error = copyin(ifr->ifr_data, &i2c, sizeof(i2c)); + error = copyin(ifr_data_get_ptr(ifr), &i2c, sizeof(i2c)); if (error) break; if (i2c.len > sizeof(i2c.data)) { _at__at_ -2075,7 +2075,7 _at__at_ out: error = -error; break; } - error = copyout(&i2c, ifr->ifr_data, sizeof(i2c)); + error = copyout(&i2c, ifr_data_get_ptr(ifr), sizeof(i2c)); break; } #endif Modified: head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c ============================================================================== --- head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/mlx5/mlx5_en/mlx5_en_main.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -2884,7 +2884,7 _at__at_ out: * Copy from the user-space address ifr_data to the * kernel-space address i2c */ - error = copyin(ifr->ifr_data, &i2c, sizeof(i2c)); + error = copyin(ifr_data_get_ptr(ifr), &i2c, sizeof(i2c)); if (error) break; _at__at_ -2948,7 +2948,7 _at__at_ out: goto err_i2c; } - error = copyout(&i2c, ifr->ifr_data, sizeof(i2c)); + error = copyout(&i2c, ifr_data_get_ptr(ifr), sizeof(i2c)); err_i2c: PRIV_UNLOCK(priv); break; Modified: head/sys/dev/mwl/if_mwl.c ============================================================================== --- head/sys/dev/mwl/if_mwl.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/mwl/if_mwl.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -4750,8 +4750,8 _at__at_ mwl_ioctl(struct ieee80211com *ic, u_long cmd, void *d * statistics. The alternative is to copy the data * to a local structure. */ - return (copyout(&sc->sc_stats, - ifr->ifr_data, sizeof (sc->sc_stats))); + return (copyout(&sc->sc_stats, ifr_data_get_ptr(ifr), + sizeof (sc->sc_stats))); #ifdef MWL_DIAGAPI case SIOCGMVDIAG: /* XXX check privs */ Modified: head/sys/dev/nxge/if_nxge.c ============================================================================== --- head/sys/dev/nxge/if_nxge.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/nxge/if_nxge.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -1368,7 +1368,7 _at__at_ xge_ioctl_stats(xge_lldev_t *lldev, struct ifreq *ifre void *info = NULL; int retValue = EINVAL; - cmd = fubyte(ifreqp->ifr_data); + cmd = fubyte(ifr_data_get_ptr(ifreqp)); if (cmd == -1) return (EFAULT); _at__at_ -1379,7 +1379,7 _at__at_ xge_ioctl_stats(xge_lldev_t *lldev, struct ifreq *ifre (xge_hal_stats_hw_info_t **)&info); mtx_unlock(&lldev->mtx_drv); if(status == XGE_HAL_OK) { - if(copyout(info, ifreqp->ifr_data, + if(copyout(info, ifr_data_get_ptr(ifreqp), sizeof(xge_hal_stats_hw_info_t)) == 0) retValue = 0; } _at__at_ -1397,7 +1397,7 _at__at_ xge_ioctl_stats(xge_lldev_t *lldev, struct ifreq *ifre sizeof(xge_hal_pci_config_t)); mtx_unlock(&lldev->mtx_drv); if(status == XGE_HAL_OK) { - if(copyout(info, ifreqp->ifr_data, + if(copyout(info, ifr_data_get_ptr(ifreqp), sizeof(xge_hal_pci_config_t)) == 0) retValue = 0; } _at__at_ -1417,7 +1417,7 _at__at_ xge_ioctl_stats(xge_lldev_t *lldev, struct ifreq *ifre sizeof(xge_hal_stats_device_info_t)); mtx_unlock(&lldev->mtx_drv); if(status == XGE_HAL_OK) { - if(copyout(info, ifreqp->ifr_data, + if(copyout(info, ifr_data_get_ptr(ifreqp), sizeof(xge_hal_stats_device_info_t)) == 0) retValue = 0; } _at__at_ -1438,7 +1438,7 _at__at_ xge_ioctl_stats(xge_lldev_t *lldev, struct ifreq *ifre sizeof(xge_hal_stats_sw_err_t)); mtx_unlock(&lldev->mtx_drv); if(status == XGE_HAL_OK) { - if(copyout(info, ifreqp->ifr_data, + if(copyout(info, ifr_data_get_ptr(ifreqp), sizeof(xge_hal_stats_sw_err_t)) == 0) retValue = 0; } _at__at_ -1451,7 +1451,7 _at__at_ xge_ioctl_stats(xge_lldev_t *lldev, struct ifreq *ifre break; case XGE_QUERY_DRIVERSTATS: - if(copyout(&lldev->driver_stats, ifreqp->ifr_data, + if(copyout(&lldev->driver_stats, ifr_data_get_ptr(ifreqp), sizeof(xge_driver_stats_t)) == 0) { retValue = 0; } _at__at_ -1465,7 +1465,8 _at__at_ xge_ioctl_stats(xge_lldev_t *lldev, struct ifreq *ifre info = xge_os_malloc(NULL, XGE_BUFFER_SIZE); if(info != NULL) { strcpy(info, XGE_DRIVER_VERSION); - if(copyout(info, ifreqp->ifr_data, XGE_BUFFER_SIZE) == 0) + if(copyout(info, ifr_data_get_ptr(ifreqp), + XGE_BUFFER_SIZE) == 0) retValue = 0; xge_os_free(NULL, info, XGE_BUFFER_SIZE); } _at__at_ -1479,7 +1480,7 _at__at_ xge_ioctl_stats(xge_lldev_t *lldev, struct ifreq *ifre sizeof(xge_hal_device_config_t)); mtx_unlock(&lldev->mtx_drv); if(status == XGE_HAL_OK) { - if(copyout(info, ifreqp->ifr_data, + if(copyout(info, ifr_data_get_ptr(ifreqp), sizeof(xge_hal_device_config_t)) == 0) retValue = 0; } _at__at_ -1492,7 +1493,7 _at__at_ xge_ioctl_stats(xge_lldev_t *lldev, struct ifreq *ifre break; case XGE_QUERY_BUFFER_MODE: - if(copyout(&lldev->buffer_mode, ifreqp->ifr_data, + if(copyout(&lldev->buffer_mode, ifr_data_get_ptr(ifreqp), sizeof(int)) == 0) retValue = 0; break; _at__at_ -1501,7 +1502,7 _at__at_ xge_ioctl_stats(xge_lldev_t *lldev, struct ifreq *ifre case XGE_SET_BUFFER_MODE_2: case XGE_SET_BUFFER_MODE_5: mode = (cmd == XGE_SET_BUFFER_MODE_1) ? 'Y':'N'; - if(copyout(&mode, ifreqp->ifr_data, sizeof(mode)) == 0) + if(copyout(&mode, ifr_data_get_ptr(ifreqp), sizeof(mode)) == 0) retValue = 0; break; default: _at__at_ -1529,7 +1530,7 _at__at_ xge_ioctl_registers(xge_lldev_t *lldev, struct ifreq * int error; u64 val64 = 0; - error = copyin(ifreqp->ifr_data, &tmpdata, sizeof(tmpdata)); + error = copyin(ifr_data_get_ptr(ifreqp), &tmpdata, sizeof(tmpdata)); if (error != 0) return (error); data = &tmpdata; _at__at_ -1542,7 +1543,8 _at__at_ xge_ioctl_registers(xge_lldev_t *lldev, struct ifreq * &data->value); mtx_unlock(&lldev->mtx_drv); if(status == XGE_HAL_OK) { - if(copyout(data, ifreqp->ifr_data, sizeof(xge_register_t)) == 0) + if(copyout(data, ifr_data_get_ptr(ifreqp), + sizeof(xge_register_t)) == 0) retValue = 0; } } _at__at_ -1587,7 +1589,7 _at__at_ xge_ioctl_registers(xge_lldev_t *lldev, struct ifreq * mtx_unlock(&lldev->mtx_drv); if(retValue == 0) { - if(copyout(data, ifreqp->ifr_data, + if(copyout(data, ifr_data_get_ptr(ifreqp), sizeof(xge_hal_pci_bar0_t)) != 0) { xge_trace(XGE_ERR, "Copyout of register values failed"); retValue = EINVAL; Modified: head/sys/dev/oce/oce_if.c ============================================================================== --- head/sys/dev/oce/oce_if.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/oce/oce_if.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -2276,7 +2276,7 _at__at_ oce_handle_passthrough(struct ifnet *ifp, caddr_t data struct ifreq *ifr = (struct ifreq *)data; int rc = ENXIO; char cookie[32] = {0}; - void *priv_data = (void *)ifr->ifr_data; + void *priv_data = ifr_data_get_ptr(ifr); void *ioctl_ptr; uint32_t req_size; struct mbx_hdr req; Modified: head/sys/dev/qlnx/qlnxe/qlnx_os.c ============================================================================== --- head/sys/dev/qlnx/qlnxe/qlnx_os.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/qlnx/qlnxe/qlnx_os.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -2464,7 +2464,7 _at__at_ qlnx_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data struct ecore_hwfn *p_hwfn = &ha->cdev.hwfns[0]; struct ecore_ptt *p_ptt; - ret = copyin(ifr->ifr_data, &i2c, sizeof(i2c)); + ret = copyin(ifr_data_get_ptr(ifr), &i2c, sizeof(i2c)); if (ret) break; _at__at_ -2494,7 +2494,7 _at__at_ qlnx_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data break; } - ret = copyout(&i2c, ifr->ifr_data, sizeof(i2c)); + ret = copyout(&i2c, ifr_data_get_ptr(ifr), sizeof(i2c)); QL_DPRINT8(ha, "SIOCGI2C copyout ret = %d \ len = %d addr = 0x%02x offset = 0x%04x \ Modified: head/sys/dev/sbni/if_sbni.c ============================================================================== --- head/sys/dev/sbni/if_sbni.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/sbni/if_sbni.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -1153,7 +1153,7 _at__at_ sbni_ioctl(struct ifnet *ifp, u_long command, caddr_t SBNI_LOCK(sc); bcopy(&sc->in_stats, in_stats, sizeof(struct sbni_in_stats)); SBNI_UNLOCK(sc); - error = copyout(ifr->ifr_data, in_stats, + error = copyout(ifr_data_get_ptr(ifr), in_stats, sizeof(struct sbni_in_stats)); free(in_stats, M_DEVBUF); break; Modified: head/sys/dev/sfxge/sfxge.c ============================================================================== --- head/sys/dev/sfxge/sfxge.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/sfxge/sfxge.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -529,7 +529,7 _at__at_ sfxge_if_ioctl(struct ifnet *ifp, unsigned long comman { struct ifi2creq i2c; - error = copyin(ifr->ifr_data, &i2c, sizeof(i2c)); + error = copyin(ifr_data_get_ptr(ifr), &i2c, sizeof(i2c)); if (error != 0) break; _at__at_ -544,7 +544,8 _at__at_ sfxge_if_ioctl(struct ifnet *ifp, unsigned long comman &i2c.data[0]); SFXGE_ADAPTER_UNLOCK(sc); if (error == 0) - error = copyout(&i2c, ifr->ifr_data, sizeof(i2c)); + error = copyout(&i2c, ifr_data_get_ptr(ifr), + sizeof(i2c)); break; } #endif _at__at_ -552,12 +553,13 _at__at_ sfxge_if_ioctl(struct ifnet *ifp, unsigned long comman error = priv_check(curthread, PRIV_DRIVER); if (error != 0) break; - error = copyin(ifr->ifr_data, &ioc, sizeof(ioc)); + error = copyin(ifr_data_get_ptr(ifr), &ioc, sizeof(ioc)); if (error != 0) return (error); error = sfxge_private_ioctl(sc, &ioc); if (error == 0) { - error = copyout(&ioc, ifr->ifr_data, sizeof(ioc)); + error = copyout(&ioc, ifr_data_get_ptr(ifr), + sizeof(ioc)); } break; default: Modified: head/sys/dev/vxge/vxge.c ============================================================================== --- head/sys/dev/vxge/vxge.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/dev/vxge/vxge.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -3710,8 +3710,8 _at__at_ vxge_ioctl_regs(vxge_dev_t *vdev, struct ifreq *ifr) u32 offset, reqd_size = 0; int i, err = EINVAL; - char *command = (char *) ifr->ifr_data; - void *reg_info = (void *) ifr->ifr_data; + char *command = ifr_data_get_ptr(ifr); + void *reg_info = ifr_data_get_ptr(ifr); vxge_vpath_t *vpath; vxge_hal_status_e status = VXGE_HAL_OK; _at__at_ -3818,7 +3818,7 _at__at_ vxge_ioctl_stats(vxge_dev_t *vdev, struct ifreq *ifr) vxge_drv_stats_t *drv_stat; char *buffer = NULL; - char *command = (char *) ifr->ifr_data; + char *command = ifr_data_get_ptr(ifr); vxge_hal_status_e status = VXGE_HAL_OK; switch (*command) { _at__at_ -3829,7 +3829,8 _at__at_ vxge_ioctl_stats(vxge_dev_t *vdev, struct ifreq *ifr) status = vxge_hal_aux_pci_config_read(vdev->devh, bufsize, buffer, &retsize); if (status == VXGE_HAL_OK) - err = copyout(buffer, ifr->ifr_data, retsize); + err = copyout(buffer, ifr_data_get_ptr(ifr), + retsize); else device_printf(vdev->ndev, "failed pciconfig statistics query\n"); _at__at_ -3848,7 +3849,8 _at__at_ vxge_ioctl_stats(vxge_dev_t *vdev, struct ifreq *ifr) status = vxge_hal_aux_stats_mrpcim_read(vdev->devh, bufsize, buffer, &retsize); if (status == VXGE_HAL_OK) - err = copyout(buffer, ifr->ifr_data, retsize); + err = copyout(buffer, ifr_data_get_ptr(ifr), + retsize); else device_printf(vdev->ndev, "failed mrpcim statistics query\n"); _at__at_ -3864,7 +3866,8 _at__at_ vxge_ioctl_stats(vxge_dev_t *vdev, struct ifreq *ifr) status = vxge_hal_aux_stats_device_read(vdev->devh, bufsize, buffer, &retsize); if (status == VXGE_HAL_OK) - err = copyout(buffer, ifr->ifr_data, retsize); + err = copyout(buffer, ifr_data_get_ptr(ifr), + retsize); else device_printf(vdev->ndev, "failed device statistics query\n"); _at__at_ -3888,7 +3891,7 _at__at_ vxge_ioctl_stats(vxge_dev_t *vdev, struct ifreq *ifr) ((vxge_device_hw_info_t *) buffer)->port_failure = vdev->port_failure; - err = copyout(buffer, ifr->ifr_data, bufsize); + err = copyout(buffer, ifr_data_get_ptr(ifr), bufsize); if (err != 0) device_printf(vdev->ndev, "failed device hardware info query\n"); _at__at_ -3915,7 +3918,7 _at__at_ vxge_ioctl_stats(vxge_dev_t *vdev, struct ifreq *ifr) sizeof(vxge_drv_stats_t)); } - err = copyout(drv_stat, ifr->ifr_data, bufsize); + err = copyout(drv_stat, ifr_data_get_ptr(ifr), bufsize); if (err != 0) device_printf(vdev->ndev, "failed driver statistics query\n"); _at__at_ -3925,7 +3928,7 _at__at_ vxge_ioctl_stats(vxge_dev_t *vdev, struct ifreq *ifr) break; case VXGE_GET_BANDWIDTH: - bw_info = (vxge_bw_info_t *) ifr->ifr_data; + bw_info = ifr_data_get_ptr(ifr); if ((vdev->config.hw_info.func_id != 0) && (vdev->hw_fw_version < VXGE_FW_VERSION(1, 8, 0))) _at__at_ -3938,7 +3941,8 _at__at_ vxge_ioctl_stats(vxge_dev_t *vdev, struct ifreq *ifr) if (status != VXGE_HAL_OK) break; - err = copyout(bw_info, ifr->ifr_data, sizeof(vxge_bw_info_t)); + err = copyout(bw_info, ifr_data_get_ptr(ifr), + sizeof(vxge_bw_info_t)); break; case VXGE_SET_BANDWIDTH: _at__at_ -3949,7 +3953,7 _at__at_ vxge_ioctl_stats(vxge_dev_t *vdev, struct ifreq *ifr) case VXGE_SET_PORT_MODE: if (vdev->is_privilaged) { if (vdev->config.hw_info.ports == VXGE_DUAL_PORT_MODE) { - port_info = (vxge_port_info_t *) ifr->ifr_data; + port_info = ifr_data_get_ptr(ifr); vdev->config.port_mode = port_info->port_mode; err = vxge_port_mode_update(vdev); if (err != ENXIO) _at__at_ -3966,10 +3970,11 _at__at_ vxge_ioctl_stats(vxge_dev_t *vdev, struct ifreq *ifr) case VXGE_GET_PORT_MODE: if (vdev->is_privilaged) { if (vdev->config.hw_info.ports == VXGE_DUAL_PORT_MODE) { - port_info = (vxge_port_info_t *) ifr->ifr_data; + port_info = ifr_data_get_ptr(ifr); err = vxge_port_mode_get(vdev, port_info); if (err == VXGE_HAL_OK) { - err = copyout(port_info, ifr->ifr_data, + err = copyout(port_info, + ifr_data_get_ptr(ifr), sizeof(vxge_port_info_t)); } } _at__at_ -4005,7 +4010,7 _at__at_ vxge_bw_priority_set(vxge_dev_t *vdev, struct ifreq *i u32 func_id; vxge_bw_info_t *bw_info; - bw_info = (vxge_bw_info_t *) ifr->ifr_data; + bw_info = ifr_data_get_ptr(ifr); func_id = bw_info->func_id; vdev->config.bw_info[func_id].priority = bw_info->priority; Modified: head/sys/net/if.c ============================================================================== --- head/sys/net/if.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/net/if.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -2403,6 +2403,20 _at__at_ ifr_buffer_set_length(struct thread *td, void *data, s ifrup->ifr.ifr_ifru.ifru_buffer.length = len; } +void * +ifr_data_get_ptr(void *ifrp) +{ + union ifreq_union *ifrup; + + ifrup = ifrp; +#ifdef COMPAT_FREEBSD32 + if (SV_CURPROC_FLAG(SV_ILP32)) + return ((void *)(uintptr_t) + ifrup->ifr32.ifr_ifru.ifru_data); +#endif + return (ifrup->ifr.ifr_ifru.ifru_data); +} + /* * Hardware specific interface ioctls. */ _at__at_ -2584,7 +2598,8 _at__at_ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, error = priv_check(td, PRIV_NET_SETIFNAME); if (error) return (error); - error = copyinstr(ifr->ifr_data, new_name, IFNAMSIZ, NULL); + error = copyinstr(ifr_data_get_ptr(ifr), new_name, IFNAMSIZ, + NULL); if (error != 0) return (error); if (new_name[0] == '\0') _at__at_ -2895,8 +2910,8 _at__at_ ifioctl(struct socket *so, u_long cmd, caddr_t data, s error = priv_check(td, PRIV_NET_IFCREATE); if (error == 0) error = if_clone_create(ifr->ifr_name, - sizeof(ifr->ifr_name), - cmd == SIOCIFCREATE2 ? ifr->ifr_data : NULL); + sizeof(ifr->ifr_name), cmd == SIOCIFCREATE2 ? + ifr_data_get_ptr(ifr) : NULL); CURVNET_RESTORE(); return (error); case SIOCIFDESTROY: Modified: head/sys/net/if.h ============================================================================== --- head/sys/net/if.h Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/net/if.h Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -412,7 +412,9 _at__at_ struct ifreq { #define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ #define ifr_phys ifr_ifru.ifru_phys /* physical wire */ #define ifr_media ifr_ifru.ifru_media /* physical media */ +#ifndef _KERNEL #define ifr_data ifr_ifru.ifru_data /* for use by interface */ +#endif #define ifr_reqcap ifr_ifru.ifru_cap[0] /* requested capabilities */ #define ifr_curcap ifr_ifru.ifru_cap[1] /* current capabilities */ #define ifr_index ifr_ifru.ifru_index /* interface index */ Modified: head/sys/net/if_gif.c ============================================================================== --- head/sys/net/if_gif.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/net/if_gif.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -898,12 +898,14 _at__at_ gif_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) break; case GIFGOPTS: options = sc->gif_options; - error = copyout(&options, ifr->ifr_data, sizeof(options)); + error = copyout(&options, ifr_data_get_ptr(ifr), + sizeof(options)); break; case GIFSOPTS: if ((error = priv_check(curthread, PRIV_NET_GIF)) != 0) break; - error = copyin(ifr->ifr_data, &options, sizeof(options)); + error = copyin(ifr_data_get_ptr(ifr), &options, + sizeof(options)); if (error) break; if (options & ~GIF_OPTMASK) Modified: head/sys/net/if_gre.c ============================================================================== --- head/sys/net/if_gre.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/net/if_gre.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -455,7 +455,8 _at__at_ gre_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) case GRESKEY: if ((error = priv_check(curthread, PRIV_NET_GRE)) != 0) break; - if ((error = copyin(ifr->ifr_data, &opt, sizeof(opt))) != 0) + if ((error = copyin(ifr_data_get_ptr(ifr), &opt, + sizeof(opt))) != 0) break; if (sc->gre_key != opt) { GRE_WLOCK(sc); _at__at_ -465,13 +466,14 _at__at_ gre_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) } break; case GREGKEY: - error = copyout(&sc->gre_key, ifr->ifr_data, + error = copyout(&sc->gre_key, ifr_data_get_ptr(ifr), sizeof(sc->gre_key)); break; case GRESOPTS: if ((error = priv_check(curthread, PRIV_NET_GRE)) != 0) break; - if ((error = copyin(ifr->ifr_data, &opt, sizeof(opt))) != 0) + if ((error = copyin(ifr_data_get_ptr(ifr), &opt, + sizeof(opt))) != 0) break; if (opt & ~GRE_OPTMASK) error = EINVAL; _at__at_ -486,7 +488,7 _at__at_ gre_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) break; case GREGOPTS: - error = copyout(&sc->gre_options, ifr->ifr_data, + error = copyout(&sc->gre_options, ifr_data_get_ptr(ifr), sizeof(sc->gre_options)); break; default: Modified: head/sys/net/if_ipsec.c ============================================================================== --- head/sys/net/if_ipsec.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/net/if_ipsec.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -688,12 +688,12 _at__at_ ipsec_ioctl(struct ifnet *ifp, u_long cmd, caddr_t dat break; case IPSECGREQID: reqid = sc->reqid; - error = copyout(&reqid, ifr->ifr_data, sizeof(reqid)); + error = copyout(&reqid, ifr_data_get_ptr(ifr), sizeof(reqid)); break; case IPSECSREQID: if ((error = priv_check(curthread, PRIV_NET_SETIFCAP)) != 0) break; - error = copyin(ifr->ifr_data, &reqid, sizeof(reqid)); + error = copyin(ifr_data_get_ptr(ifr), &reqid, sizeof(reqid)); if (error != 0) break; error = ipsec_set_reqid(ifp, reqid); Modified: head/sys/net/if_spppsubr.c ============================================================================== --- head/sys/net/if_spppsubr.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/net/if_spppsubr.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -5058,17 +5058,17 _at__at_ sppp_params(struct sppp *sp, u_long cmd, void *data) if ((spr = malloc(sizeof(struct spppreq), M_TEMP, M_NOWAIT)) == NULL) return (EAGAIN); /* - * ifr->ifr_data is supposed to point to a struct spppreq. + * ifr_data_get_ptr(ifr) is supposed to point to a struct spppreq. * Check the cmd word first before attempting to fetch all the * data. */ - rv = fueword(ifr->ifr_data, &subcmd); + rv = fueword(ifr_data_get_ptr(ifr), &subcmd); if (rv == -1) { rv = EFAULT; goto quit; } - if (copyin((caddr_t)ifr->ifr_data, spr, sizeof(struct spppreq)) != 0) { + if (copyin(ifr_data_get_ptr(ifr), spr, sizeof(struct spppreq)) != 0) { rv = EFAULT; goto quit; } _at__at_ -5105,8 +5105,8 _at__at_ sppp_params(struct sppp *sp, u_long cmd, void *data) * setting it. */ spr->defs.lcp.timeout = sp->lcp.timeout * 1000 / hz; - rv = copyout(spr, (caddr_t)ifr->ifr_data, - sizeof(struct spppreq)); + rv = copyout(spr, ifr_data_get_ptr(ifr), + sizeof(struct spppreq)); break; case (u_long)SPPPIOSDEFS: Modified: head/sys/net/if_var.h ============================================================================== --- head/sys/net/if_var.h Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/net/if_var.h Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -719,6 +719,9 _at__at_ int drbr_enqueue_drv(if_t ifp, struct buf_ring *br, st void if_hw_tsomax_common(if_t ifp, struct ifnet_hw_tsomax *); int if_hw_tsomax_update(if_t ifp, struct ifnet_hw_tsomax *); +/* accessors for struct ifreq */ +void *ifr_data_get_ptr(void *ifrp); + #ifdef DEVICE_POLLING enum poll_cmd { POLL_ONLY, POLL_AND_CHECK_STATUS }; Modified: head/sys/net/if_vlan.c ============================================================================== --- head/sys/net/if_vlan.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/net/if_vlan.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -1857,7 +1857,7 _at__at_ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data break; } #endif - error = copyin(ifr->ifr_data, &vlr, sizeof(vlr)); + error = copyin(ifr_data_get_ptr(ifr), &vlr, sizeof(vlr)); if (error) break; if (vlr.vlr_parent[0] == '\0') { _at__at_ -1888,7 +1888,7 _at__at_ vlan_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data vlr.vlr_tag = ifv->ifv_vid; } VLAN_SUNLOCK(); - error = copyout(&vlr, ifr->ifr_data, sizeof(vlr)); + error = copyout(&vlr, ifr_data_get_ptr(ifr), sizeof(vlr)); break; case SIOCSIFFLAGS: Modified: head/sys/net/iflib.c ============================================================================== --- head/sys/net/iflib.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/net/iflib.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -3984,7 +3984,7 _at__at_ iflib_if_ioctl(if_t ifp, u_long command, caddr_t data) { struct ifi2creq i2c; - err = copyin(ifr->ifr_data, &i2c, sizeof(i2c)); + err = copyin(ifr_data_get_ptr(ifr), &i2c, sizeof(i2c)); if (err != 0) break; if (i2c.dev_addr != 0xA0 && i2c.dev_addr != 0xA2) { _at__at_ -3997,7 +3997,8 _at__at_ iflib_if_ioctl(if_t ifp, u_long command, caddr_t data) } if ((err = IFDI_I2C_REQ(ctx, &i2c)) == 0) - err = copyout(&i2c, ifr->ifr_data, sizeof(i2c)); + err = copyout(&i2c, ifr_data_get_ptr(ifr), + sizeof(i2c)); break; } case SIOCSIFCAP: Modified: head/sys/net80211/ieee80211_ioctl.c ============================================================================== --- head/sys/net80211/ieee80211_ioctl.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/net80211/ieee80211_ioctl.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -3567,7 +3567,8 _at__at_ ieee80211_ioctl(struct ifnet *ifp, u_long cmd, caddr_t break; case SIOCG80211STATS: ifr = (struct ifreq *)data; - copyout(&vap->iv_stats, ifr->ifr_data, sizeof (vap->iv_stats)); + copyout(&vap->iv_stats, ifr_data_get_ptr(ifr), + sizeof (vap->iv_stats)); break; case SIOCSIFMTU: ifr = (struct ifreq *)data; Modified: head/sys/netinet/ip_carp.c ============================================================================== --- head/sys/netinet/ip_carp.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/netinet/ip_carp.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -1708,7 +1708,7 _at__at_ carp_ioctl(struct ifreq *ifr, u_long cmd, struct threa struct carp_softc *sc = NULL; int error = 0, locked = 0; - if ((error = copyin(ifr->ifr_data, &carpr, sizeof carpr))) + if ((error = copyin(ifr_data_get_ptr(ifr), &carpr, sizeof carpr))) return (error); ifp = ifunit_ref(ifr->ifr_name); _at__at_ -1824,7 +1824,8 _at__at_ carp_ioctl(struct ifreq *ifr, u_long cmd, struct threa break; } carp_carprcp(&carpr, sc, priveleged); - error = copyout(&carpr, ifr->ifr_data, sizeof(carpr)); + error = copyout(&carpr, ifr_data_get_ptr(ifr), + sizeof(carpr)); } else { int i, count; _at__at_ -1842,7 +1843,8 _at__at_ carp_ioctl(struct ifreq *ifr, u_long cmd, struct threa IFNET_FOREACH_CARP(ifp, sc) { carp_carprcp(&carpr, sc, priveleged); carpr.carpr_count = count; - error = copyout(&carpr, ifr->ifr_data + + error = copyout(&carpr, + (caddr_t)ifr_data_get_ptr(ifr) + (i * sizeof(carpr)), sizeof(carpr)); if (error) { CIF_UNLOCK(ifp->if_carp); Modified: head/sys/netpfil/pf/if_pfsync.c ============================================================================== --- head/sys/netpfil/pf/if_pfsync.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/netpfil/pf/if_pfsync.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -1319,7 +1319,8 _at__at_ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t dat pfsyncr.pfsyncr_defer = (PFSYNCF_DEFER == (sc->sc_flags & PFSYNCF_DEFER)); PFSYNC_UNLOCK(sc); - return (copyout(&pfsyncr, ifr->ifr_data, sizeof(pfsyncr))); + return (copyout(&pfsyncr, ifr_data_get_ptr(ifr), + sizeof(pfsyncr))); case SIOCSETPFSYNC: { _at__at_ -1330,7 +1331,8 _at__at_ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t dat if ((error = priv_check(curthread, PRIV_NETINET_PF)) != 0) return (error); - if ((error = copyin(ifr->ifr_data, &pfsyncr, sizeof(pfsyncr)))) + if ((error = copyin(ifr_data_get_ptr(ifr), &pfsyncr, + sizeof(pfsyncr)))) return (error); if (pfsyncr.pfsyncr_maxupdates > 255) Modified: head/sys/security/mac/mac_net.c ============================================================================== --- head/sys/security/mac/mac_net.c Fri Mar 30 18:49:52 2018 (r331796) +++ head/sys/security/mac/mac_net.c Fri Mar 30 18:50:13 2018 (r331797) _at__at_ -406,7 +406,7 _at__at_ mac_ifnet_ioctl_get(struct ucred *cred, struct ifreq * if (!(mac_labeled & MPC_OBJECT_IFNET)) return (EINVAL); - error = copyin(ifr->ifr_ifru.ifru_data, &mac, sizeof(mac)); + error = copyin(ifr_data_get_ptr(ifr), &mac, sizeof(mac)); if (error) return (error); _at__at_ -449,7 +449,7 _at__at_ mac_ifnet_ioctl_set(struct ucred *cred, struct ifreq * if (!(mac_labeled & MPC_OBJECT_IFNET)) return (EINVAL); - error = copyin(ifr->ifr_ifru.ifru_data, &mac, sizeof(mac)); + error = copyin(ifr_data_get_ptr(ifr), &mac, sizeof(mac)); if (error) return (error); ----- End forwarded message -----
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:41:15 UTC