diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/inet/ip/ip_ire.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/usr/src/uts/common/inet/ip/ip_ire.c b/usr/src/uts/common/inet/ip/ip_ire.c index 775e96485f..3d9a6427ab 100644 --- a/usr/src/uts/common/inet/ip/ip_ire.c +++ b/usr/src/uts/common/inet/ip/ip_ire.c @@ -2486,7 +2486,9 @@ ire_to_ill(const ire_t *ire) * condition may not hold during that period since the ires * are added one at a time. Thus one of the pair could have been * added and the other not yet added. - * 3) For all others return the ones pointed by ire_ipif->ipif_ill. + * 3) For many other IREs (e.g., IRE_LOCAL), ire_rfq indicates the ill. + * 4) For all others return the ones pointed by ire_ipif->ipif_ill. + * That handles IRE_LOOPBACK. */ if (ire->ire_type == IRE_CACHE) { @@ -2505,6 +2507,8 @@ ire_to_ill(const ire_t *ire) ill = (ill_t *)ire_next->ire_stq->q_ptr; } } + } else if (ire->ire_rfq != NULL) { + ill = ire->ire_rfq->q_ptr; } else if (ire->ire_ipif != NULL) { ill = ire->ire_ipif->ipif_ill; } @@ -4830,14 +4834,14 @@ ire_local_same_ill_group(ire_t *ire_local, ire_t *xmit_ire) ill_t *recv_ill, *xmit_ill; ill_group_t *recv_group, *xmit_group; - ASSERT(ire_local->ire_type == IRE_LOCAL); - ASSERT(ire_local->ire_rfq != NULL); - ASSERT(xmit_ire->ire_type & (IRE_CACHE|IRE_BROADCAST|IRE_INTERFACE)); - ASSERT(xmit_ire->ire_stq != NULL); - ASSERT(xmit_ire->ire_ipif != NULL); + ASSERT(ire_local->ire_type & (IRE_LOCAL|IRE_LOOPBACK)); + ASSERT(xmit_ire->ire_type & (IRE_CACHETABLE)); - recv_ill = ire_local->ire_rfq->q_ptr; - xmit_ill = xmit_ire->ire_stq->q_ptr; + recv_ill = ire_to_ill(ire_local); + xmit_ill = ire_to_ill(xmit_ire); + + ASSERT(recv_ill != NULL); + ASSERT(xmit_ill != NULL); if (recv_ill == xmit_ill) return (B_TRUE); |