hyperv/hn: Renaming and minor cleanup

This prepares for the upcoming transparent VF support.

MFC after:	3 days
Sponsored by:	Microsoft
Differential Revision:	https://reviews.freebsd.org/D11708
This commit is contained in:
sephe 2017-08-01 02:45:54 +00:00
parent f5002f5e5f
commit f1555b6b44
2 changed files with 55 additions and 48 deletions

View File

@ -222,9 +222,9 @@ struct hn_rxinfo {
uint32_t hash_value;
};
struct hn_update_vf {
struct hn_rxvf_setarg {
struct hn_rx_ring *rxr;
struct ifnet *vf;
struct ifnet *vf_ifp;
};
#define HN_RXINFO_VLAN 0x0001
@ -264,6 +264,13 @@ static void hn_ifaddr_event(void *, struct ifnet *);
static void hn_ifnet_attevent(void *, struct ifnet *);
static void hn_ifnet_detevent(void *, struct ifnet *);
static bool hn_ismyvf(const struct hn_softc *,
const struct ifnet *);
static void hn_rxvf_change(struct hn_softc *,
struct ifnet *, bool);
static void hn_rxvf_set(struct hn_softc *, struct ifnet *);
static void hn_rxvf_set_task(void *, int);
static int hn_rndis_rxinfo(const void *, int,
struct hn_rxinfo *);
static void hn_rndis_rx_data(struct hn_rx_ring *,
@ -801,7 +808,7 @@ hn_rxfilter_config(struct hn_softc *sc)
HN_LOCK_ASSERT(sc);
if ((ifp->if_flags & IFF_PROMISC) ||
(sc->hn_flags & HN_FLAG_VF)) {
(sc->hn_flags & HN_FLAG_RXVF)) {
filter = NDIS_PACKET_TYPE_PROMISCUOUS;
} else {
filter = NDIS_PACKET_TYPE_DIRECTED;
@ -991,39 +998,39 @@ hn_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
}
static void
hn_update_vf_task(void *arg, int pending __unused)
hn_rxvf_set_task(void *xarg, int pending __unused)
{
struct hn_update_vf *uv = arg;
struct hn_rxvf_setarg *arg = xarg;
uv->rxr->hn_rxvf_ifp = uv->vf;
arg->rxr->hn_rxvf_ifp = arg->vf_ifp;
}
static void
hn_update_vf(struct hn_softc *sc, struct ifnet *vf)
hn_rxvf_set(struct hn_softc *sc, struct ifnet *vf_ifp)
{
struct hn_rx_ring *rxr;
struct hn_update_vf uv;
struct hn_rxvf_setarg arg;
struct task task;
int i;
HN_LOCK_ASSERT(sc);
TASK_INIT(&task, 0, hn_update_vf_task, &uv);
TASK_INIT(&task, 0, hn_rxvf_set_task, &arg);
for (i = 0; i < sc->hn_rx_ring_cnt; ++i) {
rxr = &sc->hn_rx_ring[i];
if (i < sc->hn_rx_ring_inuse) {
uv.rxr = rxr;
uv.vf = vf;
arg.rxr = rxr;
arg.vf_ifp = vf_ifp;
vmbus_chan_run_task(rxr->hn_chan, &task);
} else {
rxr->hn_rxvf_ifp = vf;
rxr->hn_rxvf_ifp = vf_ifp;
}
}
}
static __inline bool
static bool
hn_ismyvf(const struct hn_softc *sc, const struct ifnet *ifp)
{
const struct ifnet *hn_ifp;
@ -1048,7 +1055,7 @@ hn_ismyvf(const struct hn_softc *sc, const struct ifnet *ifp)
}
static void
hn_set_vf(struct hn_softc *sc, struct ifnet *ifp, bool vf)
hn_rxvf_change(struct hn_softc *sc, struct ifnet *ifp, bool rxvf)
{
struct ifnet *hn_ifp;
@ -1059,21 +1066,19 @@ hn_set_vf(struct hn_softc *sc, struct ifnet *ifp, bool vf)
if (!hn_ismyvf(sc, ifp))
goto out;
hn_ifp = sc->hn_ifp;
/* Now we're sure 'ifp' is a real VF device. */
if (vf) {
if (sc->hn_flags & HN_FLAG_VF)
if (rxvf) {
if (sc->hn_flags & HN_FLAG_RXVF)
goto out;
sc->hn_flags |= HN_FLAG_VF;
sc->hn_flags |= HN_FLAG_RXVF;
hn_rxfilter_config(sc);
} else {
if (!(sc->hn_flags & HN_FLAG_VF))
if (!(sc->hn_flags & HN_FLAG_RXVF))
goto out;
sc->hn_flags &= ~HN_FLAG_VF;
sc->hn_flags &= ~HN_FLAG_RXVF;
if (hn_ifp->if_drv_flags & IFF_DRV_RUNNING)
hn_rxfilter_config(sc);
else
@ -1081,11 +1086,11 @@ hn_set_vf(struct hn_softc *sc, struct ifnet *ifp, bool vf)
}
hn_nvs_set_datapath(sc,
vf ? HN_NVS_DATAPATH_VF : HN_NVS_DATAPATH_SYNTHETIC);
rxvf ? HN_NVS_DATAPATH_VF : HN_NVS_DATAPATH_SYNTHETIC);
hn_update_vf(sc, vf ? ifp : NULL);
hn_rxvf_set(sc, rxvf ? ifp : NULL);
if (vf) {
if (rxvf) {
hn_suspend_mgmt(sc);
sc->hn_link_flags &=
~(HN_LINK_FLAG_LINKUP | HN_LINK_FLAG_NETCHG);
@ -1094,12 +1099,13 @@ hn_set_vf(struct hn_softc *sc, struct ifnet *ifp, bool vf)
hn_resume_mgmt(sc);
}
devctl_notify("HYPERV_NIC_VF", if_name(hn_ifp),
vf ? "VF_UP" : "VF_DOWN", NULL);
devctl_notify("HYPERV_NIC_VF", hn_ifp->if_xname,
rxvf ? "VF_UP" : "VF_DOWN", NULL);
if (bootverbose)
if_printf(hn_ifp, "Data path is switched %s %s\n",
vf ? "to" : "from", if_name(ifp));
if (bootverbose) {
if_printf(hn_ifp, "datapath is switched %s %s\n",
rxvf ? "to" : "from", ifp->if_xname);
}
out:
HN_UNLOCK(sc);
}
@ -1107,16 +1113,17 @@ hn_set_vf(struct hn_softc *sc, struct ifnet *ifp, bool vf)
static void
hn_ifnet_event(void *arg, struct ifnet *ifp, int event)
{
if (event != IFNET_EVENT_UP && event != IFNET_EVENT_DOWN)
return;
hn_set_vf(arg, ifp, event == IFNET_EVENT_UP);
hn_rxvf_change(arg, ifp, event == IFNET_EVENT_UP);
}
static void
hn_ifaddr_event(void *arg, struct ifnet *ifp)
{
hn_set_vf(arg, ifp, ifp->if_flags & IFF_UP);
hn_rxvf_change(arg, ifp, ifp->if_flags & IFF_UP);
}
static void
@ -2902,7 +2909,7 @@ hn_stop(struct hn_softc *sc, bool detaching)
* If the VF is active, make sure the filter is not 0, even if
* the synthetic NIC is down.
*/
if (!detaching && (sc->hn_flags & HN_FLAG_VF))
if (!detaching && (sc->hn_flags & HN_FLAG_RXVF))
hn_rxfilter_config(sc);
}
@ -3438,13 +3445,13 @@ hn_vf_sysctl(SYSCTL_HANDLER_ARGS)
{
struct hn_softc *sc = arg1;
char vf_name[IFNAMSIZ + 1];
struct ifnet *vf;
struct ifnet *vf_ifp;
HN_LOCK(sc);
vf_name[0] = '\0';
vf = sc->hn_vf_ifp;
if (vf != NULL)
snprintf(vf_name, sizeof(vf_name), "%s", if_name(vf));
vf_ifp = sc->hn_vf_ifp;
if (vf_ifp != NULL)
snprintf(vf_name, sizeof(vf_name), "%s", vf_ifp->if_xname);
HN_UNLOCK(sc);
return sysctl_handle_string(oidp, vf_name, sizeof(vf_name), req);
}
@ -3454,13 +3461,13 @@ hn_rxvf_sysctl(SYSCTL_HANDLER_ARGS)
{
struct hn_softc *sc = arg1;
char vf_name[IFNAMSIZ + 1];
struct ifnet *vf;
struct ifnet *vf_ifp;
HN_LOCK(sc);
vf_name[0] = '\0';
vf = sc->hn_rx_ring[0].hn_rxvf_ifp;
if (vf != NULL)
snprintf(vf_name, sizeof(vf_name), "%s", if_name(vf));
vf_ifp = sc->hn_rx_ring[0].hn_rxvf_ifp;
if (vf_ifp != NULL)
snprintf(vf_name, sizeof(vf_name), "%s", vf_ifp->if_xname);
HN_UNLOCK(sc);
return sysctl_handle_string(oidp, vf_name, sizeof(vf_name), req);
}
@ -5445,7 +5452,7 @@ hn_suspend(struct hn_softc *sc)
hn_polling(sc, 0);
if ((sc->hn_ifp->if_drv_flags & IFF_DRV_RUNNING) ||
(sc->hn_flags & HN_FLAG_VF))
(sc->hn_flags & HN_FLAG_RXVF))
hn_suspend_data(sc);
hn_suspend_mgmt(sc);
}
@ -5535,16 +5542,16 @@ hn_resume(struct hn_softc *sc)
{
if ((sc->hn_ifp->if_drv_flags & IFF_DRV_RUNNING) ||
(sc->hn_flags & HN_FLAG_VF))
(sc->hn_flags & HN_FLAG_RXVF))
hn_resume_data(sc);
/*
* When the VF is activated, the synthetic interface is changed
* to DOWN in hn_set_vf(). Here, if the VF is still active, we
* don't call hn_resume_mgmt() until the VF is deactivated in
* hn_set_vf().
* to DOWN in hn_rxvf_change(). Here, if the VF is still active,
* we don't call hn_resume_mgmt() until the VF is deactivated in
* hn_rxvf_change().
*/
if (!(sc->hn_flags & HN_FLAG_VF))
if (!(sc->hn_flags & HN_FLAG_RXVF))
hn_resume_mgmt(sc);
/*

View File

@ -251,7 +251,7 @@ struct hn_softc {
#define HN_FLAG_NO_SLEEPING 0x0020
#define HN_FLAG_RXBUF_REF 0x0040
#define HN_FLAG_CHIM_REF 0x0080
#define HN_FLAG_VF 0x0100
#define HN_FLAG_RXVF 0x0100
#define HN_FLAG_ERRORS (HN_FLAG_RXBUF_REF | HN_FLAG_CHIM_REF)