A2osX/LIB/LIBTCPIP.S.txt
2020-10-29 13:55:55 +01:00

400 lines
9.0 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF lib/libtcpip
*--------------------------------------
AUXPIPE .EQ 1
*--------------------------------------
.MA ADC16
clc
lda ]1
adc ]2
sta ]1
lda ]1+1
adc ]2+1
sta ]1+1
.EM
*--------------------------------------
.MA SBC16
sec
lda ]1
sbc ]2
sta ]1
lda ]1+1
sbc ]2+1
sta ]1+1
.EM
*--------------------------------------
.INB inc/macros.i
.DO AUXPIPE=1
.INB inc/io.i
.FIN
.INB inc/a2osx.i
.INB inc/mli.e.i
.INB inc/nic.i
.INB inc/eth.i
.INB inc/lib.net.i
.INB inc/libtcpip.i
*--------------------------------------
ZPFrameInPtr .EQ ZPLIB
ZPFrameInLen .EQ ZPLIB+2
ZPDataInPtr .EQ ZPLIB+4
ZPDataInLen .EQ ZPLIB+6
ZPFrameOutPtr .EQ ZPLIB+8
ZPFrameOutLen .EQ ZPLIB+10
ZPDataOutPtr .EQ ZPLIB+12
ZPDataOutLen .EQ ZPLIB+14
ZPTmpPtr1 .EQ ZPLIB+16
ZPPtrSKT .EQ ZPLIB+18
ZPCode .EQ ZPLIB+20 12 bytes
ZPPtrIP .EQ ZPLIB+20
ZPPtrMAC .EQ ZPLIB+22
ZPPtrDNS .EQ ZPLIB+24
ZPCachePtr .EQ ZPLIB+26
IP.CHECKSUM .EQ ZPLIB+28
IP.CHECKSUM.TMP .EQ ZPLIB+30
TmpDWord .EQ ZPLIB+28
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA 0
.DA CS.END-CS.START
.DA 0
.DA 0
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA LIB.LOAD
.DA LIB.UNLOAD
.DA CFG.SET
.DA CFG.GET
.DA INCOMING
.DA PULSE
.DA ARP.CLEAR
.DA ARP.QUERY
.DA ARP.ADD
.DA ARP.GetCACHE
.DA DNS.CLEAR
.DA DNS.QUERY
.DA DNS.ADD
.DA DNS.GetCACHE
.DA HST.GETBYNAME
.DA HST.GETBYADDR
.DA SKT.Socket
.DA SKT.Bind
.DA SKT.Connect
.DA SKT.Listen
.DA SKT.Accept
.DA SKT.Shutdown
.DA SKT.Read
.DA SKT.Write
.DA SKT.Recv
.DA SKT.Send
.DA SKT.RecvFrom
.DA SKT.SendTo
.DA SKT.getsockopt
.DA SKT.setsockopt
.DA SKT.EOF
.DA SKT.GetTable
*--------------------------------------
L.IPCFG .DA IPCFG
L.ARP.REQ .DA ARP.REQ
L.ARP.REP .DA ARP.REP
L.SA.LOCAL .DA SA.LOCAL
L.SA.REMOTE .DA SA.REMOTE
L.DNS.MSG .DA DNS.MSG
L.DNS.CACHE .DA DNS.CACHE
L.SKT.Table .DA SKT.Table
L.HST.SScanF .DA HST.SScanF
L.IOCTL .DA IOCTL
L.DCB.NIC .DA DCB.NIC
J.TCP.IN .DA TCP.IN.JMP.CLOSED
.DA TCP.IN.JMP.OPENED
.DA TCP.IN.JMP.LISTEN
.DA TCP.IN.JMP.SYNSENT
.DA TCP.IN.JMP.SYNRCVD
.DA TCP.IN.JMP.ESTBLSH
.DA TCP.IN.JMP.CLWAIT
.DA TCP.IN.JMP.LASTACK
.DA TCP.IN.JMP.FINWT1
.DA TCP.IN.JMP.FINWT2
.DA TCP.IN.JMP.CLOSING
.DA TCP.IN.JMP.TIMEWT
J.SKT.Socket .DA SKT.Socket.RAW
.DA SKT.Socket.DGRAM
.DA SKT.Socket.SEQPKT
.DA SKT.Socket.STREAM
J.SKT.connect .DA SKT.connect.RAW
.DA SKT.connect.DGRAM
.DA SKT.connect.SEQPKT
.DA SKT.connect.STREAM
J.SKT.send .DA SKT.send.RAW
.DA SKT.send.DGRAM
.DA SKT.send.SEQPKT
.DA SKT.send.STREAM
.DA 0
*--------------------------------------
LIB.LOAD ldx RefCount
bne .8
sta FD.DSOCK+S.FD.DSOCK.IOHANDLER
sta FD.SSOCK+S.FD.SSOCK.IOHANDLER
>LDYAI K.ARPCACHE.SIZE*S.ARPCACHE
>SYSCALL2 GetMem
bcs .9
>STYA ZPCachePtr
stx hARPCache
jsr ARP.Clear.I
>PUSHBI 0 no protocol
lda #S.SOCKET.T.DGRAM
jsr SKT.Socket
bcs .9
sta hDNSSocket
>PUSHW L.SA.LOCAL IP/PORT=All ZERO
lda hDNSSocket
jsr SKT.Bind
>LDYAI UDP.PORT.DNS
>STYA SA.REMOTE+S.SOCKADDR.PORT
>PUSHW L.SA.REMOTE IP=All ZERO
lda hDNSSocket
jsr SKT.Connect
jsr DNS.CLEAR
.8 inc RefCount
clc
.9 rts
*--------------------------------------
LIB.UNLOAD dec RefCount
bne .8
lda hDNSSocket
beq .1
jsr SKT.Shutdown
.1 lda hARPCache
beq .8
>SYSCALL2 freemem
.8 clc
rts
*--------------------------------------
INCOMING sta hFrameIn
>PULLW ZPTmpPtr1
ldy #S.IOCTL.BUFPTR+3
ldx #3
.1 lda (ZPTmpPtr1),y Get Frame Ptr & Len
sta ZPFrameInPtr,x
dey
dex
bpl .1
ldy #S.ETH.EII.TYPE
lda (ZPFrameInPtr),y
cmp /S.ETH.EII.TYPE.IP
bne .9
iny
lda (ZPFrameInPtr),y
cmp #S.ETH.EII.TYPE.ARP
beq .2
cmp #S.ETH.EII.TYPE.IP
beq .3
.9 sec
rts
.2 jmp ARP.IN
.3 jmp IP.IN
*--------------------------------------
* A = S.EVT.F
* Expire = every sec
* Retry = every 100 msec
*--------------------------------------
PULSE and #S.EVT.F.T1SEC
beq .1
jsr ARP.EXPIRE every sec
jsr DNS.EXPIRE
.1 jsr FRM.RETRY every 100ms
jsr DNS.POLL
jmp TCP.SENDCLOSE
*--------------------------------------
GetDynPort inc DYNPORT.LAST
bne .1
inc DYNPORT.LAST+1
lda DYNPORT.LAST
cmp #K.DYNPORT.END
lda DYNPORT.LAST+1
sbc /K.DYNPORT.END
bcs .1
lda #K.DYNPORT.START
ldx /K.DYNPORT.START
sta DYNPORT.LAST
stx DYNPORT.LAST+1
rts CC
.1 lda DYNPORT.LAST
ldx DYNPORT.LAST+1
clc
rts
*--------------------------------------
.INB usr/src/lib/libtcpip.s.arp
.INB usr/src/lib/libtcpip.s.cfg
.INB usr/src/lib/libtcpip.s.dns
.INB usr/src/lib/libtcpip.s.frm
.INB usr/src/lib/libtcpip.s.hst
.INB usr/src/lib/libtcpip.s.icmp
.INB usr/src/lib/libtcpip.s.ip
.INB usr/src/lib/libtcpip.s.skt
.INB usr/src/lib/libtcpip.s.tcp
*--------------------------------------
CS.END
*--------------------------------------
.DO AUXPIPE=1
ZP.CODE sta SETREADAUX
lda (ZPTmpPtr1),y
sta CLRREADAUX
rts
ZP.CODE.Len .EQ *-ZP.CODE
.FIN
*--------------------------------------
SA.LOCAL .DA #AF.INET S.SOCKADDR.AF
.BS 1
.BS 4 S.SOCKADDR.ADDR
.BS 2 S.SOCKADDR.PORT
*--------------------------------------
SA.REMOTE .DA #AF.INET S.SOCKADDR.AF
.BS 1
.BS 4 S.SOCKADDR.ADDR
.BS 2 S.SOCKADDR.PORT
*--------------------------------------
FD.DSOCK .DA #S.FD.T.DSOCK
.DA #0 S.FD.HANDLER
.BS 1 S.FD.DSOCK.IOHANDLER
.DA #0 S.FD.DSOCK.OPEN
.DA #LIBTCPIP.shutdown
.DA #LIBTCPIP.Recv
.DA #LIBTCPIP.Send
.DA #0 S.FD.DSOCK.STATUS
*--------------------------------------
.DA #AF.INET S.SOCKET.AF
.BS 1 S.SOCKET.T
.BS 1 S.SOCKET.PROTO
FD.DSOCK.SIZE .EQ *-FD.DSOCK
*--------------------------------------
FD.SSOCK .DA #S.FD.T.SSOCK
.DA #0 S.FD.HANDLER
.BS 1 S.FD.SSOCK.IOHANDLER
.DA #0 S.FD.SSOCK.OPEN
.DA #LIBTCPIP.shutdown
.DA #LIBTCPIP.Read
.DA #LIBTCPIP.Write
.DA #LIBTCPIP.EOF
*--------------------------------------
.DA #AF.INET S.SOCKET.AF
.DA #S.SOCKET.T.STREAM
.DA #S.IP.PROTOCOL.TCP
FD.SSOCK.SIZE .EQ *-FD.SSOCK
*--------------------------------------
IOCTL .BS S.IOCTL
DCB.NIC .BS S.DCB.NIC
IPCFG .BS S.IPCFG
DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE
*--------------------------------------
ARP.REQ .HS FFFFFFFFFFFF S.ETH.DSTMAC
ARP.REQ.SRCMAC .BS 6
ARP.REQ.ETYPE .DA /S.ETH.EII.TYPE.ARP
.DA #S.ETH.EII.TYPE.ARP
.HS 0001.0800.06.04
ARP.REQ.OP .DA /S.ARP.OPERATION.REQ
.DA #S.ARP.OPERATION.REQ
ARP.REQ.SHA .BS 6
ARP.REQ.SPA .BS 4
ARP.REQ.THA .BS 6
ARP.REQ.TPA .BS 4
*--------------------------------------
ARP.REP .EQ *
ARP.REP.DSTMAC .BS 6
ARP.REP.SRCMAC .BS 6
ARP.REP.ETYPE .DA /S.ETH.EII.TYPE.ARP
.DA #S.ETH.EII.TYPE.ARP
.HS 0001.0800.06.04
ARP.REP.OP .DA /S.ARP.OPERATION.REP
.DA #S.ARP.OPERATION.REP
ARP.REP.SHA .BS 6
ARP.REP.SPA .BS 4
ARP.REP.THA .BS 6
ARP.REP.TPA .BS 4
*--------------------------------------
DNS.MSG
DNS.MSG.ID .BS 2
.DA /S.DNS.F.RD Flags=query
.DA #S.DNS.F.RD
.DA $100 QDCOUNT
.BS 6 ANCOUNT,NSCOUNT,ARCOUNT
DNS.MSG.NAME .BS K.DNS.MAXLEN+6
*--------------------------------------
DNS.MSG.LEN .BS 2
*--------------------------------------
FRM.QUEUE.Tail .BS 1
FRM.QUEUE.Head .BS 1
FRM.QUEUE.hMem .BS K.FRMQUEUE.SIZE
FRM.QUEUE.State .BS K.FRMQUEUE.SIZE
FRM.QUEUE.Retry .BS K.FRMQUEUE.SIZE
FRM.QUEUE.LenL .BS K.FRMQUEUE.SIZE
FRM.QUEUE.LenH .BS K.FRMQUEUE.SIZE
*--------------------------------------
RefCount .DA #0
hARPCache .DA #0
DYNPORT.LAST .DA K.DYNPORT.START
hDNSSocket .BS 1
DNS.TmpCache .BS S.DNSCACHE
ARP.TmpCache .BS S.ARPCACHE
*--------------------------------------
SKT.Index .BS 1
SKT.TABLE .BS K.SKTTABLE.SIZE
SKT.LOC.ADDR .BS S.SOCKADDR
SKT.REM.ADDR .BS S.SOCKADDR
SKT.Cache .EQ *-S.SOCKET.TCP.INTAIL
.BS S.SOCKET.TCP-S.SOCKET.TCP.INTAIL
hFrameIn .BS 1
hFrameOut .BS 1
HST.SScanF .AZ "%d.%d.%d.%d"
IP.ID .DA $A205
*--------------------------------------
MAN
SAVE usr/src/lib/libtcpip.s
ASM