vnic.h revision 11878:ac93462db6d7
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21/* 22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26#ifndef _SYS_VNIC_H 27#define _SYS_VNIC_H 28 29#include <sys/types.h> 30#include <sys/ethernet.h> 31#include <sys/param.h> 32#include <sys/mac.h> 33#include <sys/mac_flow.h> 34#include <sys/dld_ioc.h> 35#include <inet/ip.h> 36#include <inet/ip6.h> 37 38#ifdef __cplusplus 39extern "C" { 40#endif 41 42/* 43 * Extended diagnostic codes that can be returned by the various 44 */ 45typedef enum { 46 VNIC_IOC_DIAG_NONE, 47 VNIC_IOC_DIAG_MACADDR_NIC, 48 VNIC_IOC_DIAG_MACADDR_INUSE, 49 VNIC_IOC_DIAG_MACADDR_INVALID, 50 VNIC_IOC_DIAG_MACADDRLEN_INVALID, 51 VNIC_IOC_DIAG_MACFACTORYSLOTINVALID, 52 VNIC_IOC_DIAG_MACFACTORYSLOTUSED, 53 VNIC_IOC_DIAG_MACFACTORYSLOTALLUSED, 54 VNIC_IOC_DIAG_MACFACTORYNOTSUP, 55 VNIC_IOC_DIAG_MACPREFIX_INVALID, 56 VNIC_IOC_DIAG_MACPREFIXLEN_INVALID, 57 VNIC_IOC_DIAG_MACMARGIN_INVALID, 58 VNIC_IOC_DIAG_NO_HWRINGS 59} vnic_ioc_diag_t; 60 61/* 62 * Allowed VNIC MAC address types. 63 * 64 * - VNIC_MAC_ADDR_TYPE_FIXED, VNIC_MAC_ADDR_TYPE_RANDOM: 65 * The MAC address is specified by value by the caller, which 66 * itself can obtain it from the user directly, 67 * or pick it in a random fashion. Which method is used by the 68 * caller is irrelevant to the VNIC driver. However two different 69 * types are provided so that the information can be made available 70 * back to user-space when listing the kernel defined VNICs. 71 * 72 * When a VNIC is created, the address in passed through the 73 * vc_mac_addr and vc_mac_len fields of the vnic_ioc_create_t 74 * structure. 75 * 76 * - VNIC_MAC_ADDR_TYPE_FACTORY: the MAC address is obtained from 77 * one of the MAC factory MAC addresses of the underyling NIC. 78 * 79 * - VNIC_MAC_ADDR_TYPE_AUTO: the VNIC driver attempts to 80 * obtain the address from one of the factory MAC addresses of 81 * the underlying NIC. If none is available, the specified 82 * MAC address value is used. 83 * 84 * - VNIC_MAC_ADDR_TYPE_PRIMARY: this is a VNIC based VLAN. The 85 * address for this is the address of the primary MAC client. 86 * 87 */ 88 89typedef enum { 90 VNIC_MAC_ADDR_TYPE_UNKNOWN = -1, 91 VNIC_MAC_ADDR_TYPE_FIXED, 92 VNIC_MAC_ADDR_TYPE_RANDOM, 93 VNIC_MAC_ADDR_TYPE_FACTORY, 94 VNIC_MAC_ADDR_TYPE_AUTO, 95 VNIC_MAC_ADDR_TYPE_PRIMARY, 96 VNIC_MAC_ADDR_TYPE_VRID 97} vnic_mac_addr_type_t; 98 99#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 100#pragma pack(4) 101#endif 102 103#define VNIC_IOC_CREATE VNICIOC(1) 104 105#define VNIC_IOC_CREATE_NODUPCHECK 0x00000001 106#define VNIC_IOC_CREATE_ANCHOR 0x00000002 107 108/* 109 * Force creation of VLAN based VNIC without checking if the 110 * undelying MAC supports the margin size. 111 */ 112#define VNIC_IOC_CREATE_FORCE 0x00000004 113 114typedef struct vnic_ioc_create { 115 datalink_id_t vc_vnic_id; 116 datalink_id_t vc_link_id; 117 vnic_mac_addr_type_t vc_mac_addr_type; 118 uint_t vc_mac_len; 119 uchar_t vc_mac_addr[MAXMACADDRLEN]; 120 uint_t vc_mac_prefix_len; 121 int vc_mac_slot; 122 uint16_t vc_vid; 123 vrid_t vc_vrid; 124 int vc_af; 125 uint_t vc_status; 126 uint_t vc_flags; 127 vnic_ioc_diag_t vc_diag; 128 mac_resource_props_t vc_resource_props; 129} vnic_ioc_create_t; 130 131#define VNIC_IOC_DELETE VNICIOC(2) 132 133typedef struct vnic_ioc_delete { 134 datalink_id_t vd_vnic_id; 135} vnic_ioc_delete_t; 136 137#define VNIC_IOC_INFO VNICIOC(3) 138 139typedef struct vnic_info { 140 datalink_id_t vn_vnic_id; 141 datalink_id_t vn_link_id; 142 vnic_mac_addr_type_t vn_mac_addr_type; 143 uint_t vn_mac_len; 144 uchar_t vn_mac_addr[MAXMACADDRLEN]; 145 uint_t vn_mac_slot; 146 uint32_t vn_mac_prefix_len; 147 uint16_t vn_vid; 148 vrid_t vn_vrid; 149 int vn_af; 150 boolean_t vn_force; 151 mac_resource_props_t vn_resource_props; 152} vnic_info_t; 153 154typedef struct vnic_ioc_info { 155 vnic_info_t vi_info; 156} vnic_ioc_info_t; 157 158#define VNIC_IOC_MODIFY VNICIOC(4) 159 160#define VNIC_IOC_MODIFY_ADDR 0x01 161#define VNIC_IOC_MODIFY_RESOURCE_CTL 0x02 162 163typedef struct vnic_ioc_modify { 164 datalink_id_t vm_vnic_id; 165 uint_t vm_modify_mask; 166 uint_t vm_mac_len; 167 int vm_mac_slot; 168 uchar_t vm_mac_addr[MAXMACADDRLEN]; 169 vnic_mac_addr_type_t vm_mac_addr_type; 170 mac_resource_props_t vm_resource_props; 171 vnic_ioc_diag_t vm_diag; 172} vnic_ioc_modify_t; 173 174#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 175#pragma pack() 176#endif 177 178#ifdef __cplusplus 179} 180#endif 181 182#endif /* _SYS_VNIC_H */ 183