Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/virtio/network/if_vtnet.c
Show First 20 Lines • Show All 107 Lines • ▼ Show 20 Lines | |||||
static int vtnet_init_txq(struct vtnet_softc *, int); | static int vtnet_init_txq(struct vtnet_softc *, int); | ||||
static int vtnet_alloc_rxtx_queues(struct vtnet_softc *); | static int vtnet_alloc_rxtx_queues(struct vtnet_softc *); | ||||
static void vtnet_free_rxtx_queues(struct vtnet_softc *); | static void vtnet_free_rxtx_queues(struct vtnet_softc *); | ||||
static int vtnet_alloc_rx_filters(struct vtnet_softc *); | static int vtnet_alloc_rx_filters(struct vtnet_softc *); | ||||
static void vtnet_free_rx_filters(struct vtnet_softc *); | static void vtnet_free_rx_filters(struct vtnet_softc *); | ||||
static int vtnet_alloc_virtqueues(struct vtnet_softc *); | static int vtnet_alloc_virtqueues(struct vtnet_softc *); | ||||
static int vtnet_alloc_interface(struct vtnet_softc *); | static int vtnet_alloc_interface(struct vtnet_softc *); | ||||
static int vtnet_setup_interface(struct vtnet_softc *); | static int vtnet_setup_interface(struct vtnet_softc *); | ||||
static int vtnet_ioctl_mtu(struct vtnet_softc *, int); | static int vtnet_ioctl_mtu(struct vtnet_softc *, u_int); | ||||
static int vtnet_ioctl_ifflags(struct vtnet_softc *); | static int vtnet_ioctl_ifflags(struct vtnet_softc *); | ||||
static int vtnet_ioctl_multi(struct vtnet_softc *); | static int vtnet_ioctl_multi(struct vtnet_softc *); | ||||
static int vtnet_ioctl_ifcap(struct vtnet_softc *, struct ifreq *); | static int vtnet_ioctl_ifcap(struct vtnet_softc *, struct ifreq *); | ||||
static int vtnet_ioctl(struct ifnet *, u_long, caddr_t); | static int vtnet_ioctl(struct ifnet *, u_long, caddr_t); | ||||
static uint64_t vtnet_get_counter(struct ifnet *, ift_counter); | static uint64_t vtnet_get_counter(struct ifnet *, ift_counter); | ||||
static int vtnet_rxq_populate(struct vtnet_rxq *); | static int vtnet_rxq_populate(struct vtnet_rxq *); | ||||
static void vtnet_rxq_free_mbufs(struct vtnet_rxq *); | static void vtnet_rxq_free_mbufs(struct vtnet_rxq *); | ||||
▲ Show 20 Lines • Show All 76 Lines • ▼ Show 20 Lines | |||||
static void vtnet_init(void *); | static void vtnet_init(void *); | ||||
static void vtnet_free_ctrl_vq(struct vtnet_softc *); | static void vtnet_free_ctrl_vq(struct vtnet_softc *); | ||||
static void vtnet_exec_ctrl_cmd(struct vtnet_softc *, void *, | static void vtnet_exec_ctrl_cmd(struct vtnet_softc *, void *, | ||||
struct sglist *, int, int); | struct sglist *, int, int); | ||||
static int vtnet_ctrl_mac_cmd(struct vtnet_softc *, uint8_t *); | static int vtnet_ctrl_mac_cmd(struct vtnet_softc *, uint8_t *); | ||||
static int vtnet_ctrl_guest_offloads(struct vtnet_softc *, uint64_t); | static int vtnet_ctrl_guest_offloads(struct vtnet_softc *, uint64_t); | ||||
static int vtnet_ctrl_mq_cmd(struct vtnet_softc *, uint16_t); | static int vtnet_ctrl_mq_cmd(struct vtnet_softc *, uint16_t); | ||||
static int vtnet_ctrl_rx_cmd(struct vtnet_softc *, uint8_t, int); | static int vtnet_ctrl_rx_cmd(struct vtnet_softc *, uint8_t, bool); | ||||
static int vtnet_set_promisc(struct vtnet_softc *, int); | static int vtnet_set_promisc(struct vtnet_softc *, bool); | ||||
static int vtnet_set_allmulti(struct vtnet_softc *, int); | static int vtnet_set_allmulti(struct vtnet_softc *, bool); | ||||
static void vtnet_rx_filter(struct vtnet_softc *); | static void vtnet_rx_filter(struct vtnet_softc *); | ||||
static void vtnet_rx_filter_mac(struct vtnet_softc *); | static void vtnet_rx_filter_mac(struct vtnet_softc *); | ||||
static int vtnet_exec_vlan_filter(struct vtnet_softc *, int, uint16_t); | static int vtnet_exec_vlan_filter(struct vtnet_softc *, int, uint16_t); | ||||
static void vtnet_rx_filter_vlan(struct vtnet_softc *); | static void vtnet_rx_filter_vlan(struct vtnet_softc *); | ||||
static void vtnet_update_vlan_filter(struct vtnet_softc *, int, uint16_t); | static void vtnet_update_vlan_filter(struct vtnet_softc *, int, uint16_t); | ||||
static void vtnet_register_vlan(void *, struct ifnet *, uint16_t); | static void vtnet_register_vlan(void *, struct ifnet *, uint16_t); | ||||
static void vtnet_unregister_vlan(void *, struct ifnet *, uint16_t); | static void vtnet_unregister_vlan(void *, struct ifnet *, uint16_t); | ||||
▲ Show 20 Lines • Show All 148 Lines • ▼ Show 20 Lines | |||||
MODULE_DEPEND(vtnet, virtio, 1, 1, 1); | MODULE_DEPEND(vtnet, virtio, 1, 1, 1); | ||||
#ifdef DEV_NETMAP | #ifdef DEV_NETMAP | ||||
MODULE_DEPEND(vtnet, netmap, 1, 1, 1); | MODULE_DEPEND(vtnet, netmap, 1, 1, 1); | ||||
#endif | #endif | ||||
VIRTIO_SIMPLE_PNPINFO(vtnet, VIRTIO_ID_NETWORK, "VirtIO Networking Adapter"); | VIRTIO_SIMPLE_PNPINFO(vtnet, VIRTIO_ID_NETWORK, "VirtIO Networking Adapter"); | ||||
static int | static int | ||||
vtnet_modevent(module_t mod, int type, void *unused) | vtnet_modevent(module_t mod __unused, int type, void *unused __unused) | ||||
{ | { | ||||
int error = 0; | int error = 0; | ||||
static int loaded = 0; | static int loaded = 0; | ||||
switch (type) { | switch (type) { | ||||
case MOD_LOAD: | case MOD_LOAD: | ||||
if (loaded++ == 0) { | if (loaded++ == 0) { | ||||
vtnet_tx_header_zone = uma_zcreate("vtnet_tx_hdr", | vtnet_tx_header_zone = uma_zcreate("vtnet_tx_hdr", | ||||
▲ Show 20 Lines • Show All 857 Lines • ▼ Show 20 Lines | vtnet_rx_cluster_size(struct vtnet_softc *sc, int mtu) | ||||
else if (framesz <= MJUM9BYTES) | else if (framesz <= MJUM9BYTES) | ||||
return (MJUM9BYTES); | return (MJUM9BYTES); | ||||
/* Sane default; avoid 16KB clusters. */ | /* Sane default; avoid 16KB clusters. */ | ||||
return (MCLBYTES); | return (MCLBYTES); | ||||
} | } | ||||
static int | static int | ||||
vtnet_ioctl_mtu(struct vtnet_softc *sc, int mtu) | vtnet_ioctl_mtu(struct vtnet_softc *sc, u_int mtu) | ||||
{ | { | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
int clustersz; | int clustersz; | ||||
ifp = sc->vtnet_ifp; | ifp = sc->vtnet_ifp; | ||||
VTNET_CORE_LOCK_ASSERT(sc); | VTNET_CORE_LOCK_ASSERT(sc); | ||||
if (ifp->if_mtu == mtu) | if (ifp->if_mtu == mtu) | ||||
▲ Show 20 Lines • Show All 544 Lines • ▼ Show 20 Lines | default: | ||||
return (1); | return (1); | ||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
vtnet_rxq_csum_data_valid(struct vtnet_rxq *rxq, struct mbuf *m, | vtnet_rxq_csum_data_valid(struct vtnet_rxq *rxq, struct mbuf *m, | ||||
uint16_t etype, int hoff, struct virtio_net_hdr *hdr) | uint16_t etype, int hoff, struct virtio_net_hdr *hdr __unused) | ||||
{ | { | ||||
struct vtnet_softc *sc; | struct vtnet_softc *sc; | ||||
int protocol; | int protocol; | ||||
sc = rxq->vtnrx_sc; | sc = rxq->vtnrx_sc; | ||||
switch (etype) { | switch (etype) { | ||||
#if defined(INET) | #if defined(INET) | ||||
▲ Show 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | vtnet_rxq_merged_eof(struct vtnet_rxq *rxq, struct mbuf *m_head, int nbufs) | ||||
struct mbuf *m_tail; | struct mbuf *m_tail; | ||||
sc = rxq->vtnrx_sc; | sc = rxq->vtnrx_sc; | ||||
vq = rxq->vtnrx_vq; | vq = rxq->vtnrx_vq; | ||||
m_tail = m_head; | m_tail = m_head; | ||||
while (--nbufs > 0) { | while (--nbufs > 0) { | ||||
struct mbuf *m; | struct mbuf *m; | ||||
int len; | uint32_t len; | ||||
m = virtqueue_dequeue(vq, &len); | m = virtqueue_dequeue(vq, &len); | ||||
if (m == NULL) { | if (m == NULL) { | ||||
rxq->vtnrx_stats.vrxs_ierrors++; | rxq->vtnrx_stats.vrxs_ierrors++; | ||||
goto fail; | goto fail; | ||||
} | } | ||||
if (vtnet_rxq_new_buf(rxq) != 0) { | if (vtnet_rxq_new_buf(rxq) != 0) { | ||||
▲ Show 20 Lines • Show All 113 Lines • ▼ Show 20 Lines | vtnet_rxq_eof(struct vtnet_rxq *rxq) | ||||
ifp = sc->vtnet_ifp; | ifp = sc->vtnet_ifp; | ||||
deq = 0; | deq = 0; | ||||
count = sc->vtnet_rx_process_limit; | count = sc->vtnet_rx_process_limit; | ||||
VTNET_RXQ_LOCK_ASSERT(rxq); | VTNET_RXQ_LOCK_ASSERT(rxq); | ||||
while (count-- > 0) { | while (count-- > 0) { | ||||
struct mbuf *m; | struct mbuf *m; | ||||
int len, nbufs, adjsz; | uint32_t len, nbufs, adjsz; | ||||
m = virtqueue_dequeue(vq, &len); | m = virtqueue_dequeue(vq, &len); | ||||
if (m == NULL) | if (m == NULL) | ||||
break; | break; | ||||
deq++; | deq++; | ||||
if (len < sc->vtnet_hdr_size + ETHER_HDR_LEN) { | if (len < sc->vtnet_hdr_size + ETHER_HDR_LEN) { | ||||
rxq->vtnrx_stats.vrxs_ierrors++; | rxq->vtnrx_stats.vrxs_ierrors++; | ||||
▲ Show 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | #endif | ||||
return (count > 0 ? 0 : EAGAIN); | return (count > 0 ? 0 : EAGAIN); | ||||
} | } | ||||
static void | static void | ||||
vtnet_rx_vq_process(struct vtnet_rxq *rxq, int tries) | vtnet_rx_vq_process(struct vtnet_rxq *rxq, int tries) | ||||
{ | { | ||||
struct vtnet_softc *sc; | struct vtnet_softc *sc; | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
int more; | u_int more; | ||||
#ifdef DEV_NETMAP | #ifdef DEV_NETMAP | ||||
int nmirq; | int nmirq; | ||||
#endif /* DEV_NETMAP */ | #endif /* DEV_NETMAP */ | ||||
sc = rxq->vtnrx_sc; | sc = rxq->vtnrx_sc; | ||||
ifp = sc->vtnet_ifp; | ifp = sc->vtnet_ifp; | ||||
if (__predict_false(rxq->vtnrx_id >= sc->vtnet_act_vq_pairs)) { | if (__predict_false(rxq->vtnrx_id >= sc->vtnet_act_vq_pairs)) { | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
struct vtnet_rxq *rxq; | struct vtnet_rxq *rxq; | ||||
rxq = xrxq; | rxq = xrxq; | ||||
vtnet_rx_vq_process(rxq, VTNET_INTR_DISABLE_RETRIES); | vtnet_rx_vq_process(rxq, VTNET_INTR_DISABLE_RETRIES); | ||||
} | } | ||||
static void | static void | ||||
vtnet_rxq_tq_intr(void *xrxq, int pending) | vtnet_rxq_tq_intr(void *xrxq, int pending __unused) | ||||
{ | { | ||||
struct vtnet_rxq *rxq; | struct vtnet_rxq *rxq; | ||||
rxq = xrxq; | rxq = xrxq; | ||||
vtnet_rx_vq_process(rxq, 0); | vtnet_rx_vq_process(rxq, 0); | ||||
} | } | ||||
static int | static int | ||||
▲ Show 20 Lines • Show All 500 Lines • ▼ Show 20 Lines | if (VTNET_TXQ_TRYLOCK(txq) != 0) { | ||||
error = drbr_enqueue(ifp, txq->vtntx_br, m); | error = drbr_enqueue(ifp, txq->vtntx_br, m); | ||||
taskqueue_enqueue(txq->vtntx_tq, &txq->vtntx_defrtask); | taskqueue_enqueue(txq->vtntx_tq, &txq->vtntx_defrtask); | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
static void | static void | ||||
vtnet_txq_tq_deferred(void *xtxq, int pending) | vtnet_txq_tq_deferred(void *xtxq, int pending __unused) | ||||
{ | { | ||||
struct vtnet_softc *sc; | struct vtnet_softc *sc; | ||||
struct vtnet_txq *txq; | struct vtnet_txq *txq; | ||||
txq = xtxq; | txq = xtxq; | ||||
sc = txq->vtntx_sc; | sc = txq->vtntx_sc; | ||||
VTNET_TXQ_LOCK(txq); | VTNET_TXQ_LOCK(txq); | ||||
Show All 18 Lines | if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) | ||||
vtnet_start_locked(txq, ifp); | vtnet_start_locked(txq, ifp); | ||||
#else | #else | ||||
if (!drbr_empty(ifp, txq->vtntx_br)) | if (!drbr_empty(ifp, txq->vtntx_br)) | ||||
vtnet_txq_mq_start_locked(txq, NULL); | vtnet_txq_mq_start_locked(txq, NULL); | ||||
#endif | #endif | ||||
} | } | ||||
static void | static void | ||||
vtnet_txq_tq_intr(void *xtxq, int pending) | vtnet_txq_tq_intr(void *xtxq, int pending __unused) | ||||
{ | { | ||||
struct vtnet_softc *sc; | struct vtnet_softc *sc; | ||||
struct vtnet_txq *txq; | struct vtnet_txq *txq; | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
txq = xtxq; | txq = xtxq; | ||||
sc = txq->vtntx_sc; | sc = txq->vtntx_sc; | ||||
ifp = sc->vtnet_ifp; | ifp = sc->vtnet_ifp; | ||||
▲ Show 20 Lines • Show All 818 Lines • ▼ Show 20 Lines | vtnet_ctrl_mq_cmd(struct vtnet_softc *sc, uint16_t npairs) | ||||
if (error == 0) | if (error == 0) | ||||
vtnet_exec_ctrl_cmd(sc, &s.ack, &sg, sg.sg_nseg - 1, 1); | vtnet_exec_ctrl_cmd(sc, &s.ack, &sg, sg.sg_nseg - 1, 1); | ||||
return (s.ack == VIRTIO_NET_OK ? 0 : EIO); | return (s.ack == VIRTIO_NET_OK ? 0 : EIO); | ||||
} | } | ||||
static int | static int | ||||
vtnet_ctrl_rx_cmd(struct vtnet_softc *sc, uint8_t cmd, int on) | vtnet_ctrl_rx_cmd(struct vtnet_softc *sc, uint8_t cmd, bool on) | ||||
{ | { | ||||
struct sglist_seg segs[3]; | struct sglist_seg segs[3]; | ||||
struct sglist sg; | struct sglist sg; | ||||
struct { | struct { | ||||
struct virtio_net_ctrl_hdr hdr __aligned(2); | struct virtio_net_ctrl_hdr hdr __aligned(2); | ||||
uint8_t pad1; | uint8_t pad1; | ||||
uint8_t onoff; | uint8_t onoff; | ||||
uint8_t pad2; | uint8_t pad2; | ||||
uint8_t ack; | uint8_t ack; | ||||
} s; | } s; | ||||
int error; | int error; | ||||
error = 0; | error = 0; | ||||
MPASS(sc->vtnet_flags & VTNET_FLAG_CTRL_RX); | MPASS(sc->vtnet_flags & VTNET_FLAG_CTRL_RX); | ||||
s.hdr.class = VIRTIO_NET_CTRL_RX; | s.hdr.class = VIRTIO_NET_CTRL_RX; | ||||
s.hdr.cmd = cmd; | s.hdr.cmd = cmd; | ||||
s.onoff = !!on; | s.onoff = on; | ||||
s.ack = VIRTIO_NET_ERR; | s.ack = VIRTIO_NET_ERR; | ||||
sglist_init(&sg, nitems(segs), segs); | sglist_init(&sg, nitems(segs), segs); | ||||
error |= sglist_append(&sg, &s.hdr, sizeof(struct virtio_net_ctrl_hdr)); | error |= sglist_append(&sg, &s.hdr, sizeof(struct virtio_net_ctrl_hdr)); | ||||
error |= sglist_append(&sg, &s.onoff, sizeof(uint8_t)); | error |= sglist_append(&sg, &s.onoff, sizeof(uint8_t)); | ||||
error |= sglist_append(&sg, &s.ack, sizeof(uint8_t)); | error |= sglist_append(&sg, &s.ack, sizeof(uint8_t)); | ||||
MPASS(error == 0 && sg.sg_nseg == nitems(segs)); | MPASS(error == 0 && sg.sg_nseg == nitems(segs)); | ||||
if (error == 0) | if (error == 0) | ||||
vtnet_exec_ctrl_cmd(sc, &s.ack, &sg, sg.sg_nseg - 1, 1); | vtnet_exec_ctrl_cmd(sc, &s.ack, &sg, sg.sg_nseg - 1, 1); | ||||
return (s.ack == VIRTIO_NET_OK ? 0 : EIO); | return (s.ack == VIRTIO_NET_OK ? 0 : EIO); | ||||
} | } | ||||
static int | static int | ||||
vtnet_set_promisc(struct vtnet_softc *sc, int on) | vtnet_set_promisc(struct vtnet_softc *sc, bool on) | ||||
{ | { | ||||
return (vtnet_ctrl_rx_cmd(sc, VIRTIO_NET_CTRL_RX_PROMISC, on)); | return (vtnet_ctrl_rx_cmd(sc, VIRTIO_NET_CTRL_RX_PROMISC, on)); | ||||
} | } | ||||
static int | static int | ||||
vtnet_set_allmulti(struct vtnet_softc *sc, int on) | vtnet_set_allmulti(struct vtnet_softc *sc, bool on) | ||||
{ | { | ||||
return (vtnet_ctrl_rx_cmd(sc, VIRTIO_NET_CTRL_RX_ALLMULTI, on)); | return (vtnet_ctrl_rx_cmd(sc, VIRTIO_NET_CTRL_RX_ALLMULTI, on)); | ||||
} | } | ||||
static void | static void | ||||
vtnet_rx_filter(struct vtnet_softc *sc) | vtnet_rx_filter(struct vtnet_softc *sc) | ||||
{ | { | ||||
device_t dev; | device_t dev; | ||||
▲ Show 20 Lines • Show All 105 Lines • ▼ Show 20 Lines | vtnet_rx_filter_mac(struct vtnet_softc *sc) | ||||
MPASS(error == 0 && sg.sg_nseg == nitems(segs)); | MPASS(error == 0 && sg.sg_nseg == nitems(segs)); | ||||
if (error == 0) | if (error == 0) | ||||
vtnet_exec_ctrl_cmd(sc, &ack, &sg, sg.sg_nseg - 1, 1); | vtnet_exec_ctrl_cmd(sc, &ack, &sg, sg.sg_nseg - 1, 1); | ||||
if (ack != VIRTIO_NET_OK) | if (ack != VIRTIO_NET_OK) | ||||
if_printf(ifp, "error setting host MAC filter table\n"); | if_printf(ifp, "error setting host MAC filter table\n"); | ||||
out: | out: | ||||
if (promisc != 0 && vtnet_set_promisc(sc, 1) != 0) | if (promisc != 0 && vtnet_set_promisc(sc, true) != 0) | ||||
if_printf(ifp, "cannot enable promiscuous mode\n"); | if_printf(ifp, "cannot enable promiscuous mode\n"); | ||||
if (allmulti != 0 && vtnet_set_allmulti(sc, 1) != 0) | if (allmulti != 0 && vtnet_set_allmulti(sc, true) != 0) | ||||
if_printf(ifp, "cannot enable all-multicast mode\n"); | if_printf(ifp, "cannot enable all-multicast mode\n"); | ||||
} | } | ||||
static int | static int | ||||
vtnet_exec_vlan_filter(struct vtnet_softc *sc, int add, uint16_t tag) | vtnet_exec_vlan_filter(struct vtnet_softc *sc, int add, uint16_t tag) | ||||
{ | { | ||||
struct sglist_seg segs[3]; | struct sglist_seg segs[3]; | ||||
struct sglist sg; | struct sglist sg; | ||||
▲ Show 20 Lines • Show All 112 Lines • ▼ Show 20 Lines | vtnet_update_speed_duplex(struct vtnet_softc *sc) | ||||
ifp = sc->vtnet_ifp; | ifp = sc->vtnet_ifp; | ||||
if ((sc->vtnet_features & VIRTIO_NET_F_SPEED_DUPLEX) == 0) | if ((sc->vtnet_features & VIRTIO_NET_F_SPEED_DUPLEX) == 0) | ||||
return; | return; | ||||
/* BMV: Ignore duplex. */ | /* BMV: Ignore duplex. */ | ||||
speed = virtio_read_dev_config_4(sc->vtnet_dev, | speed = virtio_read_dev_config_4(sc->vtnet_dev, | ||||
offsetof(struct virtio_net_config, speed)); | offsetof(struct virtio_net_config, speed)); | ||||
if (speed != -1) | if (speed != UINT32_MAX) | ||||
ifp->if_baudrate = IF_Mbps(speed); | ifp->if_baudrate = IF_Mbps(speed); | ||||
} | } | ||||
static int | static int | ||||
vtnet_is_link_up(struct vtnet_softc *sc) | vtnet_is_link_up(struct vtnet_softc *sc) | ||||
{ | { | ||||
uint16_t status; | uint16_t status; | ||||
Show All 23 Lines | if (link != 0 && sc->vtnet_link_active == 0) { | ||||
if_link_state_change(ifp, LINK_STATE_UP); | if_link_state_change(ifp, LINK_STATE_UP); | ||||
} else if (link == 0 && sc->vtnet_link_active != 0) { | } else if (link == 0 && sc->vtnet_link_active != 0) { | ||||
sc->vtnet_link_active = 0; | sc->vtnet_link_active = 0; | ||||
if_link_state_change(ifp, LINK_STATE_DOWN); | if_link_state_change(ifp, LINK_STATE_DOWN); | ||||
} | } | ||||
} | } | ||||
static int | static int | ||||
vtnet_ifmedia_upd(struct ifnet *ifp) | vtnet_ifmedia_upd(struct ifnet *ifp __unused) | ||||
{ | { | ||||
return (EOPNOTSUPP); | return (EOPNOTSUPP); | ||||
} | } | ||||
static void | static void | ||||
vtnet_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) | vtnet_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr) | ||||
{ | { | ||||
struct vtnet_softc *sc; | struct vtnet_softc *sc; | ||||
▲ Show 20 Lines • Show All 463 Lines • Show Last 20 Lines |