A2osX/LIB/LIBTCPIP.S.TCP.txt

628 lines
11 KiB
Plaintext
Raw Normal View History

PR#3
PREFIX /A2OSX.SRC
LOMEM $900
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
TCP.IN jsr IP.FillSKT.TemplateSrcDst
ldy #S.TCP.SRCPORT
lda (ZPFrameInPtr),y
sta SKT.Template+S.SOCKET.DST.PORT+1
iny
lda (ZPFrameInPtr),y
sta SKT.Template+S.SOCKET.DST.PORT
ldy #S.TCP.DSTPORT
lda (ZPFrameInPtr),y
sta SKT.Template+S.SOCKET.SRC.PORT+1
iny
lda (ZPFrameInPtr),y
sta SKT.Template+S.SOCKET.SRC.PORT
2017-02-10 07:29:58 +00:00
lda hSocketTable
>SYSCALL GetMemPtrA
>STYA ZPPtrSKT
ldx #0
.3 lda (ZPPtrSKT)
beq .7
cmp #S.SOCKET.SOCK.STREAM
bne .7
ldy #S.SOCKET.SRC.ADDR
.4 lda SKT.Template,y
cmp (ZPPtrSKT),y
bne .7 Not for this socket...
iny
cpy #S.SOCKET.SRC.PORT+2
bne .4
ldy #S.SOCKET.SO
lda (ZPPtrSKT),y
and #S.SOCKET.SO.ACCEPTCONN Listening socket?
beq .5 no, go check if Dst Match
ldy #S.TCP.OPTIONS yes, only accept SYN packet
lda (ZPFrameInPtr),y
and #S.TCP.OPTIONS.SYN
beq .7 maybe a regular frame for a regular socket
jmp TCP.IN.JMP.LISTEN
.5 ldy #S.SOCKET.DST.ADDR
.6 lda SKT.Template,y regular socket, check remote ADDR/PORT
cmp (ZPPtrSKT),y
bne .7
iny
cpy #S.SOCKET.DST.PORT+2
bne .6
stx hSocket
ldy #S.SOCKET.TCP.STATUS
lda (ZPPtrSKT),y
asl
tax
jmp (L.TCP.IN.JMP,x)
.7 lda ZPPtrSKT
clc
adc #S.SOCKET
sta ZPPtrSKT
bcc .8
inc ZPPtrSKT+1
.8 inx
cpx #K.SKTTABLE.SIZE
bne .3
.9 clc Discard frame
rts
*--------------------------------------
TCP.IN.JMP.CLOSED
clc
rts
*--------------------------------------
TCP.IN.JMP.LISTEN
lda #S.SOCKET.SOCK.STREAM
sta SKT.Template+S.SOCKET.SOCK
stz SKT.Template+S.SOCKET.SO
>PUSHW L.SKT.Template
jsr SKT.New
bcs .9
2016-04-09 09:15:11 +00:00
phy
pha
txa
2016-06-07 06:10:18 +00:00
jsr SKT.AddToQueueA
2016-04-09 09:15:11 +00:00
pla
sta ZPPtrSKT+1
pla
sta ZPPtrSKT
bcc .3 Queued successfully ?
2016-06-07 06:10:18 +00:00
lda #0 error
sta (ZPPtrSKT) clear this socket
lda #ERR.SKT.OOS
.9 rts
2016-04-09 09:15:11 +00:00
.3 jsr ARP.AddFromFrameInPtr
ldy #S.TCP.SEQ.NUMBER+3
ldx #3
sec
.1 lda (ZPFrameInPtr),y Set ACK=SEQ+1 for new socket...
adc #0
sta TmpDWord,x
dey
dex
bpl .1
ldx #3
ldy #S.SOCKET.SQ.ACKNUM+3
.4 lda TmpDWord,x Update new socket with ACK number
sta (ZPPtrSKT),y
dey
dex
bpl .4
ldy #S.SOCKET.TCP.STATUS
lda #S.SOCKET.TCP.STATUS.SYNRCVD
2016-06-07 06:10:18 +00:00
sta (ZPPtrSKT),y
2016-04-09 09:15:11 +00:00
ldy #S.SOCKET.TCP.OPTIONS
lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK
sta (ZPPtrSKT),y
jsr TCP.Out
bcs .9
ldy #S.SOCKET.TCP.STATUS
lda #S.SOCKET.TCP.STATUS.SYNSENT
sta (ZPPtrSKT),y
clc
rts
*--------------------------------------
TCP.IN.JMP.SYNSENT
clc
rts
*--------------------------------------
TCP.IN.JMP.SYNRCVD
ldy #S.TCP.OPTIONS only accept ACK packet
lda (ZPFrameInPtr),y
cmp #S.TCP.OPTIONS.ACK
bne .8
ldx #3
ldy #S.SOCKET.SQ.SEQNUM+3
sec
.10 lda (ZPPtrSKT),y
adc #0
sta TmpDWord,x
dey
dex
bpl .10
ldx #3
ldy #S.TCP.ACK.NUMBER+3
.11 lda (ZPFrameInPtr),y
cmp TmpDWord,x
bne .8
dey
dex
bpl .11
ldx #3
ldy #S.SOCKET.SQ.SEQNUM+3
.12 lda TmpDWord,x
sta (ZPPtrSKT),y
dey
dex
bpl .12
ldy #S.SOCKET.TCP.STATUS
lda #S.SOCKET.TCP.STATUS.ESTBLSH
sta (ZPPtrSKT),y
2017-02-10 07:29:58 +00:00
.8 clc
rts
*--------------------------------------
TCP.IN.JMP.ESTBLSH
ldy #S.TCP.OPTIONS
lda (ZPFrameInPtr),y
bit #S.TCP.OPTIONS.ACK
beq .2
ldy #S.TCP.ACK.NUMBER+3 Get new ACK number from FrameIn...
ldx #3
.1 lda (ZPFrameInPtr),y
sta TmpDWord,x
dey
dex
bpl .1
ldy #S.SOCKET.SQ.ACKNUM Substract old Ack from socket
sec
lda (ZPPtrSKT),y
sbc TmpDWord
pha save result LO for FreeData
lda TmpDWord
sta (ZPPtrSKT),y and store new ACK in skt
iny
lda (ZPPtrSKT),y
sbc TmpDWord+1
tax save result HI for FreeData
lda TmpDWord+1 we stop here, will never be more than K.TCP.WSIZE
sta (ZPPtrSKT),y
iny
lda TmpDWord+2
sta (ZPPtrSKT),y
iny
lda TmpDWord+3
sta (ZPPtrSKT),y
pla
jsr SKT.FreeDataFromSktOutAX
*----------
.2 lda ZPDataInLen
ora ZPDataInLen+1
beq .8 No data in this incoming frame...
ldy #S.TCP.SEQ.NUMBER+3
ldx #3
.3 lda (ZPFrameInPtr),y
sta TmpDWord,x
dey
dex
bpl .3
jsr TCP.SetDataInPtrAndLen
jsr SKT.AddDataToSktIn
.8 clc
rts
*--------------------------------------
TCP.IN.JMP.CLWAIT
TCP.IN.JMP.LASTACK
TCP.IN.JMP.FINWT1
TCP.IN.JMP.FINWT2
TCP.IN.JMP.CLOSING
TCP.IN.JMP.TIMEWT
clc
rts
*--------------------------------------
TCP.OUT ldy #S.SOCKET.TCP.OPTIONS
lda (ZPPtrSKT),y
bit #S.TCP.OPTIONS.SYN
beq TCP.OUT.ESTBLSH
>LDYAI 0
jsr TCP.NewFrame
bcs .9
ldy #S.TCP.OPTIONS
lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK
sta (ZPFrameOutPtr),y
jsr TCP.SendFrame
bcs .9
ldy #S.TCP.OPTIONS
lda #0
sta (ZPFrameOutPtr),y
ldy #S.SOCKET.TCP.STATUS
lda #S.SOCKET.TCP.STATUS.SYNSENT
sta (ZPFrameOutPtr),y
clc
.9 rts
*--------------------------------------
TCP.OUT.ESTBLSH ldy #S.SOCKET.SQ.OUTUSED
lda (ZPPtrSKT),y
2017-02-13 07:26:18 +00:00
pha
iny
lda (ZPPtrSKT),y
ply
2017-02-13 07:26:18 +00:00
bne .1
tax
beq .2 Y,A=0 : nothing to send....
2017-02-13 07:26:18 +00:00
.1 cpy #K.TCP.MSS
pha
sbc /K.TCP.MSS OUTDATA > MSS ?
pla
bcs .2 no....get data len
>LDYAI K.TCP.MSS yes get only MSS
.2 >STYA TmpOffset
jsr TCP.NewFrame
bcs .9
jsr SKT.GetDataFromSktOut
2017-02-13 07:26:18 +00:00
ldy #S.SOCKET.SQ.SEQNUM compute new SEQ.NUM
lda (ZPPtrSKT),y
clc
adc TmpOffset
sta TmpDWord
2017-02-13 07:26:18 +00:00
iny
lda (ZPPtrSKT),y
adc TmpOffset+1
sta TmpDWord+1
2017-02-13 07:26:18 +00:00
iny
lda (ZPPtrSKT),y
adc #0
sta TmpDWord+2
iny
lda (ZPPtrSKT),y
adc #0
sta TmpDWord+3
ldy #S.TCP.SEQ.NUMBER+3
ldx #3
.3 lda TmpDWord,x
sta (ZPFrameOutPtr),y
dey
dex
bpl .3
ldy #S.SOCKET.TCP.OPTIONS
lda (ZPPtrSKT),y
bit #S.TCP.OPTIONS.ACK
beq .7
ldy #S.TCP.OPTIONS
lda (ZPFrameOutPtr),y
ora #S.TCP.OPTIONS.ACK
sta (ZPFrameOutPtr),y
.7 jsr TCP.SendFrame
bcs .9
ldy #S.SOCKET.TCP.OPTIONS
lda (ZPPtrSKT),y
and #$ff^S.TCP.OPTIONS.ACK
sta (ZPPtrSKT),y
ldx #3
ldy #S.SOCKET.SQ.SEQNUM+3
.71 lda TmpDWord,x
sta (ZPPtrSKT),y
dey
dex
bpl .71
2017-02-13 07:26:18 +00:00
.8 clc
.9 rts
2017-02-13 07:26:18 +00:00
*--------------------------------------
TCP.GetSktAckNum
ldy #S.TCP.ACK.NUMBER
ldx #4
.1 lda (ZPFrameInPtr),y
pha
iny
dex
bne .1
ldy #S.SOCKET.SQ.ACKNUM+3
ldx #4
.2 pla
sta (ZPPtrSKT),y
dey
dex
bne .2
rts
*--------------------------------------
TCP.UpdateSktAckNum
ldy #S.SOCKET.SQ.ACKNUM+3
lda (ZPPtrSKT),y
clc
adc ZPDataInLen
sta (ZPPtrSKT),y
dey
lda (ZPPtrSKT),y
adc ZPDataInLen+1
sta (ZPPtrSKT),y
dey
lda (ZPPtrSKT),y
adc #0
sta (ZPPtrSKT),y
dey
lda (ZPPtrSKT),y
adc #0
sta (ZPPtrSKT),y
rts
*--------------------------------------
TCP.SetDataInPtrAndLen
ldy #S.TCP.DATAOFFSET
lda (ZPFrameInPtr),y
and #$F0
lsr
lsr
adc #S.TCP
sta TmpOffset
lda #0
* clc
adc /S.TCP
sta TmpOffset+1 TmpOffset=Data Offset in Frame
lda ZPFrameInPtr
* clc
adc TmpOffset
sta ZPDataInPtr
lda ZPFrameInPtr+1
adc #0
sta ZPDataInPtr+1
lda ZPFrameInLen
sec
sbc TmpOffset
sta ZPDataInLen
lda ZPFrameInLen+1
sbc TmpOffset+1
sta ZPDataInLen+1
rts
*--------------------------------------
TCP.NewFrame ldx #S.IP.PROTOCOL.TCP
jsr FRM.NewIP
bcs .9
jsr SKT.SetFrameOutDstIP
2016-04-09 09:15:11 +00:00
ldy #S.SOCKET.SRC.PORT
lda (ZPPtrSKT),y
tax
2016-04-09 09:15:11 +00:00
iny
lda (ZPPtrSKT),y
ldy #S.TCP.SRCPORT
sta (ZPFrameOutPtr),y
iny
txa
sta (ZPFrameOutPtr),y
2016-04-09 09:15:11 +00:00
ldy #S.SOCKET.DST.PORT
lda (ZPPtrSKT),y
tax
2016-04-09 09:15:11 +00:00
iny
lda (ZPPtrSKT),y
ldy #S.TCP.DSTPORT
sta (ZPFrameOutPtr),y
iny
txa
sta (ZPFrameOutPtr),y
ldy #S.TCP.DATAOFFSET
lda #$50 Header size = 5 DWORDS
sta (ZPFrameOutPtr),y
ldy #S.SOCKET.SQ.INFREE
lda (ZPPtrSKT),y
pha
iny
lda (ZPPtrSKT),y
ldy #S.TCP.WINDOW
sta (ZPFrameOutPtr),y
iny
pla
sta (ZPFrameOutPtr),y
2016-04-09 09:15:11 +00:00
clc
.9 rts
2016-04-09 09:15:11 +00:00
*--------------------------------------
TCP.SendFrame ldy #S.SOCKET.SQ.SEQNUM+7
ldx #7
.1 lda (ZPPtrSKT),y
pha
dey
dex
bpl .1
ldy #S.TCP.SEQ.NUMBER
.2 pla
sta (ZPFrameOutPtr),y
iny
cpy #S.TCP.SEQ.NUMBER+8
bne .2
jmp FRM.SendIP
*--------------------------------------
TCP.ComputeChecksum
lda #0 RESET.TCP.CHECKSUM
ldy #S.TCP.CHECKSUM
sta (ZPFrameOutPtr),y
iny
sta (ZPFrameOutPtr),y
>LDYA ZPFrameOutPtr
>STYA ZPTmpPtr1
lda ZPFrameOutLen
sec
sbc #S.IP-2
sta ZPDataInLen
lda ZPFrameOutLen+1
sbc /S.IP-2
sta ZPDataInLen+1
clc
* lda ZPDataInLen+1
* adc #0 RESERVED (all zero)
sta IP.CHECKSUM
lda ZPDataInLen
adc #S.IP.PROTOCOL.TCP
sta IP.CHECKSUM+1
ldy #S.IP.SRC
ldx #4 4 words for SRC & DST IP
.10 lda (ZPFrameOutPtr),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
lda (ZPFrameOutPtr),y
adc IP.CHECKSUM+1
sta IP.CHECKSUM+1
iny
dex
bne .10
ldy #S.IP
.1 jsr DecDataInLen
beq .8
lda (ZPTmpPtr1),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
bne .20
inc ZPTmpPtr1+1
.20 jsr DecDataInLen
bne .2
lda #0
bra .21
.2 lda (ZPTmpPtr1),y
.21 adc IP.CHECKSUM+1
sta IP.CHECKSUM+1
iny
bne .1
inc ZPTmpPtr1+1
bra .1
.8 ldy #S.TCP.CHECKSUM
lda IP.CHECKSUM
adc #0 Don't forget to add last carry!!!
eor #$FF
sta (ZPFrameOutPtr),y
iny
lda IP.CHECKSUM+1
adc #0 Don't forget to add last carry!!!
eor #$FF
sta (ZPFrameOutPtr),y
rts
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.TCP
LOAD LIB/LIBTCPIP.S
ASM