blob: 89d1f4d20a38d1eff9ead252950960b3e266347d [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#pragma once
#include <zircon/device/ioctl.h>
#include <zircon/device/ioctl-wrapper.h>
#include <stdint.h>
#define IOCTL_ETHERTAP_CONFIG \
IOCTL(IOCTL_KIND_GET_HANDLE, IOCTL_FAMILY_ETHERTAP, 1)
#define ETHERTAP_MAX_NAME_LEN 31
#define ETHERTAP_MAX_MTU 2000
// Ethertap signals on the socket are used to indicate link status. It is an error to assert that a
// device is both online and offline; the device will be shutdown. A device is in the offline state
// when it is created.
// ZX_USER_SIGNAL_7 is reserved for internal ethertap use.
#define ETHERTAP_SIGNAL_ONLINE ZX_USER_SIGNAL_0
#define ETHERTAP_SIGNAL_OFFLINE ZX_USER_SIGNAL_1
// Enables tracing of the ethertap device itself
#define ETHERTAP_OPT_TRACE (1u << 0)
#define ETHERTAP_OPT_TRACE_PACKETS (1u << 1)
// Report EthmacSetParam() over Control channel of socket, and return success from EthmacSetParam().
// If this option is not set, EthmacSetParam() will return ZX_ERR_NOT_SUPPORTED.
#define ETHERTAP_OPT_REPORT_PARAM (1u << 2)
// An ethertap device has a fixed mac address and mtu, and transfers ethernet frames over the
// returned data socket. To destroy the device, close the socket.
typedef struct ethertap_ioctl_config {
// The name of this tap device.
char name[ETHERTAP_MAX_NAME_LEN + 1];
// Ethertap options (see above).
uint32_t options;
// Ethernet protocol fields for the ethermac device.
uint32_t features;
uint32_t mtu;
uint8_t mac[6];
} ethertap_ioctl_config_t;
// A header is prepended to socket communication from ethertap. This tells whether
// the subsequent bytes are a packet, a setparam report, etc.
#define ETHERTAP_MSG_PACKET (1u)
#define ETHERTAP_MSG_PARAM_REPORT (2u)
typedef struct ethertap_socket_header {
uint32_t type;
int32_t info; // Might not be used yet; also there for 64-bit alignment
} ethertap_socket_header_t;
// If EthmacSetParam() reporting is requested, this struct is written to the Control
// channel of the ethertap socket each time the function is called.
//
// CAUTION: The Control channel holds only one piece of data at a time. If EthmacSetParam()
// is called more than once without reading the struct, structs 2..N will be lost: consecutive
// calls of EthmacSetParam() without reading this struct will retain the very first result only.
// EthmacSetParam() will still return ZX_OK in that case, since it is a limitation of test
// infrastructure and not a simulated failure of the ethmac device under test.
#define SETPARAM_REPORT_DATA_SIZE 64
typedef struct ethertap_setparam_report {
uint32_t param;
int32_t value;
// As needed for debug/test of individual params, the next two fields can be used
// to return a hash or slice of the data sent in the ioctl data field.
uint8_t data[SETPARAM_REPORT_DATA_SIZE];
size_t data_length;
} ethertap_setparam_report_t;
// ssize_t ioctl_ethertap_config(int fd, const ethertap_ioctl_config_t* in, zx_handle_t* out);
IOCTL_WRAPPER_INOUT(ioctl_ethertap_config, IOCTL_ETHERTAP_CONFIG, \
ethertap_ioctl_config_t, zx_handle_t);