17c8c0b82SPatrick Mooney /* 27c8c0b82SPatrick Mooney * This file and its contents are supplied under the terms of the 37c8c0b82SPatrick Mooney * Common Development and Distribution License ("CDDL"), version 1.0. 47c8c0b82SPatrick Mooney * You may only use this file in accordance with the terms of version 57c8c0b82SPatrick Mooney * 1.0 of the CDDL. 67c8c0b82SPatrick Mooney * 77c8c0b82SPatrick Mooney * A full copy of the text of the CDDL should have accompanied this 87c8c0b82SPatrick Mooney * source. A copy of the CDDL is also available via the Internet at 97c8c0b82SPatrick Mooney * http://www.illumos.org/license/CDDL. 107c8c0b82SPatrick Mooney */ 117c8c0b82SPatrick Mooney 127c8c0b82SPatrick Mooney /* 137c8c0b82SPatrick Mooney * Copyright 2013 Pluribus Networks Inc. 147c8c0b82SPatrick Mooney * Copyright 2018 Joyent, Inc. 15d4221574SAndy Fiddaman * Copyright 2022 OmniOS Community Edition (OmniOSce) Association. 16*7037363aSKyle Simpson * Copyright 2025 Oxide Computer Company 177c8c0b82SPatrick Mooney */ 187c8c0b82SPatrick Mooney 197c8c0b82SPatrick Mooney #ifndef _VIONA_IO_H_ 207c8c0b82SPatrick Mooney #define _VIONA_IO_H_ 217c8c0b82SPatrick Mooney 227c8c0b82SPatrick Mooney #define VNA_IOC (('V' << 16)|('C' << 8)) 237c8c0b82SPatrick Mooney #define VNA_IOC_CREATE (VNA_IOC | 0x01) 247c8c0b82SPatrick Mooney #define VNA_IOC_DELETE (VNA_IOC | 0x02) 25a26f9c14SPatrick Mooney #define VNA_IOC_VERSION (VNA_IOC | 0x03) 26ce489a5eSPatrick Mooney #define VNA_IOC_DEFAULT_PARAMS (VNA_IOC | 0x04) 277c8c0b82SPatrick Mooney 287c8c0b82SPatrick Mooney #define VNA_IOC_RING_INIT (VNA_IOC | 0x10) 297c8c0b82SPatrick Mooney #define VNA_IOC_RING_RESET (VNA_IOC | 0x11) 307c8c0b82SPatrick Mooney #define VNA_IOC_RING_KICK (VNA_IOC | 0x12) 317c8c0b82SPatrick Mooney #define VNA_IOC_RING_SET_MSI (VNA_IOC | 0x13) 327c8c0b82SPatrick Mooney #define VNA_IOC_RING_INTR_CLR (VNA_IOC | 0x14) 33a26f9c14SPatrick Mooney #define VNA_IOC_RING_SET_STATE (VNA_IOC | 0x15) 34a26f9c14SPatrick Mooney #define VNA_IOC_RING_GET_STATE (VNA_IOC | 0x16) 35a26f9c14SPatrick Mooney #define VNA_IOC_RING_PAUSE (VNA_IOC | 0x17) 367c8c0b82SPatrick Mooney 377c8c0b82SPatrick Mooney #define VNA_IOC_INTR_POLL (VNA_IOC | 0x20) 387c8c0b82SPatrick Mooney #define VNA_IOC_SET_FEATURES (VNA_IOC | 0x21) 397c8c0b82SPatrick Mooney #define VNA_IOC_GET_FEATURES (VNA_IOC | 0x22) 407c8c0b82SPatrick Mooney #define VNA_IOC_SET_NOTIFY_IOP (VNA_IOC | 0x23) 41d4221574SAndy Fiddaman #define VNA_IOC_SET_PROMISC (VNA_IOC | 0x24) 42ce489a5eSPatrick Mooney #define VNA_IOC_GET_PARAMS (VNA_IOC | 0x25) 43ce489a5eSPatrick Mooney #define VNA_IOC_SET_PARAMS (VNA_IOC | 0x26) 44*7037363aSKyle Simpson #define VNA_IOC_GET_MTU (VNA_IOC | 0x27) 45*7037363aSKyle Simpson #define VNA_IOC_SET_MTU (VNA_IOC | 0x28) 467c8c0b82SPatrick Mooney 47a26f9c14SPatrick Mooney 48a26f9c14SPatrick Mooney /* 49a26f9c14SPatrick Mooney * Viona Interface Version 50a26f9c14SPatrick Mooney * 51a26f9c14SPatrick Mooney * Like bhyve, viona exposes Private interfaces which are nonetheless consumed 52a26f9c14SPatrick Mooney * by out-of-gate consumers. While those consumers assume all risk of breakage 53a26f9c14SPatrick Mooney * incurred by subsequent changes, it would be nice to equip them to potentially 54a26f9c14SPatrick Mooney * detect (and handle) those modifications. 55a26f9c14SPatrick Mooney * 56a26f9c14SPatrick Mooney * There are no established criteria for the magnitude of change which requires 57a26f9c14SPatrick Mooney * this version to be incremented, and maintenance of it is considered a 58a26f9c14SPatrick Mooney * best-effort activity. Nothing is to be inferred about the magnitude of a 59a26f9c14SPatrick Mooney * change when the version is modified. It follows no rules like semver. 60a26f9c14SPatrick Mooney * 61a26f9c14SPatrick Mooney */ 62*7037363aSKyle Simpson #define VIONA_CURRENT_INTERFACE_VERSION 4 63a26f9c14SPatrick Mooney 647c8c0b82SPatrick Mooney typedef struct vioc_create { 657c8c0b82SPatrick Mooney datalink_id_t c_linkid; 667c8c0b82SPatrick Mooney int c_vmfd; 677c8c0b82SPatrick Mooney } vioc_create_t; 687c8c0b82SPatrick Mooney 697c8c0b82SPatrick Mooney typedef struct vioc_ring_init { 707c8c0b82SPatrick Mooney uint16_t ri_index; 717c8c0b82SPatrick Mooney uint16_t ri_qsize; 727c8c0b82SPatrick Mooney uint64_t ri_qaddr; 737c8c0b82SPatrick Mooney } vioc_ring_init_t; 747c8c0b82SPatrick Mooney 75a26f9c14SPatrick Mooney typedef struct vioc_ring_state { 76a26f9c14SPatrick Mooney uint16_t vrs_index; 77a26f9c14SPatrick Mooney uint16_t vrs_avail_idx; 78a26f9c14SPatrick Mooney uint16_t vrs_used_idx; 79a26f9c14SPatrick Mooney uint16_t vrs_qsize; 80a26f9c14SPatrick Mooney uint64_t vrs_qaddr; 81a26f9c14SPatrick Mooney } vioc_ring_state_t; 82a26f9c14SPatrick Mooney 837c8c0b82SPatrick Mooney typedef struct vioc_ring_msi { 847c8c0b82SPatrick Mooney uint16_t rm_index; 857c8c0b82SPatrick Mooney uint64_t rm_addr; 867c8c0b82SPatrick Mooney uint64_t rm_msg; 877c8c0b82SPatrick Mooney } vioc_ring_msi_t; 887c8c0b82SPatrick Mooney 897c8c0b82SPatrick Mooney enum viona_vq_id { 907c8c0b82SPatrick Mooney VIONA_VQ_RX = 0, 917c8c0b82SPatrick Mooney VIONA_VQ_TX = 1, 927c8c0b82SPatrick Mooney VIONA_VQ_MAX = 2 937c8c0b82SPatrick Mooney }; 947c8c0b82SPatrick Mooney 95d4221574SAndy Fiddaman typedef enum { 96d4221574SAndy Fiddaman VIONA_PROMISC_NONE = 0, 97d4221574SAndy Fiddaman VIONA_PROMISC_MULTI, 98d4221574SAndy Fiddaman VIONA_PROMISC_ALL, 99d4221574SAndy Fiddaman VIONA_PROMISC_MAX, 100d4221574SAndy Fiddaman } viona_promisc_t; 101d4221574SAndy Fiddaman 1027c8c0b82SPatrick Mooney typedef struct vioc_intr_poll { 1037c8c0b82SPatrick Mooney uint32_t vip_status[VIONA_VQ_MAX]; 1047c8c0b82SPatrick Mooney } vioc_intr_poll_t; 1057c8c0b82SPatrick Mooney 1067c8c0b82SPatrick Mooney 107ce489a5eSPatrick Mooney /* 108ce489a5eSPatrick Mooney * Viona Parameter Interfaces 109ce489a5eSPatrick Mooney * 110ce489a5eSPatrick Mooney * A viona link can have various configuration parameters set upon it. This is 111ce489a5eSPatrick Mooney * done using packed nvlists in order to communicate those parameters to/from 112ce489a5eSPatrick Mooney * the device driver. 113ce489a5eSPatrick Mooney * 114ce489a5eSPatrick Mooney * 115ce489a5eSPatrick Mooney * Currently supported parameters are: 116ce489a5eSPatrick Mooney * - tx_copy_data (boolean): During packet transmission, should viona copy all 117ce489a5eSPatrick Mooney * of the packet data, rather than "loaning" those regions of guest memory 118ce489a5eSPatrick Mooney * (other than the packet headers) in the mblk. 119ce489a5eSPatrick Mooney * - tx_header_pad (uint16): How many bytes (if any) should be left as empty 120ce489a5eSPatrick Mooney * padding on transmitted packets? These could be used by subsequent 121ce489a5eSPatrick Mooney * encapsulation mechanisms in the network stack without the need to 122ce489a5eSPatrick Mooney * reallocate space for the then-longer header. 123ce489a5eSPatrick Mooney * 124ce489a5eSPatrick Mooney */ 125ce489a5eSPatrick Mooney 126ce489a5eSPatrick Mooney /* Maximum size for parameter (or error) packed nvlist buffers */ 127ce489a5eSPatrick Mooney #define VIONA_MAX_PARAM_NVLIST_SZ 4096 128ce489a5eSPatrick Mooney 129ce489a5eSPatrick Mooney typedef struct vioc_get_params { 130ce489a5eSPatrick Mooney void *vgp_param; 131ce489a5eSPatrick Mooney size_t vgp_param_sz; 132ce489a5eSPatrick Mooney } vioc_get_params_t; 133ce489a5eSPatrick Mooney 134ce489a5eSPatrick Mooney typedef struct vioc_set_params { 135ce489a5eSPatrick Mooney void *vsp_param; 136ce489a5eSPatrick Mooney size_t vsp_param_sz; 137ce489a5eSPatrick Mooney void *vsp_error; 138ce489a5eSPatrick Mooney size_t vsp_error_sz; 139ce489a5eSPatrick Mooney } vioc_set_params_t; 140ce489a5eSPatrick Mooney 1417c8c0b82SPatrick Mooney #endif /* _VIONA_IO_H_ */ 142