Index: ip_output.c =================================================================== RCS file: /cvsroot/src/sys/netinet/ip_output.c,v retrieving revision 1.324 diff -p -u -r1.324 ip_output.c --- ip_output.c 21 Nov 2022 09:51:13 -0000 1.324 +++ ip_output.c 10 Apr 2023 12:41:18 -0000 @@ -348,11 +348,6 @@ ip_output(struct mbuf *m0, struct mbuf * } mtu = ifp->if_mtu; ia = in_get_ia_from_ifp_psref(ifp, &psref_ia); - if (ia == NULL) { - IP_STATINC(IP_STAT_IFNOADDR); - error = EADDRNOTAVAIL; - goto bad; - } if (IN_MULTICAST(ip->ip_dst.s_addr) || ip->ip_dst.s_addr == INADDR_BROADCAST) { isbroadcast = 0; @@ -449,30 +444,28 @@ ip_output(struct mbuf *m0, struct mbuf * * of outgoing interface. */ if (in_nullhost(ip->ip_src)) { - struct in_ifaddr *xia; struct ifaddr *xifa; - struct psref _psref; - xia = in_get_ia_from_ifp_psref(ifp, &_psref); - if (!xia) { - IP_STATINC(IP_STAT_IFNOADDR); - error = EADDRNOTAVAIL; + /* Bail if no interface address has been configured */ + if (ia == NULL) { + IP_STATINC(IP_STAT_NOROUTE); + error = EHOSTUNREACH; goto bad; } - xifa = &xia->ia_ifa; + + xifa = &ia->ia_ifa; if (xifa->ifa_getifa != NULL) { - ia4_release(xia, &_psref); + ia4_release(ia, &psref_ia); /* FIXME ifa_getifa is NOMPSAFE */ - xia = ifatoia((*xifa->ifa_getifa)(xifa, rdst)); - if (xia == NULL) { + ia = ifatoia((*xifa->ifa_getifa)(xifa, rdst)); + if (ia == NULL) { IP_STATINC(IP_STAT_IFNOADDR); error = EADDRNOTAVAIL; goto bad; } - ia4_acquire(xia, &_psref); + ia4_acquire(ia, &psref_ia); } - ip->ip_src = xia->ia_addr.sin_addr; - ia4_release(xia, &_psref); + ip->ip_src = ia->ia_addr.sin_addr; } inmgroup = in_multi_group(ip->ip_dst, ifp, flags); @@ -531,10 +524,8 @@ ip_output(struct mbuf *m0, struct mbuf * if (in_nullhost(ip->ip_src)) { struct ifaddr *xifa; - /* If rt_ifa is AF_LINK, ia can be NULL. */ + /* Bail if no interface address has been configured */ if (ia == NULL) { - KASSERTMSG(rt->rt_ifa->ifa_addr->sa_family == AF_LINK, - "sa_family=%d", rt->rt_ifa->ifa_addr->sa_family); IP_STATINC(IP_STAT_NOROUTE); error = EHOSTUNREACH; goto bad; @@ -546,6 +537,7 @@ ip_output(struct mbuf *m0, struct mbuf * /* FIXME ifa_getifa is NOMPSAFE */ ia = ifatoia((*xifa->ifa_getifa)(xifa, rdst)); if (ia == NULL) { + IP_STATINC(IP_STAT_IFNOADDR); error = EADDRNOTAVAIL; goto bad; } @@ -591,15 +583,6 @@ ip_output(struct mbuf *m0, struct mbuf * sendit: if ((flags & (IP_FORWARDING|IP_NOIPNEWID)) == 0) { - /* If rt_ifa is AF_LINK, ia can be NULL. */ - if (ia == NULL) { - KASSERTMSG(rt->rt_ifa->ifa_addr->sa_family == AF_LINK, - "sa_family=%d", rt->rt_ifa->ifa_addr->sa_family); - IP_STATINC(IP_STAT_NOROUTE); - error = EHOSTUNREACH; - goto bad; - } - if (m->m_pkthdr.len < IP_MINFRAGSIZE) { ip->ip_id = 0; } else if ((m->m_pkthdr.csum_flags & M_CSUM_TSOv4) == 0) {