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

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/vioif/vioif.c
          +++ new/usr/src/uts/common/io/vioif/vioif.c
↓ open down ↓ 47 lines elided ↑ open up ↑
  48   48  #include <sys/strsubr.h>
  49   49  #include <sys/kmem.h>
  50   50  #include <sys/conf.h>
  51   51  #include <sys/devops.h>
  52   52  #include <sys/ksynch.h>
  53   53  #include <sys/stat.h>
  54   54  #include <sys/modctl.h>
  55   55  #include <sys/debug.h>
  56   56  #include <sys/pci.h>
  57   57  #include <sys/ethernet.h>
       58 +#include <sys/vlan.h>
  58   59  
  59      -#define VLAN_TAGSZ 4
  60      -
  61   60  #include <sys/dlpi.h>
  62   61  #include <sys/taskq.h>
  63   62  #include <sys/cyclic.h>
  64   63  
  65   64  #include <sys/pattr.h>
  66   65  #include <sys/strsun.h>
  67   66  
  68   67  #include <sys/random.h>
  69   68  #include <sys/sysmacros.h>
  70   69  #include <sys/stream.h>
  71   70  
  72   71  #include <sys/mac.h>
  73   72  #include <sys/mac_provider.h>
  74   73  #include <sys/mac_ether.h>
  75   74  
  76   75  #include "virtiovar.h"
  77   76  #include "virtioreg.h"
  78   77  
  79      -#if !defined(__packed)
  80      -#define __packed __attribute__((packed))
  81      -#endif /* __packed */
  82      -
  83   78  /* Configuration registers */
  84   79  #define VIRTIO_NET_CONFIG_MAC           0 /* 8bit x 6byte */
  85   80  #define VIRTIO_NET_CONFIG_STATUS        6 /* 16bit */
  86   81  
  87   82  /* Feature bits */
  88   83  #define VIRTIO_NET_F_CSUM       (1 << 0) /* Host handles pkts w/ partial csum */
  89   84  #define VIRTIO_NET_F_GUEST_CSUM (1 << 1) /* Guest handles pkts w/ part csum */
  90   85  #define VIRTIO_NET_F_MAC        (1 << 5) /* Host has given MAC address. */
  91   86  #define VIRTIO_NET_F_GSO        (1 << 6) /* Host handles pkts w/ any GSO type */
  92   87  #define VIRTIO_NET_F_GUEST_TSO4 (1 << 7) /* Guest can handle TSOv4 in. */
