- ro->ro_rt = (struct rtentry *)0;
- }
- if ((ro->ro_rt == (struct rtentry *)0) ||
- (ifp = ro->ro_rt->rt_ifp) == (struct ifnet *)0) {
- /* No route yet, so try to acquire one */
- ro->ro_dst.sa_family = AF_NS;
- ((struct sockaddr_ns *) &ro->ro_dst)->sns_addr =
- sns->sns_addr;
- rtalloc(ro);
- if (ro->ro_rt == 0)
- ia = (struct ns_ifaddr *) 0;
- else
- for (ia = ns_ifaddr; ia; ia = ia->ia_next)
- if (ia->ia_ifp == ifp)
- break;
- }
+ ro->ro_rt = (struct rtentry *)0;
+ nsp->nsp_laddr.x_net = ns_zeronet;
+ }
+ }/* else cached route is ok; do nothing */
+ nsp->nsp_lastdst = sns->sns_addr;
+ if ((nsp->nsp_socket->so_options & SO_DONTROUTE) == 0 && /*XXX*/
+ (ro->ro_rt == (struct rtentry *)0 ||
+ ro->ro_rt->rt_ifp == (struct ifnet *)0)) {
+ /* No route yet, so try to acquire one */
+ ro->ro_dst.sa_family = AF_NS;
+ ro->ro_dst.sa_len = sizeof(ro->ro_dst);
+ *dst = sns->sns_addr;
+ dst->x_port = 0;
+ rtalloc(ro);
+ }
+ if (ns_neteqnn(nsp->nsp_laddr.x_net, ns_zeronet)) {
+ /*
+ * If route is known or can be allocated now,
+ * our src addr is taken from the i/f, else punt.
+ */
+
+ ia = (struct ns_ifaddr *)0;
+ /*
+ * If we found a route, use the address
+ * corresponding to the outgoing interface
+ */
+ if (ro->ro_rt && (ifp = ro->ro_rt->rt_ifp))
+ for (ia = ns_ifaddr; ia; ia = ia->ia_next)
+ if (ia->ia_ifp == ifp)
+ break;
+ if (ia == 0) {
+ u_short fport = sns->sns_addr.x_port;
+ sns->sns_addr.x_port = 0;
+ ia = (struct ns_ifaddr *)
+ ifa_ifwithdstaddr((struct sockaddr *)sns);
+ sns->sns_addr.x_port = fport;
+ if (ia == 0)
+ ia = ns_iaonnetof(&sns->sns_addr);