+ /* destroy temporarily created socket */
+ if (dropsocket)
+ (void) soabort(so);
+ return;
+}
+
+tcp_dooptions(tp, om)
+ struct tcpcb *tp;
+ struct mbuf *om;
+{
+ register u_char *cp;
+ int opt, optlen, cnt;
+
+ cp = mtod(om, u_char *);
+ cnt = om->m_len;
+ for (; cnt > 0; cnt -= optlen, cp += optlen) {
+ opt = cp[0];
+ if (opt == TCPOPT_EOL)
+ break;
+ if (opt == TCPOPT_NOP)
+ optlen = 1;
+ else
+ optlen = cp[1];
+ switch (opt) {
+
+ default:
+ break;
+
+ case TCPOPT_MAXSEG:
+ if (optlen != 4)
+ continue;
+ tp->t_maxseg = *(u_short *)(cp + 2);
+ tp->t_maxseg = ntohs((u_short)tp->t_maxseg);
+ break;
+ }
+ }
+ (void) m_free(om);
+}
+
+/*
+ * Pull out of band byte out of a segment so
+ * it doesn't appear in the user's data queue.
+ * It is still reflected in the segment length for
+ * sequencing purposes.
+ */
+tcp_pulloutofband(so, ti)
+ struct socket *so;
+ struct tcpiphdr *ti;
+{
+ register struct mbuf *m;
+ int cnt = ti->ti_urp - 1;
+
+ m = dtom(ti);
+ while (cnt >= 0) {
+ if (m->m_len > cnt) {
+ char *cp = mtod(m, caddr_t) + cnt;
+ struct tcpcb *tp = sototcpcb(so);
+
+ tp->t_iobc = *cp;
+ tp->t_oobflags |= TCPOOB_HAVEDATA;
+ bcopy(cp+1, cp, (unsigned)(m->m_len - cnt - 1));
+ m->m_len--;
+ return;
+ }
+ cnt -= m->m_len;
+ m = m->m_next;
+ if (m == 0)
+ break;
+ }
+ panic("tcp_pulloutofband");