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 2008 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_FIXED, 91 VNIC_MAC_ADDR_TYPE_RANDOM, 92 VNIC_MAC_ADDR_TYPE_FACTORY, 93 VNIC_MAC_ADDR_TYPE_AUTO, 94 VNIC_MAC_ADDR_TYPE_PRIMARY 95 } vnic_mac_addr_type_t; 96 97 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 98 #pragma pack(4) 99 #endif 100 101 #define VNIC_IOC_CREATE VNICIOC(1) 102 103 #define VNIC_IOC_CREATE_NODUPCHECK 0x00000001 104 #define VNIC_IOC_CREATE_ANCHOR 0x00000002 105 106 /* 107 * Force creation of VLAN based VNIC without checking if the 108 * undelying MAC supports the margin size. 109 */ 110 #define VNIC_IOC_CREATE_FORCE 0x00000004 111 112 /* Allocate a hardware ring to the vnic */ 113 #define VNIC_IOC_CREATE_REQ_HWRINGS 0x00000008 114 115 typedef struct vnic_ioc_create { 116 datalink_id_t vc_vnic_id; 117 datalink_id_t vc_link_id; 118 vnic_mac_addr_type_t vc_mac_addr_type; 119 uint_t vc_mac_len; 120 uchar_t vc_mac_addr[MAXMACADDRLEN]; 121 uint_t vc_mac_prefix_len; 122 int vc_mac_slot; 123 uint16_t vc_vid; 124 uint_t vc_status; 125 uint_t vc_flags; 126 vnic_ioc_diag_t vc_diag; 127 mac_resource_props_t vc_resource_props; 128 } vnic_ioc_create_t; 129 130 #define VNIC_IOC_DELETE VNICIOC(2) 131 132 typedef struct vnic_ioc_delete { 133 datalink_id_t vd_vnic_id; 134 } vnic_ioc_delete_t; 135 136 #define VNIC_IOC_INFO VNICIOC(3) 137 138 typedef struct vnic_info { 139 datalink_id_t vn_vnic_id; 140 datalink_id_t vn_link_id; 141 vnic_mac_addr_type_t vn_mac_addr_type; 142 uint_t vn_mac_len; 143 uchar_t vn_mac_addr[MAXMACADDRLEN]; 144 uint_t vn_mac_slot; 145 uint32_t vn_mac_prefix_len; 146 uint16_t vn_vid; 147 boolean_t vn_force; 148 mac_resource_props_t vn_resource_props; 149 } vnic_info_t; 150 151 typedef struct vnic_ioc_info { 152 vnic_info_t vi_info; 153 } vnic_ioc_info_t; 154 155 #define VNIC_IOC_MODIFY VNICIOC(4) 156 157 #define VNIC_IOC_MODIFY_ADDR 0x01 158 #define VNIC_IOC_MODIFY_RESOURCE_CTL 0x02 159 160 typedef struct vnic_ioc_modify { 161 datalink_id_t vm_vnic_id; 162 uint_t vm_modify_mask; 163 uint_t vm_mac_len; 164 int vm_mac_slot; 165 uchar_t vm_mac_addr[MAXMACADDRLEN]; 166 vnic_mac_addr_type_t vm_mac_addr_type; 167 mac_resource_props_t vm_resource_props; 168 vnic_ioc_diag_t vm_diag; 169 } vnic_ioc_modify_t; 170 171 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 172 #pragma pack() 173 #endif 174 175 #ifdef __cplusplus 176 } 177 #endif 178 179 #endif /* _SYS_VNIC_H */ 180