summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr/src/lib/libdladm/common/libdladm_impl.h2
-rw-r--r--usr/src/uts/common/io/dld/dld_proto.c13
-rw-r--r--usr/src/uts/common/io/mac/mac_client.c2
-rw-r--r--usr/src/uts/common/io/vnic/vnic_dev.c21
4 files changed, 21 insertions, 17 deletions
diff --git a/usr/src/lib/libdladm/common/libdladm_impl.h b/usr/src/lib/libdladm/common/libdladm_impl.h
index 07937f2c04..13169285e3 100644
--- a/usr/src/lib/libdladm/common/libdladm_impl.h
+++ b/usr/src/lib/libdladm/common/libdladm_impl.h
@@ -118,7 +118,7 @@ extern void dladm_free_args(dladm_arg_list_t *);
FKEY, FNPORTS, FPORTS, FPOLICY, \
FFIXMACADDR, FFORCE, FLACPMODE, FLACPTIMER, \
FMADDRTYPE, FMADDRLEN, FMADDRSLOT, \
- FMADDRPREFIXLEN, \
+ FMADDRPREFIXLEN, FVRID, FVRAF, \
FMACADDR, FSIMNETTYPE, FSIMNETPEER
/*
diff --git a/usr/src/uts/common/io/dld/dld_proto.c b/usr/src/uts/common/io/dld/dld_proto.c
index 67774c329f..1231a0cced 100644
--- a/usr/src/uts/common/io/dld/dld_proto.c
+++ b/usr/src/uts/common/io/dld/dld_proto.c
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
/*
@@ -1558,7 +1557,6 @@ proto_capability_advertise(dld_str_t *dsp, mblk_t *mp)
uint8_t *ptr;
queue_t *q = dsp->ds_wq;
mblk_t *mp1;
- boolean_t is_vlan;
boolean_t hcksum_capable = B_FALSE;
boolean_t zcopy_capable = B_FALSE;
boolean_t dld_capable = B_FALSE;
@@ -1568,17 +1566,12 @@ proto_capability_advertise(dld_str_t *dsp, mblk_t *mp)
* Initially assume no capabilities.
*/
subsize = 0;
- is_vlan = (mac_client_vid(dsp->ds_mch) != VLAN_ID_NONE);
/*
- * Check if checksum offload is supported on this MAC. Don't
- * advertise DL_CAPAB_HCKSUM if the underlying MAC is VLAN incapable,
- * since it might not be able to do the hardware checksum offload
- * with the correct offset.
+ * Check if checksum offload is supported on this MAC.
*/
bzero(&hcksum, sizeof (dl_capab_hcksum_t));
- if ((!is_vlan || (!mac_capab_get(dsp->ds_mh, MAC_CAPAB_NO_NATIVEVLAN,
- NULL))) && mac_capab_get(dsp->ds_mh, MAC_CAPAB_HCKSUM,
+ if (mac_capab_get(dsp->ds_mh, MAC_CAPAB_HCKSUM,
&hcksum.hcksum_txflags)) {
if (hcksum.hcksum_txflags != 0) {
hcksum_capable = B_TRUE;
diff --git a/usr/src/uts/common/io/mac/mac_client.c b/usr/src/uts/common/io/mac/mac_client.c
index 58680d7bbf..0ccf207567 100644
--- a/usr/src/uts/common/io/mac/mac_client.c
+++ b/usr/src/uts/common/io/mac/mac_client.c
@@ -4051,11 +4051,11 @@ mac_capab_get(mac_handle_t mh, mac_capab_t cap, void *cap_data)
*/
if (mip->mi_nactiveclients > 1) {
switch (cap) {
- case MAC_CAPAB_NO_NATIVEVLAN:
case MAC_CAPAB_NO_ZCOPY:
return (B_TRUE);
case MAC_CAPAB_LEGACY:
case MAC_CAPAB_HCKSUM:
+ case MAC_CAPAB_NO_NATIVEVLAN:
break;
default:
return (B_FALSE);
diff --git a/usr/src/uts/common/io/vnic/vnic_dev.c b/usr/src/uts/common/io/vnic/vnic_dev.c
index 2b063cf79c..26d2200b0d 100644
--- a/usr/src/uts/common/io/vnic/vnic_dev.c
+++ b/usr/src/uts/common/io/vnic/vnic_dev.c
@@ -19,8 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*/
#include <sys/types.h>
@@ -440,10 +439,21 @@ vnic_dev_create(datalink_id_t vnic_id, datalink_id_t linkid,
if (vnic->vn_addr_type == VNIC_MAC_ADDR_TYPE_FACTORY)
vnic->vn_slot_id = *mac_slot;
- /* set the initial VNIC capabilities */
- if (!mac_capab_get(vnic->vn_lower_mh, MAC_CAPAB_HCKSUM,
- &vnic->vn_hcksum_txflags))
+ /*
+ * Set the initial VNIC capabilities. If the VNIC is created
+ * over MACs which does not support nactive vlan, disable
+ * VNIC's hardware checksum capability if its VID is not 0,
+ * since the underlying MAC would get the hardware checksum
+ * offset wrong in case of VLAN packets.
+ */
+ if (vid == 0 || !mac_capab_get(vnic->vn_lower_mh,
+ MAC_CAPAB_NO_NATIVEVLAN, NULL)) {
+ if (!mac_capab_get(vnic->vn_lower_mh, MAC_CAPAB_HCKSUM,
+ &vnic->vn_hcksum_txflags))
+ vnic->vn_hcksum_txflags = 0;
+ } else {
vnic->vn_hcksum_txflags = 0;
+ }
}
/* register with the MAC module */
@@ -773,6 +783,7 @@ vnic_m_capab_get(void *arg, mac_capab_t cap, void *cap_data)
return (B_FALSE);
}
case MAC_CAPAB_NO_NATIVEVLAN:
+ return (B_FALSE);
case MAC_CAPAB_NO_ZCOPY:
return (B_TRUE);
case MAC_CAPAB_VRRP: {