steveh@hammer.UUCP (Stephen Hemminger) (08/01/84)
As part of the max segment size fixes (which were in my previous note), here are the diffs for tcp_subr.c ---------------------- *** tcp_subr.4_2 Wed Aug 1 08:24:58 1984 --- tcp_subr.fix Wed Aug 1 08:26:09 1984 *************** *** 1,4 ! /* tcp_subr.c 6.1 83/07/29 */ #include "../h/param.h" #include "../h/systm.h" --- 1,4 ----- ! /* tcp_subr.c 6.1 (Berkeley/w fixes) 83/07/29 */ #include "../h/param.h" #include "../h/systm.h" *************** *** 149,154 struct inpcb *inp; { struct mbuf *m = m_getclr(M_DONTWAIT, MT_PCB); register struct tcpcb *tp; if (m == NULL) --- 149,156 ----- struct inpcb *inp; { struct mbuf *m = m_getclr(M_DONTWAIT, MT_PCB); + register struct ifnent *ifp; + struct ifnet *tcp_getif(); register struct tcpcb *tp; if (m == NULL) *************** *** 155,160 return ((struct tcpcb *)0); tp = mtod(m, struct tcpcb *); tp->seg_next = tp->seg_prev = (struct tcpiphdr *)tp; /* * If the default maximum IP packet size is 576 bytes * and a standard IP header is 20 bytes, with a TCP --- 157,163 ----- return ((struct tcpcb *)0); tp = mtod(m, struct tcpcb *); tp->seg_next = tp->seg_prev = (struct tcpiphdr *)tp; + /* * If the default maximum IP packet size is 576 bytes * and a standard IP header is 20 bytes, with a TCP *************** *** 161,166 * header of 20 bytes plus the options necessary to * upgrade it to something higher, then initialize the * maximum segment size to 576 - (20 + 20 + 8 + slop). */ tp->t_maxseg = 512; /* satisfy the rest of the world */ tp->t_flags = 0; /* sends options! */ --- 164,171 ----- * header of 20 bytes plus the options necessary to * upgrade it to something higher, then initialize the * maximum segment size to 576 - (20 + 20 + 8 + slop). + * But Postel says make it 536; see <INC-PROJECT, MAX-SEG-SIZ.NLS.14> + * and letter of 7 Nov 1983. */ tp->t_maxseg = 536; /* satisfy the rest of the world */ tp->t_flags = 0; /* sends options! */ *************** *** 162,168 * upgrade it to something higher, then initialize the * maximum segment size to 576 - (20 + 20 + 8 + slop). */ ! tp->t_maxseg = 512; /* satisfy the rest of the world */ tp->t_flags = 0; /* sends options! */ tp->t_inpcb = inp; inp->inp_ppcb = (caddr_t)tp; --- 167,173 ----- * But Postel says make it 536; see <INC-PROJECT, MAX-SEG-SIZ.NLS.14> * and letter of 7 Nov 1983. */ ! tp->t_maxseg = 536; /* satisfy the rest of the world */ tp->t_flags = 0; /* sends options! */ tp->t_inpcb = inp; inp->inp_ppcb = (caddr_t)tp; *************** *** 264,266 in_pcbnotify(&tcb, sin, (int)inetctlerrmap[cmd], tcp_abort); } } --- 269,299 ----- in_pcbnotify(&tcb, sin, (int)inetctlerrmap[cmd], tcp_abort); } } + /* + * Given a tcpcb, discover route and determine interface to send + * packets over. + */ + + struct ifnet * + tcp_getif(tp) + struct tcpcb *tp; + { + struct route iproute; + register struct route *ro; + struct in_addr faddr; + register struct ifnet *ifp; + + ro = &iproute; + bzero((caddr_t)ro, sizeof(*ro)); + ro->ro_dst.sa_family = AF_INET; + faddr = tp->t_inpcb->inp_faddr; + if (faddr.s_addr == 0) + return (struct ifnet *)0; + + ((struct sockaddr_in *) &iproute.ro_dst)->sin_addr = faddr; + rtalloc(ro); + if ((ro->ro_rt == 0) || (ifp = ro->ro_rt->rt_ifp) == 0) + return (struct ifnet *)0; + rtfree(ro->ro_rt); + return ifp; + } -------------------- Stephen Hemminger {ihnp4,decvax,allegra}!tektronix!hammer!steveh