diff options
-rw-r--r-- | usr/src/lib/libdladm/common/libdladm_impl.h | 2 | ||||
-rw-r--r-- | usr/src/uts/common/io/dld/dld_proto.c | 13 | ||||
-rw-r--r-- | usr/src/uts/common/io/mac/mac_client.c | 2 | ||||
-rw-r--r-- | usr/src/uts/common/io/vnic/vnic_dev.c | 21 |
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: { |