$ od -c -N 50000 [Indigo]<AltoSource>PUPSOURCES.DM!3 0000000 377 \0 \0 P u p . d e c l \0 373 224 024 027 0000020 026 \0 \0 376 \0 u 243 { / / P u p . d 0000040 e c l \r / / C o p y r i g h t 0000060 X e r o x C o r p o r a t i 0000100 o n 1 9 7 9 \r \r g e t " P u 0000120 p 0 . d e c l " \r g e t " P u 0000140 p 1 . d e c l " \r g e t " P u 0000160 p R T P . d e c l " \r g e t " 0000200 P u p B S P . d e c l " \r 377 \0 \0 0000220 P u p P a r a m s . d e c l \0 373 0000240 225 356 272 272 \0 \0 376 001 \0 005 V / / P u 0000260 p P a r a m s . d e c l - - 0000300 a d j u s t a b l e p a r a m 0000320 e t e r s f o r t h e P u 0000340 p p a c k a g e \r / / C o p 0000360 y r i g h t X e r o x C o r 0000400 p o r a t i o n 1 9 7 9 , 1 0000420 9 8 0 \r / / L a s t m o d i 0000440 f i e d S e p t e m b e r 1 0000460 6 , 1 9 8 0 5 : 1 5 P M 0000500 b y B o g g s \r \r m a n i f 0000520 e s t \r [ \r / / T h e f o l 0000540 l o w i n g p a r a m e t e r 0000560 s d e t e r m i n e t h e 0000600 t y p e a n d n u m b e r \r 0000620 / / o f n e t w o r k i n 0000640 t e r f a c e s \r \r a 376 001 \0 016 ? 0000660 l t o = t r u e \t \t / / C 0000700 o m p i l i n g f o r a n 0000720 A l t o \r n o v a = n o t 0000740 a l t o \t \t / / C o m p i l i 0000760 n g f o r a N o v a \r \r n 0001000 u m A l t o E t h e r = 1 \t 0001020 / / A l t o E t h e r n e t 0001040 ( 0 t o 3 ) \r n u m A l t 0001060 o C o m P r o c = 0 \t / / 0001100 A l t o C o m P r o c ( 0 0001120 o r 1 ) \r n u m A l t o E I A 0001140 = 0 \t \t / / A l t o E I 0001160 A ( 0 o r 1 ) \r n u m A l 0001200 t o I m p = 0 \t \t / / A l 0001220 t o I M P ( A r p a n e t ) 0001240 ( 0 o r 1 ) \r n u m A l t 0001260 376 001 \0 205 240 o P R U = 0 \t \t / 0001300 / A l t o P R U ( P a c k 0001320 e t r a d i o ) ( 0 o r 0001340 1 ) \r \r n u m N o v a E t h e r 0001360 = 0 \t / / N o v a E t h 0001400 e r n e t ( 0 t o 3 ) \r n 0001420 u m N o v a M C A = 0 \t \t / 0001440 / N o v a M C A ( 0 t o 0001460 2 ) \r n u m N o v a I m p = 0001500 0 \t \t / / N o v a I m p 0001520 ( A r p a n e t ) ( 0 o r 0001540 1 ) \r n u m N o v a S L A = 0001560 0 \t \t / / N o v a S L A ( 0001600 0 o r 1 ) \r \r / / T h i s 0001620 d e r i v e d p a r a m e t 0001640 e r g o v e r n s i n c l u 0001660 s i o n 376 001 \0 8 . o f l o g 0001700 i c f o r h a n d l i n g \r 0001720 / / m u l t i p l e c o n n 0001740 e c t e d n e t w o r k s . \r 0001760 \r m u l t i p l e N e t s = 0002000 ( n u m A l t o E t h e r + 0002020 n u m A l t o E I A + n u m 0002040 A l t o I m p + n u m A l t 0002060 o P R U + \r n u m A l t o C 0002100 o m P r o c + n u m N o v a 0002120 E t h e r + n u m N o v a M 0002140 C A + n u m N o v a I m p 0002160 + n u m N o v a S L A ) g r 0002200 1 \r \r \r / / M a x i m u m 0002220 n u m b e r o f d a t a ( 0002240 c o n t e n t ) b y t e s p 0002260 e r P u p . \r / / 376 001 \0 330 004 0002300 M u s t b e e v e n , a n 0002320 d b y c o n v e n t i o n 0002340 s h o u l d n o t b e g r 0002360 e a t e r t h a n 5 3 2 . \r 0002400 \r d e f a u l t P u p D a t a B 0002420 y t e s = 5 3 2 \r \r \r / / 0002440 S t a c k s i z e f o r e 0002460 a c h R T P / B S P p r o c 0002500 e s s \r / / M u s t b e i 0002520 n c r e a s e d i f a u s 0002540 e r " o t h e r p r o t o c 0002560 o l " p a c k e t h a n d l 0002600 e r \r / / r e q u i r e s a 0002620 l o t o f s t a c k s p 0002640 a c e . \r \r d e f a u l t R T P 0002660 S t a c k S i z e = 1 4 0 376 0002700 001 \0 230 C \r \r \r / / D e f a u l 0002720 t e r r o r t i m e o u t 0002740 i n t e r v a l f o r R T P 0002760 / B S P i n t e r a c t i o n 0003000 s \r \r d e f a u l t D e f a u l 0003020 t T i m e o u t = 6 0 0 0 0003040 / / 6 0 s e c o n d s ( 0003060 u n i t s a r e 1 0 m s ) 0003100 \r \r \r / / I f P u p D e b u 0003120 g i s t r u e , a n u m 0003140 b e r o f e x t r a c o n 0003160 s i s t e n c y c h e c k s \r 0003200 / / a r e c o m p i l e d , 0003220 a n d s o m e s t a t i s 0003240 t i c s a r e g a t h e r e 0003260 d : \r / / T h i n g s g e t 0003300 b i g 376 \0 $ x 201 g e r a n d 0003320 s l o w e r . \r \r p u p D e b 0003340 u g = f a l s e \r ] \r 377 \0 \0 0003360 P u p B S P . d e c l \0 373 231 005 203 0003400 E \0 \0 376 001 \0 q 200 / / P u p B S 0003420 P . d e c l - - B y t e S 0003440 t r e a m P r o t o c o l d 0003460 e f i n i t i o n s \r / / C o 0003500 p y r i g h t X e r o x C o 0003520 r p o r a t i o n 1 9 7 9 , 0003540 1 9 8 2 \r \r / / L a s t m o 0003560 d i f i e d M a y 9 , 1 9 0003600 8 2 1 : 0 1 P M b y T 0003620 a f t \r \r / / P u p 0 . d e c 0003640 l , P u p 1 . d e c l , a n 0003660 d P u p R T P . d e c l m u 0003700 s t b e c o m p i l e d b 0003720 e f o r e t h i s . \r \r g e t 0003740 " S t r e a m s . d " \r \r / / 0003760 - - - - - - - - - - - - - - - - 0004000 - - - - - - - - 376 001 \0 \f 356 - - - 0004020 - - - - - - - - - - - - - - - - * 0004100 - \r s t r u c t u r e B S P S 0004120 t r : \t / / B S P S t r e a 0004140 m b l o c k ( p a r a l l e 0004160 l s P u p B S P a . a s m ) \r 0004200 / / - - - - - - - - - - - - - - 0004220 - - - - - - - - - - - - - - - - * 0004300 - - - - - - - - - - - - - - \r [ 0004320 \r @ S T \t \t \t / / A s t a n 0004340 d a r d O S s t r e a m \r i 0004360 P B I w o r d \t \t / / c u r 0004400 r e n t i n p u t b u 376 001 \0 0004420 a 242 f f e r . 0 i f n o n 0004440 e \r i W o r d P w o r d \t \t / 0004460 / - > w o r d c o n t a i 0004500 n i n g n e x t b y t e \r i 0004520 B y t e P w o r d \t \t / / N 0004540 e x t b y t e p o s . 0 0004560 = l e f t , 1 = r i g 0004600 h t \r i B y t e C w o r d \t \t 0004620 / / r e m a i n i n g i n p 0004640 u t b y t e c o u n t \r o P 0004660 B I w o r d \t \t / / c u r r 0004700 e n t o u t p u t b u f f e 0004720 r . 0 i f n o n e \r o W o 0004740 r d P w o r d \t \t / / - > 0004760 w o r d c o n t a i n i n g 0005000 n e x t b y t e \r o B y t e P 0005020 w 376 001 \0 7 Z o r d \t \t / / N 0005040 e x t b y t e p o s . 0 0005060 = l e f t , 1 = r i g 0005100 h t \r o B y t e C w o r d \t \t 0005120 / / r e m a i n i n g o u t 0005140 p u t b y t e c o u n t \r ] 0005160 \r m a n i f e s t l e n B S P 0005200 S t r = s i z e B S P S t 0005220 r / 1 6 \r \r c o m p i l e i f 0005240 o f f s e t B S P S t r . i P 0005260 B I / 1 6 n e 1 2 t h e n 0005300 \r [ B a r f ( " B S P S 0005320 t r s t r u c t u r e d i s 0005340 a g r e e s w i t h a s s u 0005360 m p t i o n s i n P u p B S 0005400 P a . a s m " ) ] \r \r / / I 0005420 n v a r i a n 376 001 \0 z 031 t : i 0005440 B y t e C = 0 i f f i P B I 0005460 = 0 , o B y t e C = 0 i f f 0005500 o P B I = 0 \r \f \r / / - - - - 0005520 - - - - - - - - - - - - - - - - * 0005620 - - - - - - - - \r s t r u c t u 0005640 r e B S P S o c : \r / / - - - 0005660 - - - - - - - - - - - - - - - - * 0005760 - - - - - - - - - \r [ \r @ R T P 0006000 S o c = \r [ \r b l 0006020 a n k w o r d o f f 376 001 \0 360 0006040 362 s e t R T P S o c . r t p O 0006060 t h e r P u p P r o c / 1 6 \r 0006100 b s p P u p P r o c w o r 0006120 d \t / / l o c a l n a m e 0006140 f o r r t p O t h e r P u p P 0006160 r o c \r b s p T i m e r 0006200 w o r d \t / / l o c a l n a 0006220 m e f o r r t p O t h e r T 0006240 i m e r \r b s p T i m e r 0006260 P r o c w o r d \t / / l o c 0006300 a l n a m e f o r r t p O 0006320 t h e r T i m e r P r o c \r 0006340 ] \r b s p O t h e r P u p P r 0006360 o c w o r d \t / / p r o c 0006400 c a l l e d f o r n o n - R 0006420 T P a n d n o n - B S P p 0006440 u 376 001 \0 237 - p s \r u s e r B y t 0006460 e I D ^ 1 , 2 w o r d \t / / 0006500 I D o f p a c k e t w e 0006520 a r e w o r k i n g o n \r r 0006540 c v B y t e I D ^ 1 , 2 w o r 0006560 d \t / / f i r s t b y t e 0006600 b e y o n d w h a t I h a 0006620 v e a c k e d \r r c v I n t I 0006640 D ^ 1 , 2 w o r d \t / / I D 0006660 o f n e x t i n c o m i n 0006700 g i n t e r r u p t \r u n R e 0006720 a d P u p s w o r d \t \t / / 0006740 P u p s f r o m l e f t w 0006760 i n d o w e d g e t o f i 0007000 r s t h o l e \r b s p I Q : \t 0007020 \t \t / / d a t a a n d m a 0007040 r k p u p 376 001 \0 o 341 s f o r 0007060 l o c a l p r o c e s s \r 0007100 [ \r h e a d w o r d 0007120 \r t a i l w o r d \r 0007140 ] \r x m i t B y t e I D ^ 1 , 0007160 2 w o r d \t / / I D o f 0007200 n e x t o u t g o i n g p a 0007220 c k e t c r e a t e d \r x m i 0007240 t I n t I D ^ 1 , 2 w o r d \t 0007260 / / I D o f n e x t o u 0007300 t g o i n g i n t e r r u p t 0007320 \r l a s t A c k I D ^ 1 , 2 w 0007340 o r d \t / / I D o f l a s 0007360 t r e c e i v e d a c k \r u 0007400 n A c k e d P u p s w o r d \t 0007420 / / o u t s t a n d i n g a 0007440 n d u n a c k n o w 376 001 \0 026 375 0007460 l e d g e d P u p s \r u n A c 0007500 k e d B y t e s w o r d \t / / 0007520 o u t s t a n d i n g a n d 0007540 u n a c k n o w l e d g e d 0007560 b y t e s \r b y t e s P e r P u 0007600 p w o r d \r p u p A l l o c 0007620 w o r d \t \t / / r e m a i n i 0007640 n g o u t g o i n g P u p 0007660 a l l o c a t i o n \r b y t e A 0007700 l l o c w o r d \t \t / / r e 0007720 m a i n i n g o u t g o i n g 0007740 b y t e a l l o c a t i o n 0007760 \r m a x P u p A l l o c w o r 0010000 d \t / / u p p e r b o u n d 0010020 o n p u p A l l o c \r p u p 0010040 A l l o c C o u n t w o r d \t 0010060 376 001 \0 v 260 / / c o u n t e r 0010100 c o n t r o l l i n g c h a n 0010120 g e s t o m a x P u p A l l 0010140 o c \r a D a t a C o u n t w o 0010160 r d \t \t / / c o u n t e r i 0010200 n c r e m e n t e d o n c e 0010220 p e r A D a t a s e n t \r l 0010240 a s t A D a t a T i m e w o r 0010260 d \t / / t i m e a t w h i 0010300 c h l a s t A D a t a w a 0010320 s s e n t \r a D a t a T i m e 0010340 o u t w o r d \t / / A D a t 0010360 a t i m e o u t i n t e r v 0010400 a l n o w b e i n g u s e 0010420 d \r i n a c t i v i t y T i m e 0010440 r w o r d \t / / c o n n e c 0010460 t i o n 376 001 \0 265 216 i n a c t i 0010500 v i t y t i m e r \r b s p T Q 0010520 : \t \t \t / / p u p s a w a i 0010540 t i n g a c k n o w l e d g e 0010560 m e n t \r [ \r h e a 0010600 d w o r d \r t a i l w 0010620 o r d \r ] \r b s p S t a t 0010640 u s w o r d = \r [ \r 0010660 m a r k P e n d i n g b i 0010700 t \t / / e n c o u n t e r e d 0010720 M a r k i n s t r e a m \r 0010740 i n t e r r u p t O u t 0010760 b i t \t / / u n a c k n o w l 0011000 e d g e d I n t e r r u p t 0011020 o u t s t a n d i n g \r i 0011040 n t e r r u p t I n b i t \t / 0011060 / I n t e r r u p 376 001 \0 316 240 t 0011100 r e c e i v e d \r a c k 0011120 P e n d i n g b i t \t / / A 0011140 D a t a r e c e i v e d , n 0011160 e e d t o s e n d A c k \r 0011200 a c k R e q u e s t e d 0011220 b i t \t / / A D a t a s e n 0011240 t , e x p e c t i n g A c k 0011260 \r s e n t Z e r o A l l o 0011300 c b i t \t / / n e e d t o 0011320 s e n d g r a t u i t o u s 0011340 A c k \r n o I n a c t i 0011360 v i t y T i m e o u t b i t 0011400 / / d o n ' t a b o r t 0011420 u p o n i n a c t i v i t y 0011440 t i m e o u t \r ] \r b s p 0011460 S t r w o r d l e n B S P 376 0011500 001 \0 326 " S t r = @ B S P S t 0011520 r \r ] \r m a n i f e s t l e n 0011540 B S P S o c = s i z e B S 0011560 P S o c / 1 6 \r \f \r m a n i f e 0011600 s t \r [ \r / / B y t e S t r 0011620 e a m P r o t o c o l P u p 0011640 t y p e s \r t y p e D a t a 0011660 = # 2 0 \r t y p e A D a t a 0011700 = # 2 1 \r t y p e A c k = 0011720 # 2 2 \r t y p e M a r k = # 0011740 2 3 \r t y p e A M a r k = # 0011760 2 6 \r t y p e I n t e r r u p t 0012000 = # 2 4 \r t y p e I n t e r 0012020 r u p t R e p l y = # 2 5 \r 0012040 \r / / E r r o r c o d e s 0012060 f o r B S P s t r e a m s \r 0012100 e c B a 376 001 \0 304 q d S t a t e F 0012120 o r G e t s = 2 2 0 0 \r e c 0012140 G e t s T i m e o u t = 2 2 0012160 0 1 \r e c M a r k E n c o u n t 0012200 e r e d = 2 2 0 2 \r e c B a 0012220 d S t a t e F o r P u t s = 0012240 2 2 0 3 \r e c P u t s T i m e o 0012260 u t = 2 2 0 4 \r e c B a d B 0012300 S P G e t M a r k = 2 2 0 5 0012320 \r \r / / t i m e o u t i n t 0012340 e r v a l s \r \r / / i n i t i 0012360 a l v a l u e o f a D a t 0012400 a T i m e o u t \r / / = t i 0012420 m e t o w a i t a f t e r 0012440 s e n d i n g A D a t a b 0012460 e f o r e r e p r o b i n g \r 0012500 i n i t i a l A D 376 001 \0 a p a t 0012520 a T i m e o u t = 1 0 0 \r \r 0012540 / / m a x i m u m t i m e 0012560 a f t e r s e n d i n g D a 0012600 t a b e f o r e e l i c i t 0012620 i n g A c k \r o u t s t a n d 0012640 i n g D a t a T i m e o u t = 0012660 1 0 0 \r \r / / t i m e o u t 0012700 t o u s e w h e n n o 0012720 p a c k e t s a r e o u t s 0012740 t a n d i n g \r i d l e T i m e 0012760 o u t = 1 5 0 0 \r \r / / i 0013000 n a c t i v i t y t i m e o u 0013020 t , e x p i r a t i o n o f 0013040 w h i c h c a u s e s c o 0013060 n n e c t i o n t o b e a 0013100 b o r t e d \r i n a c t i v 376 001 0013120 \0 \v F i t y T i m e o u t = 0013140 1 2 0 0 0 \r \r / / w h e n e v 0013160 e r p u p A l l o c H y s t e 0013200 r e s i s o u t g o i n g P 0013220 u p s h a v e b e e n s u 0013240 c c e s s f u l l y \r / / a c 0013260 k n o w l e d g e d w i t h 0013300 n o c o n g e s t i o n e r 0013320 r o r s , a t t e m p t t o 0013340 i n c r e a s e \r / / t h e 0013360 o u t g o i n g P u p a l 0013400 l o c a t i o n ( m a x P u p 0013420 A l l o c ) . \r p u p A l l o c 0013440 H y s t e r e s i s = 5 0 \r 0013460 \r / / i n i t i a l m a x i 0013500 m u m P u p a l l o c a t i 0013520 o n 376 \0 n 352 375 t h a t t h e 0013540 s e n d e r w i l l u s e 0013560 , r e g a r d l e s s \r / / 0013600 o f t h e a l l o c a t i o 0013620 n p r o v i d e d b y t h 0013640 e r e c e i v e r . \r i n i t 0013660 i a l M a x P u p A l l o c = 0013700 5 \r ] \r \r 377 \0 \0 P u p B S P O 0013720 p e n C l o s e . b c p l \0 373 230 0013740 \b 261 032 \0 \0 376 001 \0 351 341 / / P u p 0013760 B S P O p e n C l o s e . b c p 0014000 l - - B y t e S t r e a m 0014020 P r o t o c o l \r / / C o m 0014040 p a n i o n f i l e s a r e 0014060 P u p B S P P r o t , P u p 0014100 B S P S t r e a m s a n d P 0014120 u p B S P a \r / / T h i s m 0014140 o d u l e c o n t a i n s i 0014160 n f r e q u e n t l y e x e c 0014200 u t e d c o d e w h i c h 0014220 c a n s w a p \r / / w i t 0014240 h o u t a f f e c t i n g p 0014260 e r f o r m a n c e . \r / / C 0014300 o p y r i g h t X e r o x C 0014320 o r p o r a t i o n 1 9 7 9 , 0014340 1 9 8 0 , 1 9 8 376 001 \0 k 304 1 0014360 \r / / L a s t m o d i f i e 0014400 d O c t o b e r 2 9 , 1 9 0014420 8 1 5 : 2 2 P M b y T 0014440 a f t \r \r g e t " P u p . d e 0014460 c l " \r g e t " P u p R T P I 0014500 n t e r n a l . d e c l " \r \r e 0014520 x t e r n a l \r [ \r / / o u t 0014540 g o i n g p r o c e d u r e s 0014560 \r C r e a t e B S P S t r e a m 0014600 ; C l o s e B S P S o c k e t 0014620 ; B S P P u t I n t e r r u p 0014640 t ; B S P H a n d l e U n c o 0014660 m m o n P u p \r \r / / i n c o 0014700 m i n g p r o c e d u r e s \r 0014720 B S P P u p P r o c ; B S P T 0014740 i m e r P r o c ; B S P F o 376 0014760 001 \0 301 R r c e O u t p u t ; B 0015000 S P P r e p a r e I P B I ; B 0015020 S P G e t C l e a n u p \r B S P 0015040 G e t B y t e ; B S P P u t B 0015060 y t e ; B S P E n d o f s ; 0015100 B S P E r r o r s ; B S P C l 0015120 o s e s ; S e a r c h T Q \r C 0015140 l o s e R T P S o c k e t ; R 0015160 T P F i l t e r ; R T P F S M 0015200 ; C l o s e L e v e l 1 S o c 0015220 k e t ; S e t T i m e o u t \r 0015240 R e l e a s e P B I ; G e t P 0015260 B I ; C o m p l e t e P u p ; 0015300 S e t P u p I D ; A p p e n 0015320 d S t r i n g T o P u p ; M u 0015340 l t E q \r N o o p ; Z e r o ; 0015360 S e t 376 001 \0 326 . B l o c k ; 0015400 M o v e B l o c k ; S y s E r 0015420 r ; D o u b l e I n c r e m e 0015440 n t ; D o u b l e D i f f e r 0015460 e n c e \r S e t T i m e r ; T 0015500 i m e r H a s E x p i r e d ; 0015520 B l o c k ; D i s m i s s ; 0015540 M i n \r F l u s h Q u e u e \r \r 0015560 / / o u t g o i n g s t a t 0015600 i c s \r l B S P S o c ; o f f 0015620 s e t B S P S t r \r \r / / i n 0015640 c o m i n g s t a t i c s \r d 0015660 e f a u l t T i m e o u t \r ] \r 0015700 \r s t a t i c \r [ \r l B S P S o 0015720 c = l e n B S P S o c \r o f 0015740 f s e t B S P S t r = o f f 0015760 s e t B S P S o 376 001 \0 343 v c . 0016000 b s p S t r / 1 6 \r ] \r \r / / - 0016020 - - - - - - - - - - - - - - - - * 0016120 - - - - - - - - - - - \r l e t 0016140 C r e a t e B S P S t r e a m ( 0016160 s o c ) = v a l o f \r / / - 0016200 - - - - - - - - - - - - - - - - * 0016300 - - - - - - - - - - - \r [ \r / / 0016320 i n i t i a l i z e B S P 0016340 s o c k e t \r u n l e s s s o 0016360 c > > B S P S o c . s t a t 376 001 0016400 \0 277 375 e e q s t a t e O p e 0016420 n % s o c > > B S P S o c . 0016440 s t a t e e q s t a t e E n 0016460 d I n d o \r r e s u l t 0016500 i s 0 \r Z e r o ( s o c + l e 0016520 n R T P S o c , l e n B S P S 0016540 o c - l e n R T P S o c ) \r f o 0016560 r i = 0 t o 5 d o \r 0016600 M o v e B l o c k ( s o c 0016620 + ( t a b l e \r 0016640 [ \r o f f s e t B 0016660 S P S o c . u s e r B y t e I D 0016700 / 1 6 \r o f f s e t 0016720 B S P S o c . r c v B y t e I 0016740 D / 1 6 \r o f f s e 0016760 t B S P S o c . r c v I n t I 0017000 D / 1 376 001 \0 K 362 6 \r 0017020 o f f s e t B S P S o c . x m 0017040 i t I n t I D / 1 6 \r 0017060 o f f s e t B S P S o c . x 0017100 m i t B y t e I D / 1 6 \r 0017120 o f f s e t B S P S o c 0017140 . l a s t A c k I D / 1 6 \r 0017160 ] ) ! i , l v s o c 0017200 > > B S P S o c . c o n n I D , 0017220 2 ) \r S e t T i m e r ( l v 0017240 s o c > > B S P S o c . b s p T 0017260 i m e r , 0 ) \r S e t T i m e 0017300 r ( l v s o c > > B S P S o c 0017320 . i n a c t i v i t y T i m e r 0017340 , i n a c t i v i t y T i m e 0017360 o u t ) \r s o c > > B S P S o c 0017400 . b s p O t h e 376 001 \0 303 254 r P u 0017420 p P r o c = s o c > > B S P 0017440 S o c . b s p P u p P r o c \r s 0017460 o c > > B S P S o c . b s p P u 0017500 p P r o c = B S P P u p P r 0017520 o c \r s o c > > B S P S o c . b 0017540 s p T i m e r P r o c = B S 0017560 P T i m e r P r o c \r s o c > > 0017600 B S P S o c . a D a t a T i m e 0017620 o u t = i n i t i a l A D a 0017640 t a T i m e o u t \r s o c > > B 0017660 S P S o c . m a x P u p A l l o 0017700 c = M i n ( s o c > > B S P 0017720 S o c . m a x O P B I , i n i 0017740 t i a l M a x P u p A l l o c ) 0017760 \r \r / / i n i t i a l i z e 0020000 B S P s t r e a m \r l e 376 001 \0 0020020 322 \v t s t r = s o c + o f 0020040 f s e t B S P S t r \r S e t B l 0020060 o c k ( s t r , S y s E r r , 0020100 l S T ) \r s t r > > B S P S t 0020120 r . g e t s = B S P G e t B 0020140 y t e \r s t r > > B S P S t r . 0020160 p u t s = B S P P u t B y t 0020200 e \r s t r > > B S P S t r . c l 0020220 o s e = B S P C l o s e s \r 0020240 s t r > > B S P S t r . e n d o 0020260 f = B S P E n d o f s \r s t 0020300 r > > B S P S t r . e r r o r 0020320 = B S P E r r o r s \r \r r e s 0020340 u l t i s s t r \r ] \r \f \r / / 0020360 - - - - - - - - - - - - - - - - * 0020420 - - 376 001 \0 335 261 - - - - - - - - - 0020440 - - - - - - - - - - - - - - - - * 0020500 - \r a n d C l o s e B S P S o 0020520 c k e t ( s o c , t i m e o u 0020540 t ; n u m a r g s n a ) = 0020560 v a l o f \r / / - - - - - - - 0020600 - - - - - - - - - - - - - - - - * 0020700 - - - - - \r [ \r i f n a l e 0020720 1 t h e n t i m e o u t 0020740 = d e f a u l t T i m e o u t 0020760 \r i f s o c > > B S P S o c . 0021000 s t a t e e q s t a t e O p 0021020 e n % s o 376 001 \0 001 203 c > > B 0021040 S P S o c . s t a t e e q s 0021060 t a t e E n d I n t h e n \r 0021100 [ / / w a i t t i l 0021120 a l l q u e u e d o u t p 0021140 u t h a s b e e n a c k n 0021160 o w l e d g e d \r B S P F 0021200 o r c e O u t p u t ( s o c ) \r 0021220 l e t t i m e r = n 0021240 i l ; S e t T i m e r ( l v 0021260 t i m e r , t i m e o u t ) \r 0021300 w h i l e s o c > > B S 0021320 P S o c . u n A c k e d P u p s 0021340 n e 0 % s o c > > B S P 0021360 S o c . i n t e r r u p t O u t 0021400 d o \r [ \r 0021420 B S P F l u s h I n 376 001 \0 K 0021440 A p u t ( s o c ) / / f l 0021460 u s h w a i t i n g i n p u 0021500 t \r s w i t c h o n 0021520 s o c > > B S P S o c . s t a 0021540 t e i n t o \r 0021560 [ \r c a s e 0021600 s t a t e O p e n : c a s e 0021620 s t a t e E n d I n : \r 0021640 u n l e s s 0021660 T i m e r H a s E x p i r e d ( 0021700 l v t i m e r ) e n d c a s 0021720 e \r d e f a u 0021740 l t : \r 0021760 t i m e o u t = 0 ; b r e 0022000 a k / / t i m e d o u t 0022020 o r a b o r t e d \r 0022040 376 001 \0 204 E ] \r 0022060 D i s m i s s ( 1 ) \r 0022100 ] \r ] \r \r / / c l 0022120 o s e t h e s o c k e t , 0022140 f l u s h i n g B S P i n p 0022160 u t w h i l e w a i t i n g 0022200 \r s o c > > B S P S o c . b s p 0022220 T i m e r P r o c = B S P I 0022240 n p u t S u c k e r U p p e r \r 0022260 B S P I n p u t S u c k e r U p 0022300 p e r ( s o c ) \r t i m e o u t 0022320 = C l o s e R T P S o c k e 0022340 t ( s o c , t i m e o u t ) \r 0022360 \r / / w a i t t i l a l l 0022400 o w n e d p b i ' s h a v 0022420 e r e t u r n e d b e f o r 0022440 e d e s t 376 001 \0 l 227 r o y i n 0022460 g s o c k e t \r s o c > > B S 0022500 P S o c . b s p P u p P r o c 0022520 = R e l e a s e P B I / / 0022540 t u r n o f f i n p u t \r 0022560 s o c > > B S P S o c . b s p T 0022600 i m e r P r o c = N o o p \r 0022620 i f s o c > > B S P S o c . o 0022640 P B I n e 0 t h e n R e 0022660 l e a s e P B I ( s o c > > B S 0022700 P S o c . o P B I ) \r w h i l e 0022720 s o c > > B S P S o c . n u m 0022740 O P B I n e s o c > > B S P 0022760 S o c . m a x O P B I d o \r 0023000 [ F l u s h Q u e u e ( l 0023020 v s o c > > B S P S o c . b s 0023040 p T Q ) ; D i s m i 376 001 \0 245 305 0023060 s s ( 1 ) ] \r F l u s h Q u e 0023100 u e ( l v s o c > > B S P S o 0023120 c . b s p I Q ) \r C l o s e L e 0023140 v e l 1 S o c k e t ( s o c ) \r 0023160 r e s u l t i s t i m e o u t 0023200 n e 0 \r ] \r \r / / - - - - - 0023220 - - - - - - - - - - - - - - - - * 0023320 - - - - - - \r a n d B S P F l 0023340 u s h I n p u t ( s o c ) b e 0023360 \r / / - - - - - - - - - - - - - 0023400 - - - - - - - - - - - - - - - - * 0023460 376 001 \0 335 : - - - - - - - - - - - 0023500 - - - \r / / c a l l e d v i 0023520 a B S P T i m e r P r o c e 0023540 n t r y t o f l u s h i n 0023560 p u t d u r i n g R T P c 0023600 l o s e \r [ \r l e t e c = 0023620 B S P P r e p a r e I P B I ( s 0023640 o c , 0 ) \r u n l e s s e c 0023660 e q 0 % e c e q e c 0023700 M a r k E n c o u n t e r e d 0023720 r e t u r n \r B S P G e t C l e 0023740 a n u p ( s o c ) \r ] r e p e 0023760 a t \r \r / / - - - - - - - - - - 0024000 - - - - - - - - - - - - - - - - * 0024060 - - - - - 376 001 \0 " 271 - - - - - - 0024100 - - - - - - \r a n d B S P I n 0024120 p u t S u c k e r U p p e r ( s 0024140 o c ) b e \r / / - - - - - - - 0024160 - - - - - - - - - - - - - - - - * 0024260 - - - - \r / / c a l l e d v 0024300 i a B S P T i m e r P r o c 0024320 e n t r y t o f l u s h i 0024340 n p u t d u r i n g R T P 0024360 c l o s e \r [ \r B S P F l u s h 0024400 I n p u t ( s o c ) \r S e t T i 0024420 m e r ( l v s o c > > B S P S 0024440 o c . b s p T i m e r , 1 0 ) 0024460 \r ] \r \f \r / / - - - 376 001 \0 5 255 - 0024500 - - - - - - - - - - - - - - - - * 0024600 - - - - - - - \r a n d B S P P 0024620 u t I n t e r r u p t ( s o c , 0024640 c o d e , s t r i n g , t 0024660 i m e o u t ; n u m a r g s 0024700 n a ) = v a l o f \r / / - - 0024720 - - - - - - - - - - - - - - - - * 0025020 - - - - - - - - - \r [ \r i f n 0025040 a l s 4 t h e n t i m e 0025060 o u t = - 1 \r l e t t i 376 0025100 001 \0 351 c m e r = n i l ; S 0025120 e t T i m e r ( l v t i m e r 0025140 , t i m e o u t ) \r [ \r 0025160 s w i t c h o n s o c > 0025200 > B S P S o c . s t a t e i n 0025220 t o \r [ \r 0025240 c a s e s t a t e O p e n : 0025260 c a s e s t a t e E n d I n 0025300 : \r u n l e s 0025320 s t i m e o u t g e 0 & 0025340 T i m e r H a s E x p i r e d 0025360 ( l v t i m e r ) e n d c a 0025400 s e \r d e f a u l t 0025420 : \r r e s u l 0025440 t i s f a l s e / / b a 0025460 d s t a t e o r t i m e d 0025500 o u t 376 001 \0 326 q \r 0025520 ] \r i f s o c > > B S P 0025540 S o c . n u m T P B I n e 0 0025560 & s o c > > B S P S o c . n 0025600 u m O P B I n e 0 & \r 0025620 n o t s o c > > B S P 0025640 S o c . i n t e r r u p t O u t 0025660 t h e n b r e a k \r B 0025700 l o c k ( ) \r ] r e p e 0025720 a t \r \r l e t p b i = G e 0025740 t P B I ( s o c ) \r p b i > > P 0025760 B I . p u p . w o r d s ^ 1 = 0026000 c o d e \r A p p e n d S t r i 0026020 n g T o P u p ( p b i , 3 , 0026040 s t r i n g ) \r S e t P u p I D 0026060 ( p b i , l v s o c > > B S 0026100 P S o c . x m i t 376 001 \0 262 351 I n 0026120 t I D ) \r p b i > > P B I . q u 0026140 e u e = l v s o c > > B S 0026160 P S o c . b s p T Q / / k 0026200 e e p p b i a r o u n d \r C 0026220 o m p l e t e P u p ( p b i , 0026240 t y p e I n t e r r u p t ) \r s 0026260 o c > > B S P S o c . i n t e r 0026300 r u p t O u t = t r u e \r S 0026320 e t T i m e o u t ( s o c ) \r r 0026340 e s u l t i s t r u e \r ] \r \f 0026360 \r / / - - - - - - - - - - - - - 0026400 - - - - - - - - - - - - - - - - * 0026460 - - - - - - - - - - - - - - \r a 0026500 n d B S P H a n d l e U n 376 001 0026520 \0 + 2 c o m m o n P u p ( s o c 0026540 , p b i ) b e \r / / - - - - 0026560 - - - - - - - - - - - - - - - - * 0026660 - - - - - - - \r / / C a l l e 0026700 d f r o m B S P P u p P r o 0026720 c f o r I n t e r r u p t , 0026740 I n t e r r u p t R e p l y , 0026760 a n d E n d . \r / / A l w 0027000 a y s d i s p o s e s o f 0027020 p b i . \r [ \r l e t p a s s e 0027040 d S o u r c e F i l t e r = 0027060 R T P F i l t e r ( p b i , t 0027100 r u e , f a l s e ) \r s w i t 0027120 c h o 376 001 \0 7 / n p b i > > P 0027140 B I . p u p . t y p e i n t o 0027160 \r [ \r c a s e t y 0027200 p e I n t e r r u p t R e p l y 0027220 : \r i f p a s s e 0027240 d S o u r c e F i l t e r & \r 0027260 M u l t E q ( l v 0027300 p b i > > P B I . p u p . i d 0027320 , l v s o c > > B S P S o c 0027340 . x m i t I n t I D ) & \r 0027360 s o c > > B S P S o c 0027400 . i n t e r r u p t O u t t h 0027420 e n \r [ \r 0027440 l e t n p b i 0027460 = S e a r c h T Q ( s o c , 0027500 t r u e ) / / F i n d i 0027520 n t e r r u p t 376 001 \0 \r G o n 0027540 T Q \r i f 0027560 n p b i n e 0 t h e n \r 0027600 [ \r 0027620 D o u b l e I 0027640 n c r e m e n t ( l v s o c > 0027660 > B S P S o c . x m i t I n t I 0027700 D , 1 ) \r 0027720 s o c > > B S P S o c . i n 0027740 t e r r u p t O u t = f a l 0027760 s e \r R 0030000 e l e a s e P B I ( n p b i ) \r 0030020 ] \r 0030040 / / I f w e 0030060 c a n ' t f i n d i t , w 0030100 e m u s t b e r e t r a n 0030120 s m i t t i n g i t n 376 001 \0 0030140 / s o w , \r / 0030160 / s o j u s t p r e t e n 0030200 d t h e r e p l y w a s 0030220 l o s t a n d r e l y o n 0030240 t h e \r / / 0030260 r e t r a n s m i s s i o n 0030300 t o e l i c i t a n e w 0030320 r e p l y \r ] 0030340 \r e n d c a s e \r \r 0030360 c a s e t y p e I n t e 0030400 r r u p t : \r i f 0030420 p a s s e d S o u r c e F i l t 0030440 e r t h e n \r 0030460 [ \r l e t 0030500 d = D o u b l e D i f f e r 0030520 e n c e ( l v s o c > > B S P 0030540 S o 376 001 \0 002 255 c . r c v I n t I 0030560 D , \r l v 0030600 p b i > > P B I . p u p . i d ) 0030620 \r t e s t d 0030640 e q 0 \r 0030660 i f s o \r 0030700 [ / / T h i s 0030720 i s a n e w i n t e r r 0030740 u p t s o u p d a t e i d 0030760 \r 0031000 D o u b l e I n c r e m e n t ( 0031020 l v s o c > > B S P S o c . r 0031040 c v I n t I D , 1 ) \r 0031060 s o c > > 0031100 B S P S o c . i n t e r r u p t 0031120 I n = t r u e \r 0031140 376 001 \0 k 375 ( s 0031160 o c > > B S P S o c . b s p O t 0031200 h e r P u p P r o c ) ( p b i ) 0031220 / / p a s s i t o n \r 0031240 ] \r 0031260 i f n o 0031300 t R e l e a s e P B I ( p b i 0031320 ) \r i f d 0031340 u l e 1 t h e n \r 0031360 [ / / G e n 0031400 e r a t e I n t e r r u p t R 0031420 e p l y f o r c a s e s 0 0031440 a n d 1 \r 0031460 p b i = G e t P B I ( 0031500 s o c , t r u e ) \r 0031520 i f p b i n e 0031540 0 t h e n \r 376 001 \0 302 0031560 377 [ \r 0031600 S e t 0031620 P u p I D ( p b i , l v s o 0031640 c > > B S P S o c . r c v I n t 0031660 I D ) \r 0031700 D o u b l e I n c r e m e 0031720 n t ( l v p b i > > P B I . p 0031740 u p . i d , - 1 ) \r 0031760 C o m p l e 0032000 t e P u p ( p b i , t y p e I 0032020 n t e r r u p t R e p l y , p 0032040 u p O v B y t e s ) \r 0032060 ] \r 0032100 ] \r 0032120 r e t u r n / / p b 0032140 i a l r e a d y r e l e a s 0032160 e 376 001 \0 ? 331 d \r 0032200 ] \r e n d c a s e 0032220 \r \r c a s e t y p e E n 0032240 d : \r / / A l r e 0032260 a d y f i l t e r e d b y 0032300 R T P . \r / / I f 0032320 s t r e a m i s i d l e 0032340 t h e n c l o s e c o n n e 0032360 c t i o n i m m e d i a t e l 0032400 y ; o t h e r w i s e \r 0032420 / / a w a i t l o c a 0032440 l c l o s e . \r i 0032460 f s o c > > B S P S o c . o P 0032500 B I e q 0 & s o c > > B 0032520 S P S o c . u n A c k e d P u p 0032540 s e q 0 & \r 0032560 n o t s o 376 \0 304 225 t c > > B S 0032600 P S o c . i n t e r r u p t O u 0032620 t & s o c > > B S P S o c . 0032640 u n R e a d P u p s e q 0 0032660 t h e n \r R T 0032700 P F S M ( s o c , C L S N ) \r 0032720 e n d c a s e \r 0032740 ] \r \r / / a b o v e 0032760 c o d e s h o u l d r e t u 0033000 r n b e f o r e h e r e i 0033020 f p b i i s a l r e a d y 0033040 d i s p o s e d o f \r R e l 0033060 e a s e P B I ( p b i ) \r ] \r 377 0033100 \0 \0 P u p B S P S t r e a m s . 0033120 b c p l \0 373 230 375 207 366 \0 \0 376 001 \0 371 0033140 345 / / P u p B S P S t r e a m 0033160 s . b c p l - - B y t e S 0033200 t r e a m P r o t o c o l \r / 0033220 / C o m p a n i o n f i l e 0033240 s a r e P u p B S P O p e n 0033260 C l o s e , P u p B S P P r o 0033300 t a n d P u p B S P a \r / / 0033320 T h i s m o d u l e c o n 0033340 t a i n s t h e ' m a i n 0033360 l i n e ' c o d e . \r / / C 0033400 o p y r i g h t X e r o x C 0033420 o r p o r a t i o n 1 9 7 9 , 0033440 1 9 8 0 , 1 9 8 1 , 1 9 8 0033460 2 \r / / L a s t m o d i f i 0033500 e d M a y 3 , 1 9 8 2 0033520 1 1 : 3 2 A M b y T a f t 0033540 \r 376 001 \0 7 6 \r g e t " P u p . 0033560 d e c l " \r \r e x t e r n a l \r 0033600 [ \r / / o u t g o i n g p r 0033620 o c e d u r e s \r B S P G e t B 0033640 y t e ; B S P P r e p a r e I 0033660 P B I ; B S P G e t C l e a n 0033700 u p ; B S P G e t M a r k \r B 0033720 S P P u t B y t e ; B S P P r 0033740 e p a r e O P B I ; B S P F o 0033760 r c e O u t p u t ; B S P P u 0034000 t M a r k \r B S P C l o s e s ; 0034020 B S P E n d o f s ; B S P E 0034040 r r o r s \r \r / / i n c o m i 0034060 n g p r o c e d u r e s \r B S 0034100 P G e t s ; B S P P u t s ; 0034120 C l o s e B S P S o c k e t \r S 0034140 e n d A c k 376 001 \0 \t 375 ; T r a 0034160 n s m i t S t r a t e g y ; S 0034200 e t T i m e o u t \r R e l e a s 0034220 e P B I ; G e t P B I ; C o 0034240 m p l e t e P u p ; S e t P u 0034260 p I D \r Z e r o ; M o v e B l 0034300 o c k ; C a l l S w a t ; S 0034320 y s E r r ; G e t s ; P u t 0034340 s ; E r r o r s \r D o u b l e 0034360 I n c r e m e n t ; S e t T i 0034400 m e r ; T i m e r H a s E x p 0034420 i r e d ; B l o c k \r E n q u 0034440 e u e ; D e q u e u e ; M i 0034460 n \r \r / / o u t g o i n g s 0034500 t a t i c s \r b s p V e r s i o 0034520 n \r \r / / i n c o m i n g s 0034540 t a t i c s \r o f f s 376 001 \0 325 226 0034560 e t B S P S t r \r ] \r \r s t a t 0034600 i c [ b s p V e r s i o n 0034620 = 1 0 1 1 ] / / p r o t 0034640 o c o l a n d p a c k a g e 0034660 v e r s i o n s \r \r \r / / - - 0034700 - - - - - - - - - - - - - - - - * 0035000 - - - - - - - - - \r l e t B S 0035020 P C l o s e s ( s t r ) = C 0035040 l o s e B S P S o c k e t ( s t 0035060 r - o f f s e t B S P S t r ) \r 0035100 / / - - - - - - - - - - - - - - 0035120 - - - - - - - - - - - - - - - - * 0035160 376 001 \0 ^ 361 - - - - - - - - - - - 0035200 - - - - - - - - - - - - - - - - 0035220 - - \r \r \r / / - - - - - - - - - 0035240 - - - - - - - - - - - - - - - - * 0035340 - - - \r a n d B S P E r r o r 0035360 s ( s t r , e c ) = / / 0035400 d e f a u l t B S P s t r e 0035420 a m e r r o r h a n d l e r 0035440 \r / / - - - - - - - - - - - - - 0035460 - - - - - - - - - - - - - - - - * 0035540 - - - - - - - - - - - - - - - \r 0035560 s e l e c 376 001 \0 g ` t o n e c 0035600 i n t o \r [ \r c a 0035620 s e e c B a d S t a t e F o r 0035640 G e t s : \r c a s e e c 0035660 G e t s T i m e o u t : \r 0035700 c a s e e c M a r k E n c o u 0035720 n t e r e d : \r - 1 0035740 \r c a s e e c B a d S t 0035760 a t e F o r P u t s : \r c 0036000 a s e e c P u t s T i m e o u 0036020 t : \r f a l s e \r 0036040 d e f a u l t : \r 0036060 S y s E r r ( s t r , e c ) 0036100 \r ] \r \f \r / / - - - - - - 0036120 - - - - - - - - - - - - - - - - * 0036160 - - - - - - - - - - 376 001 \0 356 5 - 0036200 - - - - - - - - - - - - - - - - 0036220 - - - - - - - - - - - \r a n d 0036240 B S P G e t B y t e ( s t r , 0036260 t i m e o u t ; n u m a r g s 0036300 n a ) = v a l o f \r / / - 0036320 - - - - - - - - - - - - - - - - * 0036420 - - - - - - - - - - - \r / / S 0036440 t r e a m G e t s p r o c e 0036460 d u r e c a l l e d w h e n 0036500 t h e r e m i g h t n o t 0036520 b e a c u r r e n t i P 0036540 B I . \r [ \r l e t e c = B 0036560 S P P r e p a r e I P B I ( s 376 0036600 001 \0 372 353 t r - o f f s e t B S P 0036620 S t r , ( n a g r 1 ? t 0036640 i m e o u t , - 1 ) ) \r r e s 0036660 u l t i s e c n e 0 ? E 0036700 r r o r s ( s t r , e c ) , 0036720 G e t s ( s t r ) \r ] \r \r / / - 0036740 - - - - - - - - - - - - - - - - * 0037040 - - - - - - - - - - - \r a n d 0037060 B S P P r e p a r e I P B I ( s 0037100 o c , t i m e o u t ) = v 0037120 a l o f \r / / - - - - - - - - - 0037140 - - - - - - - - - - - - - - - - * 0037200 - - - - 376 001 \0 023 k - - - - - - - 0037220 - - - - - - - - - - - - - - - - 0037240 - - - - - - - - \r / / A t t e 0037260 m p t s t o g e t a n e 0037300 w I P B I i f n e c e s s 0037320 a r y . \r / / R e t u r n s 0037340 z e r o n o r m a l l y a n 0037360 d a n e r r o r c o d e 0037400 u p o n f a i l u r e . \r [ \r 0037420 l e t t i m e r = n i l ; 0037440 S e t T i m e r ( l v t i m 0037460 e r , t i m e o u t ) \r 0037500 [ / / r e p e a t \r B 0037520 l o c k ( ) \r i f s o c 0037540 > > B S P S o c . i P B I n e 0037560 0 t h e n b r e a k / 0037600 / s o m e o n e 376 001 \0 d E e 0037620 l s e a l r e a d y s e t 0037640 i t u p \r i f s o c > 0037660 > B S P S o c . u n R e a d P u 0037700 p s n e 0 t h e n \r 0037720 [ / / n e w P B I 0037740 r e a d y t o r e a d \r 0037760 l e t p b i = D e 0040000 q u e u e ( l v s o c > > B S 0040020 P S o c . b s p I Q ) \r 0040040 c o m p i l e i f p u p D 0040060 e b u g t h e n \r 0040100 [ i f p b i e q 0 0040120 t h e n C a l l S w a t ( " 0040140 [ B S P P r e p a r e I P B I ] 0040160 I n p u t Q f o u l e d 0040200 u p " ) ] \r s 376 001 0040220 \0 230 031 o c > > B S P S o c . i P 0040240 B I = p b i \r c 0040260 o m p i l e i f t y p e D a t 0040300 a g e t y p e M a r k % 0040320 t y p e A D a t a g e t y p 0040340 e M a r k % \r t 0040360 y p e A M a r k l s t y p e 0040400 M a r k t h e n \r 0040420 [ B a r f ( " P u p t 0040440 y p e i n e q u a l i t y a 0040460 s s u m p t i o n i n v a l i 0040500 d " ) ] \r s o c > 0040520 > B S P S o c . m a r k P e n d 0040540 i n g = p b i > > P B I . p 0040560 u p . t y p e g e t y p e M 0040600 a r k / / M a r k o r 0040620 A M a 376 001 \0 j 277 r k \r 0040640 s o c > > B S P S o c . i W o 0040660 r d P = l v p b i > > P B 0040700 I . p u p . w o r d s \r 0040720 s o c > > B S P S o c . i B 0040740 y t e P = 0 \r s 0040760 o c > > B S P S o c . i B y t e 0041000 C = p b i > > P B I . p u p 0041020 . l e n g t h - p u p O v B y t 0041040 e s \r b r e a k \r 0041060 ] \r / / d o n 0041100 ' t t e s t s t a t e u n 0041120 t i l a f t e r c h e c k i 0041140 n g u n R e a d P u p s s o 0041160 t h a t a s o c k e t i 0041200 n \r / / s t a t e E n d 0041220 I n w o n ' t 376 001 \0 222 324 g e 0041240 t a n e r r o r u n t i l 0041260 a l l r e c e i v e d P B 0041300 I s h a v e b e e n r e a 0041320 d . \r l e t s t a t e 0041340 = s o c > > B S P S o c . s t 0041360 a t e \r u n l e s s s t 0041400 a t e e q s t a t e O p e n 0041420 % s t a t e e q s t a t 0041440 e E n d O u t r e s u l t i s 0041460 e c B a d S t a t e F o r G e 0041500 t s \r i f t i m e o u t 0041520 n e - 1 & T i m e r H a 0041540 s E x p i r e d ( l v t i m e 0041560 r ) r e s u l t i s e c G e 0041600 t s T i m e o u t \r ] r 0041620 e p e a t \r t e s t s o 376 001 \0 0041640 272 ] c > > B S P S o c . m a r k 0041660 P e n d i n g \r i f s o 0041700 r e s u l t i s e c M a r k E 0041720 n c o u n t e r e d \r i f 0041740 n o t [ s o c > > B S P S o 0041760 c . g e t s = B S P G e t s 0042000 ; r e s u l t i s 0 ] \r ] 0042020 \r \r / / - - - - - - - - - - - - 0042040 - - - - - - - - - - - - - - - - * 0042140 \r a n d B S P G e t C l e a n 0042160 u p ( s o c , d a t a B y t e 0042200 ) = v a l o f \r / / - - - - 0042220 - - - - - - - - - - - - - - - - 0042240 - - 376 001 \0 b g - - - - - - - - - 0042260 - - - - - - - - - - - - - - - - * 0042320 - - - - - - - - - - - - - \r / / 0042340 C a l l e d f r o m B S P 0042360 G e t s a f t e r i t c o 0042400 n s u m e s t h e l a s t 0042420 b y t e o f t h e c u r r 0042440 e n t P u p . \r [ \r D o u b l 0042460 e I n c r e m e n t ( l v s o 0042500 c > > B S P S o c . u s e r B y 0042520 t e I D , \r ( s o c > > B S P 0042540 S o c . i P B I ) > > P B I . p 0042560 u p . l e n g t h - p u p O v B 0042600 y t e s ) \r R e l e a s e P B I 0042620 ( s o c > > B S P S o c . i P B 0042640 I ) \r s o c > 376 001 \0 P T > B S P 0042660 S o c . i P B I = 0 \r s o c 0042700 > > B S P S o c . u n R e a d P 0042720 u p s = s o c > > B S P S o 0042740 c . u n R e a d P u p s - 1 \r s 0042760 o c > > B S P S o c . g e t s 0043000 = B S P G e t B y t e \r \r / / 0043020 I f w e p r e v i o u s l 0043040 y s e n t a n a l l o c a 0043060 t i o n o f z e r o a n d 0043100 a t l e a s t h a l f t 0043120 h e s o c k e t ' s \r / / a 0043140 l l o c a t i o n i s n o w 0043160 a v a i l a b l e t h e n 0043200 s e n d a g r a t u i t o u 0043220 s a c k . T h e l a t t 0043240 e r t e s t \r / / i 376 001 \0 237 0043260 347 s t o p r e v e n t t h 0043300 e P u p e q u i v a l e n t 0043320 o f w h a t t h e A r p 0043340 a I n t e r n e t p e o p l 0043360 e \r / / c a l l " S i l l y 0043400 W i n d o w S y n d r o m e 0043420 " . \r i f s o c > > B S P S o 0043440 c . s e n t Z e r o A l l o c 0043460 & \r s o c > > B S P S o c . u 0043500 n R e a d P u p s l e s o c 0043520 > > B S P S o c . m a x I P B I 0043540 r s h i f t 1 t h e n \r 0043560 S e n d A c k ( s o c ) \r r 0043600 e s u l t i s d a t a B y t e 0043620 \r ] \r \r / / - - - - - - - - - - 0043640 - - - - - - - - - - - - - - - - 0043660 - 376 001 \0 350 2 - - - - - - - - - - 0043700 - - - - - - - - - - - - - - - - * 0043740 - - - - - - - \r a n d B S P E 0043760 n d o f s ( s t r ) = s t r 0044000 > > B S P S t r . g e t s e q 0044020 B S P G e t s ? f a l s e , 0044040 \r B S P P r e p a r e I 0044060 P B I ( s t r - o f f s e t B S 0044100 P S t r , 0 ) n e 0 \r / / 0044120 - - - - - - - - - - - - - - - - * 0044220 - - - - - - - - - - - - \r \f \r / 0044240 / - - - - - - - - - - - - - - - 0044260 - - - - - - 376 001 \0 4 356 - - - - - 0044300 - - - - - - - - - - - - - - - - * 0044360 - - \r a n d B S P P u t B y t 0044400 e ( s t r , d a t a B y t e , 0044420 t i m e o u t ; n u m a r g 0044440 s n a ) = v a l o f \r / / 0044460 - - - - - - - - - - - - - - - - * 0044560 - - - - - - - - - - - - \r / / 0044600 S t r e a m P u t s p r o c 0044620 e d u r e c a l l e d w h e 0044640 n t h e r e m i g h t n o 0044660 t b e a c u r r 376 001 \0 t 200 0044700 e n t o P B I . \r [ \r l e t 0044720 e c = B S P P r e p a r e O 0044740 P B I ( s t r - o f f s e t B S 0044760 P S t r , ( n a g r 2 ? 0045000 t i m e o u t , - 1 ) ) \r i f 0045020 e c n e 0 r e s u l t i 0045040 s E r r o r s ( s t r , e c 0045060 ) \r r e s u l t i s P u t s ( 0045100 s t r , d a t a B y t e ) \r ] 0045120 \r \r / / - - - - - - - - - - - - 0045140 - - - - - - - - - - - - - - - - * 0045240 \r a n d B S P P r e p a r e O 0045260 P B I ( s o c , t i m e o u t 0045300 376 001 \0 177 % ) = v a l o f \r / 0045320 / - - - - - - - - - - - - - - - 0045340 - - - - - - - - - - - - - - - - * 0045420 - - - - - - - - - - - - - \r / / 0045440 A t t e m p t s t o s e t 0045460 u p a n e w O P B I i 0045500 f n e c e s s a r y . \r / / 0045520 R e t u r n s z e r o n o r 0045540 m a l l y a n d a n e r r 0045560 o r c o d e u p o n f a i 0045600 l u r e . \r [ \r l e t t i m e 0045620 r = n i l ; S e t T i m e 0045640 r ( l v t i m e r , t i m e 0045660 o u t ) \r [ / / r e p 0045700 e a t \r 376 001 \0 227 234 B l o c 0045720 k ( ) \r i f s o c > > B 0045740 S P S o c . o P B I n e 0 0045760 t h e n b r e a k / / s 0046000 o m e o n e e l s e a l r e 0046020 a d y s e t i t u p \r 0046040 l e t s t a t e = s o c 0046060 > > B S P S o c . s t a t e \r 0046100 u n l e s s s t a t e e 0046120 q s t a t e O p e n % s t 0046140 a t e e q s t a t e E n d I 0046160 n r e s u l t i s e c B a d 0046200 S t a t e F o r P u t s \r 0046220 i f s o c > > B S P S o c . p 0046240 u p A l l o c g r 0 & s 0046260 o c > > B S P S o c . b y t e A 0046300 l l o c g r 0 376 001 \0 006 323 & 0046320 \r s o c > > B S P S o c 0046340 . n u m T P B I g r 1 & 0046360 s o c > > B S P S o c . n u m O 0046400 P B I g r 1 t h e n \r 0046420 [ / / o k t o a 0046440 l l o c a t e a n e w P B 0046460 I \r l e t p b i 0046500 = G e t P B I ( s o c ) \r 0046520 p b i > > P B I . p u p 0046540 . l e n g t h = M i n ( s o 0046560 c > > B S P S o c . b y t e s P 0046600 e r P u p , s o c > > B S P S 0046620 o c . b y t e A l l o c ) \r 0046640 p b i > > P B I . p u p 0046660 . t y p e = t y p e D a t a 0046700 \r s o c > > B S P 376 0046720 001 \0 H 0 S o c . o P B I = p 0046740 b i \r s o c > > B S 0046760 P S o c . o W o r d P = l v 0047000 p b i > > P B I . p u p . w o 0047020 r d s \r s o c > > B 0047040 S P S o c . o B y t e P = 0 0047060 \r s o c > > B S P S 0047100 o c . o B y t e C = p b i > 0047120 > P B I . p u p . l e n g t h \r 0047140 s o c > > B S P S o 0047160 c . p u t s = B S P P u t s 0047200 / / a s s e m b l y - l a 0047220 n g u a g e v e r s i o n \r 0047240 b r e a k \r 0047260 ] \r i f t i m e o u t 0047300 n e - 1 & T i m e r H a 0047320 s E x p 376 001 \0 355 340 i r e d ( l v 0047340 t i m e r ) r e s u l t i s 0047360 e c P u t s T i m e o u t \r 0047400 ] r e p e a t \r r e s u l 0047420 t i s 0 \r ] \r \r / / - - - - - 0047440 - - - - - - - - - - - - - - - - * 0047540 - - - - - - - \r a n d B S P F 0047560 o r c e O u t p u t ( s o c , 0047600 s e n d N o w ; n u m a r g s 0047620 n a ) = v a l o f \r / / - 0047640 - - - - - - - - - - - - - - - - * 0047720 - - - - - - - - - 376 001 \0 020 / - - 0047740 - - - - - - - - - - - - - - - - 0047760 \r / / C a l l e d f r o m 0050000 B S P P u t s a f t e r i t 0050020 c o m p l e t e l y f i l l 0050040 s t h e c u r r e n t P u 0050060 p , a n d \r / / e l s e w h 0050100 e r e t o f o r c e t r a 0050120 n s m i s s i o n o f a p 0050140 a r t i a l l y - f i l l e d 0050160 P u p . \r / / I f s e n d N 0050200 o w t h e n t h e P u p 0050220 i s s e n t a s a n A D 0050240 a t a o r A M a r k t o 0050260 f o r c e i m m e d i a t e \r 0050300 / / a c k n o w l e d g m e n 0050320 t a n d t h e r e b y 376 001 0050340 \0 323 346 g e t t h e o u t p u 0050360 t s t r e a m c l e a n e d 0050400 u p q u i c k l y . \r [ \r l 0050420 e t p b i = s o c > > B S 0050440 P S o c . o P B I \r i f p b i 0050460 n e 0 t h e n \r [ \r 0050500 l e t n B y t e s = 0050520 p b i > > P B I . p u p . l e n 0050540 g t h - s o c > > B S P S o 0050560 c . o B y t e C \r p b i > 0050600 > P B I . p u p . l e n g t h 0050620 = n B y t e s + p u p O v B y 0050640 t e s \r S e t P u p I D ( 0050660 p b i , l v s o c > > B S P 0050700 S o c . x m i t B y t e I D ) \r 0050720 D o u b l e I n c r e m e 0050740 n t ( 376 001 \0 270 256 l v s o c > > 0050760 B S P S o c . x m i t B y t e I 0051000 D , n B y t e s ) \r s o 0051020 c > > B S P S o c . u n A c k e 0051040 d P u p s = s o c > > B S P 0051060 S o c . u n A c k e d P u p s + 0051100 1 \r s o c > > B S P S o c 0051120 . u n A c k e d B y t e s = 0051140 s o c > > B S P S o c . u n A c 0051160 k e d B y t e s + n B y t e s \r 0051200 s o c > > B S P S o c . p 0051220 u p A l l o c = s o c > > B 0051240 S P S o c . p u p A l l o c - 1 0051260 \r s o c > > B S P S o c . 0051300 b y t e A l l o c = s o c > 0051320 > B S P S o c . b y t e A l l o 0051340 c - n B y t e s 376 001 \0 1 352 \r 0051360 s o c > > B S P S o c . o P B 0051400 I = 0 \r s o c > > B S 0051420 P S o c . o B y t e C = 0 \r 0051440 s o c > > B S P S o c . p 0051460 u t s = B S P P u t B y t e 0051500 \r p b i > > P B I . q u e 0051520 u e = l v s o c > > B S P 0051540 S o c . b s p T Q / / r e t 0051560 u r n p b i t o b s p T Q 0051600 \r p b i > > P B I . t i m 0051620 e r = s o c > > B S P S o c 0051640 . a D a t a C o u n t \r T 0051660 r a n s m i t S t r a t e g y ( 0051700 p b i , n a g r 1 & s 0051720 e n d N o w ) \r C o m p l 0051740 e t e P u p ( p b i ) \r 376 001 \0 0051760 353 342 S e t T i m e o u t ( s 0052000 o c ) \r ] \r r e s u l t i 0052020 s t r u e / / f o r B 0052040 S P P u t s \r ] \r \f \r / / - - - 0052060 - - - - - - - - - - - - - - - - * 0052160 - - - - - - - - - \r a n d B S 0052200 P G e t M a r k ( s o c ) = 0052220 v a l o f \r / / - - - - - - - - 0052240 - - - - - - - - - - - - - - - - * 0052340 - - - - \r [ \r u n l e s s s o 0052360 c > 376 001 \0 027 324 > B S P S o c . m 0052400 a r k P e n d i n g r e s u l 0052420 t i s E r r o r s ( s o c , 0052440 e c B a d B S P G e t M a r k ) 0052460 \r s o c > > B S P S o c . m a r 0052500 k P e n d i n g = f a l s e 0052520 \r r e s u l t i s G e t s ( s 0052540 o c + o f f s e t B S P S t r ) 0052560 \r ] \r \r / / - - - - - - - - - - 0052600 - - - - - - - - - - - - - - - - * 0052700 - - \r a n d B S P P u t M a r 0052720 k ( s o c , m a r k B y t e , 0052740 t i m e o u t , s e n d N o 0052760 w ; n u m a 376 001 \0 331 ) r g s 0053000 n a ) = v a l o f \r / / - - 0053020 - - - - - - - - - - - - - - - - * 0053120 - - - - - - - - - - \r [ \r / / 0053140 T h i s i s h a i r y . 0053160 W e w a n t t o p u t t 0053200 h e m a r k B y t e i n a 0053220 f r e s h P B I . J u s 0053240 t c a l l i n g \r / / B S P 0053260 F o r c e O u t p u t f o l l 0053300 o w e d b y P u t s i s 0053320 n o t g o o d e n o u g h , 0053340 b e c a u s e P u t s c a 0053360 l l s \r / / B S P P r 376 001 \0 7 0053400 274 e p a r e O P B I w h i c h 0053420 m a y B l o c k a w a i t 0053440 i n g a l l o c a t i o n , 0053460 a n d m e a n w h i l e s o 0053500 m e \r / / o t h e r c o n t 0053520 e x t m i g h t d o a P 0053540 u t s o f s o m e d a t a 0053560 b y t e s , w h i c h o u 0053600 r P u t s w o u l d \r / / 0053620 t h e n a p p e n d t o . \r 0053640 [ / / r e p e a t \r 0053660 B S P F o r c e O u t p u t 0053700 ( s o c ) \r l e t e c 0053720 = B S P P r e p a r e O P B I 0053740 ( s o c , ( n a g e 3 ? 0053760 t i m e o u t , - 1 ) ) \r 0054000 376 001 \0 350 230 i f e c n e 0 0054020 r e s u l t i s E r r o r s 0054040 ( s o c + o f f s e t B S P S t 0054060 r , e c ) \r / / t h i 0054100 s i s h o w w e t e l l 0054120 w h e t h e r w e n o w 0054140 h a v e a f r e s h P B I 0054160 : \r ] r e p e a t u n t 0054200 i l s o c > > B S P S o c . o 0054220 B y t e C e q s o c > > B S 0054240 P S o c . o P B I > > P B I . p 0054260 u p . l e n g t h \r \r s o c > > 0054300 B S P S o c . o P B I > > P B I 0054320 . p u p . t y p e = t y p e 0054340 M a r k \r P u t s ( s o c + o f 0054360 f s e t B S P S t r , m a r k 0054400 B y t e ) 376 \0 Q 256 362 / / g 0054420 u a r a n t e e d t o s u c 0054440 c e e d \r B S P F o r c e O u t 0054460 p u t ( s o c , n a g r 3 0054500 & s e n d N o w ) \r r e s u 0054520 l t i s t r u e \r ] \r 377 \0 \0 P 0054540 u p B S P P r o t . b c p l \0 373 0054560 230 & 245 ) \0 \0 376 001 \0 026 033 / / P u 0054600 p B S P P r o t . b c p l - - 0054620 B y t e S t r e a m P r o 0054640 t o c o l \r / / c o m p a n i 0054660 o n f i l e s a r e P u p 0054700 B S P S t r e a m s . b c p l 0054720 a n d P u p B S P a . a s m \r 0054740 / / C o p y r i g h t X e r 0054760 o x C o r p o r a t i o n 1 0055000 9 7 9 , 1 9 8 1 \r \r / / L a 0055020 s t m o d i f i e d N o v e 0055040 m b e r 2 1 , 1 9 8 1 1 0055060 0 : 4 9 A M b y T a f t \r 0055100 \r g e t " P u p . d e c l " \r 0055120 g e t " P u p R T P I n t e r 0055140 n a l . d e c l " \r \r e x t e r 0055160 n a l \r [ \r / / o u t 376 001 \0 216 353 0055200 g o i n g p r o c e d u r e s 0055220 \r B S P P u p P r o c ; B S P 0055240 T i m e r P r o c ; S e n d A 0055260 c k ; T r a n s m i t S t r a 0055300 t e g y ; S e t T i m e o u t 0055320 ; S e a r c h T Q \r \r / / i n 0055340 c o m i n g p r o c e d u r e 0055360 s \r B S P H a n d l e U n c o m 0055400 m o n P u p ; R T P F i l t e 0055420 r ; R T P F S M \r R e l e a s 0055440 e P B I ; G e t P B I ; C o 0055460 m p l e t e P u p ; S e t P u 0055500 p I D \r Z e r o ; M u l t E q 0055520 ; D o u b l e D i f f e r e n 0055540 c e ; D o u b l e I n c r e m 0055560 e n t \r S e t T i m e r ; T i 0055600 376 001 \0 i p m e r H a s E x p i r 0055620 e d \r E n q u e u e ; D e q u 0055640 e u e ; U n q u e u e ; I n 0055660 s e r t A f t e r ; F l u s h 0055700 Q u e u e \r E n a b l e I n t e 0055720 r r u p t s ; D i s a b l e I 0055740 n t e r r u p t s ; M i n ; 0055760 M a x \r \r / / s t a t i c s \r m 0056000 a x P u p D a t a B y t e s ; 0056020 o v e r l a p D a t a W i t h A 0056040 c k \r ] \r \r / / I f o v e r 0056060 l a p D a t a W i t h A c k i 0056100 s t r u e , T r a n s m i t 0056120 S t r a t e g y w i l l g e 0056140 n e r a t e \r / / a n A D a 0056160 t a b e f o r e a l l o c a 0056200 t i o n 376 001 \0 E 360 i s c o m 0056220 p l e t e l y e x h a u s t e 0056240 d , t h e r e b y p e r m i 0056260 t t i n g \r / / c o n t i n u 0056300 e d s e n d i n g d u r i n 0056320 g t h e A D a t a / A c k 0056340 r o u n d - t r i p t i m e . 0056360 \r / / T h i s i m p r o v e 0056400 s p e r f o r m a n c e w h 0056420 e n t h e r o u n d - t r i 0056440 p t i m e i s l a r g e . 0056460 \r / / U n f o r t u n a t e l 0056500 y , i t h a s d i s a s t 0056520 e r o u s e f f e c t s o n 0056540 p e r f o r m a n c e i n 0056560 c e r t a i n \r / / s i t u a 0056600 t i o n s b e c a 376 001 \0 354 Q u 0056620 s e o f l o s t p a c k e 0056640 t s c a u s e d b y E t h 0056660 e r n e t i n t e r f a c e \r 0056700 / / t u r n a r o u n d l a 0056720 t e n c y i n A l t o s a 0056740 n d N o v a s . W e t h 0056760 e r e f o r e d o n o t e 0057000 n a b l e \r / / t h i s f e 0057020 a t u r e a t t h e p r e 0057040 s e n t t i m e . \r \r s t a t 0057060 i c [ o v e r l a p D a t a 0057100 W i t h A c k = f a l s e 0057120 ] \r \f \r / / - - - - - - - - - - 0057140 - - - - - - - - - - - - - - - - * 0057200 - - - - - - - - - - - - - - - 376 0057220 001 \0 372 243 - - - - - - - - - - - - 0057240 - - - - - - - \r l e t B S P P 0057260 u p P r o c ( p b i ) b e \r / 0057300 / - - - - - - - - - - - - - - - 0057320 - - - - - - - - - - - - - - - - * 0057400 - - - - - - - - - - - - - \r / / 0057420 I n c o m i n g P u p s t 0057440 h a t a r e n o t R T P 0057460 c o m e h e r e . p b i 0057500 i s a l w a y s d i s p o s 0057520 e d o f , \r / / e i t h e r 0057540 h e r e o r b y h i g h 0057560 e r - l e v e l h a n d l e r 0057600 t h a t w e c a l l . \r [ 0057620 \r l e t 376 001 \0 345 340 s o c = 0057640 p b i > > P B I . s o c k e t \r 0057660 \r / / i g n o r e p b i i 0057700 f s o c k e t ' s s t a t e 0057720 i s n o t O p e n , E n 0057740 d I n , o r E n d O u t \r i 0057760 f s o c > > B S P S o c . s t 0060000 a t e l s s t a t e O p e n 0060020 % s o c > > B S P S o c . s 0060040 t a t e g r s t a t e E n d 0060060 O u t t h e n \r [ R e 0060100 l e a s e P B I ( p b i ) ; r 0060120 e t u r n ] \r \r s w i t c h o 0060140 n p b i > > P B I . p u p . t 0060160 y p e i n t o \r [ \r 0060200 c a s e t y p e A M a r k : 0060220 \r c a s e 376 001 \0 I 342 t y 0060240 p e A D a t a : \r s 0060260 o c > > B S P S o c . a c k P e 0060300 n d i n g = t r u e \r 0060320 c a s e t y p e D a t a : \r 0060340 c a s e t y p e M a r k : 0060360 \r [ \r / 0060400 / d i s c a r d p b i u n 0060420 l e s s a l l t h e f o l 0060440 l o w i n g c o n d i t i o n 0060460 s a r e m e t : \r 0060500 / / f r o m c o r r e c t 0060520 s o u r c e p o r t ? \r 0060540 u n l e s s R T P F i 0060560 l t e r ( p b i , t r u e , 0060600 f a l s e ) & \r \r 0060620 / / s o c k e t a l l o 376 001 0060640 \0 225 210 c a t i o n s u f f i c 0060660 i e n t ? \r s o c 0060700 > > B S P S o c . n u m T P B I 0060720 n e 0 & s o c > > B S P 0060740 S o c . n u m I P B I n e 0 0060760 & \r \r / / p b i 0061000 n o n - e m p t y ? \r 0061020 p b i > > P B I . p u p . 0061040 l e n g t h g r p u p O v B 0061060 y t e s & \r \r / / 0061100 a l l o f p b i ' s b y 0061120 t e s i n a l l o c a t i o 0061140 n w i n d o w ? \r 0061160 D o u b l e D i f f e r e n c 0061200 e ( l v p b i > > P B I . p u 0061220 p . i d , l v s o c > > B S 0061240 P S o 376 001 \0 035 377 c . r c v B y t 0061260 e I D ) + \r p b 0061300 i > > P B I . p u p . l e n g t 0061320 h - ( p u p O v B y t e s + 0061340 1 ) u l s \r ( s 0061360 o c > > B S P S o c . m a x I P 0061400 B I - 1 ) * m a x P u p D a t a 0061420 B y t e s & \r \r / 0061440 / n o n - d u p l i c a t e ? 0061460 \r I n s e r t I n 0061500 S e q u e n c e ( l v s o c > 0061520 > B S P S o c . b s p I Q , p 0061540 b i ) d o \r 0061560 [ R e l e a s e P B I ( p b i 0061600 ) ; e n d c a s e ] / / 0061620 d i s c a r d \r \r 0061640 w h i l e p b 376 001 \0 304 347 i n 0061660 e 0 & \r M u l 0061700 t E q ( l v s o c > > B S P S 0061720 o c . r c v B y t e I D , l v 0061740 p b i > > P B I . p u p . i d 0061760 ) d o \r [ 0062000 / / F i l l e d i n f i 0062020 r s t h o l e , a d v a n c 0062040 e r c v B y t e I D \r 0062060 D o u b l e I n c r e 0062100 m e n t ( l v s o c > > B S P 0062120 S o c . r c v B y t e I D , \r 0062140 p b i > > P B 0062160 I . p u p . l e n g t h - p u p 0062200 O v B y t e s ) \r 0062220 s o c > > B S P S o c . u n 0062240 R e a d P u p s = s o 376 001 \0 0062260 351 244 c > > B S P S o c . u n R e 0062300 a d P u p s + 1 \r 0062320 p b i = p b i ! 0 \r 0062340 ] \r \r 0062360 S e t T i m e r ( l v s o c > 0062400 > B S P S o c . i n a c t i v i 0062420 t y T i m e r , i n a c t i v 0062440 i t y T i m e o u t ) \r 0062460 e n d c a s e \r 0062500 ] \r \r c a s e t y p e A 0062520 c k : \r [ \r 0062540 u n l e s s R T P F i l t 0062560 e r ( p b i , t r u e , f a 0062600 l s e ) & \r D o 0062620 u b l e D i f f e r e n c e ( l 0062640 v p b i > > P B I . p u p . i 0062660 d , 376 001 \0 v B l v s o c > > 0062700 B S P S o c . l a s t A c k I D 0062720 ) g e 0 d o \r 0062740 [ R e l e a s e P B I ( 0062760 p b i ) ; e n d c a s e ] 0063000 / / w r o n g s o u r c e 0063020 o r o u t o f o r d e r 0063040 \r \r i f s o c > > 0063060 B S P S o c . a c k R e q u e s 0063100 t e d t h e n \r 0063120 [ / / U p d a t e t 0063140 h e a d a p t i v e t i m e 0063160 o u t = 2 t i m e s t h 0063200 e a v e r a g e r o u n d - 0063220 t r i p \r 0063240 / / d e l a y , e x p o n 0063260 e n t i a l l 376 001 \0 3 214 y a g 0063300 e d o v e r t h e l a s t 0063320 8 s a m p l e s . \r 0063340 l e t t = n i l 0063360 ; S e t T i m e r ( l v t , 0063400 0 ) \r c o m 0063420 p i l e t e s t a l t o \r 0063440 i f s o [ 0063460 t = ( t - s o c > > B S P 0063500 S o c . l a s t A D a t a T i m 0063520 e ) l s h i f t 3 + 4 ] 0063540 \r i f n 0063560 o t [ t = ( t - s o c > 0063600 > B S P S o c . l a s t A D a t 0063620 a T i m e ) l s h i f t 1 0063640 + 1 ] \r s o 0063660 c > > B S P S o c . a D 376 001 \0 367 0063700 Q a t a T i m e o u t = \r 0063720 ( 7 * s o c > > 0063740 B S P S o c . a D a t a T i m e 0063760 o u t + M a x ( 5 , M i n ( 1 0064000 0 0 0 , t ) ) ) r s h i f t 0064020 3 \r ] \r \r 0064040 s o c > > B S P S o c 0064060 . l a s t A c k I D ^ 1 = p 0064100 b i > > P B I . p u p . i d ^ 1 0064120 \r s o c > > B S P S 0064140 o c . l a s t A c k I D ^ 2 = 0064160 p b i > > P B I . p u p . i d 0064200 ^ 2 \r \f \r / / B S P P u p P r 0064220 o c ( c o n t ' d ) \r \r 0064240 / / m o v e a l l P 0064260 B I s f r o m b s p T Q t 0064300 o 376 001 \0 ! 374 a p r i v a t e 0064320 q u e u e \r l e t 0064340 t Q = v e c 1 \r 0064360 D i s a b l e I n t e r r u 0064400 p t s ( ) \r t Q ! 0 0064420 = s o c > > B S P S o c . b 0064440 s p T Q . h e a d ; t Q ! 1 0064460 = s o c > > B S P S o c . b s 0064500 p T Q . t a i l \r s 0064520 o c > > B S P S o c . b s p T Q 0064540 . h e a d = 0 \r 0064560 E n a b l e I n t e r r u p t s 0064600 ( ) \r \r / / d e c 0064620 i d e w h e t h e r t o r 0064640 e l e a s e , k e e p , o r 0064660 r e t r a n s m i t e a c h 0064700 p b i \r 376 001 \0 357 307 0064720 l e t r T Q = v e c 1 ; 0064740 r T Q ! 0 = 0 / / q 0064760 o f p b i s t o r e t r 0065000 a n s m i t \r 0065020 [ / / r e p e a t \r 0065040 l e t n p b i = 0065060 D e q u e u e ( t Q ) ; i f 0065100 n p b i e q 0 b r e a k \r 0065120 i f n p b i 0065140 > > P B I . p u p . t y p e e 0065160 q t y p e I n t e r r u p t 0065200 t h e n \r 0065220 [ C o m p l e t e P u p ( n 0065240 p b i ) ; l o o p ] / / 0065260 R e t r a n s m i t i n t e 0065300 r r u p t s \r 376 001 \0 214 277 0065320 t e s t D o u b l e 0065340 D i f f e r e n c e ( l v s o 0065360 c > > B S P S o c . l a s t A c 0065400 k I D , \r l 0065420 v n p b i > > P B I . p u p . 0065440 i d ) g e n p b i > > P B I 0065460 . p u p . l e n g t h - p u p O 0065500 v B y t e s \r 0065520 i f s o \r 0065540 [ / / T h i 0065560 s p b i h a s b e e n a 0065600 c k e d , r e l e a s e i t 0065620 \r 0065640 s o c > > B S P S o c . u n A c 0065660 k e d P u p s = s o c > > B 0065700 S P S o c . u n A c k e d P u p 0065720 376 001 \0 257 025 s - 1 \r 0065740 s o c > > B S P 0065760 S o c . u n A c k e d B y t e s 0066000 = s o c > > B S P S o c . u 0066020 n A c k e d B y t e s - \r 0066040 ( 0066060 n p b i > > P B I . p u p . l e 0066100 n g t h - p u p O v B y t e s ) 0066120 \r 0066140 R e l e a s e P B I ( n p b i ) 0066160 \r 0066200 s o c > > B S P S o c . p u p A 0066220 l l o c C o u n t = s o c > 0066240 > B S P S o c . p u p A l l o c 0066260 C o u n t + 1 \r 0066300 ] \r 0066320 376 001 \0 > ] i f n o t \r 0066340 [ 0066360 / / p b i n o t y e t 0066400 a c k e d , d e c i d e w 0066420 h e t h e r t o r e t r a n 0066440 s m i t \r 0066460 t e s t s o c > > B S 0066500 P S o c . a D a t a C o u n t - 0066520 n p b i > > P B I . t i m e r 0066540 g r 0 & \r 0066560 s o c > > B S P S 0066600 o c . a c k R e q u e s t e d \r 0066620 0066640 i f s o / / Y e s , 0066660 r e t a i n f o r r e t r a 0066700 n s m i s s i o n \r 0066720 376 001 \0 367 + 0066740 [ \r 0066760 T r a n s 0067000 m i t S t r a t e g y ( n p b i 0067020 , f a l s e ) \r 0067040 I n 0067060 s e r t I n S e q u e n c e ( r 0067100 T Q , n p b i ) / / c a n 0067120 ' t b e d u p l i c a t e \r 0067140 0067160 ] \r 0067200 i f n o t 0067220 / / N o , j u s t p u t 0067240 b a c k o n b s p T Q \r 0067260 0067300 E n q u e u e ( l v s o 0067320 c > > B S P S o c . b s p T Q 376 0067340 001 \0 177 026 , n p b i ) \r 0067360 ] \r 0067400 ] r e p e a t \r \r 0067420 / / U p d a t e 0067440 a l l o c a t i o n s \r 0067460 s o c > > B S P S o c . a c 0067500 k R e q u e s t e d = f a l 0067520 s e \r i f s o c > 0067540 > B S P S o c . p u p A l l o c 0067560 C o u n t g e p u p A l l o 0067600 c H y s t e r e s i s t h e n 0067620 \r [ / / 0067640 T i m e t o a t t e m p t 0067660 t o i n c r e a s e m a x P 0067700 u p A l l o c \r 0067720 s o c > > B S P S o c . p u p 0067740 A l l o 376 001 \0 356 b c C o u n t 0067760 = 0 \r s o c 0070000 > > B S P S o c . m a x P u p A 0070020 l l o c = \r 0070040 M i n ( s o c > > B S P S o c 0070060 . m a x P u p A l l o c + 1 , 0070100 s o c > > B S P S o c . m a x O 0070120 P B I ) \r ] \r 0070140 s o c > > B S P S o 0070160 c . b y t e s P e r P u p = 0070200 M i n ( p b i > > P B I . p u p 0070220 . w o r d s ^ 1 , m a x P u p 0070240 D a t a B y t e s ) \r 0070260 s o c > > B S P S o c . p u p 0070300 A l l o c = M i n ( s o c > 0070320 > B S P S o c . m a x P u p A l 0070340 l o c , \r 376 001 \0 r 272 0070360 p b i > > P B I . p u p . w o 0070400 r d s ^ 2 - s o c > > B S P 0070420 S o c . u n A c k e d P u p s ) 0070440 \r s o c > > B S P S 0070460 o c . b y t e A l l o c = p 0070500 b i > > P B I . p u p . w o r d 0070520 s ^ 3 - s o c > > B S P S o 0070540 c . u n A c k e d B y t e s \r 0070560 R e l e a s e P B I ( 0070600 p b i ) \r \r / / i 0070620 f w e h a v e a n y P B 0070640 I s t o r e t r a n s m i t 0070660 , d o s o n o w \r 0070700 i f r T Q ! 0 n e 0 0070720 t h e n \r [ \r 0070740 T r a n s 376 001 0070760 \0 ] 243 m i t S t r a t e g y ( r 0071000 T Q ! 1 ) / / M a y b e 0071020 t u r n t a i l i n t o A 0071040 D a t a \r w h 0071060 i l e r T Q ! 0 n e 0 d 0071100 o C o m p l e t e P u p ( D e 0071120 q u e u e ( r T Q ) ) \r 0071140 ] \r \r S e 0071160 t T i m e o u t ( s o c ) \r 0071200 S e t T i m e r ( l v 0071220 s o c > > B S P S o c . i n a c 0071240 t i v i t y T i m e r , i n a 0071260 c t i v i t y T i m e o u t ) \r 0071300 e n d c a s e \r 0071320 ] \r \f \r / / B S P P u 0071340 p P r o c ( c o n t ' d ) \r \r 0071360 376 001 \0 221 W c a s e t y p 0071400 e I n t e r r u p t : \r c 0071420 a s e t y p e I n t e r r u p 0071440 t R e p l y : \r c a s e 0071460 t y p e E n d : \r B 0071500 S P H a n d l e U n c o m m o n 0071520 P u p ( s o c , p b i ) / 0071540 / i t a l w a y s d i s p 0071560 o s e s o f p b i \r 0071600 e n d c a s e \r \r c a 0071620 s e t y p e E r r o r : \r 0071640 i f p b i > > P B I . 0071660 p u p . w o r d s ^ 1 1 e q 0071700 3 % / / p o r t I Q 0071720 o v e r f l o w \r 0071740 p b i > > P B I . p u p . w o r 0071760 d s ^ 1 1 e q 376 001 \0 315 v # 1 0072000 0 0 7 t h e n / / g a t 0072020 e w a y O Q o v e r f l o w 0072040 \r [ \r 0072060 / / G o t a c o 0072100 n g e s t i o n e r r o r . 0072120 A t t e m p t t o t h r o 0072140 t t l e b a c k o u t p u t 0072160 \r / / b y 0072200 d e c r e a s i n g t h e m 0072220 a x i m u m o u t g o i n g 0072240 P u p a l l o c a t i o n . \r 0072260 s o c > > B S 0072300 P S o c . m a x P u p A l l o c 0072320 = M a x ( s o c > > B S P S 0072340 o c . m a x P u p A l l o c - 1 0072360 , 1 ) \r 376 001 \0 0072400 005 375 s o c > > B S P S o c . p 0072420 u p A l l o c C o u n t = 0 0072440 \r ] \r 0072460 / / l e t h i g h e r - 0072500 l e v e l h a n d l e r l o 0072520 o k a t i t a l s o \r \r 0072540 d e f a u l t : \r 0072560 / / n o n - B S P P u p s 0072600 g e t p a s s e d t o h 0072620 i g h e r - l e v e l h a n d 0072640 l e r , w h i c h a l w a y 0072660 s \r / / d i s p o 0072700 s e s o f p b i \r 0072720 ( s o c > > B S P S o c . b s 0072740 p O t h e r P u p P r o c ) ( p 0072760 b i ) \r ] \r \r i f s o c 0073000 > > 376 001 \0 353 024 B S P S o c . a c 0073020 k P e n d i n g t h e n S e 0073040 n d A c k ( s o c ) \r ] \r \r / / 0073060 - - - - - - - - - - - - - - - - * 0073160 - - - - - - - - - - - - \r a n d 0073200 I n s e r t I n S e q u e n c 0073220 e ( q u e u e , p b i ) = 0073240 v a l o f \r / / - - - - - - - - 0073260 - - - - - - - - - - - - - - - - * 0073360 - - - - \r / / I n s e r t s 0073400 p b i i n t 376 001 \0 004 k o t h 0073420 e p r o p e r p l a c e i 0073440 n q u e u e t o m a i n t 0073460 a i n a s c e n d i n g o r 0073500 d e r o f \r / / P u p I D 0073520 s . Q u e u e m u s t a 0073540 l r e a d y b e i n o r d 0073560 e r . \r / / R e t u r n s t 0073600 r u e n o r m a l l y ; f a 0073620 l s e i f t h e p b i ' s 0073640 I D d u p l i c a t e s o 0073660 n e a l r e a d y i n \r / / 0073700 t h e q u e u e . \r [ \r / / 0073720 T e s t f i r s t f o r 0073740 t h e m o s t c o m m o n 0073760 c a s e o f t h e n e w 0074000 p b i g o i n g o n 376 001 \0 \ 0074020 ~ t h e e n d o f \r / / 0074040 t h e q u e u e . I f i 0074060 t d o e s n ' t b e l o n g 0074100 t h e r e , t h e n i n i 0074120 t i a t e a s e a r c h f 0074140 r o m t h e \r / / f r o n t 0074160 o f t h e q u e u e f o 0074200 r t h e r i g h t p l a c 0074220 e t o i n s e r t i t . \r 0074240 t e s t q u e u e ! 0 e q 0074260 0 % \r D o u b l e D i f f e 0074300 r e n c e ( l v p b i > > P B 0074320 I . p u p . i d , l v ( q u 0074340 e u e ! 1 ) > > P B I . p u p . 0074360 i d ) g r 0 \r i f s o 0074400 E n q u e u e ( q u e u e , 0074420 p 376 001 \0 366 : b i ) \r i f n 0074440 o t \r [ / / S e 0074460 a r c h q u e u e f o r r 0074500 i g h t p l a c e t o i n 0074520 s e r t n e w p b i \r 0074540 l e t p r e d = q u 0074560 e u e \r l e t d 0074600 = n i l \r \r / / 0074620 a s s e r t : t h e q u e u 0074640 e i s n o n - e m p t y a 0074660 n d p b i ' s I D < = t 0074700 h e t a i l i t e m ' s I 0074720 D . \r / / T h e r 0074740 e f o r e t h i s l o o p 0074760 i s g u a r a n t e e d t o 0075000 t e r m i n a t e . \r 0075020 [ 376 001 \0 307 \v / / r 0075040 e p e a t \r d 0075060 = D o u b l e D i f f e r e 0075100 n c e ( l v p b i > > P B I . 0075120 p u p . i d , l v ( p r e d 0075140 ! 0 ) > > P B I . p u p . i d ) 0075160 \r i f d l 0075200 e 0 t h e n b r e a k \r 0075220 p r e d = p 0075240 r e d ! 0 \r ] 0075260 r e p e a t \r \r i 0075300 f d e q 0 t h e n r e 0075320 s u l t i s f a l s e / / 0075340 d u p l i c a t e \r 0075360 I n s e r t A f t e r ( q u e 0075400 u e , p r e d , p b i ) \r 0075420 ] \r \r r e s 376 001 \0 266 375 0075440 u l t i s t r u e \r ] \r \f \r / 0075460 / - - - - - - - - - - - - - - - 0075500 - - - - - - - - - - - - - - - - * 0075560 - - - - - - - - - - - - - \r a n 0075600 d B S P T i m e r P r o c ( s 0075620 o c ) b e \r / / - - - - - - - 0075640 - - - - - - - - - - - - - - - - * 0075740 - - - - - \r / / C a l l e d 0075760 w h e n e v e r t h e s o c 0076000 k e t b s p T i m e r e x p 0076020 i r e s \r [ \r / / d o n o t 0076040 376 001 \0 273 275 h i n g i f s o c 0076060 k e t ' s s t a t e i s n 0076100 o t O p e n , E n d I n , 0076120 o r E n d O u t \r u n l e s s 0076140 s o c > > B S P S o c . s t a 0076160 t e l s s t a t e O p e n 0076200 % s o c > > B S P S o c . s t 0076220 a t e g r s t a t e E n d O 0076240 u t d o \r [ \r u n 0076260 l e s s s o c > > B S P S o c 0076300 . n o I n a c t i v i t y T i m 0076320 e o u t d o \r i f 0076340 T i m e r H a s E x p i r e d 0076360 ( l v s o c > > B S P S o c . 0076400 i n a c t i v i t y T i m e r ) 0076420 t h e n \r [ 0076440 R T P F 376 001 \0 304 023 S M ( s o c 0076460 , C L S T , 0 ) ; r e t u 0076500 r n ] / / C o n n e c t 0076520 i o n h a s d i e d , a b 0076540 o r t i t \r \r i f s o 0076560 c > > B S P S o c . a c k P e n 0076600 d i n g t h e n S e n d A c 0076620 k ( s o c ) \r i f s o c 0076640 > > B S P S o c . i n t e r r u 0076660 p t O u t t h e n \r 0076700 [ \r l e t p b i 0076720 = S e a r c h T Q ( s o c , 0076740 t r u e ) / / S e a r c 0076760 h f o r o u t s t a n d i n 0077000 g i n t e r r u p t \r 0077020 i f p b i n e 0 t h 0077040 e n C o m p l e t 376 001 \0 t 333 e 0077060 P u p ( p b i ) / / R e t 0077100 r a n s m i t i f f o u n d 0077120 o n e \r ] \r \r 0077140 / / G e n e r a t e A D a 0077160 t a p r o b e u n c o n d i 0077200 t i o n a l l y . I f w e 0077220 h a v e n o d a t a t o 0077240 m o v e , \r / / p r o 0077260 b e o n c e e v e r y 1 5 0077300 s e c o n d s t o e n s u 0077320 r e t h a t t h e c o n n 0077340 e c t i o n i s a l i v e . 0077360 \r l e t p b i = G e 0077400 t P B I ( s o c , t r u e ) \r 0077420 t e s t p b i n e 0 0077440 \r i f s o \r 376 0077460 001 \0 } A [ / / 0077500 P r o b e w i t h z e r o - 0077520 l e n g t h A D a t a i f 0077540 c a n g e t p b i \r 0077560 u n l e s s s o c > 0077600 > B S P S o c . a c k R e q u e 0077620 s t e d d o \r 0077640 S e t T i m e r ( l v 0077660 s o c > > B S P S o c . l a s t 0077700 A D a t a T i m e , 0 ) \r 0077720 s o c > > B S P S 0077740 o c . a c k R e q u e s t e d 0077760 = t r u e \r 0100000 s o c > > B S P S o c . a D a t 0100020 a C o u n t = s o c > > B S 0100040 P S o c . a D a t a C o u n t + 0100060 1 \r 376 001 \0 032 n 0100100 S e t P u p I D ( p b i , l v 0100120 s o c > > B S P S o c . x m i 0100140 t B y t e I D ) \r 0100160 C o m p l e t e P u p ( p b 0100200 i , t y p e A D a t a , p u 0100220 p O v B y t e s ) \r 0100240 ] \r i f n o t 0100260 \r [ / / 0100300 P r o b e w i t h a p b i 0100320 o n t h e T Q o t h e r 0100340 w i s e \r p b 0100360 i = S e a r c h T Q ( s o c 0100400 , f a l s e ) / / L o o 0100420 k f o r a n o n - i n t e 0100440 r r u p t \r i 0100460 f p b i n e 376 001 \0 D 357 0 0100500 t h e n \r 0100520 [ T r a n s m i t S t r a t 0100540 e g y ( p b i , t r u e ) ; 0100560 C o m p l e t e P u p ( p b i ) 0100600 ] \r ] \r 0100620 ] \r \r S e t T i m e o u t ( s 0100640 o c ) \r ] \r \r / / - - - - - - - 0100660 - - - - - - - - - - - - - - - - * 0100760 - - - - - \r a n d S e n d A c 0101000 k ( s o c ) b e \r / / - - - - 0101020 - - - - - - - - - - - - - - - - * 0101060 - - - - - - - - - - - - - - 376 001 0101100 \0 360 F - - - - - - - - - - - - - 0101120 - - - - - - - - - - - - - \r [ \r 0101140 l e t p b i = G e t P B I 0101160 ( s o c , t r u e ) ; i f 0101200 p b i n e 0 t h e n \r 0101220 [ \r s o c > > B S P S o 0101240 c . a c k P e n d i n g = f 0101260 a l s e \r S e t P u p I D 0101300 ( p b i , l v s o c > > B S 0101320 P S o c . r c v B y t e I D ) \r 0101340 p b i > > P B I . p u p . 0101360 w o r d s ^ 1 = m a x P u p 0101400 D a t a B y t e s / / B y 0101420 t e s p e r p u p \r p 0101440 b i > > P B I . p u p . w o r d 0101460 s ^ 2 = / / P u p a l 0101500 l o c 376 001 \0 374 > a t i o n \r 0101520 s o c > > B S P S o c . 0101540 m a x I P B I - 1 - s o c > > B 0101560 S P S o c . u n R e a d P u p s 0101600 \r p b i > > P B I . p u p 0101620 . w o r d s ^ 3 = / / B 0101640 y t e a l l o c a t i o n \r 0101660 m a x P u p D a t a B 0101700 y t e s * p b i > > P B I . p u 0101720 p . w o r d s ^ 2 \r s o c 0101740 > > B S P S o c . s e n t Z e r 0101760 o A l l o c = p b i > > P B 0102000 I . p u p . w o r d s ^ 2 e q 0102020 0 \r C o m p l e t e P u 0102040 p ( p b i , t y p e A c k , 0102060 p u p O v B y t e s + 6 ) \r \r 0102100 / / F l u 376 001 \0 355 244 s h 0102120 r e c e i v e d d a t a p a 0102140 c k e t s w e a r e n ' t 0102160 a c k n o w l e d g i n g , s 0102200 i n c e \r / / w e k n 0102220 o w t h e y w i l l b e 0102240 r e t r a n s m i t t e d a n 0102260 d w e d o n ' t w a n t 0102300 t h e \r / / r e t r a n 0102320 s m i s s i o n s t o o v e 0102340 r f l o w o u r s o c k e t 0102360 I Q i f w e a r e s l 0102400 o w \r / / i n p r o c 0102420 e s s i n g t h e m . \r 0102440 w h i l e s o c > > B S P S o 0102460 c . b s p I Q . h e a d n e 0102500 0 d o \r [ \r 376 001 \0 0102520 g 006 p b i = s o 0102540 c > > B S P S o c . b s p I Q . 0102560 t a i l \r i f D o 0102600 u b l e D i f f e r e n c e ( l 0102620 v p b i > > P B I . p u p . i 0102640 d , \r l v s o c 0102660 > > B S P S o c . r c v B y t e 0102700 I D ) l s 0 t h e n b r 0102720 e a k \r U n q u e u 0102740 e ( l v s o c > > B S P S o c 0102760 . b s p I Q , p b i ) \r 0103000 R e l e a s e P B I ( p b 0103020 i ) \r ] \r ] \r 0103040 ] \r \f \r / / - - - - - - - - - - 0103060 - - - - - - - - - - - - - - - - * 0103120 - - 376 001 \0 \r 340 - - - - - - - - - 0103140 - - - - - - - - - - - - - - - - 0103160 - - - - - - - \r a n d S e a r 0103200 c h T Q ( s o c , l o o k F o 0103220 r I n t e r r u p t ) = v a 0103240 l o f \r / / - - - - - - - - - - 0103260 - - - - - - - - - - - - - - - - * 0103360 - - \r / / U n q u e u e s a 0103400 n d r e t u r n s t h e l 0103420 a s t p b i o n t h e B 0103440 S P T Q , l o o k i n g f 0103460 o r \r / / a n I n t e r r u 0103500 p t i f l o o k F o r I n t 0103520 e r r u p t 376 001 \0 024 j i s t 0103540 r u e , a n y t h i n g e l 0103560 s e i f f a l s e . \r / / 0103600 W e r e t u r n t h e l a 0103620 s t p b i ( r a t h e r t 0103640 h a n t h e f i r s t ) s 0103660 o t h a t r e t r a n s m i 0103700 t t i n g i t \r / / l e a v 0103720 e s t h e o r d e r o f 0103740 p b i s o n t h e T Q u 0103760 n c h a n g e d . R e t u r 0104000 n s z e r o i f n o n e 0104020 f o u n d . \r [ \r l e t r p b 0104040 i = 0 \r l e t p b i = 0104060 s o c > > B S P S o c . b s p T 0104100 Q . h e a d \r w h i l e p b i 0104120 n e 0 d o \r 376 001 \0 214 0104140 274 [ \r i f ( p b i > > P 0104160 B I . p u p . t y p e e q t 0104200 y p e I n t e r r u p t ) e q 0104220 v l o o k F o r I n t e r r u 0104240 p t t h e n \r [ 0104260 r p b i = p b i ; b r e a 0104300 k ] \r p b i = p b i 0104320 ! 0 \r ] \r i f r p b i 0104340 n e 0 t h e n U n q u e u 0104360 e ( l v s o c > > B S P S o c 0104400 . b s p T Q , r p b i ) \r r e 0104420 s u l t i s r p b i \r ] \r \r / 0104440 / - - - - - - - - - - - - - - - 0104460 - - - - - - - - - - - - - - - - * 0104540 - 376 001 \0 \v % - - - - - - - - - - 0104560 - - \r a n d T r a n s m i t S 0104600 t r a t e g y ( p b i , m a k 0104620 e A ; n u m a r g s n a ) 0104640 b e \r / / - - - - - - - - - - - 0104660 - - - - - - - - - - - - - - - - * 0104760 - \r / / D i d d l e s t y p 0105000 e d e p e n d i n g o n m 0105020 a k e A o r a l l o c a t i 0105040 o n r e m a i n i n g . \r / / 0105060 C u r r e n t a l g o r i t 0105100 h m i s t h a t w e s e 0105120 n d A D a t a w h e n a l 0105140 l o c a t i 376 001 \0 305 235 o n \r / / 0105160 f a l l s b e l o w 3 3 % 0105200 o f t h a t g i v e n i 0105220 n t h e l a s t r e c e i 0105240 v e d A c k . \r / / T h i s 0105260 m a y b e e x p r e s s e 0105300 d a s : \r / / p u p A l 0105320 l o c l e k * ( p u p A 0105340 l l o c + u n A c k e d P u 0105360 p s ) \r / / w h e r e k = 0105400 0 . 3 3 a n d i t i s 0105420 a s s u m e d t h a t p u p 0105440 A l l o c + u n A c k e d P u p 0105460 s \r / / g i v e s t h e o 0105500 r i g i n a l P u p a l l o 0105520 c a t i o n . T h i s i s 0105540 e q u i v a l e n t 376 001 \0 T \0 0105560 t o \r / / ( 1 - k ) / k 0105600 * p u p A l l o c l e u 0105620 n A c k e d P u p s . \r / / F 0105640 o r k = 0 . 3 3 , ( 1 - 0105660 k ) / k = 2 . T h i s 0105700 i s t h e d e r i v a t i o 0105720 n o f t h e \r / / c o m p 0105740 a r i s o n " p u p A l l o c 0105760 l s h i f t 1 l e s o c 0106000 > > B S P S o c . u n A c k e d 0106020 P u p s " b e l o w . \r [ \r l 0106040 e t s o c = p b i > > P B 0106060 I . s o c k e t \r u n l e s s 0106100 n a g r 1 & m a k e A 0106120 d o \r t e s t s o c > > 0106140 B S P S o c . a c k R e q u e s 0106160 376 001 \0 371 277 t e d \r i 0106200 f s o m a k e A = f a l s 0106220 e \r i f n o t \r 0106240 [ \r 0106260 l e t p u p A l l o c = 0106300 M i n ( M i n ( M i n ( s o c 0106320 > > B S P S o c . p u p A l l o 0106340 c , \r s 0106360 o c > > B S P S o c . b y t e A 0106400 l l o c / s o c > > B S P S o c 0106420 . b y t e s P e r P u p ) , \r 0106440 s o c > > 0106460 B S P S o c . n u m O P B I - 1 0106500 ) , s o c > > B S P S o c . n 0106520 u m T P B I - 1 ) \r 0106540 m a k e A = ( o v e r 0106560 l a p D a 376 001 \0 214 261 t a W i t h 0106600 A c k ? \r 0106620 p u p A l l o c l s h i f t 0106640 1 l e s o c > > B S P S o 0106660 c . u n A c k e d P u p s , \r 0106700 p u p A l 0106720 l o c l e 0 ) \r 0106740 ] \r i f m a k e A t h 0106760 e n \r [ \r / / U n 0107000 l e s s a n A D a t a i s 0107020 a l r e a d y o u t s t a n 0107040 d i n g , s t a r t m e a s 0107060 u r i n g \r / / t h e 0107100 r o u n d - t r i p d e l a y 0107120 f o r c o m p u t i n g t 0107140 h e a d a p t i v e t i m e 0107160 o u t . \r u n 376 001 \0 347 P l 0107200 e s s s o c > > B S P S o c . 0107220 a c k R e q u e s t e d d o \r 0107240 S e t T i m e r ( l 0107260 v s o c > > B S P S o c . l a 0107300 s t A D a t a T i m e , 0 ) \r 0107320 s o c > > B S P S o c . a 0107340 c k R e q u e s t e d = t r 0107360 u e \r s o c > > B S P S o 0107400 c . a D a t a C o u n t = s 0107420 o c > > B S P S o c . a D a t a 0107440 C o u n t + 1 \r ] \r p b i 0107460 > > P B I . p u p . t y p e = 0107500 s e l e c t o n p b i > > P 0107520 B I . p u p . t y p e i n t o 0107540 \r [ \r c a s e t y 0107560 p e D a t a : \r c a s e 376 0107600 001 \0 226 203 t y p e A D a t a : 0107620 m a k e A ? t y p e A D a t a 0107640 , t y p e D a t a \r c a 0107660 s e t y p e M a r k : \r 0107700 c a s e t y p e A M a r k : 0107720 m a k e A ? t y p e A M a r k 0107740 , t y p e M a r k \r ] \r 0107760 ] \r \r / / - - - - - - - - - - - 0110000 - - - - - - - - - - - - - - - - * 0110100 - \r a n d S e t T i m e o u t 0110120 ( s o c ) b e \r / / - - - - - 0110140 - - - - - - - - - - - - - - - - * 0110200 - - - - 376 001 \0 > 5 - - - - - - - 0110220 - - - - - - - - - - - - - - - - 0110240 - - - - - - - - - - - - \r S e t 0110260 T i m e r ( l v s o c > > B S 0110300 P S o c . b s p T i m e r , ( 0110320 s o c > > B S P S o c . i n t e 0110340 r r u p t O u t % \r s o c > 0110360 > B S P S o c . u n A c k e d P 0110400 u p s g r 0 % s o c > > 0110420 B S P S o c . p u p A l l o c 0110440 l e 0 % \r s o c > > B S P 0110460 S o c . b y t e A l l o c l e 0110500 0 % s o c > > B S P S o c 0110520 . b y t e s P e r P u p l e 0110540 0 ) ? \r ( s o c > > B S P 0110560 S o c . a c k R e q u e s t e d 0110600 ? s o c > > B S 376 \0 ] 201 310 P S 0110620 o c . a D a t a T i m e o u t , 0110640 \r M a x ( s o c > > B S P 0110660 S o c . a D a t a T i m e o u t 0110700 , o u t s t a n d i n g D a t 0110720 a T i m e o u t ) ) , \r i d 0110740 l e T i m e o u t ) \r 377 \0 \0 P u 0110760 p B S P a . a s m \0 373 231 020 037 s \0 0111000 \0 376 001 \0 z 023 ; C o p y r i g h 0111020 t X e r o x C o r p o r a t 0111040 i o n 1 9 7 9 , 1 9 8 0 , 0111060 1 9 8 2 \r \r ; P u p B S P a . 0111100 a s m - - A s s e m b l y - 0111120 l a n g u a g e r o u t i n e 0111140 s f o r B S P \r ; \t \t - C 0111160 o m p a n i o n t o P u p B 0111200 S P b . b c p l \r \r ; L a s t 0111220 m o d i f i e d M a y 1 7 0111240 , 1 9 8 2 2 : 1 0 P M 0111260 b y T a f t \r \r . e n t B S 0111300 P G e t s \r . e n t B S P P u 0111320 t s \r \r . b e x t B S P G e t 0111340 C l e a n u p \r . b e x t B S 0111360 P F o r c e O u t p u t \r . b e 0111400 x t o f f 376 001 \0 " 327 s e t B S 0111420 P S t r \r \r . s r e l \r \r B S P 0111440 G e t s : . B S P G e t s \r B 0111460 S P P u t s : . B S P P u t s 0111500 \r \r . n r e l \r \r \r ; R o u t 0111520 i n e s i m p l e m e n t i n 0111540 g f a s t B S P s t r e a 0111560 m s \r \r ; T h e B S P s t 0111600 r e a m s t r u c t u r e i 0111620 s a s s u m e d t o b e 0111640 t h e f o l l o w i n g : \r ; 0111660 \t @ S T \t \t ; W o r d s 0 - 0111700 1 1 . \r \t i P B I = 1 2 . \t ; 0111720 C u r r e n t i n p u t p a 0111740 c k e t b u f f e r i t e m 0111760 \r \t i W o r d P = 1 3 . \t ; P 0112000 t r t o w o r d 376 001 \0 017 202 0112020 c o n t a i n i n g n e x t 0112040 b y t e \r \t i B y t e P = 1 4 . 0112060 \t ; N e x t b y t e p o s 0112100 i t i o n : 0 = l e f t , 1 0112120 = r i g h t \r \t i B y t e C = 1 0112140 5 . \t ; I n p u t r e m a i 0112160 n i n g b y t e c o u n t \r 0112200 \t o P B I = 1 6 . \t ; C u r r 0112220 e n t o u t p u t p a c k e 0112240 t b u f f e r i t e m \r \t o 0112260 W o r d P = 1 7 . \t ; P t r 0112300 t o w o r d c o n t a i n i 0112320 n g n e x t b y t e \r \t o B 0112340 y t e P = 1 8 . \t ; N e x t 0112360 b y t e p o s i t i o n : 0 0112400 = l e f t , 1 = r i g h t \r \t 0112420 376 001 \0 A 313 o B y t e C = 1 9 . \t 0112440 ; O u t p u t r e m a i n i 0112460 n g b y t e c o u n t \r \r \r 0112500 ; B S P G e t s ( s t r ) - 0112520 r e t u r n s n e x t b y 0112540 t e f r o m B S P S t r e 0112560 a m \r \r . B S P G e t s : \r \t s 0112600 t a 3 1 2 \t \t ; S a v e 0112620 i n c r e m e n t e d r e t 0112640 u r n \r \t i s z 1 2 \r \t m o 0112660 v 0 3 \t \t \t ; S t r e a m 0112700 p o i n t e r \r \t l d a 0 0112720 @ i W o r d P 3 \t \t ; G e t 0112740 w o r d c o n t a i n i n g 0112760 d e s i r e d b y t e \r \t d 0113000 s z i B y t e P 3 \t \t ; W 0113020 h i c h 376 001 \0 j m b y t e ? \r 0113040 \t j m p g e t e v n \t \t ; 0113060 L e f t b y t e \r \r ; G e t 0113100 r i g h t ( o d d ) b y t 0113120 e a n d a d v a n c e w o 0113140 r d p o i n t e r \r \t l d a 0113160 1 c 3 7 7 \t \t ; M a s k r 0113200 i g h t b y t e \r \t a n d 1 0113220 0 \r \t i s z i W o r d P 3 0113240 \t \t ; A d v a n c e w o r d 0113260 p o i n t e r \r \t d s z i B 0113300 y t e C 3 \t \t ; D e c r e m 0113320 e n t a n d t e s t c o u 0113340 n t \r \t j m p @ 1 2 \t \t ; 0113360 N o t e x h a u s t e d , 0113400 r e t u r n \r \t j m p g e t s 0113420 1 \t \t ; E x h a u 376 001 \0 312 260 s 0113440 t e d \r \r ; G e t l e f t 0113460 ( e v e n ) b y t e \r g e t e 0113500 v n : \t l d a 1 c 1 7 7 4 0 0113520 0 \t \t ; M a s k l e f t b 0113540 y t e \r \t a n d s 1 0 \t \t ; 0113560 R i g h t - j u s t i f y \r \t 0113600 m k o n e 1 1 \t \t ; R e s 0113620 e t b y t e p o s i t i o n 0113640 \r \t s t a 1 i B y t e P 3 0113660 \r \t d s z i B y t e C 3 \t \t 0113700 ; D e c r e m e n t a n d 0113720 t e s t c o u n t \r \t j m p 0113740 @ 1 2 \t \t ; N o t e x h 0113760 a u s t e d , r e t u r n \r \r 0114000 ; C o u n t n o w e x h a 0114020 u s t e d , c a l l c l e 376 0114040 001 \0 256 6 a n u p p r o c e d u 0114060 r e \r g e t s 1 : \t m o v 0 0114100 1 \t \t \t ; S a v e d a t a 0114120 b y t e \r \t m o v 3 0 \r \t l 0114140 d a 3 @ l v o f f s e t B S 0114160 P S t r \t ; C o n v e r t s 0114200 t r t o s o c \r \t s u b 3 0114220 0 \r \t l d a 3 @ l v B S P 0114240 G e t C l e a n u p \t ; B S P 0114260 G e t C l e a n u p ( s o c , 0114300 b y t e ) \r \t j m p b c p l E 0114320 x i t \r \f \r ; F a s t B S P 0114340 s t r e a m s ( c o n t ' d 0114360 ) \r \r ; B S P P u t s ( s t r 0114400 , b y t e ) - o u t p u t 0114420 s b y t e o n B S P S t 0114440 r e a m 376 001 \0 266 A \r \r . B S P P 0114460 u t s : \r \t s t a 3 1 2 \t 0114500 \t ; S a v e i n c r e m e n 0114520 t e d r e t u r n \r \t i s z 0114540 1 2 \r \t m o v 0 3 \t \t \t ; 0114560 S t r e a m p o i n t e r \r 0114600 \t l d a 0 c 3 7 7 \t \t ; G 0114620 e t b y t e m a s k \r \t d s 0114640 z o B y t e P 3 \t \t ; W h 0114660 i c h b y t e ? \r \t j m p 0114700 p u t e v n \t \t ; L e f t b 0114720 y t e \r \r ; S t o r e r i g 0114740 h t ( o d d ) b y t e a n 0114760 d a d v a n c e w o r d p 0115000 o i n t e r \r \t a n d 0 1 \t 0115020 \t \t ; M a s k o u t g a r 0115040 b a g e i n l 376 001 \0 364 7 h 0115060 o f b y t e \r \t l d a 0 @ 0115100 o W o r d P 3 \t \t ; G e t 0115120 p r e v i o u s l y s t o r e 0115140 d l h b y t e \r \t a d d 0 0115160 1 \t \t \t ; A p p e n d r h 0115200 b y t e \r \t s t a 1 @ o W 0115220 o r d P 3 \t \t ; S t o r e 0115240 i t b a c k \r \t i s z o W o 0115260 r d P 3 \t \t ; A d v a n c e 0115300 w o r d p o i n t e r \r \t m 0115320 k m i n u s o n e 0 0 \t \t ; 0115340 P r e p a r e t o r e t u 0115360 r n t r u e \r \t d s z o B y 0115400 t e C 3 \t \t ; D e c r e m e 0115420 n t a n d t e s t c o u n 0115440 t \r \t j m p @ 1 2 \t \t 376 001 0115460 \0 X M ; N o t e x h a u s t 0115500 e d , r e t u r n \r \t j m p 0115520 p u t s 1 \t \t ; E x h a u s t 0115540 e d \r \r ; S t o r e e v e n 0115560 ( l e f t ) b y t e \r p u t 0115600 e v n : \t a n d s 0 1 \t \t ; 0115620 M a s k b y t e a n d p 0115640 u t i n l h \r \t s t a 1 0115660 @ o W o r d P 3 \t \t ; S t o 0115700 r e i t ( c l e a r r h 0115720 b y t e ) \r \t m k o n e 1 1 0115740 \t \t ; R e s e t b y t e p 0115760 o s i t i o n \r \t s t a 1 o 0116000 B y t e P 3 \r \t m k m i n u s 0116020 o n e 0 0 \t \t ; P r e p a 0116040 r e t o r e t u r n t r u 0116060 e \r \t 376 001 \0 v 322 d s z o B y t 0116100 e C 3 \t \t ; D e c r e m e n 0116120 t a n d t e s t c o u n t 0116140 \r \t j m p @ 1 2 \t \t ; N 0116160 o t e x h a u s t e d , r e 0116200 t u r n \r \r ; C o u n t n o 0116220 w e x h a u s t e d , c a l 0116240 l c l e a n u p p r o c e d 0116260 u r e \r p u t s 1 : \t m o v 3 0116300 0 \r \t l d a 3 @ l v o f f 0116320 s e t B S P S t r \t ; C o n v 0116340 e r t s t r t o s o c \r \t 0116360 s u b 3 0 \r \t m k z e r o 0116400 1 1 \r \t l d a 3 @ l v B S 0116420 P F o r c e O u t p u t \t ; B 0116440 S P F o r c e O u t p u t ( s o 0116460 c , f a l s e 376 \0 362 \a 364 ) \r b 0116500 c p l E x i t : \r \t s t a 3 0116520 2 2 \t \t ; B c p l p r o c 0116540 e d u r e w e e x i t t o 0116560 \r \t d s z 1 2 \t \t \t ; R e 0116600 s t o r e o r i g i n a l r 0116620 e t u r n P C \r \t l d a 3 0116640 1 2 \r \t j m p @ 2 2 \r \r l 0116660 v B S P G e t C l e a n u p : 0116700 B S P G e t C l e a n u p \r l v 0116720 B S P F o r c e O u t p u t : 0116740 B S P F o r c e O u t p u t \r l 0116760 v o f f s e t B S P S t r : o 0117000 f f s e t B S P S t r \r \r c 3 7 0117020 7 : \t 3 7 7 \r c 1 7 7 4 0 0 : 0117040 1 7 7 4 0 0 \r \r \r \t . e n d \r 377 0117060 \0 \0 P u p B S P B l o c k . b c 0117100 p l \0 373 226 y : 367 \0 \0 376 001 \0 215 i / 0117120 / P u p B S P B l o c k . b c 0117140 p l - - p r o c e d u r e s 0117160 f o r f a s t B S P t r 0117200 a n s f e r s \r / / C o p y r 0117220 i g h t X e r o x C o r p o 0117240 r a t i o n 1 9 7 9 , 1 9 8 0117260 0 \r / / L a s t m o d i f i 0117300 e d D e c e m b e r 3 0 , 0117320 1 9 8 0 5 : 3 5 P M b y 0117340 B o g g s \r \r g e t " p u p 0117360 . d e c l " \r \r e x t e r n a l 0117400 \r [ \r / / O u t g o i n g p 0117420 r o c e d u r e s \r B S P R e a 0117440 d B l o c k ; B S P W r i t e 0117460 B l o c k \r \r / / I n c o m i 0117500 n g p r o c e d u r e s \r B 376 0117520 001 \0 321 C S P P r e p a r e I P B 0117540 I ; B S P G e t C l e a n u p 0117560 ; B S P P r e p a r e O P B I 0117600 ; B S P F o r c e O u t p u t 0117620 \r B y t e B l t ; M i n ; E 0117640 r r o r s \r \r / / S t a t i c 0117660 s \r o f f s e t B S P S t r \r ] 0117700 \r \r s t r u c t u r e [ l h 0117720 b y t e ; r h b y t e ] 0117740 \r \r \r / / - - - - - - - - - - 0117760 - - - - - - - - - - - - - - - - * 0120060 - \r l e t B S P R e a d B l o 0120100 c k ( s t r , w o r d P , b 0120120 y t e P 376 001 \0 270 @ , c o u n t 0120140 , t i m e o u t ; n u m a r 0120160 g s n a ) = v a l o f \r / / 0120200 - - - - - - - - - - - - - - - 0120220 - - - - - - - - - - - - - - - - * 0120300 - - - - - - - - - - - - \r / / 0120320 R e a d a m a x i m u m o 0120340 f c o u n t b y t e s f r 0120360 o m t h e B S P s t r e a 0120400 m s t r , \r / / s t o r i n 0120420 g t h e m s t a r t i n g 0120440 a t a d d r e s s w o r d P 0120460 i n b y t e b y t e P ( 0120500 0 = l e f t , \r / / 1 = r i g 0120520 h t h a l f ) . 376 001 \0 233 265 0120540 t i m e o u t ( o p t i o n a 0120560 l ) i s d e f i n e d a s 0120600 f o r B S P G e t B y t e . 0120620 \r / / R e t u r n s t h e 0120640 a c t u a l n u m b e r o f 0120660 b y t e s r e a d . \r [ \r l 0120700 e t s o c = s t r - o f f 0120720 s e t B S P S t r \r l e t b y 0120740 t e s S o F a r = 0 \r w h i 0120760 l e c o u n t g r 0 d o 0121000 \r [ \r / / E n s u 0121020 r e t h e r e i s a t l 0121040 e a s t o n e b y t e t o 0121060 r e a d , g e t t i n g n 0121100 e w i P B I i f n e c e s 0121120 s a r y \r l e t e c 376 001 0121140 \0 \a 233 = B S P P r e p a r e 0121160 I P B I ( s o c , ( n a g e 0121200 5 ? t i m e o u t , - 1 ) 0121220 ) \r i f e c n e 0 0121240 t h e n [ E r r o r s ( s t 0121260 r , e c ) ; b r e a k ] \r 0121300 \r / / T r a n s f e r 0121320 a s m a n y b y t e s a s 0121340 w e c a n \r l e t c 0121360 = M i n ( s t r > > B S P S 0121400 t r . i B y t e C , c o u n t 0121420 ) \r B y t e B l t ( w o r 0121440 d P , b y t e P , s t r > > 0121460 B S P S t r . i W o r d P , s 0121500 t r > > B S P S t r . i B y t e 0121520 P , c ) \r \r / / A d j 0121540 u s t 376 001 \0 340 W c o u n t s 0121560 a n d p o i n t e r s t o 0121600 a c c o u n t f o r b y t e 0121620 s j u s t t r a n s f e r r 0121640 e d \r s t r > > B S P S t 0121660 r . i W o r d P = s t r > > 0121700 B S P S t r . i W o r d P + 0121720 ( c + s t r > > B S P S t r . i 0121740 B y t e P ) r s h i f t 1 \r 0121760 s t r > > B S P S t r . i 0122000 B y t e P = ( c + s t r > > 0122020 B S P S t r . i B y t e P ) & 0122040 1 \r s t r > > B S P S t 0122060 r . i B y t e C = s t r > > 0122100 B S P S t r . i B y t e C - 0122120 c \r w o r d P = w o r 0122140 d P + ( c + b y 376 001 \0 5 ( t e P 0122160 ) r s h i f t 1 \r b y 0122200 t e P = ( c + b y t e P ) 0122220 & 1 \r b y t e s S o F a 0122240 r = b y t e s S o F a r + c 0122260 \r c o u n t = c o u n 0122300 t - c \r \r / / C l e a n 0122320 u p s t r e a m i f c u 0122340 r r e n t i P B I i s e x 0122360 h a u s t e d \r i f s t 0122400 r > > B S P S t r . i B y t e C 0122420 e q 0 t h e n B S P G e 0122440 t C l e a n u p ( s o c ) \r 0122460 ] \r r e s u l t i s b y t e 0122500 s S o F a r \r ] \r \f \r / / - - 0122520 - - - - - - - - - - - - - - - - 0122540 - - - - - - - - - - - - - 376 001 \0 0122560 ; A - - - - - - - - - - - - - - 0122600 - - - - - - - - - - - - - - - - 0122620 - - - - - - - - - - - - - - \r a 0122640 n d B S P W r i t e B l o c k 0122660 ( s t r , w o r d P , b y t 0122700 e P , c o u n t , t i m e o 0122720 u t ; n u m a r g s n a ) = 0122740 v a l o f \r / / - - - - - - 0122760 - - - - - - - - - - - - - - - - * 0123060 - - - - - \r / / W r i t e a 0123100 m a x i m u m o f c o u n 0123120 t b y t e s i n t o t h e 0123140 B S P s t r e a m s t r , 0123160 g 376 001 \0 \ \0 e t t i n g \r / / 0123200 t h e m s t a r t i n g a 0123220 t a d d r e s s w o r d P 0123240 i n b y t e b y t e P ( 0 0123260 = l e f t , \r / / 1 = r i g h 0123300 t h a l f ) . t i m e o u 0123320 t ( o p t i o n a l ) i s 0123340 d e f i n e d a s f o r B 0123360 S P P u t B y t e . \r / / R e 0123400 t u r n s t h e a c t u a l 0123420 n u m b e r o f b y t e s 0123440 w r i t t e n . \r [ \r l e t 0123460 s o c = s t r - o f f s e t 0123500 B S P S t r \r l e t b y t e s 0123520 S o F a r = 0 \r w h i l e 0123540 c o u n t g r 0 d o \r 0123560 [ \r / 376 001 \0 J - / E n 0123600 s u r e t h e r e i s a n 0123620 o P B I s e t u p \r 0123640 l e t e c = B S P P r e p 0123660 a r e O P B I ( s o c , ( n a 0123700 g e 5 ? t i m e o u t , 0123720 - 1 ) ) \r i f e c n e 0123740 0 t h e n [ E r r o r s 0123760 ( s t r , e c ) ; b r e a k 0124000 ] \r \r / / T r a n s f 0124020 e r a s m a n y b y t e s 0124040 a s w e c a n \r l e 0124060 t c = M i n ( s t r > > B 0124100 S P S t r . o B y t e C , c o 0124120 u n t ) \r B y t e B l t ( 0124140 s t r > > B S P S t r . o W o r 0124160 d P , s t r > > B S P 376 001 \0 x 0124200 351 S t r . o B y t e P , w o r 0124220 d P , b y t e P , c ) \r \r 0124240 / / A d j u s t c o u n 0124260 t s a n d p o i n t e r s 0124300 t o a c c o u n t f o r b 0124320 y t e s j u s t t r a n s f 0124340 e r r e d \r s t r > > B S 0124360 P S t r . o W o r d P = s t 0124400 r > > B S P S t r . o W o r d P 0124420 + ( c + s t r > > B S P S t 0124440 r . o B y t e P ) r s h i f t 0124460 1 \r s t r > > B S P S t 0124500 r . o B y t e P = ( c + s t 0124520 r > > B S P S t r . o B y t e P 0124540 ) & 1 \r s t r > > B S 0124560 P S t r . o B y t e C = s t 0124600 r 376 001 \0 240 361 > > B S P S t r . o 0124620 B y t e C - c \r w o r 0124640 d P = w o r d P + ( c + b y 0124660 t e P ) r s h i f t 1 \r 0124700 b y t e P = ( c + b y t e 0124720 P ) & 1 \r b y t e s S 0124740 o F a r = b y t e s S o F a 0124760 r + c \r c o u n t = c 0125000 o u n t - c \r \r / / E n 0125020 s u r e t h a t i f t h e 0125040 l a s t b y t e t r a n s 0125060 f e r r e d w a s t o t h 0125100 e l e f t h a l f , t h e 0125120 \r / / r i g h t h a l 0125140 f i s z e r o . n . b . 0125160 t h i s m a y c l o b b e 0125200 r o n e 376 001 \0 C o w o r d 0125220 b e y o n d t h e e n d \r 0125240 / / o f t h e d a t a 0125260 p o r t i o n o f t h e 0125300 P u p , b u t t h a t ' s 0125320 t h e c h e c k s u m w o r 0125340 d , s o o k . \r s t r 0125360 > > B S P S t r . o W o r d P > 0125400 > r h = 0 \r \r / / C 0125420 l e a n u p s t r e a m i 0125440 f c u r r e n t o P B I i 0125460 s f u l l \r i f s t r 0125500 > > B S P S t r . o B y t e C 0125520 e q 0 t h e n B S P F o r 0125540 c e O u t p u t ( s o c ) \r 0125560 ] \r r e s u l t i s b y t e 0125600 s S o F a r \r ] \r \r \r 377 \0 \0 P u 0125620 p R T P . d e c l \0 373 224 024 027 " \0 0125640 \0 376 001 \0 003 260 / / P u p R T P . 0125660 d e c l - - P u b l i c d 0125700 e c l a r a t i o n s f o r 0125720 R e n d e z v o u s / T e r m i 0125740 n a t i o n P r o t o c o l \r 0125760 / / C o p y r i g h t X e r 0126000 o x C o r p o r a t i o n 1 0126020 9 7 9 \r \r / / L a s t m o d 0126040 i f i e d J a n u a r y 1 7 0126060 , 1 9 7 9 6 : 3 8 P M 0126100 b y B o g g s \r \r / / - - - - 0126120 - - - - - - - - - - - - - - - - * 0126220 - - - - - - - - \r s t r u c t u 0126240 r e R T P 376 001 \0 036 037 S o c : \t 0126260 / / B e t w e e n r a w p 0126300 u p s a n d t h e R T P \r 0126320 / / - - - - - - - - - - - - - - 0126340 - - - - - - - - - - - - - - - - * 0126420 - - - - - - - - - - - - - - \r [ 0126440 \r @ P u p S o c \r c t x w o r 0126460 d \t \t / / c o n t e x t f o 0126500 r R T P S o c k e t P r o c e 0126520 s s \r r t p S t a t u s w o r 0126540 d = \r [ \r w a s L 0126560 i s t e n i n g b i t \t / / 0126600 p o r t i s o r w a s l 0126620 i s t e n i n g \r b l a n 0126640 k b i t 7 \r 376 001 \0 310 357 0126660 s t a t e b y t e \t \t / / F 0126700 S M s t a t e \r ] \r c o 0126720 n n I D ^ 1 , 2 w o r d \t \t / 0126740 / c o n n e c t i o n I D \r 0126760 r t p T i m e r w o r d \t \t / 0127000 / t i m e r f o r R T P 0127020 s t a t e c h a n g e s \r \r / 0127040 / e n t r i e s f o r c o 0127060 m m u n i c a t i o n w i t h 0127100 h i g h e r l e v e l s \r / 0127120 / * * * d o n o t c h a 0127140 n g e o r d e r w i t h o u 0127160 t c o n s u l t i n g P u p 0127200 B S P . d e c l * * * \r r t p 0127220 O t h e r P u p P r o c w o r 0127240 d \t / / p r o c e d u r e c 0127260 376 001 \0 006 346 a l l e d f o r n 0127300 o n - R T P p u p s \r r t p O 0127320 t h e r T i m e r w o r d \t / 0127340 / t i m e r f o r h i g h 0127360 e r l e v e l s \r r t p O t h 0127400 e r T i m e r P r o c w o r d 0127420 \t / / p r o c e d u r e c a 0127440 l l e d w h e n t i m e r 0127460 e x p i r e s \r ] \r m a n i f e 0127500 s t l e n R T P S o c = s 0127520 i z e R T P S o c / 1 6 \r \r \r 0127540 m a n i f e s t \r [ \r / / R T 0127560 P o p e n m o d e s \r m o d 0127600 e I n i t A n d W a i t = 0 0127620 \r m o d e I n i t A n d R e t u 0127640 r n = 1 \r m o d e L i s t e 0127660 n A n d W 376 001 \0 316 272 a i t = 0127700 2 \r m o d e L i s t e n A n d R 0127720 e t u r n = 3 \r m o d e I m 0127740 m e d i a t e O p e n = 4 \r 0127760 \r / / R T P F i n i t e s 0130000 t a t e m a c h i n e s o c 0130020 k e t s t a t e s \r s t a t e 0130040 C l o s e d = 0 \r s t a t e 0130060 R F C O u t = 1 \r s t a t e 0130100 L i s t e n i n g = 2 \r s t 0130120 a t e O p e n = 3 \r s t a t 0130140 e E n d I n = 4 \r s t a t e 0130160 E n d O u t = 5 \r s t a t e 0130200 D a l l y = 6 \r s t a t e A 0130220 b o r t = 7 \r \r / / R e n 0130240 d e z v o u s / T e r m i n a t 0130260 i o n p r o t o c 376 \0 s + T o 0130300 l \r t y p e R F C = # 1 0 \r 0130320 t y p e A b o r t = # 1 1 \r 0130340 t y p e E n d = # 1 2 \r t y 0130360 p e E n d R e p l y = # 1 3 0130400 \r \r / / E r r o r c o d e s 0130420 \r e c I m p r o p e r S t a t e 0130440 F o r E v e n t = 2 2 4 0 \r 0130460 ] \r 377 \0 \0 P u p R T P I n t e r 0130500 n a l . d e c l \0 373 224 024 027 # \0 \0 0130520 376 001 \0 y # / / P u p R t p I n t 0130540 e r n a l . d e c l - - P r 0130560 i v a t e d e f i n i t i o n 0130600 s f o r R T P \r / / C o p 0130620 y r i g h t X e r o x C o r 0130640 p o r a t i o n 1 9 7 9 \r \r / 0130660 / l a s t m o d i f i e d M 0130700 a r c h 8 , 1 9 7 8 5 : 0130720 0 5 P M \r \r g e t " P u p R 0130740 T P . d e c l " \r \r / / - - - - 0130760 - - - - - - - - - - - - - - - - * 0131060 - - - - - - - - \r s t r u c t u 0131100 r e R T P C t x : / / R T 0131120 P c o n 376 001 \0 253 \n t e x t s 0131140 t r u c t u r e \r / / - - - - - 0131160 - - - - - - - - - - - - - - - - * 0131260 - - - - - - - \r [ \r b l a n k 0131300 w o r d 3 \t / / s t a n d a r 0131320 d s t u f f \r s o c k e t w 0131340 o r d \t / / s o c k e t f o r 0131360 w h i c h c o n t e x t w 0131400 a s c r e a t e d \r z o n e 0131420 w o r d \t / / z o n e f r o m 0131440 w h i c h c o n t e x t a 0131460 l l o c a t e d \r c t x Q w o 0131500 r d \t / / c o n t e x t q u e 0131520 u e o n w h i c 376 001 \0 233 207 h 0131540 p u t \r u n c l e a n w o r 0131560 d \t / / n o n z e r o i f c 0131600 o n t e x t i s n o t i n 0131620 a c l e a n s t a t e \r ] 0131640 \r m a n i f e s t l e n R T P 0131660 C t x E x t r a = s i z e 0131700 R T P C t x / 1 6 - 3 \r \r m 0131720 a n i f e s t \r [ \r / / R T P 0131740 f i n i t e s t a t e m a c 0131760 h i n e s o c k e t s t a t 0132000 e s \r C L O S = s t a t e C 0132020 l o s e d \r R F C O = s t a 0132040 t e R F C O u t \r L I S T = 0132060 s t a t e L i s t e n i n g \r O 0132100 P E N = s t a t e O p e n \r 0132120 E N D I = s t a t e E n d 376 0132140 001 \0 360 o I n \r E N D O = s t 0132160 a t e E n d O u t \r D A L Y = 0132200 s t a t e D a l l y \r A B O R 0132220 = s t a t e A b o r t \r \r / 0132240 / R T P F i n i t e s t a t 0132260 e m a c h i n e e v e n t s 0132300 \r O P N C = 0 \t / / o p e n 0132320 a n d i n i t i a t e c o 0132340 n n e c t i o n \r O P N L = 0132360 1 \t / / o p e n a n d l i s 0132400 t e n \r O P N N = 2 \t / / o 0132420 p e n i m m e d i a t e l y 0132440 ( n o r e n d e z v o u s ) \r 0132460 C L S N = 3 \t / / c l o s e 0132500 n o r m a l l y \r C L S T = 0132520 4 \t / / c l o s e a b n o r 0132540 m a l l 376 001 \0 2 212 y ( e . g . 0132560 a f t e r t i m e o u t ) \r 0132600 R R F C = 5 \t / / r e c e i 0132620 v e d R F C \r R A B T = 6 0132640 \t / / r e c e i v e d A b o r 0132660 t \r R E N D = 7 \t / / r e c 0132700 e i v e d E n d \r R E N R = 0132720 8 \t / / r e c e i v e d E n 0132740 d R e p l y \r T I M O = 9 \t 0132760 / / f s m t i m e o u t \r \r / 0133000 / R T P F i n i t e s t a t 0133020 e m a c h i n e a c t i o n 0133040 s \r L E R R = # 0 B 8 \t / / 0133060 l o c a l e r r o r ( o u r 0133100 b u g , c a l l s S y s E 0133120 r r ) \r F E R R = # 1 B 8 \t 0133140 / / f o r e i g n 376 \0 362 331 276 e 0133160 r r o r ( h i s b u g , i 0133200 g n o r e d ) \r N O O P = # 0133220 2 B 8 \t / / n o a c t i o n \r 0133240 S A B T = # 3 B 8 \t / / s e 0133260 n d A b o r t \r O P N X = 0133300 # 4 B 8 \t / / c o m p l e t e 0133320 l o c a l l y - i n i t i a t e 0133340 d o p e n \r S R F 1 = # 5 0133360 B 8 \t / / s e n d i n i t i a 0133400 t i n g R F C \r S R F 2 = 0133420 # 6 B 8 \t / / s e n d a n s w 0133440 e r i n g R F C \r S E N D = 0133460 # 7 B 8 \t / / s e n d E n d 0133500 \r S E N R = # 1 0 B 8 \t / / 0133520 s e n d E n d R e p l y \r ] \r 0133540 377 \0 \0 P u p R T P O p e n C l o 0133560 s e . b c p l \0 373 230 \t 243 340 \0 \0 376 0133600 001 \0 \v P / / P u p R T P O p e 0133620 n C l o s e . b c p l - - R 0133640 e n d e z v o u s / T e r m i n 0133660 a t i o n P r o t o c o l \r / 0133700 / c o m p a n i o n m o d u 0133720 l e i s P u p R T P . b c p 0133740 l \r / / T h i s m o d u l e 0133760 c o n t a i n s i n f r e q 0134000 u e n t l y e x e c u t e d 0134020 c o d e w h i c h c a n s 0134040 w a p \r / / w i t h o u t a 0134060 f f e c t i n g p e r f o r m 0134100 a n c e . \r / / C o p y r i g 0134120 h t X e r o x C o r p o r a 0134140 t i o n 1 9 7 9 , 1 9 8 1 \r 0134160 \r / / l a s t m o d i f i e 0134200 d O c 376 001 \0 m 302 t o b e r 2 0134220 9 , 1 9 8 1 5 : 2 0 P M 0134240 b y T a f t \r \r g e t " P 0134260 u p 0 . d e c l " \r g e t " P 0134300 u p 1 . d e c l " \r g e t " P 0134320 u p R T P I n t e r n a l . d e 0134340 c l " \r \r e x t e r n a l \r [ \r 0134360 / / o u t g o i n g p r o c 0134400 e d u r e s \r O p e n R T P S o 0134420 c k e t ; C l o s e R T P S o 0134440 c k e t ; C o m p l e t e R T 0134460 P P u p \r R T P H a n d l e U n 0134500 c o m m o n P u p ; R T P F S 0134520 M ; B u i l d A b o r t \r \r / 0134540 / i n c o m i n g p r o c e 0134560 d u r e s \r R T P S o c k e t P 0134600 r o c e s s ; D 376 001 \0 020 267 e f 0134620 a u l t O t h e r P u p P r o c 0134640 ; R T P F i l t e r \r C o m p 0134660 l e t e P u p ; A p p e n d S 0134700 t r i n g T o P u p ; M u l t 0134720 E q \r S e t P u p D P o r t ; 0134740 S e t P u p I D \r I n i t i a l 0134760 i z e C o n t e x t ; B l o c 0135000 k \r E n q u e u e ; U n q u e 0135020 u e ; I n s e r t A f t e r \r 0135040 R e l e a s e P B I ; G e t P 0135060 B I \r Z e r o ; A l l o c a t 0135100 e ; F r e e ; M o v e B l o 0135120 c k \r D e f a u l t A r g s ; 0135140 N o o p ; S y s E r r \r S e t 0135160 T i m e r ; T i m e r H a s E 0135200 x p i r e d \r \r / / o u t 376 001 0135220 \0 x 226 g o i n g s t a t i c s 0135240 \r l R T P S o c \r \r / / i n c 0135260 o m i n g s t a t i c s \r r t 0135300 p S t a c k S i z e ; p u p L 0135320 e v e l 1 C t x \r p u p Z o n e 0135340 ; p u p C t x Q ; d e f a u 0135360 l t T i m e o u t \r ] \r \r s t a 0135400 t i c [ l R T P S o c = 0135420 l e n R T P S o c ] \r \f \r / / 0135440 - - - - - - - - - - - - - - - - * 0135540 - - - - - - - - - - - - \r l e t 0135560 O p e n R T P S o c k e t ( s 0135600 o c , c t x Q , o p e n M o 0135620 d e , 376 001 \0 0 ' c o n n I D , 0135640 o t h e r P r o c , t i m e 0135660 o u t , \r z o n e ; n u m a 0135700 r g s n a ) = v a l o f \r 0135720 / / - - - - - - - - - - - - - - 0135740 - - - - - - - - - - - - - - - - * 0136020 - - - - - - - - - - - - - - \r [ 0136040 \r l e t d e f a u l t I D = 0136060 v e c 1 ; S e t T i m e r 0136100 ( d e f a u l t I D , 0 ) ; 0136120 d e f a u l t I D ! 1 = s o 0136140 c \r D e f a u l t A r g s ( l v 0136160 n a , - 1 , p u p C t x Q 0136200 , m o d e I n i t A n d W a i 0136220 t , d e f a u 376 001 \0 336 302 l t I 0136240 D , \r D e f a u l t O t h 0136260 e r P u p P r o c , d e f a u 0136300 l t T i m e o u t , p u p Z o 0136320 n e ) \r l e t c t x = A l 0136340 l o c a t e ( z o n e , r t p 0136360 S t a c k S i z e ) \r I n i t i 0136400 a l i z e C o n t e x t ( c t x 0136420 , r t p S t a c k S i z e , 0136440 R T P S o c k e t P r o c e s s 0136460 , l e n R T P C t x E x t r a 0136500 ) \r c t x > > R T P C t x . s o 0136520 c k e t = s o c / / l 0136540 i n k f r o m c o n t e x t 0136560 t o s o c k e t \r c t x > > 0136600 R T P C t x . z o n e = z o 0136620 n e / / z o n e f 376 001 \0 0136640 x 317 r o m w h i c h c o n t 0136660 e x t a l l o c a t e d \r c t 0136700 x > > R T P C t x . c t x Q = 0136720 c t x Q / / q u e u e 0136740 o n w h i c h c o n t e x t 0136760 p l a c e d \r t e s t c t x 0137000 Q e q p u p C t x Q / / 0137020 s a m e q u e u e a s P 0137040 u p L e v e l 1 ' s ? \r i 0137060 f s o I n s e r t A f t e r ( 0137100 c t x Q , p u p L e v e l 1 C 0137120 t x , c t x ) / / b e s 0137140 t p o s i t i o n \r i f 0137160 n o t E n q u e u e ( c t x Q 0137200 , c t x ) \r s o c > > R T P S 0137220 o c . c t x = c t x / / 0137240 l 376 001 \0 [ 226 i n k f r o m 0137260 s o c k e t t o c o n t e x 0137300 t \r s o c > > R T P S o c . c o 0137320 n n I D ^ 1 = c o n n I D ! 0137340 0 \r s o c > > R T P S o c . c o 0137360 n n I D ^ 2 = c o n n I D ! 0137400 1 \r s o c > > R T P S o c . r t 0137420 p S t a t u s = 0 \r s o c > 0137440 > R T P S o c . r t p O t h e r 0137460 P u p P r o c = o t h e r P 0137500 r o c \r s o c > > R T P S o c . 0137520 r t p O t h e r T i m e r P r o 0137540 c = N o o p \r l e t i n i 0137560 t S t a t e = n i l \r s w i 0137600 t c h o n o p e n M o d e i 0137620 n t o \r [ \r c a s e 0137640 m o d e I n 376 001 \0 e f i t A n 0137660 d W a i t : c a s e m o d e 0137700 I n i t A n d R e t u r n : \r 0137720 [ \r i n i 0137740 t S t a t e = R F C O \r 0137760 R T P F S M ( s o c , 0140000 O P N C ) \r i f o 0140020 p e n M o d e e q m o d e I 0140040 n i t A n d R e t u r n t h e 0140060 n r e s u l t i s t r u e \r 0140100 e n d c a s e \r 0140120 ] \r c a s e m o 0140140 d e L i s t e n A n d W a i t : 0140160 c a s e m o d e L i s t e n 0140200 A n d R e t u r n : \r 0140220 [ \r i n i t S t a 0140240 t e = L I S T ; s 376 001 \0 365 0140260 7 o c > > R T P S o c . w a s L 0140300 i s t e n i n g = t r u e \r 0140320 R T P F S M ( s o c 0140340 , O P N L ) \r i f 0140360 o p e n M o d e e q m o d 0140400 e L i s t e n A n d R e t u r n 0140420 t h e n r e s u l t i s t 0140440 r u e \r e n d c a s 0140460 e \r ] \r c a s 0140500 e m o d e I m m e d i a t e O 0140520 p e n : \r [ \r 0140540 R T P F S M ( s o c , O 0140560 P N N ) \r r e s u l 0140600 t i s t r u e \r ] 0140620 \r ] \r l e t o p e n T i 0140640 m e r , s t a t e = n i l 0140660 , 376 001 \0 U 020 n i l ; S e t T 0140700 i m e r ( l v o p e n T i m e 0140720 r , t i m e o u t ) \r [ 0140740 \r B l o c k ( ) \r s 0140760 t a t e = s o c > > R T P S 0141000 o c . s t a t e \r ] r e 0141020 p e a t u n t i l s t a t e 0141040 n e i n i t S t a t e % T 0141060 i m e r H a s E x p i r e d ( l 0141100 v o p e n T i m e r ) \r i f 0141120 s t a t e e q O P E N % 0141140 s t a t e e q E N D I t h 0141160 e n r e s u l t i s t r u e 0141200 \r C l o s e R T P S o c k e t ( 0141220 s o c , 0 ) ; r e s u l t i 0141240 s f a l s e \r ] \r \r / / - - - 0141260 - - - - - - 376 001 \0 F 312 - - - - - 0141300 - - - - - - - - - - - - - - - - * 0141360 - - - - - - - - - - - - - - \r a 0141400 n d C l o s e R T P S o c k e 0141420 t ( s o c , t i m e o u t ; 0141440 n u m a r g s n a ) = v a 0141460 l o f \r / / - - - - - - - - - - 0141500 - - - - - - - - - - - - - - - - 0141520