diff options
author | jmg <jmg@FreeBSD.org> | 2004-09-05 02:34:12 +0000 |
---|---|---|
committer | jmg <jmg@FreeBSD.org> | 2004-09-05 02:34:12 +0000 |
commit | 8e8293b76576645a7323d6bce9cc4f8b1e544edd (patch) | |
tree | 41c4349d7abcca9eddfb8777895d58e45d58de0b /sys/netinet | |
parent | e291fa77140598041f22aa877b26c0844871d3ea (diff) | |
download | FreeBSD-src-8e8293b76576645a7323d6bce9cc4f8b1e544edd.zip FreeBSD-src-8e8293b76576645a7323d6bce9cc4f8b1e544edd.tar.gz |
fix up socket/ip layer violation... don't assume/know that
SO_DONTROUTE == IP_ROUTETOIF and SO_BROADCAST == IP_ALLOWBROADCAST...
Diffstat (limited to 'sys/netinet')
-rw-r--r-- | sys/netinet/ip_divert.c | 3 | ||||
-rw-r--r-- | sys/netinet/raw_ip.c | 3 | ||||
-rw-r--r-- | sys/netinet/tcp_output.c | 7 | ||||
-rw-r--r-- | sys/netinet/tcp_subr.c | 3 | ||||
-rw-r--r-- | sys/netinet/tcp_timewait.c | 3 | ||||
-rw-r--r-- | sys/netinet/udp_usrreq.c | 6 |
6 files changed, 17 insertions, 8 deletions
diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c index 106aa56..8f524bb 100644 --- a/sys/netinet/ip_divert.c +++ b/sys/netinet/ip_divert.c @@ -333,7 +333,8 @@ div_output(struct socket *so, struct mbuf *m, #endif error = ip_output(m, inp->inp_options, NULL, - (so->so_options & SO_DONTROUTE) | + ((so->so_options & SO_DONTROUTE) ? + IP_ROUTETOIF : 0) | IP_ALLOWBROADCAST | IP_RAWOUTPUT, inp->inp_moptions, NULL); } diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index 96e9b0a..24f4131 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -249,7 +249,8 @@ rip_output(struct mbuf *m, struct socket *so, u_long dst) struct ip *ip; int error; struct inpcb *inp = sotoinpcb(so); - int flags = (so->so_options & SO_DONTROUTE) | IP_ALLOWBROADCAST; + int flags = ((so->so_options & SO_DONTROUTE) ? IP_ROUTETOIF : 0) | + IP_ALLOWBROADCAST; /* * If the user handed us a complete IP packet, use it. diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c index ce739e9..cd09097 100644 --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -1060,8 +1060,8 @@ timer: /* TODO: IPv6 IP6TOS_ECT bit on */ error = ip6_output(m, tp->t_inpcb->in6p_outputopts, NULL, - (so->so_options & SO_DONTROUTE), NULL, NULL, - tp->t_inpcb); + ((so->so_options & SO_DONTROUTE) ? + IP_ROUTETOIF : 0), NULL, NULL, tp->t_inpcb); } else #endif /* INET6 */ { @@ -1080,7 +1080,8 @@ timer: ip->ip_off |= IP_DF; error = ip_output(m, tp->t_inpcb->inp_options, NULL, - (so->so_options & SO_DONTROUTE), 0, tp->t_inpcb); + ((so->so_options & SO_DONTROUTE) ? IP_ROUTETOIF : 0), 0, + tp->t_inpcb); } if (error) { diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c index cb709fb..b0f4e5c 100644 --- a/sys/netinet/tcp_subr.c +++ b/sys/netinet/tcp_subr.c @@ -1848,7 +1848,8 @@ tcp_twrespond(struct tcptw *tw, int flags) if (path_mtu_discovery) ip->ip_off |= IP_DF; error = ip_output(m, inp->inp_options, NULL, - (tw->tw_so_options & SO_DONTROUTE), NULL, inp); + ((tw->tw_so_options & SO_DONTROUTE) ? IP_ROUTETOIF : 0), + NULL, inp); } if (flags & TH_ACK) tcpstat.tcps_sndacks++; diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c index cb709fb..b0f4e5c 100644 --- a/sys/netinet/tcp_timewait.c +++ b/sys/netinet/tcp_timewait.c @@ -1848,7 +1848,8 @@ tcp_twrespond(struct tcptw *tw, int flags) if (path_mtu_discovery) ip->ip_off |= IP_DF; error = ip_output(m, inp->inp_options, NULL, - (tw->tw_so_options & SO_DONTROUTE), NULL, inp); + ((tw->tw_so_options & SO_DONTROUTE) ? IP_ROUTETOIF : 0), + NULL, inp); } if (flags & TH_ACK) tcpstat.tcps_sndacks++; diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 39d1634..9c02395 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -879,7 +879,11 @@ udp_output(inp, m, addr, control, td) ui->ui_dport = fport; ui->ui_ulen = htons((u_short)len + sizeof(struct udphdr)); - ipflags = inp->inp_socket->so_options & (SO_DONTROUTE | SO_BROADCAST); + ipflags = 0; + if (inp->inp_socket->so_options & SO_DONTROUTE) + ipflags |= IP_ROUTETOIF; + if (inp->inp_socket->so_options & SO_BROADCAST) + ipflags |= IP_ALLOWBROADCAST; if (inp->inp_flags & INP_ONESBCAST) ipflags |= IP_SENDONES; |