NEW PREFIX /A2OSX.BUILD AUTO 4,1 .LIST OFF *-------------------------------------- TCP.IN jsr FRM.GetTargetSKT.TCPUDP >DEBUG jsr SKT.FindMatchingLocRem bcs TCP.IN.JMP.CLOSED no socket, go discard >STYA ZPPtrSKT ldy #S.SOCKET.PROTO lda (ZPPtrSKT),y cmp #S.IP.PROTOCOL.TCP bne TCP.IN.JMP.CLOSED wrong protocol, go discard ldy #S.TCP.OPTIONS lda (ZPFrameInPtr),y and #S.TCP.OPTIONS.RST RST ? go Kill this socket... bne TCP.IN.RST ...and discard frame ldy #S.SOCKET.TCP.S lda (ZPPtrSKT),y asl tax jmp (J.TCP.IN,x) *-------------------------------------- TCP.IN.RST jsr SKT.Destroy *-------------------------------------- TCP.IN.JMP.CLOSED * lda hFrameIn * >SYSCALL FreeMem rts *-------------------------------------- TCP.IN.JMP.LISTEN ldy #S.TCP.OPTIONS SYN Received, send SYN.ACK packet lda (ZPFrameInPtr),y cmp #S.TCP.OPTIONS.SYN bne TCP.IN.JMP.CLOSED ldy #S.SOCKET.T Create a new client socket lda (ZPPtrSKT),y tax Same type a listening socket jsr SKT.Socket.I get new socket in ZPTmpPtr1 bcs TCP.IN.JMP.CLOSED txa jsr SKT.AddToQueueA Queued successfully ? bcs TCP.IN.JMP.CLOSED no, discard frame and new socket jsr ARP.AddFromFrameInPtr lda ZPTmpPtr1 sta ZPPtrSKT ldaZPTmpPtr1+1 sta ZPPtrSKT+1 jsr TCP.IN.ACKTheSYN jsr SKT.StoreTCB lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK jsr TCP.OUT.SendOptA SYN received, Send SYN.ACK bcs .9 ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.SYNRCVD sta (ZPPtrSKT),y clc rts .9 lda #0 error sta (ZPPtrSKT) clear this socket lda #ERR.SKT.OOS .99 rts *-------------------------------------- TCP.IN.JMP.SYNSENT ldy #S.TCP.OPTIONS SYN Send, only accept SYN.ACK packet, then Send ACK lda (ZPFrameInPtr),y and #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK cmp #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK bne .9 jsr SKT.GetTCB ldx #3 ldy #S.TCP.ACKNUM+3 sec Check if ACK=OUTNEXTSEQ+1 .1 lda SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ,x adc #0 sta SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ,x eor (ZPFrameInPtr),y bne .9 dey dex bpl .1 jsr TCP.IN.ACKTheSYN lda #S.TCP.OPTIONS.ACK jsr TCP.OUT.SendOptA SYN.ACK recieved, Send, ACK bcs .9 ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.ESTBLSH sta (ZPPtrSKT),y jmp SKT.StoreTCB .9 lda #S.TCP.OPTIONS.RST jsr TCP.OUT.SendOptA jmp SKT.Destroy *-------------------------------------- TCP.IN.JMP.SYNRCVD ldy #S.TCP.OPTIONS SYN Received, SYN.ACK Sent, only accept ACK packet lda (ZPFrameInPtr),y cmp #S.TCP.OPTIONS.ACK bne .8 jsr SKT.GetTCB ldx #3 ldy #S.TCP.ACKNUM+3 sec .1 lda SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ,x Check if ACK=OUTNEXTSEQ+1 adc #0 sta SKT.TmpCache+S.SOCKET.TCP.OUTSEQNUM,x setup SEQNUM sta SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ,x ...and update NEXTSEQ eor (ZPFrameInPtr),y bne .8 dey dex bpl .1 ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.ESTBLSH sta (ZPPtrSKT),y jmp SKT.StoreTCB .8 clc .9 rts *-------------------------------------- TCP.IN.JMP.ESTBLSH jsr SKT.GetTCB ldy #S.TCP.OPTIONS lda (ZPFrameInPtr),y and #S.TCP.OPTIONS.ACK Remote side ACKed data ? beq .1 jsr SKT.AckDataToSktOut Yes, Discard sent data jsr SKT.StoreTCB and update SKT .1 jsr TCP.IN.SetDataInPtrAndLen lda ZPDataInLen Incoming Data in this frame ? ora ZPDataInLen+1 beq .2 No data, ... jsr SKT.AddDataToSktIn yes, queue data if there is room for.... bcs .2 jsr SKT.StoreTCB success, update socket .2 ldy #S.TCP.OPTIONS lda (ZPFrameInPtr),y and #S.TCP.OPTIONS.FIN beq .8 jsr TCP.IN.ACKTheFIN bcs .9 ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.CLWAIT sta (ZPPtrSKT),y .8 clc .9 rts *-------------------------------------- TCP.IN.JMP.CLWAIT clc Wait for SKT.CloseA from Daemon rts *-------------------------------------- TCP.IN.JMP.LASTACK ldy #S.TCP.OPTIONS only accept ACK packet lda (ZPFrameInPtr),y bit #S.TCP.OPTIONS.ACK beq .8 jmp SKT.Destroy .8 clc rts *-------------------------------------- TCP.IN.JMP.FINWT1 ldy #S.TCP.OPTIONS only accept ACK packet lda (ZPFrameInPtr),y bit #S.TCP.OPTIONS.ACK beq TCP.IN.JMP.FINWT2.1 ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.FINWT2 sta (ZPPtrSKT),y *-------------------------------------- TCP.IN.JMP.FINWT2 ldy #S.TCP.OPTIONS only accept FIN packet lda (ZPFrameInPtr),y TCP.IN.JMP.FINWT2.1 bit #S.TCP.OPTIONS.FIN bne .8 jsr TCP.IN.ACKTheFIN bcs .9 ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.TIMEWT sta (ZPPtrSKT),y .8 clc .9 rts *-------------------------------------- TCP.IN.JMP.CLOSING ldy #S.TCP.OPTIONS only accept ACK packet lda (ZPFrameInPtr),y bit #S.TCP.OPTIONS.ACK beq .1 ldy #S.SOCKET.TCP.S lda #S.SOCKET.TCP.S.TIMEWT sta (ZPPtrSKT),y .1 clc rts *-------------------------------------- TCP.IN.JMP.TIMEWT *-------------------------------------- TCP.IN.ACKTheSYN ldy #S.TCP.SEQNUM+3 Get Remote SEQ ldx #3 sec .3 lda (ZPFrameInPtr),y Set OUTACK=SEQ+1 for new socket... adc #0 sta SKT.TmpCache+S.SOCKET.TCP.INLASTSEQNUM,x sta SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM,x dey dex bpl .3 rts *-------------------------------------- TCP.IN.ACKTheFIN ldy #S.SOCKET.TCP.O lda (ZPPtrSKT),y ora #S.TCP.OPTIONS.ACK sta (ZPPtrSKT),y jsr SKT.GetTCB ldx #3 ldy #S.TCP.ACKNUM+3 sec .3 lda SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM,x adc #0 sta SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM,x dey dex bpl .3 jmp TCP.OUT.I ACK the FIN *-------------------------------------- TCP.IN.SetDataInPtrAndLen ldy #S.IP.TOTAL.LENGTH+1 lda (ZPFrameInPtr),y sec sbc #S.IP-S.ETH sta ZPDataInLen dey lda (ZPFrameInPtr),y sbc /S.IP-S.ETH sta ZPDataInLen+1 ldy #S.TCP.DATAOFFSET lda (ZPFrameInPtr),y and #$F0 Get TCP Header len in DWORD lsr lsr sta TmpOffset lda ZPDataInLen sec sbc TmpOffset sta ZPDataInLen bcs .1 dec ZPDataInLen+1 .1 lda ZPFrameInPtr clc adc #S.IP pha lda ZPFrameInPtr+1 adc /S.IP tax pla clc adc TmpOffset bcc .2 inx .2 sta ZPDataInPtr stx ZPDataInPtr+1 rts *-------------------------------------- TCP.OUT jsr SKT.GetTCB TCP.OUT.I lda SKT.TmpCache+S.SOCKET.TCP.OUTTOSEND+1 ldy SKT.TmpCache+S.SOCKET.TCP.OUTTOSEND bne .1 tax bne .1 * Y,A=0 : no data to send ldy #S.SOCKET.TCP.O lda (ZPPtrSKT),y bne TCP.OUT.SendOptA a least an option... clc No, data, no flag....exit rts .1 cpy #K.TCP.MSS pha sbc /K.TCP.MSS OUTDATA > MSS ? pla bcc .2 no....keep data len >LDYAI K.TCP.MSS yes send only MSS .2 jsr TCP.NewFrame bcs TCP.OUT.9 jsr SKT.GetDataFromSktOut ldy #S.SOCKET.TCP.O lda (ZPPtrSKT),y ora #S.TCP.OPTIONS.ACK jsr TCP.OUT.SendOptA.1 bcs TCP.OUT.9 lda SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ+3 clc adc ZPDataOutLen sta SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ+3 lda SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ+2 adc ZPDataOutLen+1 sta SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ+2 bcc .80 inc SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ+1 bne .80 inc SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ .80 jmp SKT.StoreTCB exits with CC TCP.OUT.9 rts *-------------------------------------- TCP.OUT.SendOptA sta .1+1 >LDYAI 0 jsr TCP.NewFrame bcs TCP.OUT.9 .1 lda #$ff TCP.OUT.SendOptA.1 ldy #S.TCP.OPTIONS sta (ZPFrameOutPtr),y bit #S.TCP.OPTIONS.ACK beq .10 ldx #3 ldy #S.TCP.ACKNUM+3 .1 lda SKT.TmpCache+S.SOCKET.TCP.OUTACKNUM,x sta (ZPFrameOutPtr),y dey dex bpl .1 .10 ldx #3 ldy #S.TCP.SEQNUM+3 .2 lda SKT.TmpCache+S.SOCKET.TCP.OUTNEXTSEQ,x sta (ZPFrameOutPtr),y dey dex bpl .2 ldy #S.TCP.WINDOW lda SKT.TmpCache+S.SOCKET.TCP.INFREE+1 sta (ZPFrameOutPtr),y iny lda SKT.TmpCache+S.SOCKET.TCP.INFREE sta (ZPFrameOutPtr),y jsr FRM.SendIP bcs .9 ldy #S.SOCKET.TCP.O lda #0 sta (ZPPtrSKT),y * clc .9 rts *-------------------------------------- TCP.NewFrame ldx #S.IP.PROTOCOL.TCP jsr FRM.NewIP bcs .9 jsr SKT.SetFrameOutDstIP jsr SKT.SetFrameOutTCPUDPPorts ldy #S.TCP.DATAOFFSET lda #$50 Header size = 5 DWORDS sta (ZPFrameOutPtr),y ldy #S.TCP.WINDOW lda SKT.TmpCache+S.SOCKET.TCP.INFREE+1 sta (ZPFrameOutPtr),y iny lda SKT.TmpCache+S.SOCKET.TCP.INFREE sta (ZPFrameOutPtr),y clc .9 rts *-------------------------------------- MAN SAVE /A2OSX.SRC/LIB/LIBTCPIP.S.TCP LOAD /A2OSX.SRC/LIB/LIBTCPIP.S ASM