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 39 extern "C" { 40 #endif 41 42 /* 43 * Extended diagnostic codes that can be returned by the various 44 */ 45 typedef 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 89 typedef 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 114 typedef 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 133 typedef 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 139 typedef 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 154 typedef 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 163 typedef 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