# #include "util.h" #include "pkts.h" #include "buf.h" #include "telnet.h" #include tcp_passive_open(lskt) short lskt; { register struct tcb *ptcb; register struct rcvpkt *ppkt; long fhost; short fskt; if ((ppkt = rd_pkt()) == NULL) return(FALSE); ptcb = &tcb; ptcb->t_state = LISTEN; fhost = ppkt->rp_inet.ip_src; if (!inet_init(ptcb, fhost)) return(FALSE); tcp_init(ptcb, lskt, 0); sb_init(); if (!ch_inet(ptcb, ppkt) || !ch_tcp(ptcb, ppkt)) enque(&frq, ppkt); if ((ptcb->t_state < SYN_RCVD) || (ptcb->t_state & CLOSED2)) return(FALSE); close(net); fskt = swab(ptcb->t_tcp.tc_dskt); if (!net_init(lskt, fhost, fskt)) return(FALSE); if (!tcp_syn(ptcb)) return(FALSE); return(TRUE); } tcp_active_open(lskt, fhost, fskt) short lskt, fskt; long fhost; { register struct tcb *ptcb; ptcb = &tcb; ptcb->t_state = SYN_SENT; if (!net_init(lskt, fhost, fskt)) return(FALSE); if (!inet_init(ptcb, fhost)) return(FALSE); tcp_init(ptcb, lskt, fskt); sb_init(); if (!tcp_syn(ptcb)) return(FALSE); return(TRUE); } /* tcp_syn synchronize tcp connection */ tcp_syn(ptcb) register struct tcb *ptcb; { register int i; register struct scb *pscb; short nch; pscb = &scb; tcp_snd(ptcb, ptcb->t_iss, 1); for (i = 0; (ptcb->t_state < OPEN) && (i < 10); i++) { ioctl(net, FIONREAD, &nch); if (nch <= 0) sysleep(RETRANSTIME); time(&curtime); pkt_rcv(ptcb, pscb); ch_tcpsnd(ptcb); } if ( (ptcb->t_state < OPEN) || (ptcb->t_state & CLOSED2) ) return(FALSE); return(TRUE); }