↓ open down ↓ 4 lines elided ↑ open up ↑
  97   92  #define VIRTIO_NET_F_HOST_TSO6  (1 << 12) /* Host can handle TSOv6 in. */
  98   93  #define VIRTIO_NET_F_HOST_ECN   (1 << 13) /* Host can handle TSO[6] w/ ECN in */
  99   94  #define VIRTIO_NET_F_HOST_UFO   (1 << 14) /* Host can handle UFO in. */
 100   95  #define VIRTIO_NET_F_MRG_RXBUF  (1 << 15) /* Host can merge receive buffers. */
 101   96  #define VIRTIO_NET_F_STATUS     (1 << 16) /* Config.status available */
 102   97  #define VIRTIO_NET_F_CTRL_VQ    (1 << 17) /* Control channel available */
 103   98  #define VIRTIO_NET_F_CTRL_RX    (1 << 18) /* Control channel RX mode support */
 104   99  #define VIRTIO_NET_F_CTRL_VLAN  (1 << 19) /* Control channel VLAN filtering */
 105  100  #define VIRTIO_NET_F_CTRL_RX_EXTRA (1 << 20) /* Extra RX mode control support */
 106  101  
      102 +#define VIRTIO_NET_FEATURE_BITS \
      103 +        "\020" \
      104 +        "\1CSUM" \
      105 +        "\2GUEST_CSUM" \
      106 +        "\6MAC" \
      107 +        "\7GSO" \
      108 +        "\10GUEST_TSO4" \
      109 +        "\11GUEST_TSO6" \
      110 +        "\12GUEST_ECN" \
      111 +        "\13GUEST_UFO" \
      112 +        "\14HOST_TSO4" \
      113 +        "\15HOST_TSO6" \
      114 +        "\16HOST_ECN" \
      115 +        "\17HOST_UFO" \
      116 +        "\20MRG_RXBUF" \
      117 +        "\21STATUS" \
      118 +        "\22CTRL_VQ" \
      119 +        "\23CTRL_RX" \
      120 +        "\24CTRL_VLAN" \
      121 +        "\25CTRL_RX_EXTRA"
      122 +
 107  123  /* Status */
 108  124  #define VIRTIO_NET_S_LINK_UP    1
 109  125  
      126 +#pragma pack(1)
 110  127  /* Packet header structure */
 111  128  struct virtio_net_hdr {
 112  129          uint8_t         flags;
 113  130          uint8_t         gso_type;
 114  131          uint16_t        hdr_len;
 115  132          uint16_t        gso_size;
 116  133          uint16_t        csum_start;
 117  134          uint16_t        csum_offset;
 118  135  };
      136 +#pragma pack()
 119  137  
 120  138  #define VIRTIO_NET_HDR_F_NEEDS_CSUM     1 /* flags */
 121  139  #define VIRTIO_NET_HDR_GSO_NONE         0 /* gso_type */
 122  140  #define VIRTIO_NET_HDR_GSO_TCPV4        1 /* gso_type */
 123  141  #define VIRTIO_NET_HDR_GSO_UDP          3 /* gso_type */
 124  142  #define VIRTIO_NET_HDR_GSO_TCPV6        4 /* gso_type */
 125  143  #define VIRTIO_NET_HDR_GSO_ECN          0x80 /* gso_type, |'ed */
 126  144  
 127  145  
 128  146  /* Control virtqueue */
      147 +#pragma pack(1)
 129  148  struct virtio_net_ctrl_cmd {
 130  149          uint8_t class;
 131  150          uint8_t command;
 132      -} __packed;
      151 +};
      152 +#pragma pack()
 133  153  
 134  154  #define VIRTIO_NET_CTRL_RX              0
 135  155  #define VIRTIO_NET_CTRL_RX_PROMISC      0
 136  156  #define VIRTIO_NET_CTRL_RX_ALLMULTI     1
 137  157  
 138  158  #define VIRTIO_NET_CTRL_MAC             1
 139  159  #define VIRTIO_NET_CTRL_MAC_TABLE_SET   0
 140  160  
 141  161  #define VIRTIO_NET_CTRL_VLAN            2
 142  162  #define VIRTIO_NET_CTRL_VLAN_ADD        0
 143  163  #define VIRTIO_NET_CTRL_VLAN_DEL        1
 144  164  
      165 +#pragma pack(1)
 145  166  struct virtio_net_ctrl_status {
 146  167          uint8_t ack;
 147      -} __packed;
      168 +};
 148  169  
 149  170  struct virtio_net_ctrl_rx {
 150  171          uint8_t onoff;
 151      -} __packed;
      172 +};
 152  173  
 153  174  struct virtio_net_ctrl_mac_tbl {
 154  175          uint32_t nentries;
 155  176          uint8_t macs[][ETHERADDRL];
 156      -} __packed;
      177 +};
 157  178  
 158  179  struct virtio_net_ctrl_vlan {
 159  180          uint16_t id;
 160      -} __packed;
      181 +};
      182 +#pragma pack()
 161  183  
 162  184  static int vioif_quiesce(dev_info_t *);
 163  185  static int vioif_attach(dev_info_t *, ddi_attach_cmd_t);
 164  186  static int vioif_detach(dev_info_t *, ddi_detach_cmd_t);
 165  187  
 166  188  DDI_DEFINE_STREAM_OPS(vioif_ops,
 167  189          nulldev,                /* identify */
 168  190          nulldev,                /* probe */
 169  191          vioif_attach,           /* attach */
 170  192          vioif_detach,           /* detach */
↓ open down ↓ 666 lines elided ↑ open up ↑
 837  859                                  sc->sc_norecvbuf++;
 838  860                                  sc->sc_ierrors++;
 839  861  
 840  862                                  virtio_free_chain(ve);
 841  863                                  break;
 842  864                          }
 843  865                          mp->b_wptr = mp->b_rptr + len;
 844  866  
 845  867                          atomic_inc_ulong(&sc->sc_rxloan);
 846  868                          /*
 847      -                         * Buffer loaned, we will have to allocte a new one
      869 +                         * Buffer loaned, we will have to allocate a new one
 848  870                           * for this slot.
 849  871                           */
 850  872                          sc->sc_rxbufs[ve->qe_index] = NULL;
 851  873                  }
 852  874  
 853  875                  /*
 854  876                   * virtio-net does not tell us if this packet is multicast
 855  877                   * or broadcast, so we have to check it.
 856  878                   */
 857  879                  if (mp->b_rptr[0] & 0x1) {
↓ open down ↓ 210 lines elided ↑ open up ↑
1068 1090                  sc->sc_notxbuf++;
1069 1091                  /* Out of free descriptors - try later. */
1070 1092                  return (B_FALSE);
1071 1093          }
1072 1094          buf = &sc->sc_txbufs[ve->qe_index];
1073 1095  
1074 1096          /* Use the inline buffer of the first entry for the virtio_net_hdr. */
1075 1097          (void) memset(buf->tb_inline_mapping.vbm_buf, 0,
1076 1098              sizeof (struct virtio_net_hdr));
1077 1099  
1078      -        /* LINTED E_BAD_PTR_CAST_ALIGN */
1079      -        net_header = (struct virtio_net_hdr *)
1080      -            buf->tb_inline_mapping.vbm_buf;
     1100 +        net_header = (struct virtio_net_hdr *)buf->tb_inline_mapping.vbm_buf;
