summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/rcm_daemon/common/ip_rcm.c13
-rw-r--r--usr/src/lib/libdladm/common/libdlaggr.c2
-rw-r--r--usr/src/uts/common/io/mac/mac.c16
-rw-r--r--usr/src/uts/common/io/softmac/softmac_ctl.c5
4 files changed, 28 insertions, 8 deletions
diff --git a/usr/src/cmd/rcm_daemon/common/ip_rcm.c b/usr/src/cmd/rcm_daemon/common/ip_rcm.c
index 5421d7364a..f1e7b2931b 100644
--- a/usr/src/cmd/rcm_daemon/common/ip_rcm.c
+++ b/usr/src/cmd/rcm_daemon/common/ip_rcm.c
@@ -1126,8 +1126,17 @@ update_pif(rcm_handle_t *hd, int af, int sock, struct lifreq *lifr)
}
(void) memcpy(&ifflags, &lifreq.lifr_flags, sizeof (ifflags));
- /* Ignore loopback and multipoint interfaces */
- if (!(ifflags & IFF_MULTICAST) || (ifflags & IFF_LOOPBACK)) {
+ /*
+ * Ignore interfaces that are always incapable of DR:
+ * - IFF_VIRTUAL: e.g., loopback and vni
+ * - IFF_POINTOPOINT: e.g., sppp and ip.tun
+ * - !IFF_MULTICAST: e.g., ip.6to4tun
+ *
+ * Note: The !IFF_MULTICAST check can be removed once iptun is
+ * implemented as a datalink.
+ */
+ if (!(ifflags & IFF_MULTICAST) ||
+ (ifflags & (IFF_POINTOPOINT | IFF_VIRTUAL))) {
rcm_log_message(RCM_TRACE3, "IP: if ignored (%s)\n",
pif.pi_ifname);
return (0);
diff --git a/usr/src/lib/libdladm/common/libdlaggr.c b/usr/src/lib/libdladm/common/libdlaggr.c
index 75291d0d1d..dfac1a2a92 100644
--- a/usr/src/lib/libdladm/common/libdlaggr.c
+++ b/usr/src/lib/libdladm/common/libdlaggr.c
@@ -380,7 +380,7 @@ i_dladm_aggr_add_rmv(datalink_id_t linkid, uint32_t nports,
dladm_aggr_port_attr_db_t *ports, uint32_t flags, int cmd)
{
char *orig_portstr = NULL, *portstr = NULL;
- laioc_add_rem_t *iocp;
+ laioc_add_rem_t *iocp = NULL;
laioc_port_t *ioc_ports;
uint32_t orig_nports, result_nports, len, i, j;
dladm_conf_t conf;
diff --git a/usr/src/uts/common/io/mac/mac.c b/usr/src/uts/common/io/mac/mac.c
index 3bc71547de..d564add30d 100644
--- a/usr/src/uts/common/io/mac/mac.c
+++ b/usr/src/uts/common/io/mac/mac.c
@@ -33,6 +33,7 @@
#include <sys/types.h>
#include <sys/conf.h>
#include <sys/id_space.h>
+#include <sys/esunddi.h>
#include <sys/stat.h>
#include <sys/mkdev.h>
#include <sys/stream.h>
@@ -507,6 +508,19 @@ mac_open(const char *macname, mac_handle_t *mhp)
if ((err = mac_hold(macname, &mip)) != 0)
return (err);
+ /*
+ * Hold the dip associated to the MAC to prevent it from being
+ * detached. For a softmac, its underlying dip is held by the
+ * mi_open() callback.
+ *
+ * This is done to be more tolerant with some defective drivers,
+ * which incorrectly handle mac_unregister() failure in their
+ * xxx_detach() routine. For example, some drivers ignore the
+ * failure of mac_unregister() and free all resources that
+ * that are needed for data transmition.
+ */
+ e_ddi_hold_devi(mip->mi_dip);
+
rw_enter(&mip->mi_gen_lock, RW_WRITER);
if ((mip->mi_oref != 0) ||
@@ -521,6 +535,7 @@ mac_open(const char *macname, mac_handle_t *mhp)
*/
if ((err = mip->mi_open(mip->mi_driver)) != 0) {
rw_exit(&mip->mi_gen_lock);
+ ddi_release_devi(mip->mi_dip);
mac_rele(mip);
return (err);
}
@@ -578,6 +593,7 @@ mac_close(mac_handle_t mh)
}
rw_exit(&mip->mi_gen_lock);
+ ddi_release_devi(mip->mi_dip);
mac_rele(mip);
}
diff --git a/usr/src/uts/common/io/softmac/softmac_ctl.c b/usr/src/uts/common/io/softmac/softmac_ctl.c
index 33472bd303..b1b8cd4f42 100644
--- a/usr/src/uts/common/io/softmac/softmac_ctl.c
+++ b/usr/src/uts/common/io/softmac/softmac_ctl.c
@@ -287,11 +287,6 @@ softmac_rput_process_proto(queue_t *rq, mblk_t *mp)
if (len < DL_ERROR_ACK_SIZE)
goto runt;
- cmn_err(CE_NOTE, "softmac: received DL_ERROR_ACK for "
- "%s errno/unix_errno 0x%x/%d",
- dl_primstr(dlp->error_ack.dl_error_primitive),
- dlp->error_ack.dl_errno, dlp->error_ack.dl_unix_errno);
-
softmac_process_dlpi(slp, mp, DL_ERROR_ACK_SIZE,
dlp->error_ack.dl_error_primitive);
return;