mirror of
https://github.com/A2osX/A2osX.git
synced 2024-06-27 00:29:29 +00:00
Kernel version 0.9 : TCP & Sockets....
This commit is contained in:
parent
a293fff2a4
commit
f856158b7b
BIN
A2OSX.BOOT.po
BIN
A2OSX.BOOT.po
Binary file not shown.
BIN
A2OSX.DEV.po
BIN
A2OSX.DEV.po
Binary file not shown.
BIN
A2OSX.SRC.po
BIN
A2OSX.SRC.po
Binary file not shown.
|
@ -64,6 +64,8 @@ CS.RUN >SYSCALL GetArgC
|
||||||
>SYSCALL GetArgA
|
>SYSCALL GetArgA
|
||||||
>PUSHYA
|
>PUSHYA
|
||||||
|
|
||||||
|
>DEBUG
|
||||||
|
|
||||||
>SYSCALL SSCANF
|
>SYSCALL SSCANF
|
||||||
bcc CS.RUN.QUERY
|
bcc CS.RUN.QUERY
|
||||||
|
|
||||||
|
|
|
@ -172,11 +172,11 @@ CS.RUN.SEND.ECHO
|
||||||
|
|
||||||
jsr Init.Timeout
|
jsr Init.Timeout
|
||||||
|
|
||||||
>PUSHWI ICMP.RequestLen
|
|
||||||
>PUSHW L.ICMP.Request
|
|
||||||
|
|
||||||
ldy #hSocket
|
ldy #hSocket
|
||||||
>PUSHB (pData),y
|
>PUSHB (pData),y
|
||||||
|
>PUSHW L.ICMP.Request
|
||||||
|
>PUSHWI ICMP.RequestLen
|
||||||
|
|
||||||
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND
|
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND
|
||||||
bcs CS.RUN.ERR
|
bcs CS.RUN.ERR
|
||||||
|
|
||||||
|
@ -339,7 +339,6 @@ Socket.Src.Addr .BS 4
|
||||||
Socket.Src.Port .DA 0 Dynamic
|
Socket.Src.Port .DA 0 Dynamic
|
||||||
Socket.Dst.Addr .BS 4
|
Socket.Dst.Addr .BS 4
|
||||||
Socket.Dst.Port .DA 0 Identifier
|
Socket.Dst.Port .DA 0 Identifier
|
||||||
.BS S.SOCKET-16
|
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
ICMP.Request .DA #S.ICMP.TYPE.ECHOREQ
|
ICMP.Request .DA #S.ICMP.TYPE.ECHOREQ
|
||||||
.DA #0 CODE
|
.DA #0 CODE
|
||||||
|
|
|
@ -171,6 +171,8 @@ S.SOCKET.SRC.ADDR .EQ 4
|
||||||
S.SOCKET.SRC.PORT .EQ 8
|
S.SOCKET.SRC.PORT .EQ 8
|
||||||
S.SOCKET.DST.ADDR .EQ 10
|
S.SOCKET.DST.ADDR .EQ 10
|
||||||
S.SOCKET.DST.PORT .EQ 14
|
S.SOCKET.DST.PORT .EQ 14
|
||||||
|
*
|
||||||
|
S.SOCKET.TEMPLATE .EQ 16
|
||||||
* Listen type Queue
|
* Listen type Queue
|
||||||
* Raw Type Queue
|
* Raw Type Queue
|
||||||
* Datagram type Queue
|
* Datagram type Queue
|
||||||
|
@ -185,8 +187,8 @@ S.SOCKET.SQ.OUTHEAD .EQ 20
|
||||||
S.SOCKET.SQ.OUTTAIL .EQ 22
|
S.SOCKET.SQ.OUTTAIL .EQ 22
|
||||||
S.SOCKET.SQ.INFREE .EQ 24
|
S.SOCKET.SQ.INFREE .EQ 24
|
||||||
S.SOCKET.SQ.OUTFREE .EQ 26
|
S.SOCKET.SQ.OUTFREE .EQ 26
|
||||||
*
|
S.SOCKET.SQ.INUSED .EQ 28
|
||||||
*
|
S.SOCKET.SQ.OUTUSED .EQ 30
|
||||||
S.SOCKET.SQ.SEQNUM .EQ 32
|
S.SOCKET.SQ.SEQNUM .EQ 32
|
||||||
S.SOCKET.SQ.ACKNUM .EQ 36
|
S.SOCKET.SQ.ACKNUM .EQ 36
|
||||||
*
|
*
|
||||||
|
|
|
@ -5,25 +5,86 @@ INC 1
|
||||||
AUTO 6
|
AUTO 6
|
||||||
.LIST OFF
|
.LIST OFF
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
* #FRM.NewA
|
* FRM.New
|
||||||
* ##In:
|
* In:
|
||||||
* A = S.IP.PROTOCOL.???
|
* Y,A = DataLen
|
||||||
* ##Out:
|
* X = S.IP.PROTOCOL.xxx
|
||||||
|
* Out:
|
||||||
* Y,A = Frame PTR
|
* Y,A = Frame PTR
|
||||||
* X = hMem
|
* X = hMem
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
FRM.NewA sta .2+1
|
FRM.NewIP stx .8+1
|
||||||
>PUSHWI K.ETH.FRAME.LEN
|
>STYA ZPDataOutLen
|
||||||
>PUSHBI S.MEM.F.INIT0
|
cpx #S.IP.PROTOCOL.ICMP
|
||||||
|
bne .1
|
||||||
|
lda #S.IP-2
|
||||||
|
bra .4
|
||||||
|
|
||||||
|
.1 cpx #S.IP.PROTOCOL.UDP
|
||||||
|
bne .2
|
||||||
|
lda #S.UDP-2
|
||||||
|
bra .4
|
||||||
|
|
||||||
|
.2 cpx #S.IP.PROTOCOL.TCP
|
||||||
|
bne *
|
||||||
|
|
||||||
|
lda #S.TCP-2
|
||||||
|
bra .4
|
||||||
|
|
||||||
|
.4 sta .5+1 save Header len for reset later
|
||||||
|
clc
|
||||||
|
adc ZPDataOutLen
|
||||||
|
sta ZPFrameOutLen
|
||||||
|
pha
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
adc ZPDataOutLen+1
|
||||||
|
sta ZPFrameOutLen+1
|
||||||
|
tax
|
||||||
|
|
||||||
|
pla
|
||||||
|
adc #2
|
||||||
|
tay
|
||||||
|
txa
|
||||||
|
adc #0
|
||||||
|
|
||||||
|
>PUSHYA
|
||||||
|
>PUSHBI 0
|
||||||
>SYSCALL GetMem
|
>SYSCALL GetMem
|
||||||
bcs .9
|
bcs .9
|
||||||
|
|
||||||
stx hFrameOut
|
stx hFrameOut
|
||||||
>STYA ZPFrameOutPtr
|
>STYA ZPFrameOutPtr
|
||||||
|
|
||||||
|
lda ZPFrameOutLen
|
||||||
|
sta (ZPFrameOutPtr)
|
||||||
|
ldy #1
|
||||||
|
lda ZPFrameOutLen+1
|
||||||
|
sta (ZPFrameOutPtr),y
|
||||||
|
|
||||||
|
iny
|
||||||
|
|
||||||
|
.5 ldx #$ff Self Modified, header length
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
|
||||||
|
.6 sta (ZPFrameOutPtr),y
|
||||||
|
iny
|
||||||
|
dex
|
||||||
|
bne .6
|
||||||
|
|
||||||
|
tya
|
||||||
|
* clc
|
||||||
|
adc ZPFrameOutPtr
|
||||||
|
sta ZPDataOutPtr
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
adc ZPFrameOutPtr+1
|
||||||
|
sta ZPDataOutPtr+1
|
||||||
|
|
||||||
lda DevFlags
|
lda DevFlags
|
||||||
and #S.DEVSTAT.NET.FLAGS.IPOFFLOAD
|
and #S.DEVSTAT.NET.FLAGS.IPOFFLOAD
|
||||||
bne .1
|
bne .7
|
||||||
|
|
||||||
ldy #S.ETH.ETHERTYPE
|
ldy #S.ETH.ETHERTYPE
|
||||||
lda /S.ETH.ETHERTYPE.IP
|
lda /S.ETH.ETHERTYPE.IP
|
||||||
|
@ -40,45 +101,39 @@ FRM.NewA sta .2+1
|
||||||
* lda #$0
|
* lda #$0
|
||||||
* sta (ZPFrameOutPtr),y
|
* sta (ZPFrameOutPtr),y
|
||||||
|
|
||||||
* ldy #S.IP.IDENTIFICATION
|
|
||||||
* sta (ZPFrameOutPtr),y
|
|
||||||
* inc
|
|
||||||
* iny
|
|
||||||
* sta (ZPFrameOutPtr),y
|
|
||||||
* dec
|
|
||||||
* ldy #S.IP.FRAGMENT.FLAGS
|
* ldy #S.IP.FRAGMENT.FLAGS
|
||||||
* sta (ZPFrameOutPtr),y
|
* sta (ZPFrameOutPtr),y
|
||||||
* iny
|
* iny
|
||||||
* sta (ZPFrameOutPtr),y
|
* sta (ZPFrameOutPtr),y
|
||||||
|
|
||||||
|
ldy #S.IP.IDENTIFICATION+1
|
||||||
|
|
||||||
|
lda IP.ID
|
||||||
|
ldx IP.ID+1
|
||||||
|
inc
|
||||||
|
bne .61
|
||||||
|
inx
|
||||||
|
stx IP.ID+1
|
||||||
|
|
||||||
|
.61 sta IP.ID
|
||||||
|
|
||||||
|
sta (ZPFrameOutPtr),y
|
||||||
|
dey
|
||||||
|
txa
|
||||||
|
sta (ZPFrameOutPtr),y
|
||||||
|
|
||||||
ldy #S.IP.TTL
|
ldy #S.IP.TTL
|
||||||
lda #K.IP.TTL
|
lda #K.IP.TTL
|
||||||
sta (ZPFrameOutPtr),y
|
sta (ZPFrameOutPtr),y
|
||||||
|
|
||||||
.1 ldy #S.IP.PROTOCOL
|
.7 ldy #S.IP.PROTOCOL
|
||||||
.2 lda #$ff
|
|
||||||
sta (ZPFrameOutPtr),y
|
|
||||||
|
|
||||||
|
.8 lda #$ff
|
||||||
|
sta (ZPFrameOutPtr),y
|
||||||
|
|
||||||
.9 rts
|
.9 rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
FRM.SendICMP >PUSHW ZPFrameOutLen
|
FRM.SendICMP
|
||||||
>PUSHWI S.ICMP.TYPE-2
|
|
||||||
|
|
||||||
ldy #S.ICMP.CHECKSUM
|
|
||||||
lda #0
|
|
||||||
sta (ZPFrameOutPtr),y
|
|
||||||
iny
|
|
||||||
sta (ZPFrameOutPtr),y
|
|
||||||
|
|
||||||
jsr IP.ComputeChecksum
|
|
||||||
|
|
||||||
phy
|
|
||||||
ldy #S.ICMP.CHECKSUM
|
|
||||||
sta (ZPFrameOutPtr),y
|
|
||||||
iny
|
|
||||||
pla
|
|
||||||
sta (ZPFrameOutPtr),y
|
|
||||||
|
|
||||||
bra FRM.SendIP
|
bra FRM.SendIP
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
|
@ -164,20 +219,25 @@ FRM.SendIP ldx #3 Copy SRC.IP even if IP offload
|
||||||
cmp #S.IP.PROTOCOL.TCP
|
cmp #S.IP.PROTOCOL.TCP
|
||||||
bne .3
|
bne .3
|
||||||
jsr TCP.ComputeChecksum
|
jsr TCP.ComputeChecksum
|
||||||
bra .4
|
bra .5
|
||||||
|
|
||||||
.3 cmp #S.IP.PROTOCOL.UDP
|
.3 cmp #S.IP.PROTOCOL.UDP
|
||||||
bne .4
|
bne .4
|
||||||
jsr UDP.ComputeChecksum
|
jsr UDP.ComputeChecksum
|
||||||
|
bra .5
|
||||||
|
|
||||||
.4 lda DevFlags
|
.4 cmp #S.IP.PROTOCOL.ICMP
|
||||||
and #S.DEVSTAT.NET.FLAGS.ARPOFFLOAD
|
|
||||||
bne .5
|
bne .5
|
||||||
|
jsr ICMP.ComputeChecksum
|
||||||
|
|
||||||
|
.5 lda DevFlags
|
||||||
|
and #S.DEVSTAT.NET.FLAGS.ARPOFFLOAD
|
||||||
|
bne .6
|
||||||
|
|
||||||
jsr IP.SetDestMAC
|
jsr IP.SetDestMAC
|
||||||
bcs FRM.Queue
|
bcs FRM.Queue
|
||||||
|
|
||||||
.5 >LDYA ZPFrameOutPtr
|
.6 >LDYA ZPFrameOutPtr
|
||||||
ldx #DEVMGR.WRITEBLOCK
|
ldx #DEVMGR.WRITEBLOCK
|
||||||
jsr NetDevJmp
|
jsr NetDevJmp
|
||||||
bcs FRM.Queue
|
bcs FRM.Queue
|
||||||
|
|
|
@ -132,6 +132,26 @@ ICMP.IN.ECHOREP jsr IP.FillTmpSocketSrcDst
|
||||||
>SYSCALL FreeMemA
|
>SYSCALL FreeMemA
|
||||||
rts
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
|
ICMP.ComputeChecksum
|
||||||
|
>PUSHW ZPFrameOutLen
|
||||||
|
>PUSHWI S.ICMP.TYPE-2
|
||||||
|
|
||||||
|
ldy #S.ICMP.CHECKSUM
|
||||||
|
lda #0
|
||||||
|
sta (ZPFrameOutPtr),y
|
||||||
|
iny
|
||||||
|
sta (ZPFrameOutPtr),y
|
||||||
|
|
||||||
|
jsr IP.ComputeChecksum
|
||||||
|
|
||||||
|
phy
|
||||||
|
ldy #S.ICMP.CHECKSUM
|
||||||
|
sta (ZPFrameOutPtr),y
|
||||||
|
iny
|
||||||
|
pla
|
||||||
|
sta (ZPFrameOutPtr),y
|
||||||
|
rts
|
||||||
|
*--------------------------------------
|
||||||
MAN
|
MAN
|
||||||
SAVE LIB/LIBTCPIP.S.ICMP
|
SAVE LIB/LIBTCPIP.S.ICMP
|
||||||
LOAD LIB/LIBTCPIP.S
|
LOAD LIB/LIBTCPIP.S
|
||||||
|
|
|
@ -6,6 +6,7 @@ AUTO 6
|
||||||
.LIST OFF
|
.LIST OFF
|
||||||
*/--------------------------------------
|
*/--------------------------------------
|
||||||
* #SKT.New
|
* #SKT.New
|
||||||
|
* Create a new socket
|
||||||
* ##In :
|
* ##In :
|
||||||
* PUSHW = PTR to S.SOCKET template
|
* PUSHW = PTR to S.SOCKET template
|
||||||
* ##Out :
|
* ##Out :
|
||||||
|
@ -13,7 +14,6 @@ AUTO 6
|
||||||
* X = hSocket
|
* X = hSocket
|
||||||
*\--------------------------------------
|
*\--------------------------------------
|
||||||
SKT.New >PULLW ZPTmpPtr1
|
SKT.New >PULLW ZPTmpPtr1
|
||||||
|
|
||||||
ldy #S.SOCKET.SRC.PORT+1
|
ldy #S.SOCKET.SRC.PORT+1
|
||||||
lda (ZPTmpPtr1),y
|
lda (ZPTmpPtr1),y
|
||||||
dey
|
dey
|
||||||
|
@ -74,7 +74,8 @@ SKT.New >PULLW ZPTmpPtr1
|
||||||
lda TmpOffset Did we found an empty slot ?
|
lda TmpOffset Did we found an empty slot ?
|
||||||
bmi .9
|
bmi .9
|
||||||
|
|
||||||
ldy #S.SOCKET-1
|
ldy #S.SOCKET.TEMPLATE-1
|
||||||
|
|
||||||
.7 lda (ZPTmpPtr1),y
|
.7 lda (ZPTmpPtr1),y
|
||||||
sta (ZPTmpPtr3),y
|
sta (ZPTmpPtr3),y
|
||||||
dey
|
dey
|
||||||
|
@ -116,6 +117,17 @@ SKT.New.TCP ldy #S.SOCKET.SQ.INFREE
|
||||||
lda /K.TCP.WSIZE
|
lda /K.TCP.WSIZE
|
||||||
sta (ZPTmpPtr3),y
|
sta (ZPTmpPtr3),y
|
||||||
|
|
||||||
|
lda #0
|
||||||
|
ldy #S.SOCKET.SQ.INUSED
|
||||||
|
sta (ZPTmpPtr3),y
|
||||||
|
iny
|
||||||
|
sta (ZPTmpPtr3),y
|
||||||
|
|
||||||
|
ldy #S.SOCKET.SQ.OUTUSED
|
||||||
|
sta (ZPTmpPtr3),y
|
||||||
|
iny
|
||||||
|
sta (ZPTmpPtr3),y
|
||||||
|
|
||||||
>PUSHW K.TCP.WSIZE
|
>PUSHW K.TCP.WSIZE
|
||||||
>PUSHBI 0
|
>PUSHBI 0
|
||||||
>SYSCALL GetMem
|
>SYSCALL GetMem
|
||||||
|
@ -136,7 +148,14 @@ SKT.New.TCP ldy #S.SOCKET.SQ.INFREE
|
||||||
|
|
||||||
clc
|
clc
|
||||||
.9 rts
|
.9 rts
|
||||||
*--------------------------------------
|
*/--------------------------------------
|
||||||
|
* #SKT.AcceptA
|
||||||
|
* Check for an incoming connection
|
||||||
|
* ##In :
|
||||||
|
* A = hListeningSocket
|
||||||
|
* ##Out :
|
||||||
|
* A = hSocket
|
||||||
|
*\--------------------------------------
|
||||||
SKT.AcceptA jsr SKT.GetA.I
|
SKT.AcceptA jsr SKT.GetA.I
|
||||||
bcs .9
|
bcs .9
|
||||||
ldy #S.SOCKET.SO
|
ldy #S.SOCKET.SO
|
||||||
|
@ -149,11 +168,14 @@ SKT.AcceptA jsr SKT.GetA.I
|
||||||
ldy #S.SOCKET.HQ.TAIL
|
ldy #S.SOCKET.HQ.TAIL
|
||||||
cmp (ZPPtrSKT),y Queue Empty
|
cmp (ZPPtrSKT),y Queue Empty
|
||||||
beq .9 CC
|
beq .9 CC
|
||||||
|
|
||||||
pha
|
pha
|
||||||
inc
|
inc
|
||||||
cmp #S.SOCKET.HQ.MAX
|
cmp #S.SOCKET.HQ.MAX
|
||||||
bne .1
|
bne .1
|
||||||
|
|
||||||
lda #0
|
lda #0
|
||||||
|
|
||||||
.1 sta (ZPPtrSKT),y
|
.1 sta (ZPPtrSKT),y
|
||||||
pla
|
pla
|
||||||
clc
|
clc
|
||||||
|
@ -166,39 +188,49 @@ SKT.AcceptA jsr SKT.GetA.I
|
||||||
.99 lda #ERR.SKT.BAD
|
.99 lda #ERR.SKT.BAD
|
||||||
sec
|
sec
|
||||||
.9 rts
|
.9 rts
|
||||||
*--------------------------------------
|
*/--------------------------------------
|
||||||
* SKT.Send
|
* #SKT.Send (DGRAM,STREAM,RAW)
|
||||||
*--------------------------------------
|
* Send block of data
|
||||||
|
* ##In :
|
||||||
|
* PUSHB = hSocket
|
||||||
|
* PUSHW = pBuf
|
||||||
|
* PUSHW = len
|
||||||
|
* ##Out :
|
||||||
|
* A = hFrame
|
||||||
|
*\--------------------------------------
|
||||||
SKT.Send >PULLW ZPDataInLen
|
SKT.Send >PULLW ZPDataInLen
|
||||||
>PULLW ZPDataInPtr
|
>PULLW ZPDataInPtr
|
||||||
>PULLB hSocket
|
>PULLB hSocket
|
||||||
|
|
||||||
jsr SKT.GetA.I
|
jsr SKT.GetA.I
|
||||||
bcs .9
|
bcs .9
|
||||||
|
|
||||||
and #S.SOCKET.SOCK.MASK
|
and #S.SOCKET.SOCK.MASK
|
||||||
cmp #S.SOCKET.SOCK.DGRAM
|
cmp #S.SOCKET.SOCK.DGRAM
|
||||||
beq SKT.SEND.UDP
|
beq SKT.SEND.UDP
|
||||||
|
|
||||||
cmp #S.SOCKET.SOCK.STREAM
|
cmp #S.SOCKET.SOCK.STREAM
|
||||||
bne .1
|
bne .1
|
||||||
|
|
||||||
|
ldy #S.SOCKET.SO
|
||||||
|
lda (ZPPtrSKT),y
|
||||||
|
and #S.SOCKET.SO.ACCEPTCONN
|
||||||
|
bne .99
|
||||||
jmp SKT.SEND.TCP
|
jmp SKT.SEND.TCP
|
||||||
|
|
||||||
.1 cmp #S.SOCKET.SOCK.RAW
|
.1 cmp #S.SOCKET.SOCK.RAW
|
||||||
bne .99
|
bne .99
|
||||||
jmp SKT.SEND.RAW
|
jmp SKT.SEND.RAW
|
||||||
|
|
||||||
.99 sec
|
.99 lda #ERR.SKT.BAD
|
||||||
|
sec
|
||||||
.9 rts
|
.9 rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
SKT.SEND.UDP lda #S.IP.PROTOCOL.UDP
|
SKT.SEND.UDP ldx #S.IP.PROTOCOL.UDP
|
||||||
jsr FRM.NewA
|
>LDYA ZPDataInLen
|
||||||
|
jsr FRM.NewIP
|
||||||
bcs .9
|
bcs .9
|
||||||
|
|
||||||
>LDAXI S.UDP-2
|
|
||||||
jsr SKT.SetFrameOutLenAX
|
|
||||||
|
|
||||||
>LDAXI S.UDP
|
|
||||||
jsr SKT.SetDataOutPtrAX
|
|
||||||
|
|
||||||
jsr SKT.SetFrameOutDstIP
|
jsr SKT.SetFrameOutDstIP
|
||||||
|
|
||||||
jsr SKT.SetFrameOutPorts
|
jsr SKT.SetFrameOutPorts
|
||||||
|
@ -209,6 +241,28 @@ SKT.SEND.UDP lda #S.IP.PROTOCOL.UDP
|
||||||
|
|
||||||
.9 rts
|
.9 rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
|
SKT.SEND.RAW ldy #S.SOCKET.RAW.PROTO
|
||||||
|
lda (ZPPtrSKT),y
|
||||||
|
|
||||||
|
tax
|
||||||
|
>LDYA ZPDataInLen
|
||||||
|
jsr FRM.NewIP
|
||||||
|
bcs .9
|
||||||
|
|
||||||
|
jsr SKT.SetFrameOutDstIP
|
||||||
|
|
||||||
|
jsr SKT.CopyDataInToOut
|
||||||
|
|
||||||
|
ldy #S.SOCKET.RAW.PROTO
|
||||||
|
lda (ZPPtrSKT),y
|
||||||
|
cmp #S.IP.PROTOCOL.ICMP
|
||||||
|
bne .1
|
||||||
|
jmp FRM.SendICMP
|
||||||
|
.1 jmp FRM.SendIP
|
||||||
|
|
||||||
|
.9 sec
|
||||||
|
rts
|
||||||
|
*--------------------------------------
|
||||||
SKT.SEND.TCP ldy #S.SOCKET.STATUS
|
SKT.SEND.TCP ldy #S.SOCKET.STATUS
|
||||||
lda (ZPPtrSKT),y
|
lda (ZPPtrSKT),y
|
||||||
and #S.SOCKET.STATUS.MASK
|
and #S.SOCKET.STATUS.MASK
|
||||||
|
@ -328,32 +382,6 @@ SKT.SEND.TCP ldy #S.SOCKET.STATUS
|
||||||
.91 lda #MLI.ERR.VOLFULL
|
.91 lda #MLI.ERR.VOLFULL
|
||||||
sec
|
sec
|
||||||
rts
|
rts
|
||||||
*--------------------------------------
|
|
||||||
SKT.SEND.RAW ldy #S.SOCKET.RAW.PROTO
|
|
||||||
lda (ZPPtrSKT),y
|
|
||||||
|
|
||||||
jsr FRM.NewA
|
|
||||||
bcs .9
|
|
||||||
|
|
||||||
>LDAXI S.IP-2
|
|
||||||
jsr SKT.SetFrameOutLenAX
|
|
||||||
|
|
||||||
>LDAXI S.IP
|
|
||||||
jsr SKT.SetDataOutPtrAX
|
|
||||||
|
|
||||||
jsr SKT.SetFrameOutDstIP
|
|
||||||
|
|
||||||
jsr SKT.CopyDataInToOut
|
|
||||||
|
|
||||||
ldy #S.SOCKET.RAW.PROTO
|
|
||||||
lda (ZPPtrSKT),y
|
|
||||||
cmp #S.IP.PROTOCOL.ICMP
|
|
||||||
bne .1
|
|
||||||
jmp FRM.SendICMP
|
|
||||||
.1 jmp FRM.SendIP
|
|
||||||
|
|
||||||
.9 sec
|
|
||||||
rts
|
|
||||||
*/--------------------------------------
|
*/--------------------------------------
|
||||||
* #SKT.RcvdA (DGRAM,RAW)
|
* #SKT.RcvdA (DGRAM,RAW)
|
||||||
* ##In :
|
* ##In :
|
||||||
|
@ -554,8 +582,14 @@ SKT.Rcvd.1 jsr SKT.GetCopy
|
||||||
.90 lda #0
|
.90 lda #0
|
||||||
.9 sec A=0, no data
|
.9 sec A=0, no data
|
||||||
rts
|
rts
|
||||||
*--------------------------------------
|
*/--------------------------------------
|
||||||
SKT.CLOSEA cmp #K.SKTTABLE.SIZE
|
* #SKT.CloseA
|
||||||
|
* Close socket
|
||||||
|
* ##In :
|
||||||
|
* A = hSocket
|
||||||
|
* ##Out :
|
||||||
|
*\--------------------------------------
|
||||||
|
SKT.CloseA cmp #K.SKTTABLE.SIZE
|
||||||
bcs SKT.GetA.9
|
bcs SKT.GetA.9
|
||||||
|
|
||||||
jsr SKT.GetA.I
|
jsr SKT.GetA.I
|
||||||
|
@ -579,7 +613,14 @@ SKT.CLOSEA cmp #K.SKTTABLE.SIZE
|
||||||
sta (ZPPtrSKT)
|
sta (ZPPtrSKT)
|
||||||
clc
|
clc
|
||||||
.9 rts
|
.9 rts
|
||||||
*--------------------------------------
|
*/--------------------------------------
|
||||||
|
* #SKT.GetA
|
||||||
|
* Get Ptr to socket
|
||||||
|
* ##In :
|
||||||
|
* A = hSocket
|
||||||
|
* ##Out :
|
||||||
|
* Y,A = pS.SOCKET
|
||||||
|
*\--------------------------------------
|
||||||
SKT.GetA cmp #K.SKTTABLE.SIZE
|
SKT.GetA cmp #K.SKTTABLE.SIZE
|
||||||
bcs SKT.GetA.9
|
bcs SKT.GetA.9
|
||||||
|
|
||||||
|
@ -609,14 +650,26 @@ SKT.GetA.I pha
|
||||||
.2 dex
|
.2 dex
|
||||||
bne .1
|
bne .1
|
||||||
|
|
||||||
lda (ZPPtrSKT)
|
.8 lda (ZPPtrSKT)
|
||||||
beq SKT.GetA.9
|
beq SKT.GetA.9
|
||||||
|
|
||||||
.8 rts CC
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
SKT.GetA.9 lda #ERR.SKT.BAD
|
SKT.GetA.9 lda #ERR.SKT.BAD
|
||||||
sec
|
sec
|
||||||
rts
|
rts
|
||||||
|
*/--------------------------------------
|
||||||
|
* #SKT.GetTable
|
||||||
|
* Get socket table
|
||||||
|
* ##In :
|
||||||
|
* ##Out :
|
||||||
|
* Y,A = pS.SOCKET
|
||||||
|
*\--------------------------------------
|
||||||
|
SKT.GetTable lda hSocketTable
|
||||||
|
>SYSCALL GetMemPtrA
|
||||||
|
clc
|
||||||
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
* ZPPtrSKT -> actual socket
|
* ZPPtrSKT -> actual socket
|
||||||
* A = hSocket or hFrame
|
* A = hSocket or hFrame
|
||||||
|
@ -648,11 +701,6 @@ SKT.AddToQueueA sta .2+1
|
||||||
.9 sec
|
.9 sec
|
||||||
rts
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
SKT.GETTABLE lda hSocketTable
|
|
||||||
>SYSCALL GetMemPtrA
|
|
||||||
clc
|
|
||||||
rts
|
|
||||||
*--------------------------------------
|
|
||||||
SKT.AddToQueueS
|
SKT.AddToQueueS
|
||||||
clc
|
clc
|
||||||
rts
|
rts
|
||||||
|
@ -674,28 +722,6 @@ SKT.PutCopy ldy #S.SOCKET-1
|
||||||
bpl .1
|
bpl .1
|
||||||
rts
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
SKT.SetFrameOutLenAX
|
|
||||||
clc
|
|
||||||
adc ZPDataInLen
|
|
||||||
sta (ZPFrameOutPtr)
|
|
||||||
sta ZPFrameOutLen
|
|
||||||
|
|
||||||
txa
|
|
||||||
adc ZPDataInLen+1
|
|
||||||
ldy #1
|
|
||||||
sta (ZPFrameOutPtr),y
|
|
||||||
sta ZPFrameOutLen+1
|
|
||||||
rts
|
|
||||||
*--------------------------------------
|
|
||||||
SKT.SetDataOutPtrAX
|
|
||||||
clc
|
|
||||||
adc ZPFrameOutPtr
|
|
||||||
sta ZPDataOutPtr
|
|
||||||
txa
|
|
||||||
adc ZPFrameOutPtr+1
|
|
||||||
sta ZPDataOutPtr+1
|
|
||||||
rts
|
|
||||||
*--------------------------------------
|
|
||||||
SKT.SetFrameOutDstIP
|
SKT.SetFrameOutDstIP
|
||||||
ldy #S.SOCKET.DST.ADDR
|
ldy #S.SOCKET.DST.ADDR
|
||||||
ldx #4
|
ldx #4
|
||||||
|
@ -738,21 +764,29 @@ SKT.SetFrameOutPorts
|
||||||
iny
|
iny
|
||||||
txa
|
txa
|
||||||
sta (ZPFrameOutPtr),y
|
sta (ZPFrameOutPtr),y
|
||||||
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
SKT.CopyDataInToOut
|
SKT.CopyDataInToOut
|
||||||
|
lda ZPDataInPtr+1
|
||||||
|
pha
|
||||||
|
lda ZPDataOutPtr+1
|
||||||
|
pha
|
||||||
|
|
||||||
lda ZPDataInLen
|
lda ZPDataInLen
|
||||||
eor #$ff
|
eor #$ff
|
||||||
sta ZPDataInLen
|
tax
|
||||||
lda ZPDataInLen+1
|
lda ZPDataInLen+1
|
||||||
eor #$ff
|
eor #$ff
|
||||||
tax
|
pha
|
||||||
|
|
||||||
ldy #0
|
ldy #0
|
||||||
|
|
||||||
.1 inc ZPDataInLen
|
.1 inx
|
||||||
bne .2
|
bne .2
|
||||||
inx
|
pla
|
||||||
|
inc
|
||||||
beq .9
|
beq .9
|
||||||
|
pha
|
||||||
|
|
||||||
.2 lda (ZPDataInPtr),y
|
.2 lda (ZPDataInPtr),y
|
||||||
sta (ZPDataOutPtr),y
|
sta (ZPDataOutPtr),y
|
||||||
|
@ -761,8 +795,13 @@ SKT.CopyDataInToOut
|
||||||
inc ZPDataInPtr+1
|
inc ZPDataInPtr+1
|
||||||
inc ZPDataOutPtr+1
|
inc ZPDataOutPtr+1
|
||||||
bne .1
|
bne .1
|
||||||
.9 rts
|
|
||||||
|
|
||||||
|
.9 pla
|
||||||
|
sta ZPDataOutPtr+1
|
||||||
|
pla
|
||||||
|
sta ZPDataInPtr+1
|
||||||
|
rts
|
||||||
|
*--------------------------------------
|
||||||
MAN
|
MAN
|
||||||
SAVE LIB/LIBTCPIP.S.SKT
|
SAVE LIB/LIBTCPIP.S.SKT
|
||||||
LOAD LIB/LIBTCPIP.S
|
LOAD LIB/LIBTCPIP.S
|
||||||
|
|
|
@ -223,6 +223,29 @@ TCP.IN.JMP.TIMEWT
|
||||||
clc
|
clc
|
||||||
rts
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
|
TCP.OUT jsr SKT.GetCopy
|
||||||
|
|
||||||
|
lda SKT.TmpCache+S.SOCKET.SQ.OUTUSED+1
|
||||||
|
bne .1
|
||||||
|
ldy SKT.TmpCache+S.SOCKET.SQ.OUTUSED
|
||||||
|
beq .8 nothing to send....go check if ACK pending
|
||||||
|
|
||||||
|
.1 cpy #K.TCP.MSS
|
||||||
|
pha
|
||||||
|
sbc /K.TCP.MSS OUTDATA > MSS ?
|
||||||
|
pla
|
||||||
|
bcs .2 no....get data len
|
||||||
|
|
||||||
|
>LDYAI K.TCP.MSS yes gert only MSS
|
||||||
|
|
||||||
|
.2 >STYA ZPDataOutLen
|
||||||
|
|
||||||
|
|
||||||
|
jmp FRM.SendTCP
|
||||||
|
|
||||||
|
.8 clc
|
||||||
|
rts
|
||||||
|
*--------------------------------------
|
||||||
TCP.UpdateSktAckNum
|
TCP.UpdateSktAckNum
|
||||||
ldy #S.SOCKET.SQ.ACKNUM+3
|
ldy #S.SOCKET.SQ.ACKNUM+3
|
||||||
lda (ZPPtrSKT),y
|
lda (ZPPtrSKT),y
|
||||||
|
|
|
@ -123,9 +123,6 @@ LIB.LOAD lda bFirstLoad
|
||||||
jsr ARP.CLEAR
|
jsr ARP.CLEAR
|
||||||
jsr DNS.CLEAR
|
jsr DNS.CLEAR
|
||||||
|
|
||||||
>LDYAI K.DYNPORT.START
|
|
||||||
>STYA DYNPORT.LAST
|
|
||||||
|
|
||||||
>PUSHWI K.SKTTABLE.SIZE*S.SOCKET
|
>PUSHWI K.SKTTABLE.SIZE*S.SOCKET
|
||||||
>PUSHBI S.MEM.F.INIT0
|
>PUSHBI S.MEM.F.INIT0
|
||||||
>SYSCALL GetMem
|
>SYSCALL GetMem
|
||||||
|
@ -138,7 +135,12 @@ LIB.LOAD lda bFirstLoad
|
||||||
.8 clc
|
.8 clc
|
||||||
.9 rts
|
.9 rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
LIB.UNLOAD clc
|
LIB.UNLOAD lda hSocketTable
|
||||||
|
beq .8
|
||||||
|
|
||||||
|
>SYSCALL FreeMemA
|
||||||
|
|
||||||
|
.8 clc
|
||||||
rts
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
POLL ldx #DEVMGR.READBLOCK
|
POLL ldx #DEVMGR.READBLOCK
|
||||||
|
@ -294,7 +296,6 @@ DNS.SOCKET.SA .BS 4
|
||||||
DNS.SOCKET.SP .DA 0 Dynamic
|
DNS.SOCKET.SP .DA 0 Dynamic
|
||||||
DNS.SOCKET.DA .BS 4
|
DNS.SOCKET.DA .BS 4
|
||||||
DNS.SOCKET.DP .DA UDP.PORT.DNS
|
DNS.SOCKET.DP .DA UDP.PORT.DNS
|
||||||
.BS S.SOCKET-16
|
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
DNS.MSG.LEN .BS 2
|
DNS.MSG.LEN .BS 2
|
||||||
DNS.MSG
|
DNS.MSG
|
||||||
|
@ -317,7 +318,7 @@ FRM.QUEUE.Retry .BS K.FRMQUEUE.SIZE
|
||||||
bFirstLoad .DA #0
|
bFirstLoad .DA #0
|
||||||
hSocketTable .BS 1
|
hSocketTable .BS 1
|
||||||
DevFlags .BS 1
|
DevFlags .BS 1
|
||||||
DYNPORT.LAST .BS 2
|
DYNPORT.LAST .DA K.DYNPORT.START
|
||||||
hDNSSocket1 .BS 1
|
hDNSSocket1 .BS 1
|
||||||
hDNSSocket2 .BS 1
|
hDNSSocket2 .BS 1
|
||||||
DNS.HostNameLen .BS 1
|
DNS.HostNameLen .BS 1
|
||||||
|
@ -333,6 +334,7 @@ hSocket .BS 1
|
||||||
TmpOffset .BS 2
|
TmpOffset .BS 2
|
||||||
HST.DecStr .BS 4
|
HST.DecStr .BS 4
|
||||||
HST.IP .BS 5
|
HST.IP .BS 5
|
||||||
|
IP.ID .BS 2
|
||||||
IP.CHECKSUM .BS 4
|
IP.CHECKSUM .BS 4
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
MAN
|
MAN
|
||||||
|
|
|
@ -106,7 +106,6 @@ CS.INIT >LDYA L.LIBTCPIP
|
||||||
CS.RUN >PUSHW L.Socket
|
CS.RUN >PUSHW L.Socket
|
||||||
|
|
||||||
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.NEW
|
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.NEW
|
||||||
|
|
||||||
bcc .1
|
bcc .1
|
||||||
jmp CS.RUN.KO
|
jmp CS.RUN.KO
|
||||||
|
|
||||||
|
@ -119,10 +118,11 @@ CS.RUN >PUSHW L.Socket
|
||||||
|
|
||||||
jsr Init.Timeout
|
jsr Init.Timeout
|
||||||
|
|
||||||
CS.RUN.SDISC >PUSHWI DHCP.DISC.LEN
|
CS.RUN.SDISC ldy #hSocket
|
||||||
|
>PUSHB (pData),y
|
||||||
>PUSHW L.DHCP.DISC
|
>PUSHW L.DHCP.DISC
|
||||||
jsr CS.RUN.SKT.SEND
|
>PUSHWI DHCP.DISC.LEN
|
||||||
|
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND
|
||||||
bcc .1
|
bcc .1
|
||||||
jmp CS.RUN.KO
|
jmp CS.RUN.KO
|
||||||
|
|
||||||
|
@ -155,9 +155,11 @@ CS.RUN.SREQ ldx #3
|
||||||
>LDYA L.MSG.CFG2
|
>LDYA L.MSG.CFG2
|
||||||
>SYSCALL CPrintFYA
|
>SYSCALL CPrintFYA
|
||||||
|
|
||||||
>PUSHWI DHCP.REQ.LEN
|
ldy #hSocket
|
||||||
|
>PUSHB (pData),y
|
||||||
>PUSHW L.DHCP.REQ
|
>PUSHW L.DHCP.REQ
|
||||||
jsr CS.RUN.SKT.SEND
|
>PUSHWI DHCP.REQ.LEN
|
||||||
|
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND
|
||||||
bcs CS.RUN.KO
|
bcs CS.RUN.KO
|
||||||
|
|
||||||
lda #S.IPCFG.STATUS.SREQ
|
lda #S.IPCFG.STATUS.SREQ
|
||||||
|
@ -207,11 +209,6 @@ CS.RUN.KO pha
|
||||||
sec
|
sec
|
||||||
rts
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
CS.RUN.SKT.SEND ldy #hSocket
|
|
||||||
>PUSHB (pData),y
|
|
||||||
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND
|
|
||||||
rts
|
|
||||||
*--------------------------------------
|
|
||||||
CS.RUN.SKT.RCVD ldy #hSocket
|
CS.RUN.SKT.RCVD ldy #hSocket
|
||||||
lda (pData),y
|
lda (pData),y
|
||||||
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.RCVDA
|
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.RCVDA
|
||||||
|
@ -243,7 +240,7 @@ CS.DOEVENT lda (pEvent)
|
||||||
CS.QUIT ldy #hSocket
|
CS.QUIT ldy #hSocket
|
||||||
lda (pData),y
|
lda (pData),y
|
||||||
|
|
||||||
* >LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA
|
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA
|
||||||
|
|
||||||
lda hLIBTCPIP
|
lda hLIBTCPIP
|
||||||
>SYSCALL UnloadLibA
|
>SYSCALL UnloadLibA
|
||||||
|
@ -449,7 +446,6 @@ Socket .DA #S.SOCKET.SOCK.DGRAM
|
||||||
.DA UDP.PORT.DHCPC Socket.Src.Port
|
.DA UDP.PORT.DHCPC Socket.Src.Port
|
||||||
.HS FF.FF.FF.FF Socket.Dst.Addr
|
.HS FF.FF.FF.FF Socket.Dst.Addr
|
||||||
.DA UDP.PORT.DHCPS Socket.Dst.Port
|
.DA UDP.PORT.DHCPS Socket.Dst.Port
|
||||||
.BS S.SOCKET-16
|
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
DHCP.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS
|
DHCP.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS
|
||||||
DHCP.DISC.XID .BS 4
|
DHCP.DISC.XID .BS 4
|
||||||
|
|
|
@ -12,6 +12,7 @@ AUTO 6
|
||||||
.INB /A2OSX.DEV/INC/A2OSX.I
|
.INB /A2OSX.DEV/INC/A2OSX.I
|
||||||
.INB /A2OSX.DEV/INC/IO.I
|
.INB /A2OSX.DEV/INC/IO.I
|
||||||
.INB /A2OSX.DEV/INC/PRODOS.I
|
.INB /A2OSX.DEV/INC/PRODOS.I
|
||||||
|
.INB /A2OSX.DEV/INC/MLI.ERR.I
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
TmpPtr1 .EQ $0 for X.PRINTF.S
|
TmpPtr1 .EQ $0 for X.PRINTF.S
|
||||||
ZPPtr1 .EQ ZPKERNEL Temp Ptrs for use in very limited scope
|
ZPPtr1 .EQ ZPKERNEL Temp Ptrs for use in very limited scope
|
||||||
|
|
|
@ -1,15 +1,7 @@
|
||||||
*** Auto generated by docgen.cmd ***
|
*** Auto generated by docgen.cmd ***
|
||||||
|
|
||||||
#FRM.NewA
|
|
||||||
|
|
||||||
##In:
|
|
||||||
+ A = S.IP.PROTOCOL.???
|
|
||||||
|
|
||||||
##Out:
|
|
||||||
* Y,A = Frame PTR
|
|
||||||
* X = hMem
|
|
||||||
|
|
||||||
#SKT.New
|
#SKT.New
|
||||||
|
+ Create a new socket
|
||||||
|
|
||||||
##In :
|
##In :
|
||||||
+ PUSHW = PTR to S.SOCKET template
|
+ PUSHW = PTR to S.SOCKET template
|
||||||
|
@ -17,3 +9,87 @@
|
||||||
##Out :
|
##Out :
|
||||||
+ YA = PTR to new S.SOCKET
|
+ YA = PTR to new S.SOCKET
|
||||||
+ X = hSocket
|
+ X = hSocket
|
||||||
|
|
||||||
|
#SKT.AcceptA
|
||||||
|
+ Check for an incoming connection
|
||||||
|
|
||||||
|
##In :
|
||||||
|
+ A = hListeningSocket
|
||||||
|
|
||||||
|
##Out :
|
||||||
|
+ A = hSocket
|
||||||
|
|
||||||
|
#SKT.Send (DGRAM,STREAM,RAW)
|
||||||
|
+ Send block of data
|
||||||
|
|
||||||
|
##In :
|
||||||
|
+ PUSHB = hSocket
|
||||||
|
+ PUSHW = pBuf
|
||||||
|
+ PUSHW = len
|
||||||
|
|
||||||
|
##Out :
|
||||||
|
+ A = hFrame
|
||||||
|
|
||||||
|
#SKT.RcvdA (DGRAM,RAW)
|
||||||
|
|
||||||
|
##In :
|
||||||
|
+ A = hSocket
|
||||||
|
|
||||||
|
##Out :
|
||||||
|
+ A = hFrame
|
||||||
|
|
||||||
|
#SKT.GetCA (STREAM)
|
||||||
|
+ Read a Char From Stream in A
|
||||||
|
|
||||||
|
##In :
|
||||||
|
+ A = hSocket
|
||||||
|
|
||||||
|
##Out :
|
||||||
|
+ A = char
|
||||||
|
|
||||||
|
#SKT.GetS (STREAM)
|
||||||
|
+ Read a CR terminated Line in pBuf
|
||||||
|
|
||||||
|
##In :
|
||||||
|
+ PUSHB = hSocket
|
||||||
|
+ PUSHW = pBuf
|
||||||
|
+ PUSHW = len
|
||||||
|
|
||||||
|
##Out :
|
||||||
|
+ Y,A = bytes read
|
||||||
|
|
||||||
|
#SKT.Rcvd (STREAM)
|
||||||
|
+ Read data in pBuf
|
||||||
|
|
||||||
|
##In :
|
||||||
|
+ PUSHB = hSocket
|
||||||
|
+ PUSHW = pBuf
|
||||||
|
+ PUSHW = len
|
||||||
|
|
||||||
|
##Out :
|
||||||
|
+ Y,A = bytes transfered
|
||||||
|
|
||||||
|
#SKT.CloseA
|
||||||
|
+ Close socket
|
||||||
|
|
||||||
|
##In :
|
||||||
|
+ A = hSocket
|
||||||
|
|
||||||
|
##Out :
|
||||||
|
|
||||||
|
#SKT.GetA
|
||||||
|
+ Get Ptr to socket
|
||||||
|
|
||||||
|
##In :
|
||||||
|
+ A = hSocket
|
||||||
|
|
||||||
|
##Out :
|
||||||
|
+ Y,A = pS.SOCKET
|
||||||
|
|
||||||
|
#SKT.GetTable
|
||||||
|
+ Get socket table
|
||||||
|
|
||||||
|
##In :
|
||||||
|
|
||||||
|
##Out :
|
||||||
|
+ Y,A = pS.SOCKET
|
||||||
|
|
Loading…
Reference in New Issue
Block a user