1081 1101  
1082 1102          mac_hcksum_get(mp, &csum_start, &csum_stuff, NULL,
1083 1103              NULL, &csum_flags);
1084 1104  
1085 1105          /* They want us to do the TCP/UDP csum calculation. */
1086 1106          if (csum_flags & HCK_PARTIALCKSUM) {
1087 1107                  struct ether_header *eth_header;
1088 1108                  int eth_hsize;
1089 1109  
1090 1110                  /* Did we ask for it? */
↓ open down ↓ 361 lines elided ↑ open up ↑
1452 1472  static void
1453 1473  vioif_show_features(struct vioif_softc *sc, const char *prefix,
1454 1474      uint32_t features)
1455 1475  {
1456 1476          char buf[512];
1457 1477          char *bufp = buf;
1458 1478          char *bufend = buf + sizeof (buf);
1459 1479  
1460 1480          /* LINTED E_PTRDIFF_OVERFLOW */
1461 1481          bufp += snprintf(bufp, bufend - bufp, prefix);
1462      -
1463 1482          /* LINTED E_PTRDIFF_OVERFLOW */
1464 1483          bufp += virtio_show_features(features, bufp, bufend - bufp);
1465      -
1466      -        /* LINTED E_PTRDIFF_OVERFLOW */
1467      -        bufp += snprintf(bufp, bufend - bufp, "Vioif ( ");
1468      -
1469      -        if (features & VIRTIO_NET_F_CSUM)
1470      -                /* LINTED E_PTRDIFF_OVERFLOW */
1471      -                bufp += snprintf(bufp, bufend - bufp, "CSUM ");
1472      -        if (features & VIRTIO_NET_F_GUEST_CSUM)
1473      -                /* LINTED E_PTRDIFF_OVERFLOW */
1474      -                bufp += snprintf(bufp, bufend - bufp, "GUEST_CSUM ");
1475      -        if (features & VIRTIO_NET_F_MAC)
1476      -                /* LINTED E_PTRDIFF_OVERFLOW */
1477      -                bufp += snprintf(bufp, bufend - bufp, "MAC ");
1478      -        if (features & VIRTIO_NET_F_GSO)
1479      -                /* LINTED E_PTRDIFF_OVERFLOW */
1480      -                bufp += snprintf(bufp, bufend - bufp, "GSO ");
1481      -        if (features & VIRTIO_NET_F_GUEST_TSO4)
1482      -                /* LINTED E_PTRDIFF_OVERFLOW */
1483      -                bufp += snprintf(bufp, bufend - bufp, "GUEST_TSO4 ");
1484      -        if (features & VIRTIO_NET_F_GUEST_TSO6)
1485      -                /* LINTED E_PTRDIFF_OVERFLOW */
1486      -                bufp += snprintf(bufp, bufend - bufp, "GUEST_TSO6 ");
1487      -        if (features & VIRTIO_NET_F_GUEST_ECN)
1488      -                /* LINTED E_PTRDIFF_OVERFLOW */
1489      -                bufp += snprintf(bufp, bufend - bufp, "GUEST_ECN ");
1490      -        if (features & VIRTIO_NET_F_GUEST_UFO)
1491      -                /* LINTED E_PTRDIFF_OVERFLOW */
1492      -                bufp += snprintf(bufp, bufend - bufp, "GUEST_UFO ");
1493      -        if (features & VIRTIO_NET_F_HOST_TSO4)
1494      -                /* LINTED E_PTRDIFF_OVERFLOW */
1495      -                bufp += snprintf(bufp, bufend - bufp, "HOST_TSO4 ");
1496      -        if (features & VIRTIO_NET_F_HOST_TSO6)
1497      -                /* LINTED E_PTRDIFF_OVERFLOW */
1498      -                bufp += snprintf(bufp, bufend - bufp, "HOST_TSO6 ");
1499      -        if (features & VIRTIO_NET_F_HOST_ECN)
1500      -                /* LINTED E_PTRDIFF_OVERFLOW */
1501      -                bufp += snprintf(bufp, bufend - bufp, "HOST_ECN ");
1502      -        if (features & VIRTIO_NET_F_HOST_UFO)
1503      -                /* LINTED E_PTRDIFF_OVERFLOW */
1504      -                bufp += snprintf(bufp, bufend - bufp, "HOST_UFO ");
1505      -        if (features & VIRTIO_NET_F_MRG_RXBUF)
1506      -                /* LINTED E_PTRDIFF_OVERFLOW */
1507      -                bufp += snprintf(bufp, bufend - bufp, "MRG_RXBUF ");
1508      -        if (features & VIRTIO_NET_F_STATUS)
1509      -                /* LINTED E_PTRDIFF_OVERFLOW */
1510      -                bufp += snprintf(bufp, bufend - bufp, "STATUS ");
1511      -        if (features & VIRTIO_NET_F_CTRL_VQ)
1512      -                /* LINTED E_PTRDIFF_OVERFLOW */
1513      -                bufp += snprintf(bufp, bufend - bufp, "CTRL_VQ ");
1514      -        if (features & VIRTIO_NET_F_CTRL_RX)
1515      -                /* LINTED E_PTRDIFF_OVERFLOW */
1516      -                bufp += snprintf(bufp, bufend - bufp, "CTRL_RX ");
1517      -        if (features & VIRTIO_NET_F_CTRL_VLAN)
1518      -                /* LINTED E_PTRDIFF_OVERFLOW */
1519      -                bufp += snprintf(bufp, bufend - bufp, "CTRL_VLAN ");
1520      -        if (features & VIRTIO_NET_F_CTRL_RX_EXTRA)
1521      -                /* LINTED E_PTRDIFF_OVERFLOW */
1522      -                bufp += snprintf(bufp, bufend - bufp, "CTRL_RX_EXTRA ");
1523      -
1524      -        /* LINTED E_PTRDIFF_OVERFLOW */
1525      -        bufp += snprintf(bufp, bufend - bufp, ")");
1526 1484          *bufp = '\0';
1527 1485  
1528      -        dev_err(sc->sc_dev, CE_NOTE, "%s", buf);
     1486 +
     1487 +        /* Using '!' to only CE_NOTE this to the system log. */
     1488 +        dev_err(sc->sc_dev, CE_NOTE, "!%s Vioif (%b)", buf, features,
     1489 +            VIRTIO_NET_FEATURE_BITS);
1529 1490  }
1530 1491  
1531 1492  /*
1532 1493   * Find out which features are supported by the device and
1533 1494   * choose which ones we wish to use.
1534 1495   */
1535 1496  static int
1536 1497  vioif_dev_features(struct vioif_softc *sc)
1537 1498  {
1538 1499          uint32_t host_features;
↓ open down ↓ 158 lines elided ↑ open up ↑
1697 1658          char cache_name[CACHE_NAME_SIZE];
1698 1659  
1699 1660          instance = ddi_get_instance(devinfo);
1700 1661  
1701 1662          switch (cmd) {
1702 1663          case DDI_ATTACH:
1703 1664                  break;
1704 1665  
1705 1666          case DDI_RESUME:
1706 1667          case DDI_PM_RESUME:
1707      -                /* not supported yet */
     1668 +                /* We do not support suspend/resume for vioif. */
1708 1669                  goto exit;
1709 1670  
1710 1671          default:
1711      -                /* unrecognized command */
1712 1672                  goto exit;
1713 1673          }
1714 1674  
1715 1675          sc = kmem_zalloc(sizeof (struct vioif_softc), KM_SLEEP);
1716 1676          ddi_set_driver_private(devinfo, sc);
1717 1677  
1718 1678          vsc = &sc->sc_virtio;
1719 1679  
1720 1680          /* Duplicate for less typing */
1721 1681          sc->sc_dev = devinfo;
↓ open down ↓ 158 lines elided ↑ open up ↑
1880 1840          struct vioif_softc *sc;
1881 1841  
1882 1842          if ((sc = ddi_get_driver_private(devinfo)) == NULL)
1883 1843                  return (DDI_FAILURE);
1884 1844  
1885 1845          switch (cmd) {
1886 1846          case DDI_DETACH:
1887 1847                  break;
1888 1848  
1889 1849          case DDI_PM_SUSPEND:
1890      -                /* not supported yet */
     1850 +                /* We do not support suspend/resume for vioif. */
1891 1851                  return (DDI_FAILURE);
1892 1852  
1893 1853          default:
1894      -                /* unrecognized command */
1895 1854                  return (DDI_FAILURE);
1896 1855          }
1897 1856  
1898 1857          if (sc->sc_rxloan) {
1899      -                cmn_err(CE_NOTE, "Some rx buffers are still upstream, "
1900      -                    "Not detaching");
     1858 +                dev_err(devinfo, CE_WARN, "!Some rx buffers are still upstream,"
     1859 +                    " not detaching.");
1901 1860                  return (DDI_FAILURE);
1902 1861          }
1903 1862  
1904 1863          virtio_stop_vq_intr(sc->sc_rx_vq);
1905 1864          virtio_stop_vq_intr(sc->sc_tx_vq);
1906 1865  
1907 1866          virtio_release_ints(&sc->sc_virtio);
1908 1867  
1909 1868          if (mac_unregister(sc->sc_mac_handle)) {
1910 1869                  return (DDI_FAILURE);
↓ open down ↓ 68 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX