Print this page
Use #pragma pack() per Hans
Hans review comments, but no pragma packed yet.
Add virtio net feature bit order string
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Code review changes
*** 53,65 ****
#include <sys/stat.h>
#include <sys/modctl.h>
#include <sys/debug.h>
#include <sys/pci.h>
#include <sys/ethernet.h>
- #define VLAN_TAGSZ 4
-
#include <sys/dlpi.h>
#include <sys/taskq.h>
#include <sys/cyclic.h>
#include <sys/pattr.h>
--- 53,64 ----
#include <sys/stat.h>
#include <sys/modctl.h>
#include <sys/debug.h>
#include <sys/pci.h>
#include <sys/ethernet.h>
+ #include <sys/vlan.h>
#include <sys/dlpi.h>
#include <sys/taskq.h>
#include <sys/cyclic.h>
#include <sys/pattr.h>
*** 74,87 ****
#include <sys/mac_ether.h>
#include "virtiovar.h"
#include "virtioreg.h"
- #if !defined(__packed)
- #define __packed __attribute__((packed))
- #endif /* __packed */
-
/* Configuration registers */
#define VIRTIO_NET_CONFIG_MAC 0 /* 8bit x 6byte */
#define VIRTIO_NET_CONFIG_STATUS 6 /* 16bit */
/* Feature bits */
--- 73,82 ----
*** 102,123 ****
--- 97,141 ----
#define VIRTIO_NET_F_CTRL_VQ (1 << 17) /* Control channel available */
#define VIRTIO_NET_F_CTRL_RX (1 << 18) /* Control channel RX mode support */
#define VIRTIO_NET_F_CTRL_VLAN (1 << 19) /* Control channel VLAN filtering */
#define VIRTIO_NET_F_CTRL_RX_EXTRA (1 << 20) /* Extra RX mode control support */
+ #define VIRTIO_NET_FEATURE_BITS \
+ "\020" \
+ "\1CSUM" \
+ "\2GUEST_CSUM" \
+ "\6MAC" \
+ "\7GSO" \
+ "\10GUEST_TSO4" \
+ "\11GUEST_TSO6" \
+ "\12GUEST_ECN" \
+ "\13GUEST_UFO" \
+ "\14HOST_TSO4" \
+ "\15HOST_TSO6" \
+ "\16HOST_ECN" \
+ "\17HOST_UFO" \
+ "\20MRG_RXBUF" \
+ "\21STATUS" \
+ "\22CTRL_VQ" \
+ "\23CTRL_RX" \
+ "\24CTRL_VLAN" \
+ "\25CTRL_RX_EXTRA"
+
/* Status */
#define VIRTIO_NET_S_LINK_UP 1
+ #pragma pack(1)
/* Packet header structure */
struct virtio_net_hdr {
uint8_t flags;
uint8_t gso_type;
uint16_t hdr_len;
uint16_t gso_size;
uint16_t csum_start;
uint16_t csum_offset;
};
+ #pragma pack()
#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1 /* flags */
#define VIRTIO_NET_HDR_GSO_NONE 0 /* gso_type */
#define VIRTIO_NET_HDR_GSO_TCPV4 1 /* gso_type */
#define VIRTIO_NET_HDR_GSO_UDP 3 /* gso_type */
*** 124,137 ****
#define VIRTIO_NET_HDR_GSO_TCPV6 4 /* gso_type */
#define VIRTIO_NET_HDR_GSO_ECN 0x80 /* gso_type, |'ed */
/* Control virtqueue */
struct virtio_net_ctrl_cmd {
uint8_t class;
uint8_t command;
! } __packed;
#define VIRTIO_NET_CTRL_RX 0
#define VIRTIO_NET_CTRL_RX_PROMISC 0
#define VIRTIO_NET_CTRL_RX_ALLMULTI 1
--- 142,157 ----
#define VIRTIO_NET_HDR_GSO_TCPV6 4 /* gso_type */
#define VIRTIO_NET_HDR_GSO_ECN 0x80 /* gso_type, |'ed */
/* Control virtqueue */
+ #pragma pack(1)
struct virtio_net_ctrl_cmd {
uint8_t class;
uint8_t command;
! };
! #pragma pack()
#define VIRTIO_NET_CTRL_RX 0
#define VIRTIO_NET_CTRL_RX_PROMISC 0
#define VIRTIO_NET_CTRL_RX_ALLMULTI 1
*** 140,165 ****
#define VIRTIO_NET_CTRL_VLAN 2
#define VIRTIO_NET_CTRL_VLAN_ADD 0
#define VIRTIO_NET_CTRL_VLAN_DEL 1
struct virtio_net_ctrl_status {
uint8_t ack;
! } __packed;
struct virtio_net_ctrl_rx {
uint8_t onoff;
! } __packed;
struct virtio_net_ctrl_mac_tbl {
uint32_t nentries;
uint8_t macs[][ETHERADDRL];
! } __packed;
struct virtio_net_ctrl_vlan {
uint16_t id;
! } __packed;
static int vioif_quiesce(dev_info_t *);
static int vioif_attach(dev_info_t *, ddi_attach_cmd_t);
static int vioif_detach(dev_info_t *, ddi_detach_cmd_t);
--- 160,187 ----
#define VIRTIO_NET_CTRL_VLAN 2
#define VIRTIO_NET_CTRL_VLAN_ADD 0
#define VIRTIO_NET_CTRL_VLAN_DEL 1
+ #pragma pack(1)
struct virtio_net_ctrl_status {
uint8_t ack;
! };
struct virtio_net_ctrl_rx {
uint8_t onoff;
! };
struct virtio_net_ctrl_mac_tbl {
uint32_t nentries;
uint8_t macs[][ETHERADDRL];
! };
struct virtio_net_ctrl_vlan {
uint16_t id;
! };
! #pragma pack()
static int vioif_quiesce(dev_info_t *);
static int vioif_attach(dev_info_t *, ddi_attach_cmd_t);
static int vioif_detach(dev_info_t *, ddi_detach_cmd_t);
*** 842,852 ****
}
mp->b_wptr = mp->b_rptr + len;
atomic_inc_ulong(&sc->sc_rxloan);
/*
! * Buffer loaned, we will have to allocte a new one
* for this slot.
*/
sc->sc_rxbufs[ve->qe_index] = NULL;
}
--- 864,874 ----
}
mp->b_wptr = mp->b_rptr + len;
atomic_inc_ulong(&sc->sc_rxloan);
/*
! * Buffer loaned, we will have to allocate a new one
* for this slot.
*/
sc->sc_rxbufs[ve->qe_index] = NULL;
}
*** 1073,1085 ****
/* Use the inline buffer of the first entry for the virtio_net_hdr. */
(void) memset(buf->tb_inline_mapping.vbm_buf, 0,
sizeof (struct virtio_net_hdr));
! /* LINTED E_BAD_PTR_CAST_ALIGN */
! net_header = (struct virtio_net_hdr *)
! buf->tb_inline_mapping.vbm_buf;
mac_hcksum_get(mp, &csum_start, &csum_stuff, NULL,
NULL, &csum_flags);
/* They want us to do the TCP/UDP csum calculation. */
--- 1095,1105 ----
/* Use the inline buffer of the first entry for the virtio_net_hdr. */
(void) memset(buf->tb_inline_mapping.vbm_buf, 0,
sizeof (struct virtio_net_hdr));
! net_header = (struct virtio_net_hdr *)buf->tb_inline_mapping.vbm_buf;
mac_hcksum_get(mp, &csum_start, &csum_stuff, NULL,
NULL, &csum_flags);
/* They want us to do the TCP/UDP csum calculation. */
*** 1457,1533 ****
char *bufp = buf;
char *bufend = buf + sizeof (buf);
/* LINTED E_PTRDIFF_OVERFLOW */
bufp += snprintf(bufp, bufend - bufp, prefix);
-
/* LINTED E_PTRDIFF_OVERFLOW */
bufp += virtio_show_features(features, bufp, bufend - bufp);
-
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "Vioif ( ");
-
- if (features & VIRTIO_NET_F_CSUM)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "CSUM ");
- if (features & VIRTIO_NET_F_GUEST_CSUM)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "GUEST_CSUM ");
- if (features & VIRTIO_NET_F_MAC)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "MAC ");
- if (features & VIRTIO_NET_F_GSO)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "GSO ");
- if (features & VIRTIO_NET_F_GUEST_TSO4)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "GUEST_TSO4 ");
- if (features & VIRTIO_NET_F_GUEST_TSO6)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "GUEST_TSO6 ");
- if (features & VIRTIO_NET_F_GUEST_ECN)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "GUEST_ECN ");
- if (features & VIRTIO_NET_F_GUEST_UFO)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "GUEST_UFO ");
- if (features & VIRTIO_NET_F_HOST_TSO4)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "HOST_TSO4 ");
- if (features & VIRTIO_NET_F_HOST_TSO6)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "HOST_TSO6 ");
- if (features & VIRTIO_NET_F_HOST_ECN)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "HOST_ECN ");
- if (features & VIRTIO_NET_F_HOST_UFO)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "HOST_UFO ");
- if (features & VIRTIO_NET_F_MRG_RXBUF)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "MRG_RXBUF ");
- if (features & VIRTIO_NET_F_STATUS)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "STATUS ");
- if (features & VIRTIO_NET_F_CTRL_VQ)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "CTRL_VQ ");
- if (features & VIRTIO_NET_F_CTRL_RX)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "CTRL_RX ");
- if (features & VIRTIO_NET_F_CTRL_VLAN)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "CTRL_VLAN ");
- if (features & VIRTIO_NET_F_CTRL_RX_EXTRA)
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, "CTRL_RX_EXTRA ");
-
- /* LINTED E_PTRDIFF_OVERFLOW */
- bufp += snprintf(bufp, bufend - bufp, ")");
*bufp = '\0';
! dev_err(sc->sc_dev, CE_NOTE, "%s", buf);
}
/*
* Find out which features are supported by the device and
* choose which ones we wish to use.
--- 1477,1494 ----
char *bufp = buf;
char *bufend = buf + sizeof (buf);
/* LINTED E_PTRDIFF_OVERFLOW */
bufp += snprintf(bufp, bufend - bufp, prefix);
/* LINTED E_PTRDIFF_OVERFLOW */
bufp += virtio_show_features(features, bufp, bufend - bufp);
*bufp = '\0';
!
! /* Using '!' to only CE_NOTE this to the system log. */
! dev_err(sc->sc_dev, CE_NOTE, "!%s Vioif (%b)", buf, features,
! VIRTIO_NET_FEATURE_BITS);
}
/*
* Find out which features are supported by the device and
* choose which ones we wish to use.
*** 1702,1716 ****
case DDI_ATTACH:
break;
case DDI_RESUME:
case DDI_PM_RESUME:
! /* not supported yet */
goto exit;
default:
- /* unrecognized command */
goto exit;
}
sc = kmem_zalloc(sizeof (struct vioif_softc), KM_SLEEP);
ddi_set_driver_private(devinfo, sc);
--- 1663,1676 ----
case DDI_ATTACH:
break;
case DDI_RESUME:
case DDI_PM_RESUME:
! /* We do not support suspend/resume for vioif. */
goto exit;
default:
goto exit;
}
sc = kmem_zalloc(sizeof (struct vioif_softc), KM_SLEEP);
ddi_set_driver_private(devinfo, sc);
*** 1885,1905 ****
switch (cmd) {
case DDI_DETACH:
break;
case DDI_PM_SUSPEND:
! /* not supported yet */
return (DDI_FAILURE);
default:
- /* unrecognized command */
return (DDI_FAILURE);
}
if (sc->sc_rxloan) {
! cmn_err(CE_NOTE, "Some rx buffers are still upstream, "
! "Not detaching");
return (DDI_FAILURE);
}
virtio_stop_vq_intr(sc->sc_rx_vq);
virtio_stop_vq_intr(sc->sc_tx_vq);
--- 1845,1864 ----
switch (cmd) {
case DDI_DETACH:
break;
case DDI_PM_SUSPEND:
! /* We do not support suspend/resume for vioif. */
return (DDI_FAILURE);
default:
return (DDI_FAILURE);
}
if (sc->sc_rxloan) {
! dev_err(devinfo, CE_WARN, "!Some rx buffers are still upstream,"
! " not detaching.");
return (DDI_FAILURE);
}
virtio_stop_vq_intr(sc->sc_rx_vq);
virtio_stop_vq_intr(sc->sc_tx_vq);