Changeset 3d135e9 in mainline


Ignore:
Timestamp:
2018-06-16T16:05:39Z (6 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b8ef198b
Parents:
fe96085
Message:

Implement virtio_net_send

Location:
uspace
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/nic/virtio-net/virtio-net.c

    rfe96085 r3d135e9  
    112112{
    113113        for (unsigned i = 0; i < size; i++) {
    114                 virtio_virtq_set_desc(vdev, num, i, 0, 0,
     114                virtio_virtq_desc_set(vdev, num, i, 0, 0,
    115115                    VIRTQ_DESC_F_NEXT, (i + 1 == size) ? -1U : i + 1);
    116116        }
    117117        *head = 0;
     118}
     119
     120static uint16_t virtio_net_alloc_buf(virtio_dev_t *vdev, uint16_t num,
     121    uint16_t *head)
     122{
     123        uint16_t descno = *head;
     124        if (descno != (uint16_t) -1U)
     125                *head = virtio_virtq_desc_get_next(vdev, num, descno);
     126        return descno;
    118127}
    119128
     
    261270                 * flags.
    262271                 */
    263                 virtio_virtq_set_desc(vdev, RX_QUEUE_1, i,
     272                virtio_virtq_desc_set(vdev, RX_QUEUE_1, i,
    264273                    virtio_net->rx_buf_p[i], RX_BUF_SIZE, VIRTQ_DESC_F_WRITE,
    265274                    0);
     
    335344static void virtio_net_send(nic_t *nic, void *data, size_t size)
    336345{
    337         // TODO
     346        virtio_net_t *virtio_net = nic_get_specific(nic);
     347        virtio_dev_t *vdev = &virtio_net->virtio_dev;
     348
     349        if (size > sizeof(virtio_net) + TX_BUF_SIZE) {
     350                ddf_msg(LVL_WARN, "TX data too big, frame dropped");
     351                return;
     352        }
     353
     354        uint16_t descno = virtio_net_alloc_buf(vdev, TX_QUEUE_1,
     355            &virtio_net->tx_free_head);
     356        if (descno == (uint16_t) -1U) {
     357                ddf_msg(LVL_WARN, "No TX buffers available, frame dropped");
     358                return;
     359        }
     360        assert(descno < TX_BUFFERS);
     361
     362        /* Setup the packed header */
     363        virtio_net_hdr_t *hdr = (virtio_net_hdr_t *) virtio_net->tx_buf[descno];
     364        memset(hdr, 0, sizeof(virtio_net_hdr_t));
     365        hdr->gso_type = VIRTIO_NET_HDR_GSO_NONE;
     366
     367        /* Copy packet data into the buffer just past the header */
     368        memcpy(&hdr[1], data, size);
     369
     370        /*
     371         * Set the descriptor, put it into the virtqueue and notify the device
     372         */
     373        virtio_virtq_desc_set(vdev, TX_QUEUE_1, descno,
     374            virtio_net->tx_buf_p[descno], TX_BUF_SIZE, 0, 0);
     375        virtio_virtq_produce_available(vdev, TX_QUEUE_1, descno);
    338376}
    339377
  • uspace/drv/nic/virtio-net/virtio-net.h

    rfe96085 r3d135e9  
    4646#define VIRTIO_NET_F_CTRL_VQ            (1U << 17)
    4747
     48#define VIRTIO_NET_HDR_GSO_NONE 0
     49typedef struct {
     50        uint8_t flags;
     51        uint8_t gso_type;
     52        uint16_t hdr_len;
     53        uint16_t gso_size;
     54        uint16_t csum_start;
     55        uint16_t csum_offset;
     56        uint16_t num_buffers;
     57} virtio_net_hdr_t;
     58
    4859typedef struct {
    4960        uint8_t mac[6];
  • uspace/lib/virtio/virtio-pci.h

    rfe96085 r3d135e9  
    176176} virtio_dev_t;
    177177
    178 extern void virtio_virtq_set_desc(virtio_dev_t *vdev, uint16_t, uint16_t,
     178extern void virtio_virtq_desc_set(virtio_dev_t *vdev, uint16_t, uint16_t,
    179179    uint64_t, uint32_t, uint16_t, uint16_t);
     180extern uint16_t virtio_virtq_desc_get_next(virtio_dev_t *vdev, uint16_t,
     181    uint16_t);
    180182
    181183extern void virtio_virtq_produce_available(virtio_dev_t *, uint16_t, uint16_t);
  • uspace/lib/virtio/virtio.c

    rfe96085 r3d135e9  
    3939#include <libarch/barrier.h>
    4040
    41 void virtio_virtq_set_desc(virtio_dev_t *vdev, uint16_t num, uint16_t descno,
     41void virtio_virtq_desc_set(virtio_dev_t *vdev, uint16_t num, uint16_t descno,
    4242    uint64_t addr, uint32_t len, uint16_t flags, uint16_t next)
    4343{
     
    4747        pio_write_le16(&d->flags, flags);
    4848        pio_write_le16(&d->next, next);
     49}
     50
     51uint16_t virtio_virtq_desc_get_next(virtio_dev_t *vdev, uint16_t num,
     52    uint16_t descno)
     53{
     54        virtq_desc_t *d = &vdev->queues[num].desc[descno];
     55        if (!(pio_read_le16(&d->flags) & VIRTQ_DESC_F_NEXT))
     56                return (uint16_t) -1U;
     57        return pio_read_le16(&d->next);
    4958}
    5059
Note: See TracChangeset for help on using the changeset viewer.