- if (n->t_len != 0)
- tcp_text(tp, n);
-/* urg */
- if (n->th_flags&TH_URG) {
- unsigned urgent;
-
- urgent = n->t_urp + n->t_seq;
- if (tp->rcv_nxt < urgent) {
- if (tp->rcv_urp <= tp->rcv_nxt)
- to_user(tp->t_ucb, UURGENT);
- tp->rcv_urp = urgent;
- }
- }
-/* eol */
- if ((n->th_flags&TH_EOL) &&
- (tp->tc_flags&TC_DROPPED_TXT) == 0 &&
- tp->t_rcv_prev != (struct th *)tp) {
- /* mark last mbuf */
- m = dtom(tp->t_rcv_prev);
- if (m != NULL) {
- while (m->m_next != NULL)
- m = m->m_next;
- m->m_act =
- (struct mbuf *)(m->m_off + m->m_len - 1);
- }
- }
- }
-/* fin */
- if ((n->th_flags&TH_FIN) && (tp->tc_flags&TC_DROPPED_TXT) == 0) {
- int last;
-
- if ((tp->tc_flags&TC_FIN_RCVD) == 0) {
- /* do we really have fin ? */
- last = firstempty(tp);
- if (tp->t_rcv_prev == (struct th *)tp ||
- last == t_end(tp->t_rcv_prev)) {
- tp->tc_flags |= TC_FIN_RCVD;
- netwakeup(tp->t_ucb); /* poke */
- }
- if ((tp->tc_flags&TC_FIN_RCVD) &&
- tp->rcv_nxt >= last) {
- tp->rcv_nxt = last + 1; /* fin seq */
- tp->tc_flags |= TC_ACK_DUE;
- }
- } else
- tp->tc_flags |= TC_ACK_DUE;
- }
-
-/* respond */
- sent = 0;
- if (tp->tc_flags&TC_ACK_DUE)
- sent = tcp_sndctl(tp);
- else if (tp->tc_flags&TC_NEW_WINDOW) {
- seq_t last = tp->snd_off;
- up = tp->t_ucb;
- for (m = up->uc_sbuf; m != NULL; m = m->m_next)
- last += m->m_len;
- if (tp->snd_nxt <= last || (tp->tc_flags&TC_SND_FIN))
- sent = send(tp);
- }
-
-/* set for retrans */
- if (!sent && tp->snd_una < tp->snd_nxt &&
- (tp->tc_flags&TC_CANCELLED)) {
- tp->t_rexmt = tp->t_xmtime;
- tp->t_rexmttl = T_REXMTTL;
- tp->t_rexmt_val = tp->t_rtl_val = tp->snd_lst;
- tp->tc_flags &= ~TC_CANCELLED;
- }
-}
-
-tcp_text(tp, n)
- register struct tcb *tp;
- register struct th *n;
-{
- register int i;
- register struct th *p, *q;
- register struct mbuf *m;
- int overage;
-COUNT(RCV_TEXT);