210 lines
5.8 KiB
C
210 lines
5.8 KiB
C
/*********************************************************
|
|
* Copyright (C) 1998-2016 VMware, Inc. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation version 2 and no later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
*********************************************************/
|
|
|
|
/************************************************************
|
|
*
|
|
* net.h
|
|
*
|
|
* This file should contain all network global defines.
|
|
* No vlance/vmxnet/vnet/vmknet specific stuff should be
|
|
* put here only defines used/usable by all network code.
|
|
* --gustav
|
|
*
|
|
************************************************************/
|
|
|
|
#ifndef VMWARE_DEVICES_NET_H
|
|
#define VMWARE_DEVICES_NET_H
|
|
|
|
#define INCLUDE_ALLOW_USERLEVEL
|
|
#define INCLUDE_ALLOW_MODULE
|
|
#define INCLUDE_ALLOW_VMCORE
|
|
|
|
#include "includeCheck.h"
|
|
#include "vm_device_version.h"
|
|
|
|
#ifdef VMCORE
|
|
#include "config.h"
|
|
#include "str.h"
|
|
#include "strutil.h"
|
|
#endif
|
|
|
|
#define ETHERNET_MTU 1518
|
|
|
|
#ifndef ETHER_ADDR_LEN
|
|
#define ETHER_ADDR_LEN 6 /* length of MAC address */
|
|
#endif
|
|
#define ETH_HEADER_LEN 14 /* length of Ethernet header */
|
|
#define IP_ADDR_LEN 4 /* length of IPv4 address */
|
|
#define IP_HEADER_LEN 20 /* minimum length of IPv4 header */
|
|
|
|
#define ETHER_MAX_QUEUED_PACKET 1600
|
|
|
|
|
|
/*
|
|
* State's that a NIC can be in currently we only use this
|
|
* in VLance but if we implement/emulate new adapters that
|
|
* we also want to be able to morph a new corresponding
|
|
* state should be added.
|
|
*/
|
|
|
|
#define LANCE_CHIP 0x2934
|
|
#define VMXNET_CHIP 0x4392
|
|
|
|
/*
|
|
* Size of reserved IO space needed by the LANCE adapter and
|
|
* the VMXNET adapter. If you add more ports to Vmxnet than
|
|
* there is reserved space you must bump VMXNET_CHIP_IO_RESV_SIZE.
|
|
* The sizes must be powers of 2.
|
|
*/
|
|
|
|
#define LANCE_CHIP_IO_RESV_SIZE 0x20
|
|
#define VMXNET_CHIP_IO_RESV_SIZE 0x40
|
|
|
|
#define MORPH_PORT_SIZE 4
|
|
|
|
#ifdef VMCORE
|
|
typedef struct Net_AdapterCount {
|
|
uint8 vlance;
|
|
uint8 vmxnet2;
|
|
uint8 vmxnet3;
|
|
uint8 vrdma;
|
|
uint8 e1000;
|
|
uint8 e1000e;
|
|
} Net_AdapterCount;
|
|
#endif
|
|
|
|
#ifdef USERLEVEL
|
|
|
|
/*
|
|
*----------------------------------------------------------------------------
|
|
*
|
|
* Net_AddAddrToLADRF --
|
|
*
|
|
* Given a MAC address, sets the corresponding bit in the LANCE style
|
|
* Logical Address Filter 'ladrf'.
|
|
* The caller should have initialized the ladrf to all 0's, as this
|
|
* function only ORs on a bit in the array.
|
|
* 'addr' is presumed to be ETHER_ADDR_LEN in size;
|
|
* 'ladrf' is presumed to point to a 64-bit vector.
|
|
*
|
|
* Derived from a long history of derivations, originally inspired by
|
|
* sample code from the AMD "Network Products: Ethernet Controllers 1998
|
|
* Data Book, Book 2", pages 1-53..1-55.
|
|
*
|
|
* Returns:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* Updates 'ladrf'.
|
|
*
|
|
*----------------------------------------------------------------------------
|
|
*/
|
|
|
|
static INLINE void
|
|
Net_AddAddrToLadrf(const uint8 *addr, // IN: pointer to MAC address
|
|
uint8 *ladrf) // IN/OUT: pointer to ladrf
|
|
{
|
|
#define CRC_POLYNOMIAL_BE 0x04c11db7UL /* Ethernet CRC, big endian */
|
|
|
|
uint16 hashcode;
|
|
int32 crc = 0xffffffff; /* init CRC for each address */
|
|
int32 j;
|
|
int32 bit;
|
|
int32 byte;
|
|
|
|
ASSERT(addr);
|
|
ASSERT(ladrf);
|
|
|
|
for (byte = 0; byte < ETHER_ADDR_LEN; byte++) { /* for each address byte */
|
|
/* process each address bit */
|
|
for (bit = *addr++, j = 0;
|
|
j < 8;
|
|
j++, bit >>= 1) {
|
|
crc = (crc << 1) ^ ((((crc < 0 ? 1 : 0) ^ bit) & 0x01) ?
|
|
CRC_POLYNOMIAL_BE : 0);
|
|
}
|
|
}
|
|
hashcode = (crc & 1); /* hashcode is 6 LSb of CRC ... */
|
|
for (j = 0; j < 5; j++) { /* ... in reverse order. */
|
|
hashcode = (hashcode << 1) | ((crc>>=1) & 1);
|
|
}
|
|
|
|
ladrf[hashcode >> 3] |= 1 << (hashcode & 0x07);
|
|
}
|
|
#endif // USERLEVEL
|
|
|
|
#ifdef VMCORE
|
|
/*
|
|
*----------------------------------------------------------------------
|
|
*
|
|
* Net_GetNumAdapters --
|
|
*
|
|
* Returns the number of each type of network adapter configured in this
|
|
* VM.
|
|
*
|
|
* Results:
|
|
* None.
|
|
*
|
|
* Side effects:
|
|
* None.
|
|
*
|
|
*----------------------------------------------------------------------
|
|
*/
|
|
|
|
static INLINE void
|
|
Net_GetNumAdapters(Net_AdapterCount *counts)
|
|
{
|
|
uint32 i;
|
|
|
|
counts->vlance = 0;
|
|
counts->vmxnet2 = 0;
|
|
counts->vmxnet3 = 0;
|
|
counts->vrdma = 0;
|
|
counts->e1000 = 0;
|
|
counts->e1000e = 0;
|
|
|
|
for (i = 0; i < MAX_ETHERNET_CARDS; i++) {
|
|
char* adapterStr;
|
|
|
|
if (!Config_GetBool(FALSE, "ethernet%d.present", i)) {
|
|
continue;
|
|
}
|
|
adapterStr = Config_GetString("vlance", "ethernet%d.virtualDev", i);
|
|
if (Str_Strcasecmp(adapterStr, "vmxnet3") == 0) {
|
|
counts->vmxnet3++;
|
|
} else if (Str_Strcasecmp(adapterStr, "vrdma") == 0) {
|
|
counts->vrdma++;
|
|
} else if (Str_Strcasecmp(adapterStr, "vlance") == 0) {
|
|
counts->vlance++;
|
|
} else if (Str_Strcasecmp(adapterStr, "vmxnet") == 0) {
|
|
counts->vmxnet2++;
|
|
} else if (Str_Strcasecmp(adapterStr, "e1000") == 0) {
|
|
counts->e1000++;
|
|
} else if (Str_Strcasecmp(adapterStr, "e1000e") == 0) {
|
|
counts->e1000e++;
|
|
} else {
|
|
LOG_ONCE(("%s: unknown adapter: %s\n", __FUNCTION__, adapterStr));
|
|
}
|
|
free(adapterStr);
|
|
}
|
|
}
|
|
|
|
#endif // VMCORE
|
|
|
|
#endif // VMWARE_DEVICES_NET_H
|