-#define LOCAL_CREDIT( tpcb ) {\
- register struct sockbuf *xxsb = &((tpcb)->tp_sock->so_rcv);\
- register int xxi = ((xxsb)->sb_hiwat-(xxsb)->sb_cc);\
- register int maxcredit = ((tpcb)->tp_xtd_format?0xffff:0xf);\
- maxcredit = ((tpcb)->tp_decbit?1:maxcredit);\
- xxi = (xxi<0) ? 0 : ((xxi)>>(tpcb)->tp_tpdusize);\
- (tpcb)->tp_lcredit = MIN( xxi ,maxcredit );\
-}
+#define LOCAL_CREDIT(tpcb) { if (tpcb->tp_rsycnt == 0) {\
+ register struct sockbuf *xxsb = &((tpcb)->tp_sock->so_rcv);\
+ register int xxi = sbspace(xxsb);\
+ xxi = (xxi<0) ? 0 : ((xxi) / (tpcb)->tp_l_tpdusize);\
+ xxi = min(xxi, (tpcb)->tp_maxlcredit); \
+ if (!(tpcb->tp_cebit_off)) { \
+ (tpcb)->tp_lcredit = ROUND((tpcb)->tp_win_recv); \
+ if (xxi < (tpcb)->tp_lcredit) { \
+ (tpcb)->tp_lcredit = xxi; \
+ } \
+ } else \
+ (tpcb)->tp_lcredit = xxi; \
+} }