+ /*
+ * If we haven't bound which network number to use as ours,
+ * we will use the number of the outgoing interface.
+ * This depends on having done a routing lookup, which
+ * we will probably have to do anyway, so we might
+ * as well do it now. On the other hand if we are
+ * sending to multiple destinations we may have already
+ * done the lookup, so see if we can use the route
+ * from before. In any case, we only
+ * chose a port number once, even if sending to multiple
+ * destinations.
+ */
+ ro = &nsp->nsp_route;
+ dst = &satons_addr(ro->ro_dst);
+ if (nsp->nsp_socket->so_options & SO_DONTROUTE)
+ goto flush;
+ if (!ns_neteq(nsp->nsp_lastdst, sns->sns_addr))
+ goto flush;
+ if (!ns_hosteq(nsp->nsp_lastdst, sns->sns_addr)) {
+ if (ro->ro_rt && ! (ro->ro_rt->rt_flags & RTF_HOST)) {
+ /* can patch route to avoid rtalloc */
+ *dst = sns->sns_addr;
+ } else {
+ flush:
+ if (ro->ro_rt)
+ RTFREE(ro->ro_rt);
+ 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.
+ */