Lines Matching refs:cb

111 static	void spx_close(struct spxpcb *cb);
112 static void spx_disconnect(struct spxpcb *cb);
113 static void spx_drop(struct spxpcb *cb, int errno);
114 static void spx_setpersist(struct spxpcb *cb);
115 static void spx_template(struct spxpcb *cb);
116 static void spx_timers(struct spxpcb *cb, int timer);
117 static void spx_usrclosed(struct spxpcb *cb);
187 struct spxpcb *cb;
206 cb = ipxtospxpcb(ipxp);
207 KASSERT(cb != NULL, ("spx_input: cb == NULL"));
234 ostate = cb->s_state;
238 struct spxpcb *ocb = cb;
267 cb = ipxtospxpcb(ipxp);
268 cb->s_mtu = ocb->s_mtu; /* preserve sockopts */
269 cb->s_flags = ocb->s_flags; /* preserve sockopts */
270 cb->s_flags2 = ocb->s_flags2; /* preserve sockopts */
271 cb->s_state = TCPS_LISTEN;
279 cb->s_idle = 0;
280 cb->s_timer[SPXT_KEEP] = SPXTV_KEEP;
282 switch (cb->s_state) {
309 spx_template(cb);
311 cb->s_did = si->si_sid;
312 cb->s_rack = si->si_ack;
313 cb->s_ralo = si->si_alo;
316 cb->s_state = TCPS_SYN_RECEIVED;
317 cb->s_force = 1 + SPXT_KEEP;
319 cb->s_timer[SPXT_KEEP] = SPXTV_KEEP;
329 if (si->si_did != cb->s_sid) {
335 cb->s_timer[SPXT_REXMT] = 0;
336 cb->s_timer[SPXT_KEEP] = SPXTV_KEEP;
338 cb->s_state = TCPS_ESTABLISHED;
352 if (si->si_did != cb->s_sid) {
357 cb->s_did = si->si_sid;
358 cb->s_rack = si->si_ack;
359 cb->s_ralo = si->si_alo;
360 cb->s_dport = ipxp->ipxp_fport = si->si_sport;
361 cb->s_timer[SPXT_REXMT] = 0;
362 cb->s_flags |= SF_ACKNOW;
364 cb->s_state = TCPS_ESTABLISHED;
369 if (cb->s_rtt) {
370 cb->s_srtt = cb->s_rtt << 3;
371 cb->s_rttvar = cb->s_rtt << 1;
372 SPXT_RANGESET(cb->s_rxtcur,
373 ((cb->s_srtt >> 2) + cb->s_rttvar) >> 1,
375 cb->s_rtt = 0;
380 spx_trace(SA_INPUT, (u_char)ostate, cb, &spx_savesi, 0);
386 if (spx_reass(cb, m, si))
388 if (cb->s_force || (cb->s_flags & (SF_ACKNOW|SF_WIN|SF_RXT)))
389 spx_output(cb, NULL);
390 cb->s_flags &= ~(SF_WIN|SF_RXT);
397 if (cb == NULL || (cb->s_ipxpcb->ipxp_socket->so_options & SO_DEBUG ||
399 spx_trace(SA_DROP, (u_char)ostate, cb, &spx_savesi, 0);
420 if (cb->s_ipxpcb->ipxp_socket->so_options & SO_DEBUG || traceallspxs)
421 spx_trace(SA_DROP, (u_char)ostate, cb, &spx_savesi, 0);
435 spx_output(struct spxpcb *cb, struct mbuf *m0)
437 struct socket *so = cb->s_ipxpcb->ipxp_socket;
450 IPX_LOCK_ASSERT(cb->s_ipxpcb);
453 int mtu = cb->s_mtu;
465 datalen = (cb->s_flags & SF_HO) ?
468 if (cb->s_flags & SF_PI) {
472 int oldEM = cb->s_cc & SPX_EM;
474 cb->s_cc &= ~SPX_EM;
478 cb->s_cc |= oldEM;
482 if (cb->s_flags & SF_NEWCALL) {
490 error = spx_output(cb, m);
492 cb->s_cc |= oldEM;
499 cb->s_cc |= oldEM;
537 si->si_i = cb->s_ipx;
538 si->si_s = cb->s_shdr;
539 if ((cb->s_flags & SF_PI) && (cb->s_flags & SF_HO)) {
557 if ((cb->s_flags2 & SF_NEWCALL) && recordp) {
561 if (cb->s_oobflags & SF_SOOB) {
581 cb->s_seq++;
584 idle = (cb->s_smax == (cb->s_rack - 1));
588 off = cb->s_snxt - cb->s_rack;
589 win = min(cb->s_swnd, (cb->s_cwnd / CUNIT));
596 if (cb->s_force == 1 + SPXT_PERSIST) {
598 cb->s_timer[SPXT_PERSIST] = 0;
599 cb->s_rxtshift = 0;
602 span = cb->s_seq - cb->s_rack;
614 cb->s_timer[SPXT_REXMT] = 0;
615 cb->s_snxt = cb->s_rack;
625 if (cb->s_oobflags & SF_SOOB) {
629 cb->s_oobflags &= ~ SF_SOOB;
634 if (cb->s_flags & SF_ACKNOW)
636 if (cb->s_state < TCPS_ESTABLISHED)
652 u_short delta = 1 + cb->s_alo - cb->s_ack;
653 int adv = rcv_win - (delta * cb->s_mtu);
655 if ((so->so_rcv.sb_cc == 0 && adv >= (2 * cb->s_mtu)) ||
658 cb->s_flags |= SF_ACKNOW;
671 if (so->so_snd.sb_cc && cb->s_timer[SPXT_REXMT] == 0 &&
672 cb->s_timer[SPXT_PERSIST] == 0) {
673 cb->s_rxtshift = 0;
674 spx_setpersist(cb);
680 cb->s_outx = 1;
690 cb->s_want = cb->s_snxt;
693 if (SSEQ_LEQ(cb->s_snxt, si->si_seq))
698 if (si->si_seq != cb->s_snxt) {
703 cb->s_snxt++;
712 alo = cb->s_ack - 1 + (rcv_win / ((short)cb->s_mtu));
713 if (SSEQ_LT(alo, cb->s_alo))
714 alo = cb->s_alo;
725 if (SSEQ_LT(si->si_seq, cb->s_smax))
729 } else if (cb->s_force || cb->s_flags & SF_ACKNOW) {
733 if (cb->s_force)
735 if (cb->s_flags & SF_ACKNOW)
749 si->si_i = cb->s_ipx;
750 si->si_s = cb->s_shdr;
751 si->si_seq = cb->s_smax + 1;
755 cb->s_outx = 3;
757 spx_trace(SA_OUTPUT, cb->s_state, cb, si, 0);
765 if (cb->s_force != (1 + SPXT_PERSIST) ||
766 cb->s_timer[SPXT_PERSIST] == 0) {
771 if (SSEQ_LT(cb->s_smax, si->si_seq)) {
772 cb->s_smax = si->si_seq;
773 if (cb->s_rtt == 0) {
775 cb->s_rtseq = si->si_seq;
776 cb->s_rtt = 1;
787 if (cb->s_timer[SPXT_REXMT] == 0 &&
788 cb->s_snxt != cb->s_rack) {
789 cb->s_timer[SPXT_REXMT] = cb->s_rxtcur;
790 if (cb->s_timer[SPXT_PERSIST]) {
791 cb->s_timer[SPXT_PERSIST] = 0;
792 cb->s_rxtshift = 0;
795 } else if (SSEQ_LT(cb->s_smax, si->si_seq))
796 cb->s_smax = si->si_seq;
797 } else if (cb->s_state < TCPS_ESTABLISHED) {
798 if (cb->s_rtt == 0)
799 cb->s_rtt = 1; /* Time initial handshake */
800 if (cb->s_timer[SPXT_REXMT] == 0)
801 cb->s_timer[SPXT_REXMT] = cb->s_rxtcur;
808 if (((si->si_cc & SPX_SP) == 0) || cb->s_force)
812 si->si_ack = htons(cb->s_ack);
819 cb->s_outx = 4;
821 spx_trace(SA_OUTPUT, cb->s_state, cb, si, 0);
830 error = ipx_outputfl(m, &cb->s_ipxpcb->ipxp_route, 0);
840 cb->s_force = 0;
841 cb->s_flags &= ~(SF_ACKNOW|SF_DELACK);
842 if (SSEQ_GT(alo, cb->s_alo))
843 cb->s_alo = alo;
846 cb->s_outx = 5;
853 spx_setpersist(struct spxpcb *cb)
855 int t = ((cb->s_srtt >> 2) + cb->s_rttvar) >> 1;
857 IPX_LOCK_ASSERT(cb->s_ipxpcb);
859 if (cb->s_timer[SPXT_REXMT] && spx_do_persist_panics)
865 SPXT_RANGESET(cb->s_timer[SPXT_PERSIST],
866 t*spx_backoff[cb->s_rxtshift],
868 if (cb->s_rxtshift < SPX_MAXRXTSHIFT)
869 cb->s_rxtshift++;
877 struct spxpcb *cb;
900 cb = ipxtospxpcb(ipxp);
901 KASSERT(cb != NULL, ("spx_ctloutput: cb == NULL"));
914 soptval = cb->s_flags & mask;
921 usoptval = cb->s_mtu;
928 spxhdr = cb->s_rhdr;
934 spxhdr = cb->s_shdr;
968 if (cb->s_flags & SF_PI) {
970 cb->s_flags |= mask;
972 cb->s_flags &= ~mask;
983 cb->s_mtu = usoptval;
994 cb->s_flags2 |= SF_NEWCALL;
997 cb->s_flags2 &= ~SF_NEWCALL;
1013 cb->s_dt = sp.spx_dt;
1014 cb->s_cc = sp.spx_cc & SPX_EM;
1034 struct spxpcb *cb;
1039 cb = ipxtospxpcb(ipxp);
1040 KASSERT(cb != NULL, ("spx_usr_abort: cb == NULL"));
1044 spx_drop(cb, ECONNABORTED);
1077 struct spxpcb *cb;
1091 cb = malloc(sizeof *cb, M_PCB, M_NOWAIT | M_ZERO);
1092 if (cb == NULL)
1096 free(cb, M_PCB);
1105 free(cb, M_PCB);
1111 cb->s_state = TCPS_LISTEN;
1112 cb->s_smax = -1;
1113 cb->s_swl1 = -1;
1114 spx_reass_init(cb);
1115 cb->s_ipxpcb = ipxp;
1116 cb->s_mtu = 576 - sizeof(struct spx);
1118 cb->s_cwnd = sbspace(sb) * CUNIT / cb->s_mtu;
1119 cb->s_ssthresh = cb->s_cwnd;
1120 cb->s_cwmx = sbspace(sb) * CUNIT / (2 * sizeof(struct spx));
1126 cb->s_rtt = SPXTV_SRTTBASE;
1127 cb->s_rttvar = SPXTV_SRTTDFLT << 2;
1128 SPXT_RANGESET(cb->s_rxtcur,
1131 ipxp->ipxp_pcb = (caddr_t)cb;
1139 struct spxpcb *cb;
1143 cb = ipxtospxpcb(ipxp);
1144 KASSERT(cb != NULL, ("spx_pcbdetach: cb == NULL"));
1146 spx_reass_flush(cb);
1147 free(cb, M_PCB);
1177 struct spxpcb *cb;
1182 cb = ipxtospxpcb(ipxp);
1183 KASSERT(cb != NULL, ("spx_usr_close: cb == NULL"));
1187 if (cb->s_state > TCPS_LISTEN)
1188 spx_disconnect(cb);
1190 spx_close(cb);
1204 struct spxpcb *cb;
1210 cb = ipxtospxpcb(ipxp);
1211 KASSERT(cb != NULL, ("spx_connect: cb == NULL"));
1229 cb->s_state = TCPS_SYN_SENT;
1230 cb->s_did = 0;
1231 spx_template(cb);
1232 cb->s_timer[SPXT_KEEP] = SPXTV_KEEP;
1233 cb->s_force = 1 + SPXTV_KEEP;
1239 * cb->s_dport.
1242 error = spx_output(cb, NULL);
1253 struct spxpcb *cb;
1261 cb = ipxtospxpcb(ipxp);
1262 KASSERT(cb != NULL, ("spx_detach: cb == NULL"));
1280 struct spxpcb *cb;
1286 cb = ipxtospxpcb(ipxp);
1287 KASSERT(cb != NULL, ("spx_usr_disconnect: cb == NULL"));
1295 spx_disconnect(cb);
1308 struct spxpcb *cb;
1314 cb = ipxtospxpcb(ipxp);
1315 KASSERT(cb != NULL, ("spx_listen: cb == NULL"));
1328 cb->s_state = TCPS_LISTEN;
1345 struct spxpcb *cb;
1351 cb = ipxtospxpcb(ipxp);
1352 KASSERT(cb != NULL, ("spx_rcvd: cb == NULL"));
1359 cb->s_flags |= SF_RVD;
1360 spx_output(cb, NULL);
1361 cb->s_flags &= ~SF_RVD;
1372 struct spxpcb *cb;
1378 cb = ipxtospxpcb(ipxp);
1379 KASSERT(cb != NULL, ("spx_rcvoob: cb == NULL"));
1387 if ((cb->s_oobflags & SF_IOOB) || so->so_oobmark ||
1391 *mtod(m, caddr_t) = cb->s_iobc;
1407 struct spxpcb *cb;
1413 cb = ipxtospxpcb(ipxp);
1414 KASSERT(cb != NULL, ("spx_send: cb == NULL"));
1427 cb->s_oobflags |= SF_SOOB;
1433 cb->s_shdr.spx_dt = *(u_char *)(&p[2]);
1439 error = spx_output(cb, m);
1454 struct spxpcb *cb;
1460 cb = ipxtospxpcb(ipxp);
1461 KASSERT(cb != NULL, ("spx_shutdown: cb == NULL"));
1470 spx_usrclosed(cb);
1482 struct spxpcb *cb;
1494 cb = ipxtospxpcb(ipxp);
1495 KASSERT(cb != NULL, ("spx_sp_attach: cb == NULL"));
1498 cb->s_flags |= (SF_HI | SF_HO | SF_PI);
1510 spx_template(struct spxpcb *cb)
1512 struct ipxpcb *ipxp = cb->s_ipxpcb;
1517 cb->s_ipx.ipx_pt = IPXPROTO_SPX;
1518 cb->s_ipx.ipx_sna = ipxp->ipxp_laddr;
1519 cb->s_ipx.ipx_dna = ipxp->ipxp_faddr;
1521 cb->s_sid = htons(spx_iss);
1524 cb->s_alo = 1;
1525 cb->s_cwnd = (sbspace(sb) * CUNIT) / cb->s_mtu;
1530 cb->s_ssthresh = cb->s_cwnd;
1531 cb->s_cwmx = (sbspace(sb) * CUNIT) / (2 * sizeof(struct spx));
1536 cb->s_cwmx = max(cb->s_cwmx, cb->s_cwnd);
1544 spx_close(struct spxpcb *cb)
1546 struct ipxpcb *ipxp = cb->s_ipxpcb;
1560 * xerox style error. For now, just close. cb will always be invalid after
1564 spx_usrclosed(struct spxpcb *cb)
1568 IPX_LOCK_ASSERT(cb->s_ipxpcb);
1570 spx_close(cb);
1574 * cb will always be invalid after this call.
1577 spx_disconnect(struct spxpcb *cb)
1581 IPX_LOCK_ASSERT(cb->s_ipxpcb);
1583 spx_close(cb);
1587 * Drop connection, reporting the specified error. cb will always be invalid
1591 spx_drop(struct spxpcb *cb, int errno)
1593 struct socket *so = cb->s_ipxpcb->ipxp_socket;
1596 IPX_LOCK_ASSERT(cb->s_ipxpcb);
1602 if (TCPS_HAVERCVDSYN(cb->s_state)) {
1604 cb->s_state = TCPS_CLOSED;
1605 /*tcp_output(cb);*/
1609 spx_close(cb);
1619 struct spxpcb *cb;
1629 cb = ipxtospxpcb(ipxp);
1630 if (cb->s_flags & SF_DELACK) {
1631 cb->s_flags &= ~SF_DELACK;
1632 cb->s_flags |= SF_ACKNOW;
1634 spx_output(cb, NULL);
1649 struct spxpcb *cb;
1665 cb = (struct spxpcb *)ipxp->ipxp_pcb;
1666 KASSERT(cb != NULL, ("spx_slowtimo: cb == NULL"));
1668 if (cb->s_timer[i] && --cb->s_timer[i] == 0) {
1669 spx_timers(cb, i);
1675 cb->s_idle++;
1676 if (cb->s_rtt)
1677 cb->s_rtt++;
1691 spx_timers(struct spxpcb *cb, int timer)
1697 IPX_LOCK_ASSERT(cb->s_ipxpcb);
1699 cb->s_force = 1 + timer;
1707 cb->s_timer[timer] = 0;
1716 if (++cb->s_rxtshift > SPX_MAXRXTSHIFT) {
1717 cb->s_rxtshift = SPX_MAXRXTSHIFT;
1719 spx_drop(cb, ETIMEDOUT);
1723 rexmt = ((cb->s_srtt >> 2) + cb->s_rttvar) >> 1;
1724 rexmt *= spx_backoff[cb->s_rxtshift];
1725 SPXT_RANGESET(cb->s_rxtcur, rexmt, SPXTV_MIN, SPXTV_REXMTMAX);
1726 cb->s_timer[SPXT_REXMT] = cb->s_rxtcur;
1734 if (cb->s_rxtshift > SPX_MAXRXTSHIFT / 4 ) {
1735 cb->s_rttvar += (cb->s_srtt >> 2);
1736 cb->s_srtt = 0;
1738 cb->s_snxt = cb->s_rack;
1743 cb->s_rtt = 0;
1749 win = min(cb->s_swnd, (cb->s_cwnd/CUNIT)) / 2;
1752 cb->s_cwnd = CUNIT;
1753 cb->s_ssthresh = win * CUNIT;
1754 spx_output(cb, NULL);
1763 spx_setpersist(cb);
1764 spx_output(cb, NULL);
1773 if (cb->s_state < TCPS_ESTABLISHED)
1775 if (cb->s_ipxpcb->ipxp_socket->so_options & SO_KEEPALIVE) {
1776 if (cb->s_idle >= SPXTV_MAXIDLE)
1779 spx_output(cb, NULL);
1781 cb->s_idle = 0;
1782 cb->s_timer[SPXT_KEEP] = SPXTV_KEEP;
1787 spx_drop(cb, ETIMEDOUT);