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,13 +53,12 @@
#include <sys/stat.h>
#include <sys/modctl.h>
#include <sys/debug.h>
#include <sys/pci.h>
#include <sys/ethernet.h>
+#include <sys/vlan.h>
-#define VLAN_TAGSZ 4
-
#include <sys/dlpi.h>
#include <sys/taskq.h>
#include <sys/cyclic.h>
#include <sys/pattr.h>
@@ -74,14 +73,10 @@
#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 */
@@ -102,22 +97,45 @@
#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,14 +142,16 @@
#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;
-} __packed;
+};
+#pragma pack()
#define VIRTIO_NET_CTRL_RX 0
#define VIRTIO_NET_CTRL_RX_PROMISC 0
#define VIRTIO_NET_CTRL_RX_ALLMULTI 1
@@ -140,26 +160,28 @@
#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;
-} __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;
+};
+#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,11 +864,11 @@
}
mp->b_wptr = mp->b_rptr + len;
atomic_inc_ulong(&sc->sc_rxloan);
/*
- * Buffer loaned, we will have to allocte a new one
+ * Buffer loaned, we will have to allocate a new one
* for this slot.
*/
sc->sc_rxbufs[ve->qe_index] = NULL;
}
@@ -1073,13 +1095,11 @@
/* 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;
+ 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,77 +1477,18 @@
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);
+
+ /* 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,15 +1663,14 @@
case DDI_ATTACH:
break;
case DDI_RESUME:
case DDI_PM_RESUME:
- /* not supported yet */
+ /* We do not support suspend/resume for vioif. */
goto exit;
default:
- /* unrecognized command */
goto exit;
}
sc = kmem_zalloc(sizeof (struct vioif_softc), KM_SLEEP);
ddi_set_driver_private(devinfo, sc);
@@ -1885,21 +1845,20 @@
switch (cmd) {
case DDI_DETACH:
break;
case DDI_PM_SUSPEND:
- /* not supported yet */
+ /* We do not support suspend/resume for vioif. */
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");
+ 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);