summaryrefslogtreecommitdiffstats
path: root/sys/netinet/tcp_output.c
diff options
context:
space:
mode:
authoritojun <itojun@openbsd.org>1999-12-08 06:50:14 +0000
committeritojun <itojun@openbsd.org>1999-12-08 06:50:14 +0000
commit287546ea80ee896bda0c88b8a8c85a1dc6ff37f9 (patch)
treecef428e54b6d2bca56fb9b461aa0667c7fb5f6a2 /sys/netinet/tcp_output.c
parentadd GENERIC.v6 (IPv6 test configuration). to be integrated into GENREIC. (diff)
downloadwireguard-openbsd-287546ea80ee896bda0c88b8a8c85a1dc6ff37f9.tar.xz
wireguard-openbsd-287546ea80ee896bda0c88b8a8c85a1dc6ff37f9.zip
bring in KAME IPv6 code, dated 19991208.
replaces NRL IPv6 layer. reuses NRL pcb layer. no IPsec-on-v6 support. see sys/netinet6/{TODO,IMPLEMENTATION} for more details. GENERIC configuration should work fine as before. GENERIC.v6 works fine as well, but you'll need KAME userland tools to play with IPv6 (will be bringed into soon).
Diffstat (limited to 'sys/netinet/tcp_output.c')
-rw-r--r--sys/netinet/tcp_output.c89
1 files changed, 40 insertions, 49 deletions
diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c
index 23bc4f94b9f..8e73f4978f0 100644
--- a/sys/netinet/tcp_output.c
+++ b/sys/netinet/tcp_output.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tcp_output.c,v 1.24 1999/12/02 16:31:17 deraadt Exp $ */
+/* $OpenBSD: tcp_output.c,v 1.25 1999/12/08 06:50:20 itojun Exp $ */
/* $NetBSD: tcp_output.c,v 1.16 1997/06/03 16:17:09 kml Exp $ */
/*
@@ -440,17 +440,13 @@ send:
* NOTE: we assume that the IP/TCP header plus TCP options
* always fit in a single mbuf, leaving room for a maximum
* link header, i.e.
- * max_linkhdr + sizeof(network header) + sizeof(struct tcphdr) +
- * optlen <= MHLEN
+ * max_linkhdr + sizeof(network header) + sizeof(struct tcphdr +
+ * optlen <= MHLEN
*/
optlen = 0;
-#if defined(INET) && defined(INET6)
switch (tp->pf) {
-#else /* defined(INET) && defined(INET6) */
- switch (0) {
-#endif /* defined(INET) && defined(INET6) */
- case 0: /* If tp->pf is 0, then assume IPv4 unless not avail */
+ case 0: /*default to PF_INET*/
#ifdef INET
case PF_INET:
hdrlen = sizeof(struct ip) + sizeof(struct tcphdr);
@@ -458,7 +454,7 @@ send:
#endif /* INET */
#ifdef INET6
case PF_INET6:
- hdrlen = sizeof(struct ipv6) + sizeof(struct tcphdr);
+ hdrlen = sizeof(struct ip6_hdr) + sizeof(struct tcphdr);
break;
#endif /* INET6 */
default:
@@ -626,13 +622,20 @@ send:
m->m_data -= hdrlen;
#else
MGETHDR(m, M_DONTWAIT, MT_HEADER);
+ if (m != NULL) {
+ MCLGET(m, M_DONTWAIT);
+ if ((m->m_flags & M_EXT) == 0) {
+ m_freem(m);
+ m = NULL;
+ }
+ }
if (m == NULL) {
error = ENOBUFS;
goto out;
}
m->m_data += max_linkhdr;
m->m_len = hdrlen;
- if (len <= MHLEN - hdrlen - max_linkhdr) {
+ if (len <= MCLBYTES - hdrlen - max_linkhdr) {
m_copydata(so->so_snd.sb_mb, off, (int) len,
mtod(m, caddr_t) + hdrlen);
m->m_len += len;
@@ -664,6 +667,13 @@ send:
tcpstat.tcps_sndwinup++;
MGETHDR(m, M_DONTWAIT, MT_HEADER);
+ if (m != NULL) {
+ MCLGET(m, M_DONTWAIT);
+ if ((m->m_flags & M_EXT) == 0) {
+ m_freem(m);
+ m = NULL;
+ }
+ }
if (m == NULL) {
error = ENOBUFS;
goto out;
@@ -763,12 +773,8 @@ send:
tp->snd_up = tp->snd_una; /* drag it along */
/* Put TCP length in pseudo-header */
-#if defined(INET) && defined(INET6)
switch (tp->pf) {
-#else /* defined(INET) && defined(INET6) */
- switch (0) {
-#endif /* defined(INET) && defined(INET6) */
- case 0:
+ case 0: /*default to PF_INET*/
#ifdef INET
case AF_INET:
if (len + optlen)
@@ -790,12 +796,8 @@ send:
memset(&sa, 0, sizeof(union sockaddr_union));
-#if defined(INET) && defined(INET6)
- switch(tp->pf) {
-#else /* defined(INET) && defined(INET6) */
- switch (0) {
-#endif /* defined(INET) && defined(INET6) */
- case 0:
+ switch (tp->pf) {
+ case 0: /*default to PF_INET*/
#ifdef INET
case AF_INET:
sa.sa.sa_len = sizeof(struct sockaddr_in);
@@ -807,7 +809,7 @@ send:
case AF_INET6:
sa.sa.sa_len = sizeof(struct sockaddr_in6);
sa.sa.sa_family = AF_INET6;
- sa.sin6.sin6_addr = mtod(m, struct ipv6 *)->ipv6_dst;
+ sa.sin6.sin6_addr = mtod(m, struct ip6_hdr *)->ip6_dst;
break;
#endif /* INET6 */
}
@@ -820,12 +822,8 @@ send:
MD5Init(&ctx);
-#if defined(INET) && defined(INET6)
- switch(tp->pf) {
-#else /* defined(INET) && defined(INET6) */
- switch (0) {
-#endif /* defined(INET) && defined(INET6) */
- case 0:
+ switch (tp->pf) {
+ case 0: /*default to PF_INET*/
#ifdef INET
case AF_INET:
{
@@ -875,12 +873,8 @@ send:
* Put TCP length in extended header, and then
* checksum extended header and data.
*/
-#if defined(INET) && defined(INET6)
switch (tp->pf) {
-#else /* defined(INET) && defined(INET6) */
- switch (0) {
-#endif /* defined(INET) && defined(INET6) */
- case 0:
+ case 0: /*default to PF_INET*/
#ifdef INET
case AF_INET:
th->th_sum = in_cksum(m, (int)(hdrlen + len));
@@ -888,8 +882,9 @@ send:
#endif /* INET */
#ifdef INET6
case AF_INET6:
- th->th_sum = in6_cksum(m, IPPROTO_TCP, hdrlen + len,
- sizeof(struct ipv6));
+ m->m_pkthdr.len = hdrlen + len;
+ th->th_sum = in6_cksum(m, IPPROTO_TCP, sizeof(struct ip6_hdr),
+ hdrlen - sizeof(struct ip6_hdr) + len);
break;
#endif /* INET6 */
}
@@ -981,12 +976,8 @@ send:
*/
m->m_pkthdr.len = hdrlen + len;
-#if defined(INET) && defined(INET6)
switch (tp->pf) {
-#else /* defined(INET) && defined(INET6) */
- switch (0) {
-#endif /* defined(INET) && defined(INET6) */
- case 0:
+ case 0: /*default to PF_INET*/
#ifdef INET
case AF_INET:
{
@@ -997,7 +988,6 @@ send:
ip->ip_ttl = tp->t_inpcb->inp_ip.ip_ttl;
ip->ip_tos = tp->t_inpcb->inp_ip.ip_tos;
}
-
error = ip_output(m, tp->t_inpcb->inp_options,
&tp->t_inpcb->inp_route, so->so_options & SO_DONTROUTE,
0, tp->t_inpcb);
@@ -1006,16 +996,17 @@ send:
#ifdef INET6
case AF_INET6:
{
- struct ipv6 *ipv6;
+ struct ip6_hdr *ipv6;
- ipv6->ipv6_length = m->m_pkthdr.len -
- sizeof(struct ipv6);
- ipv6->ipv6_nexthdr = IPPROTO_TCP;
+ ipv6 = mtod(m, struct ip6_hdr *);
+ ipv6->ip6_plen = m->m_pkthdr.len -
+ sizeof(struct ip6_hdr);
+ ipv6->ip6_nxt = IPPROTO_TCP;
+ ipv6->ip6_hlim = in6_selecthlim(tp->t_inpcb, NULL);
}
-
- error = ipv6_output(m, &tp->t_inpcb->inp_route6,
- (so->so_options & SO_DONTROUTE), NULL, NULL,
- tp->t_inpcb->inp_socket);
+ error = ip6_output(m, tp->t_inpcb->inp_outputopts6,
+ &tp->t_inpcb->inp_route6,
+ (so->so_options & SO_DONTROUTE), NULL, NULL);
break;
#endif /* INET6 */
#ifdef TUBA