enic: Move enic port profile handling code to a new 802.1Qbh provisioning info type

Signed-off-by: Roopa Prabhu <roprabhu@cisco.com>
Signed-off-by: David Wang <dwang2@cisco.com>
Signed-off-by: Christian Benvenuti <benve@cisco.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Roopa Prabhu 2010-12-10 12:02:33 +00:00 committed by David S. Miller
parent 36accaed22
commit 6c2c9d964e
3 changed files with 46 additions and 18 deletions

View File

@ -32,7 +32,7 @@
#define DRV_NAME "enic" #define DRV_NAME "enic"
#define DRV_DESCRIPTION "Cisco VIC Ethernet NIC Driver" #define DRV_DESCRIPTION "Cisco VIC Ethernet NIC Driver"
#define DRV_VERSION "1.4.1.9" #define DRV_VERSION "1.4.1.10"
#define DRV_COPYRIGHT "Copyright 2008-2010 Cisco Systems, Inc" #define DRV_COPYRIGHT "Copyright 2008-2010 Cisco Systems, Inc"
#define ENIC_BARS_MAX 6 #define ENIC_BARS_MAX 6

View File

@ -1252,7 +1252,10 @@ static int enic_set_port_profile(struct enic *enic, u8 *mac)
{ {
struct vic_provinfo *vp; struct vic_provinfo *vp;
u8 oui[3] = VIC_PROVINFO_CISCO_OUI; u8 oui[3] = VIC_PROVINFO_CISCO_OUI;
u16 os_type = VIC_GENERIC_PROV_OS_TYPE_LINUX;
char uuid_str[38]; char uuid_str[38];
char client_mac_str[18];
u8 *client_mac;
int err; int err;
err = enic_vnic_dev_deinit(enic); err = enic_vnic_dev_deinit(enic);
@ -1270,37 +1273,47 @@ static int enic_set_port_profile(struct enic *enic, u8 *mac)
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
vp = vic_provinfo_alloc(GFP_KERNEL, oui, vp = vic_provinfo_alloc(GFP_KERNEL, oui,
VIC_PROVINFO_LINUX_TYPE); VIC_PROVINFO_GENERIC_TYPE);
if (!vp) if (!vp)
return -ENOMEM; return -ENOMEM;
vic_provinfo_add_tlv(vp, vic_provinfo_add_tlv(vp,
VIC_LINUX_PROV_TLV_PORT_PROFILE_NAME_STR, VIC_GENERIC_PROV_TLV_PORT_PROFILE_NAME_STR,
strlen(enic->pp.name) + 1, enic->pp.name); strlen(enic->pp.name) + 1, enic->pp.name);
if (!is_zero_ether_addr(enic->pp.mac_addr)) if (!is_zero_ether_addr(enic->pp.mac_addr))
vic_provinfo_add_tlv(vp, client_mac = enic->pp.mac_addr;
VIC_LINUX_PROV_TLV_CLIENT_MAC_ADDR,
ETH_ALEN, enic->pp.mac_addr);
else else
vic_provinfo_add_tlv(vp, client_mac = mac;
VIC_LINUX_PROV_TLV_CLIENT_MAC_ADDR,
ETH_ALEN, mac); vic_provinfo_add_tlv(vp,
VIC_GENERIC_PROV_TLV_CLIENT_MAC_ADDR,
ETH_ALEN, client_mac);
sprintf(client_mac_str, "%pM", client_mac);
vic_provinfo_add_tlv(vp,
VIC_GENERIC_PROV_TLV_CLUSTER_PORT_UUID_STR,
sizeof(client_mac_str), client_mac_str);
if (enic->pp.set & ENIC_SET_INSTANCE) { if (enic->pp.set & ENIC_SET_INSTANCE) {
sprintf(uuid_str, "%pUB", enic->pp.instance_uuid); sprintf(uuid_str, "%pUB", enic->pp.instance_uuid);
vic_provinfo_add_tlv(vp, vic_provinfo_add_tlv(vp,
VIC_LINUX_PROV_TLV_CLIENT_UUID_STR, VIC_GENERIC_PROV_TLV_CLIENT_UUID_STR,
sizeof(uuid_str), uuid_str); sizeof(uuid_str), uuid_str);
} }
if (enic->pp.set & ENIC_SET_HOST) { if (enic->pp.set & ENIC_SET_HOST) {
sprintf(uuid_str, "%pUB", enic->pp.host_uuid); sprintf(uuid_str, "%pUB", enic->pp.host_uuid);
vic_provinfo_add_tlv(vp, vic_provinfo_add_tlv(vp,
VIC_LINUX_PROV_TLV_HOST_UUID_STR, VIC_GENERIC_PROV_TLV_HOST_UUID_STR,
sizeof(uuid_str), uuid_str); sizeof(uuid_str), uuid_str);
} }
os_type = htons(os_type);
vic_provinfo_add_tlv(vp,
VIC_GENERIC_PROV_TLV_OS_TYPE,
sizeof(os_type), &os_type);
err = enic_dev_init_prov(enic, vp); err = enic_dev_init_prov(enic, vp);
vic_provinfo_free(vp); vic_provinfo_free(vp);
if (err) if (err)

View File

@ -24,14 +24,29 @@
/* Note: String field lengths include null char */ /* Note: String field lengths include null char */
#define VIC_PROVINFO_CISCO_OUI { 0x00, 0x00, 0x0c } #define VIC_PROVINFO_CISCO_OUI { 0x00, 0x00, 0x0c }
#define VIC_PROVINFO_LINUX_TYPE 0x2 #define VIC_PROVINFO_GENERIC_TYPE 0x4
enum vic_linux_prov_tlv_type { enum vic_generic_prov_tlv_type {
VIC_LINUX_PROV_TLV_PORT_PROFILE_NAME_STR = 0, VIC_GENERIC_PROV_TLV_PORT_PROFILE_NAME_STR = 0,
VIC_LINUX_PROV_TLV_CLIENT_MAC_ADDR = 1, /* u8[6] */ VIC_GENERIC_PROV_TLV_CLIENT_MAC_ADDR = 1,
VIC_LINUX_PROV_TLV_CLIENT_NAME_STR = 2, VIC_GENERIC_PROV_TLV_CLIENT_NAME_STR = 2,
VIC_LINUX_PROV_TLV_HOST_UUID_STR = 8, VIC_GENERIC_PROV_TLV_CLUSTER_PORT_NAME_STR = 3,
VIC_LINUX_PROV_TLV_CLIENT_UUID_STR = 9, VIC_GENERIC_PROV_TLV_CLUSTER_PORT_UUID_STR = 4,
VIC_GENERIC_PROV_TLV_CLUSTER_UUID_STR = 5,
VIC_GENERIC_PROV_TLV_CLUSTER_NAME_STR = 7,
VIC_GENERIC_PROV_TLV_HOST_UUID_STR = 8,
VIC_GENERIC_PROV_TLV_CLIENT_UUID_STR = 9,
VIC_GENERIC_PROV_TLV_INCARNATION_NUMBER = 10,
VIC_GENERIC_PROV_TLV_OS_TYPE = 11,
VIC_GENERIC_PROV_TLV_OS_VENDOR = 12,
VIC_GENERIC_PROV_TLV_CLIENT_TYPE = 15,
};
enum vic_generic_prov_os_type {
VIC_GENERIC_PROV_OS_TYPE_UNKNOWN = 0,
VIC_GENERIC_PROV_OS_TYPE_ESX = 1,
VIC_GENERIC_PROV_OS_TYPE_LINUX = 2,
VIC_GENERIC_PROV_OS_TYPE_WINDOWS = 3,
}; };
struct vic_provinfo { struct vic_provinfo {