- return (ip_output(m, (struct mbuf *)0,
- (so->so_options & SO_DONTROUTE) ? &routetoif : (struct route *)0,
- so->so_state & SS_PRIV));
+ if (so->so_options & SO_DONTROUTE)
+ return (ip_output(m, (struct mbuf *)0, (struct route *)0,
+ (so->so_options & SO_BROADCAST) | IP_ROUTETOIF));
+ /*
+ * Use cached route for previous datagram if
+ * this is also to the same destination.
+ *
+ * NB: We don't handle broadcasts because that
+ * would require 3 subroutine calls.
+ */
+ ro = &inp->inp_route;
+#define satosin(sa) ((struct sockaddr_in *)(sa))
+ if (ro->ro_rt &&
+ satosin(&ro->ro_dst)->sin_addr.s_addr != ui->ui_dst.s_addr) {
+ RTFREE(ro->ro_rt);
+ ro->ro_rt = (struct rtentry *)0;
+ }
+ return (ip_output(m, (struct mbuf *)0, ro,
+ so->so_options & SO_BROADCAST));