1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright 2010 Cisco Systems, Inc. All rights reserved. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * This program is free software; you may redistribute it and/or modify 5*4882a593Smuzhiyun * it under the terms of the GNU General Public License as published by 6*4882a593Smuzhiyun * the Free Software Foundation; version 2 of the License. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 9*4882a593Smuzhiyun * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 10*4882a593Smuzhiyun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 11*4882a593Smuzhiyun * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 12*4882a593Smuzhiyun * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 13*4882a593Smuzhiyun * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 14*4882a593Smuzhiyun * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 15*4882a593Smuzhiyun * SOFTWARE. 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #ifndef _VNIC_VIC_H_ 20*4882a593Smuzhiyun #define _VNIC_VIC_H_ 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* Note: All integer fields in NETWORK byte order */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* Note: String field lengths include null char */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define VIC_PROVINFO_CISCO_OUI { 0x00, 0x00, 0x0c } 27*4882a593Smuzhiyun #define VIC_PROVINFO_GENERIC_TYPE 0x4 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun enum vic_generic_prov_tlv_type { 30*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_PORT_PROFILE_NAME_STR = 0, 31*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_CLIENT_MAC_ADDR = 1, 32*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_CLIENT_NAME_STR = 2, 33*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_CLUSTER_PORT_NAME_STR = 3, 34*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_CLUSTER_PORT_UUID_STR = 4, 35*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_CLUSTER_UUID_STR = 5, 36*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_CLUSTER_NAME_STR = 7, 37*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_HOST_UUID_STR = 8, 38*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_CLIENT_UUID_STR = 9, 39*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_INCARNATION_NUMBER = 10, 40*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_OS_TYPE = 11, 41*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_OS_VENDOR = 12, 42*4882a593Smuzhiyun VIC_GENERIC_PROV_TLV_CLIENT_TYPE = 15, 43*4882a593Smuzhiyun }; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun enum vic_generic_prov_os_type { 46*4882a593Smuzhiyun VIC_GENERIC_PROV_OS_TYPE_UNKNOWN = 0, 47*4882a593Smuzhiyun VIC_GENERIC_PROV_OS_TYPE_ESX = 1, 48*4882a593Smuzhiyun VIC_GENERIC_PROV_OS_TYPE_LINUX = 2, 49*4882a593Smuzhiyun VIC_GENERIC_PROV_OS_TYPE_WINDOWS = 3, 50*4882a593Smuzhiyun VIC_GENERIC_PROV_OS_TYPE_SOLARIS = 4, 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun struct vic_provinfo { 54*4882a593Smuzhiyun u8 oui[3]; /* OUI of data provider */ 55*4882a593Smuzhiyun u8 type; /* provider-specific type */ 56*4882a593Smuzhiyun u32 length; /* length of data below */ 57*4882a593Smuzhiyun u32 num_tlvs; /* number of tlvs */ 58*4882a593Smuzhiyun struct vic_provinfo_tlv { 59*4882a593Smuzhiyun u16 type; 60*4882a593Smuzhiyun u16 length; 61*4882a593Smuzhiyun u8 value[0]; 62*4882a593Smuzhiyun } tlv[]; 63*4882a593Smuzhiyun } __packed; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #define VIC_PROVINFO_ADD_TLV(vp, tlvtype, tlvlen, data) \ 66*4882a593Smuzhiyun do { \ 67*4882a593Smuzhiyun err = vic_provinfo_add_tlv(vp, tlvtype, tlvlen, data); \ 68*4882a593Smuzhiyun if (err) \ 69*4882a593Smuzhiyun goto add_tlv_failure; \ 70*4882a593Smuzhiyun } while (0) 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #define VIC_PROVINFO_MAX_DATA 1385 73*4882a593Smuzhiyun #define VIC_PROVINFO_MAX_TLV_DATA (VIC_PROVINFO_MAX_DATA - \ 74*4882a593Smuzhiyun sizeof(struct vic_provinfo)) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun struct vic_provinfo *vic_provinfo_alloc(gfp_t flags, const u8 *oui, 77*4882a593Smuzhiyun const u8 type); 78*4882a593Smuzhiyun void vic_provinfo_free(struct vic_provinfo *vp); 79*4882a593Smuzhiyun int vic_provinfo_add_tlv(struct vic_provinfo *vp, u16 type, u16 length, 80*4882a593Smuzhiyun const void *value); 81*4882a593Smuzhiyun size_t vic_provinfo_size(struct vic_provinfo *vp); 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #endif /* _VNIC_VIC_H_ */ 84