summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/dld/dld_proto.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/io/dld/dld_proto.c')
-rw-r--r--usr/src/uts/common/io/dld/dld_proto.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/usr/src/uts/common/io/dld/dld_proto.c b/usr/src/uts/common/io/dld/dld_proto.c
index ecf8e27afd..338a1c96d0 100644
--- a/usr/src/uts/common/io/dld/dld_proto.c
+++ b/usr/src/uts/common/io/dld/dld_proto.c
@@ -45,6 +45,7 @@ static proto_reqfunc_t proto_info_req, proto_attach_req, proto_detach_req,
static void proto_capability_advertise(dld_str_t *, mblk_t *);
static int dld_capab_poll_disable(dld_str_t *, dld_capab_poll_t *);
+static boolean_t check_mod_above(queue_t *, const char *);
#define DL_ACK_PENDING(state) \
((state) == DL_ATTACH_PENDING || \
@@ -446,6 +447,9 @@ proto_bind_req(dld_str_t *dsp, mblk_t *mp)
* Bind the channel such that it can receive packets.
*/
sap = dlp->dl_sap;
+ dsp->ds_nonip = !check_mod_above(dsp->ds_rq, "ip") &&
+ !check_mod_above(dsp->ds_rq, "arp");
+
err = dls_bind(dsp, sap);
if (err != 0) {
switch (err) {
@@ -993,14 +997,14 @@ failed:
}
static boolean_t
-check_ip_above(queue_t *q)
+check_mod_above(queue_t *q, const char *mod)
{
queue_t *next_q;
boolean_t ret = B_TRUE;
claimstr(q);
next_q = q->q_next;
- if (strcmp(next_q->q_qinfo->qi_minfo->mi_idname, "ip") != 0)
+ if (strcmp(next_q->q_qinfo->qi_minfo->mi_idname, mod) != 0)
ret = B_FALSE;
releasestr(q);
return (ret);
@@ -1506,7 +1510,8 @@ dld_capab(dld_str_t *dsp, uint_t type, void *data, uint_t flags)
* completes. So we limit the check to DLD_ENABLE case.
*/
if ((flags == DLD_ENABLE && type != DLD_CAPAB_PERIM) &&
- (dsp->ds_sap != ETHERTYPE_IP || !check_ip_above(dsp->ds_rq))) {
+ (dsp->ds_sap != ETHERTYPE_IP ||
+ !check_mod_above(dsp->ds_rq, "ip"))) {
return (ENOTSUP);
}
@@ -1593,7 +1598,7 @@ proto_capability_advertise(dld_str_t *dsp, mblk_t *mp)
/*
* Direct capability negotiation interface between IP and DLD
*/
- if (dsp->ds_sap == ETHERTYPE_IP && check_ip_above(dsp->ds_rq)) {
+ if (dsp->ds_sap == ETHERTYPE_IP && check_mod_above(dsp->ds_rq, "ip")) {
dld_capable = B_TRUE;
subsize += sizeof (dl_capability_sub_t) +
sizeof (dl_capab_dld_t);