- /*
- * Before ESTABLISHED, force sending of initial options
- * unless TCP set to not do any options.
- */
- opt = NULL;
- if (flags & TH_SYN && (tp->t_flags & TF_NOOPT) == 0) {
- u_short mss;
-
- mss = min(so->so_rcv.sb_hiwat / 2, tcp_mss(tp));
- if (mss > IP_MSS - sizeof(struct tcpiphdr)) {
- opt = tcp_initopt;
- optlen = sizeof (tcp_initopt);
- *(u_short *)(opt + 2) = htons(mss);
- }
- }
- if (opt) {
- m0 = m->m_next;
- m->m_next = m_get(M_DONTWAIT, MT_DATA);
- if (m->m_next == 0) {
- (void) m_free(m);
- m_freem(m0);
- return (ENOBUFS);
- }
- m->m_next->m_next = m0;
- m0 = m->m_next;
- m0->m_len = optlen;
- bcopy((caddr_t)opt, mtod(m0, caddr_t), optlen);
- opt = (u_char *)(mtod(m0, caddr_t) + optlen);
- while (m0->m_len & 0x3) {
- *opt++ = TCPOPT_EOL;
- m0->m_len++;
- }
- optlen = m0->m_len;