1// Copyright 2017 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#pragma once
6
7#include <ddk/protocol/ethernet.h>
8#include <stdint.h>
9#include <zircon/compiler.h>
10
11// clang-format off
12
13#define VIRTIO_NET_F_CSUM                   (1u << 0)
14#define VIRTIO_NET_F_GUEST_CSUM             (1u << 1)
15#define VIRTIO_NET_F_CNTRL_GUEST_OFFLOADS   (1u << 2)
16#define VIRTIO_NET_F_MAC                    (1u << 5)
17#define VIRTIO_NET_F_GSO                    (1u << 6)
18#define VIRTIO_NET_F_GUEST_TSO4             (1u << 7)
19#define VIRTIO_NET_F_GUEST_TSO6             (1u << 8)
20#define VIRTIO_NET_F_GUEST_ECN              (1u << 9)
21#define VIRTIO_NET_F_GUEST_UFO              (1u << 10)
22#define VIRTIO_NET_F_HOST_TSO4              (1u << 11)
23#define VIRTIO_NET_F_HOST_TSO6              (1u << 12)
24#define VIRTIO_NET_F_HOST_ECN               (1u << 13)
25#define VIRTIO_NET_F_HOST_UFO               (1u << 14)
26#define VIRTIO_NET_F_MRG_RXBUF              (1u << 15)
27#define VIRTIO_NET_F_STATUS                 (1u << 16)
28#define VIRTIO_NET_F_CTRL_VQ                (1u << 17)
29#define VIRTIO_NET_F_CTRL_RX                (1u << 18)
30#define VIRTIO_NET_F_CTRL_VLAN              (1u << 19)
31#define VIRTIO_NET_F_GUEST_ANNOUNCE         (1u << 21)
32#define VIRTIO_NET_F_MQ                     (1u << 22)
33#define VIRTIO_NET_F_CTRL_MAC_ADDR          (1u << 23)
34
35#define VIRTIO_NET_HDR_F_NEEDS_CSUM 1u
36
37#define VIRTIO_NET_HDR_GSO_NONE     0u
38#define VIRTIO_NET_HDR_GSO_TCPV4    1u
39#define VIRTIO_NET_HDR_GSO_UDP      3u
40#define VIRTIO_NET_HDR_GSO_TCPV6    4u
41#define VIRTIO_NET_HDR_GSO_ECN      0x80u
42
43#define VIRTIO_NET_S_LINK_UP        1u
44#define VIRTIO_NET_S_ANNOUNCE       2u
45
46// clang-format on
47
48__BEGIN_CDECLS
49
50typedef struct virtio_net_config {
51    uint8_t mac[ETH_MAC_SIZE];
52    uint16_t status;
53    uint16_t max_virtqueue_pairs;
54} __PACKED virtio_net_config_t;
55
56typedef struct virtio_net_hdr {
57    uint8_t flags;
58    uint8_t gso_type;
59    uint16_t hdr_len;
60    uint16_t gso_size;
61    uint16_t csum_start;
62    uint16_t csum_offset;
63    // Only if |VIRTIO_NET_F_MRG_RXBUF| or |VIRTIO_F_VERSION_1|.
64    uint16_t num_buffers;
65} __PACKED virtio_net_hdr_t;
66
67__END_CDECLS
68