LIBTCPIP:Started implementing Socket API

This commit is contained in:
Rémy GIBERT 2016-03-13 23:09:00 +01:00
parent f1f09b937d
commit 6dc3efd617
13 changed files with 1339 additions and 555 deletions

Binary file not shown.

Binary file not shown.

View File

@ -53,7 +53,7 @@ LIBTCPIP.SKT.ACCEPTA .EQ 56
LIBTCPIP.SKT.SENDA .EQ 58 LIBTCPIP.SKT.SENDA .EQ 58
LIBTCPIP.SKT.SEND .EQ 60 LIBTCPIP.SKT.SEND .EQ 60
LIBTCPIP.SKT.RCVDA .EQ 62 LIBTCPIP.SKT.RCVDA .EQ 62
LIBTCPIP.SKT.RCVD .EQ 64 *LIBTCPIP.SKT.RCVD .EQ 64
LIBTCPIP.SKT.CLOSEA .EQ 66 LIBTCPIP.SKT.CLOSEA .EQ 66
LIBTCPIP.SKT.GETTABLE .EQ 68 LIBTCPIP.SKT.GETTABLE .EQ 68
LIBTCPIP.SKT.GETA .EQ 70 LIBTCPIP.SKT.GETA .EQ 70

View File

@ -5,9 +5,7 @@ INC 1
AUTO 6 AUTO 6
.LIST OFF .LIST OFF
*-------------------------------------- *--------------------------------------
ARP.IN >PULLW ZPFrameBase1 ARP.IN ldy #S.ARP.TPA
>PULLW ZPFrameLen1
ldy #S.ARP.TPA
ldx #S.IPCFG.IP ldx #S.IPCFG.IP
.1 lda (ZPFrameBase1),y .1 lda (ZPFrameBase1),y
@ -39,59 +37,36 @@ ARP.IN.REP >LDAXI S.ARP.SHA
clc clc
ARP.IN.RTS rts ARP.IN.RTS rts
ARP.IN.REQ jsr NEW.ARP.FRAME ARP.IN.REQ ldy #S.ETH.SRCMAC+5
bcs ARP.IN.RTS ldx #5
phx .1 lda (ZPFrameBase1),y
>STYA ZPFrameBase2 sta ARP.REP.DSTMAC,x
ldy #S.ARP.OPERATION+1 sta ARP.REP.THA,x
lda #S.ARP.OPERATION.REP dey
sta (ZPFrameBase2),y dex
bpl .1
ldy #S.ARP.SPA+3
ldx #3
.2 lda (ZPFrameBase1),y
sta ARP.REP.TPA,x
dey
dex
bpl .2
>LDAXI S.ARP.SHA >LDAXI S.ARP.SHA
jsr SetFramePtr1AX jsr SetFramePtr1AX
>PUSHW ZPFramePtr1
>LDAXI S.ETH.DSTMAC
jsr SetFramePtr2AX
ldy #6
jsr CopyFramePtr12
>LDAXI S.ARP.THA
jsr SetFramePtr2AX
ldy #10 IP(4) + MAC(6)
jsr CopyFramePtr12
>PUSHW ZPFramePtr1 still point to SHA
>LDAXI S.ARP.SPA >LDAXI S.ARP.SPA
jsr SetFramePtr1AX jsr SetFramePtr1AX
>PUSHW ZPFramePtr1 >PUSHW ZPFramePtr1
jsr ARP.ADD jsr ARP.ADD
ldx #5 >PUSHW L.ARP.REP
ldy #S.ARP.SHA+5 ldx #DEVMGR.NET.SEND
.4 lda IPCFG+S.IPCFG.MAC,x jmp NetDevJmp
sta (ZPFrameBase2),y
dey
dex
bpl .4
ldx #3
ldy #S.ARP.SPA+3
.5 lda IPCFG+S.IPCFG.IP,x
sta (ZPFrameBase2),y
dey
dex
bpl .5
>PUSHW ZPFrameBase2
jsr SEND.ARP.FRAME
pla
>SYSCALL SYS.FreeMemA
clc
rts
*-------------------------------------- *--------------------------------------
* ARP.CLEAR * ARP.CLEAR
*-------------------------------------- *--------------------------------------
@ -228,59 +203,20 @@ ARP.QUERY.I ldx #0
tax tax
cmp #K.ARPCACHE.SIZE*S.ARPCACHE cmp #K.ARPCACHE.SIZE*S.ARPCACHE
bne .1 bne .1
*--------------------------------------
ARP.REQUEST.I ldy #3
.1 lda (ZPPtrIP),y
sta ARP.REQ.TPA,y
dey
bpl .1
>PUSHW L.ARP.REQ
ldx #DEVMGR.NET.SEND
jsr NetDevJmp
jsr NEW.ARP.FRAME nothing in ARP cache, send ARP request
bcs .9 bcs .9
phx jsr ARP.ADD.PENDING ZPPtrIP still pointing IP
ldy #S.ARP.OPERATION+1
lda #S.ARP.OPERATION.REQ
sta (ZPFrameBase1),y
ldx #5
ldy #S.ARP.SHA+5
.71 lda IPCFG+S.IPCFG.MAC,x
sta (ZPFrameBase1),y
dey
dex
bpl .71
ldx #3
ldy #S.ARP.SPA+3
.72 lda IPCFG+S.IPCFG.IP,x
sta (ZPFrameBase1),y
dey
dex
bpl .72
ldy #3
.73 lda (ZPPtrIP),y
pha
dey
bpl .73
ldy #S.ARP.TPA
.74 pla
sta (ZPFrameBase1),y
iny
cpy #S.ARP.TPA+4
bne .74
lda #255
ldy #S.ETH.DSTMAC
.75 sta (ZPFrameBase1),y
iny
cpy #S.ETH.DSTMAC+6
bne .75
jsr SEND.ARP.FRAME.I
bcs .76
jsr ARP.ADD.PENDING ZPARPIP still pointing IP
.76 pla
>SYSCALL SYS.FreeMemA
sec sec
.9 rts .9 rts

View File

@ -5,42 +5,6 @@ INC 1
AUTO 6 AUTO 6
.LIST OFF .LIST OFF
*-------------------------------------- *--------------------------------------
DNS.IN ldy #S.DNS.F+1
lda (ZPFrameBase1),y
and /S.DNS.F.QR
beq .9
ldy #S.DNS.ANCOUNT+1
lda (ZPFrameBase1),y
beq .9
ldy #S.DNS.QDCOUNT+1
lda (ZPFrameBase1),y
tax
beq .3 no QUERY to skip
ldy #S.DNS Read query
.1 lda (ZPFrameBase1),y
beq .2
iny
bne .1
.2 tya
clc
adc #4 Skip QTYPE & QCLASS
tay
dex skip another QUERY ?
bne .1
.3 iny skip high byte of offset
iny skip lo byte of offset
clc
rts
.9 sec
rts
*--------------------------------------
DNS.CLEAR ldx #K.DNSCACHE.SIZE*S.DNSCACHE DNS.CLEAR ldx #K.DNSCACHE.SIZE*S.DNSCACHE
.1 stz DNS.CACHE-1,x .1 stz DNS.CACHE-1,x
dex dex
@ -56,11 +20,10 @@ DNS.CLEAR ldx #K.DNSCACHE.SIZE*S.DNSCACHE
* CC: hit: IP filled with address * CC: hit: IP filled with address
* CS: missed * CS: missed
*-------------------------------------- *--------------------------------------
DNS.QUERY >PULLYA Get host string DNS.QUERY >PULLW ZPPtrDNS Get host string
jsr PSTR2DNSHostName
>PULLW ZPPtrIP Get IP address to fill >PULLW ZPPtrIP Get IP address to fill
DNS.QUERY.I jsr HST.PSTR2DNS.I
ldx #0 ldx #0
.1 lda DNS.CACHE,x .1 lda DNS.CACHE,x
@ -106,126 +69,60 @@ DNS.QUERY >PULLYA Get host string
tax tax
cmp #K.DNSCACHE.SIZE*S.DNSCACHE cmp #K.DNSCACHE.SIZE*S.DNSCACHE
bne .1 bne .1
*--------------------------------------
DNS.REQUEST ldx #0
ldy #12
DNS.REQUEST jsr NEW.UDP.FRAME .1 lda DNSHostname,x
bcc .1 sta DNS.MSG,y
beq .2
bra * inx
rts
.1 phx
ldy #S.UDP.SRCPORT
lda /UDP.PORT.DNS
sta (ZPFrameBase1),y
iny iny
lda #UDP.PORT.DNS bne .1
sta (ZPFrameBase1),y
ldy #S.UDP.DSTPORT .2 iny
lda /UDP.PORT.DNS
sta (ZPFrameBase1),y
iny
lda #UDP.PORT.DNS
sta (ZPFrameBase1),y
ldy #S.DNS.ID
lda A2osX.RANDOM16
sta (ZPFrameBase1),y
sta DNSMessageID
iny
lda A2osX.RANDOM16+1
sta (ZPFrameBase1),y
sta DNSMessageID+1
* ldy #S.DNS.F
* lda /S.DNS.F.RD
* sta (ZPFrameBase1),y
* iny
* lda #S.DNS.F.RD
* sta (ZPFrameBase1),y
ldy #S.DNS.QDCOUNT
lda /1
sta (ZPFrameBase1),y
iny
lda #1
sta (ZPFrameBase1),y
lda #S.DNS
clc
adc ZPFrameBase1
sta ZPFramePtr1
lda /S.DNS
adc ZPFrameBase1+1
sta ZPFramePtr1+1
ldy #0
.2 lda DNSHostname,y
sta (ZPFramePtr1),y
beq .3
iny
bne .2
.3 iny
lda /S.DNS.QTYPE.A lda /S.DNS.QTYPE.A
sta (ZPFramePtr1),y sta DNS.MSG,y
iny iny
lda #S.DNS.QTYPE.A lda #S.DNS.QTYPE.A
sta (ZPFramePtr1),y sta DNS.MSG,y
iny iny
lda /S.DNS.QCLASS.IN lda /S.DNS.QCLASS.IN
sta (ZPFramePtr1),y sta DNS.MSG,y
iny iny
lda #S.DNS.QCLASS.IN lda #S.DNS.QCLASS.IN
sta (ZPFramePtr1),y sta DNS.MSG,y
lda DNSHostnameLen Get hostname len again (QNAME) iny
clc tya
adc #6 (len+1) + Ending 0 + QTYPE + QCLASS sta DNS.MSG.LEN
adc #S.DNS
sta ZPFrameLen1
lda #0 lda #0
adc /S.DNS sta DNS.MSG.LEN+1
sta ZPFrameLen1+1
ldx #S.IPCFG.DNS1 lda hDNSSocket1
ldy #S.IP.DST beq .9
lda IPCFG,x >LDYA A2osX.RANDOM16
beq .5 >STYA DNS.MSG
.4 lda IPCFG,x >PUSHW DNS.MSG.LEN
sta (ZPFrameBase1),y >PUSHW L.DNS.MSG
iny >PUSHB hDNSSocket1
inx jsr SKT.SEND
cpx #S.IPCFG.DNS1+4
bne .4
jsr SEND.UDP.FRAME.I
bcs .8
.5 ldx #S.IPCFG.DNS2 lda hDNSSocket2
ldy #S.IP.DST beq .9
lda IPCFG,x >LDYA A2osX.RANDOM16
beq .7 >STYA DNS.MSG+S.DNS.ID
.6 lda IPCFG,x >PUSHW DNS.MSG.LEN
sta (ZPFrameBase1),y >PUSHW L.DNS.MSG
iny >PUSHB hDNSSocket2
inx jsr SKT.SEND
cpx #S.IPCFG.DNS2+4
bne .6
jsr SEND.UDP.FRAME.I
bcs .8
.7 jsr DNS.ADD.PENDING.I .9 sec
.8 pla
>SYSCALL SYS.FreeMemA
sec
rts rts
*-------------------------------------- *--------------------------------------
* DNS.ADD * DNS.ADD
@ -233,10 +130,11 @@ DNS.REQUEST jsr NEW.UDP.FRAME
* PULLW = hostname PSTR to Add * PULLW = hostname PSTR to Add
* PULLW = PTR to IP * PULLW = PTR to IP
*-------------------------------------- *--------------------------------------
DNS.ADD >PULLYA Get host string DNS.ADD >PULLW ZPPtrDNS Get host string
jsr PSTR2DNSHostName
>PULLW ZPPtrIP Get host IP address >PULLW ZPPtrIP Get host IP address
jsr HST.PSTR2DNS.I
lda #$80 lda #$80
sta DNSHostTTL+3 sta DNSHostTTL+3
stz DNSHostTTL+2 stz DNSHostTTL+2
@ -323,10 +221,10 @@ DNS.UPD.ENTRY lda Status
sta DNS.CACHE+S.DNSCACHE.STATUS,x sta DNS.CACHE+S.DNSCACHE.STATUS,x
bmi .1 pending? bmi .1 pending?
lda DNSMessageID * lda DNSMessageID
sta DNS.CACHE+S.DNSCACHE.ID,x * sta DNS.CACHE+S.DNSCACHE.ID,x
lda DNSMessageID+1 * lda DNSMessageID+1
sta DNS.CACHE+S.DNSCACHE.ID+1,x * sta DNS.CACHE+S.DNSCACHE.ID+1,x
bra .9 bra .9
@ -356,7 +254,51 @@ DNS.GETCACHE >LDYA L.DNS.CACHE
clc clc
rts rts
*-------------------------------------- *--------------------------------------
DNS.SKTPOLL lda hDNSSocket1
beq .8
jsr SKT.RCVDA
bcs .8
bra *
.8 clc
rts
.9 sec
rts
*--------------------------------------
ldy #S.DNS.F+1
lda (ZPFrameBase1),y
and /S.DNS.F.QR
beq .9
ldy #S.DNS.ANCOUNT+1
lda (ZPFrameBase1),y
beq .9
ldy #S.DNS.QDCOUNT+1
lda (ZPFrameBase1),y
tax
beq .3 no QUERY to skip
ldy #S.DNS Read query
.1 lda (ZPFrameBase1),y
beq .2
iny
bne .1
.2 tya
clc
adc #4 Skip QTYPE & QCLASS
tay
dex skip another QUERY ?
bne .1
.3 iny skip high byte of offset
iny skip lo byte of offset
*--------------------------------------
MAN MAN
SAVE LIB/LIBTCPIP.S.DNS SAVE LIB/LIBTCPIP.S.DNS
LOAD LIB/LIBTCPIP.S LOAD LIB/LIBTCPIP.S

View File

@ -119,10 +119,6 @@ NEW.ARP.FRAME jsr NEW.ETH.FRAME
clc clc
.9 rts .9 rts
*-------------------------------------- *--------------------------------------
* Out:
* Y,A = Frame PTR
* X = hMem
*--------------------------------------
NEW.ETH.FRAME >PUSHWI K.ETH.FRAME.LEN NEW.ETH.FRAME >PUSHWI K.ETH.FRAME.LEN
>PUSHBI S.MEM.F.INIT0 >PUSHBI S.MEM.F.INIT0
>SYSCALL SYS.GetMem >SYSCALL SYS.GetMem
@ -131,14 +127,18 @@ NEW.ETH.FRAME >PUSHWI K.ETH.FRAME.LEN
clc clc
.9 rts .9 rts
*-------------------------------------- *--------------------------------------
* In:
* Out:
*--------------------------------------
SEND.ICMP.FRAME >PULLW ZPFrameBase1 SEND.ICMP.FRAME >PULLW ZPFrameBase1
>PULLW ZPFrameLen1 jsr FRM.GetLen1
SEND.ICMP.FRAME.I
>PUSHW ZPFrameLen1 >PUSHW ZPFrameLen1
>PUSHWI S.ICMP.TYPE >PUSHWI S.ICMP.TYPE-2
ldy #S.ICMP.CHECKSUM
lda #0
sta (ZPFrameBase1),y
iny
sta (ZPFrameBase1),y
jsr IP.ComputeChecksum jsr IP.ComputeChecksum
phy phy
@ -150,117 +150,154 @@ SEND.ICMP.FRAME >PULLW ZPFrameBase1
bra SEND.IP.FRAME.I bra SEND.IP.FRAME.I
*-------------------------------------- *--------------------------------------
* In:
* Out:
*--------------------------------------
SEND.TCP.FRAME >PULLW ZPFrameBase1 SEND.TCP.FRAME >PULLW ZPFrameBase1
>PULLW ZPFrameLen1 jsr FRM.GetLen1
SEND.TCP.FRAME.I
bra SEND.IP.FRAME.I bra SEND.IP.FRAME.I
*-------------------------------------- *--------------------------------------
* In:
* Out:
*--------------------------------------
SEND.UDP.FRAME >PULLW ZPFrameBase1 SEND.UDP.FRAME >PULLW ZPFrameBase1
>PULLW ZPFrameLen1 jsr FRM.GetLen1
SEND.UDP.FRAME.I SEND.UDP.FRAME.I
ldy #S.UDP.LENGTH+1 ldy #S.UDP.LENGTH+1
lda ZPFrameLen1 lda ZPFrameLen1
sec sec
sbc #S.IP sbc #S.IP-2
sta (ZPFrameBase1),y sta (ZPFrameBase1),y
dey dey
lda ZPFrameLen1+1 lda ZPFrameLen1+1
sbc /S.IP sbc /S.IP-2
sta (ZPFrameBase1),y
lda #0 SET.UDP.CHECKSUM
ldy #S.UDP.CHECKSUM (0 = Disable UDP Checksum)
sta (ZPFrameBase1),y
iny
sta (ZPFrameBase1),y sta (ZPFrameBase1),y
bra SEND.IP.FRAME.I bra SEND.IP.FRAME.I
*-------------------------------------- *--------------------------------------
* In:
* Out:
*--------------------------------------
SEND.IP.FRAME >PULLW ZPFrameBase1 SEND.IP.FRAME >PULLW ZPFrameBase1
>PULLW ZPFrameLen1 jsr FRM.GetLen1
SEND.IP.FRAME.I ldx #S.IPCFG.IP SEND.IP.FRAME.I ldx #3
ldy #S.IP.SRC ldy #S.IP.SRC+3
.10 lda IPCFG,x .10 lda IPCFG+S.IPCFG.IP,x
sta (ZPFrameBase1),y sta (ZPFrameBase1),y
inx dey
iny dex
cpy #S.IP.SRC+4 bpl .10
bne .10
jsr ARP.RESOLVE
bcs .9
ldy #S.IP.TOTAL.LENGTH+1 ldy #S.IP.TOTAL.LENGTH+1
lda ZPFrameLen1 lda ZPFrameLen1
sec sec
sbc #S.ETH sbc #S.ETH-2
sta (ZPFrameBase1),y sta (ZPFrameBase1),y
dey dey
lda ZPFrameLen1+1 lda ZPFrameLen1+1
sbc /S.ETH sbc /S.ETH-2
sta (ZPFrameBase1),y
lda #0
ldy #S.IP.HDR.CHECKSUM
sta (ZPFrameBase1),y
iny
sta (ZPFrameBase1),y sta (ZPFrameBase1),y
stz IP.CHECKSUM RESET.IP.CHECKSUM stz IP.CHECKSUM RESET.IP.CHECKSUM
stz IP.CHECKSUM+1 stz IP.CHECKSUM+1
stz IP.CHECKSUM+2
* stz IP.CHECKSUM+3 Optimized for IP Header clc
ldy #S.IP.V.IHL.DSCP.ECN ldy #S.IP.V.IHL.DSCP.ECN
ldx #10 10 words for IP Header
.1 lda (ZPFrameBase1),y .1 lda (ZPFrameBase1),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
lda (ZPFrameBase1),y
adc IP.CHECKSUM+1
sta IP.CHECKSUM+1
iny
dex
bne .1
ldy #S.IP.HDR.CHECKSUM
lda IP.CHECKSUM
adc #0
eor #$FF
sta (ZPFrameBase1),y
iny
lda IP.CHECKSUM+1
adc #0
eor #$FF
sta (ZPFrameBase1),y
ldy #S.IP.PROTOCOL
lda (ZPFrameBase1),y
cmp #S.IP.PROTOCOL.TCP
bne .3
jsr TCP.ComputeChecksum
bra .8
.3 cmp #S.IP.PROTOCOL.UDP
bne .8
jsr UDP.ComputeChecksum
.8 lda DevFlags
and #S.DEVINFO.NET.FLAGS.ARPOFFLOAD
bne .81
jsr ARP.RESOLVE
bcs .9
.81 >PUSHW ZPFrameBase1
ldx #DEVMGR.NET.SEND
jmp NetDevJmp
.9 rts
*--------------------------------------
SEND.ARP.FRAME >PUSHW ZPFrameBase1
ldx #DEVMGR.NET.SEND
jmp NetDevJmp
*--------------------------------------
SEND.ETH.FRAME >PUSHW ZPFrameBase1
ldx #DEVMGR.NET.SEND
jmp NetDevJmp
*--------------------------------------
RCVD.FRAME >PULLW ZPFrameBase1
bra *
*--------------------------------------
RCVD.FRAMEA sta hFrame1
>SYSCALL SYS.GetMemPtrA
>STYA ZPFrameBase1
jsr FRM.GetLen1
ldy #S.ETH.ETHERTYPE
lda (ZPFrameBase1),y
tax tax
iny iny
lda (ZPFrameBase1),y lda (ZPFrameBase1),y
iny
clc cmp #S.ETH.ETHERTYPE.ARP
adc IP.CHECKSUM bne .1
sta IP.CHECKSUM cpx /S.ETH.ETHERTYPE.ARP
txa
adc IP.CHECKSUM+1
sta IP.CHECKSUM+1
bcc .2
inc IP.CHECKSUM+2
*.2 bne .3 Optimized for IP Header
* inc IP.CHECKSUM+3 Optimized for IP Header
.2 cpy #S.IP
bne .1 bne .1
lda IP.CHECKSUM jmp ARP.IN
clc
adc IP.CHECKSUM+2 .1 cmp #S.ETH.ETHERTYPE.IP
eor #$FF bne .9
ldy #S.IP.HDR.CHECKSUM+1 cpx /S.ETH.ETHERTYPE.IP
sta (ZPFrameBase1),y bne .9
dey
lda IP.CHECKSUM+1 jsr IP.IN
* adc IP.CHECKSUM+3 Optimized for IP Header bcs .9
adc #0 Optimized for IP Header jmp DNS.SKTPOLL
eor #$FF .9 sec
sta (ZPFrameBase1),y rts
bra SEND.ETH.FRAME
.9 rts
*-------------------------------------- *--------------------------------------
* In: FRM.GetLen1 lda (ZPFrameBase1) Get Frame Len
* Out: sta ZPFrameLen1
*-------------------------------------- ldy #1
SEND.ARP.FRAME >PULLW ZPFrameBase1 lda (ZPFrameBase1),y
SEND.ARP.FRAME.I sta ZPFrameLen1+1
>LDYAI S.ARP default ARP Frame length
>STYA ZPFrameLen1
*--------------------------------------
* In:
* Out:
*--------------------------------------
SEND.ETH.FRAME >PUSHW ZPFrameLen1
>PUSHW ZPFrameBase1
ldx #DEVMGR.NET.SEND
jsr NetDevJmp
rts rts
*-------------------------------------- *--------------------------------------
MAN MAN

176
LIB/LIBTCPIP.S.HST.txt Normal file
View File

@ -0,0 +1,176 @@
PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
*--------------------------------------
HST.GETBYNAME >PULLW ZPPtrDNS
>PULLW ZPPtrIP
jsr HST.ScanIP
bcc .1
jsr DNS.QUERY.I
bcs .9
.1 jmp ARP.REQUEST.I
.9 rts
*--------------------------------------
HST.GETBYADDR >PULLW ZPPtrIP
>PULLW ZPPtrDNS
sec
rts
*--------------------------------------
HST.DNS2PSTR >PULLW ZPPtrDNS
sec
rts
*--------------------------------------
HST.PSTR2DNS >PULLW ZPPtrDNS
HST.PSTR2DNS.I lda (ZPPtrDNS)
beq .9
cmp #K.DNS.MAXLEN-1
bcs .9
tay
inc
sta DNSHostNameLen
lda #0 Ending 0
sta DNSHostName+1,y
ldx #0
.1 lda (ZPPtrDNS),y
and #$7f
cmp #'.'
beq .2
cmp #'A'
bcc .10
cmp #'Z'+1
bcs .10
adc #$20
.10 inx
bra .3
.2 txa
ldx #0
.3 sta DNSHostName,y
dey
bne .1
stx DNSHostName
clc
rts
.9 sec
rts
*--------------------------------------
HST.ScanIP stz HST.IP
lda (ZPPtrDNS)
beq .9
ldy #0
.1 ldx #0
stx HST.DecStr
.2 tya
cmp (ZPPtrDNS)
beq .4
iny
lda (ZPPtrDNS),y
cmp #'.'
beq .3
cmp #'0'
bcc .9
cmp #'9'+1
bcs .9
cpx #3
beq .9
inx
sta HST.DecStr,x
bra .2
.3 stx HST.DecStr
phy
jsr HST.Dec2Hex
ply
bcc .1
rts
.4 txa
beq .5
stx HST.DecStr
jsr HST.Dec2Hex
bcs .9
.5 ldx HST.IP
cpx #4
bne .9
ldy #3
.6 lda HST.IP,x
sta (ZPPtrIP),y
dex
dey
bpl .6
clc
rts
.9 sec
rts
*--------------------------------------
HST.Dec2Hex ldy HST.DecStr
beq .9
ldx HST.IP
cpx #4
beq .9
inx
lda HST.DecStr+1
and #$0f
sta HST.IP,x
ldy #1
.1 cpy HST.DecStr
beq .8
iny
lda HST.IP,x
asl HST.IP,x
bcs .9
asl HST.IP,x
bcs .9
adc HST.IP,x
bcs .9
asl
bcs .9
sta HST.IP,x
lda HST.DecStr,y
and #$0f
adc HST.IP,x
sta HST.IP,x
bcc .1
.9 sec
rts
.8 stx HST.IP
clc
rts
*--------------------------------------
MAN
SAVE LIB/LIBTCPIP.S.HST
LOAD LIB/LIBTCPIP.S
ASM

View File

@ -12,41 +12,52 @@ ICMP.IN ldy #S.ICMP.TYPE
ldy #S.IP.DST ldy #S.IP.DST
ldx #S.IPCFG.IP ldx #S.IPCFG.IP
.10 lda (ZPFrameBase1),y .1 lda (ZPFrameBase1),y
cmp IPCFG,x cmp IPCFG,x
bne .9 bne .9
iny iny
inx inx
cpx #S.IPCFG.IP+4 cpx #S.IPCFG.IP+4
bne .10
jsr NEW.ICMP.FRAME
bcs .9
phx
>STYA ZPFrameBase2
ldy #S.ICMP.TYPE
lda #S.ICMP.TYPE.ECHOREP
sta (ZPFrameBase2),y
jsr MakeIPReply
ldy #S.ICMP.IDENTIFIER
.1 lda (ZPFrameBase1),y
sta (ZPFrameBase2),y
iny
cpy #ZPFrameLen1
bne .1 bne .1
>PUSHW ZPFrameLen1 ldy #S.ICMP.TYPE
>PUSHW ZPFrameBase2 lda #S.ICMP.TYPE.ECHOREP
jsr SEND.ICMP.FRAME sta (ZPFrameBase1),y
pla ldy #S.IP.SRC+3
>SYSCALL SYS.FreeMemA ldx #3
clc
rts .2 lda (ZPFrameBase1),y
sta TmpIP,x
dey
dex
bpl .2
ldy #S.IP.DST+3
ldx #3
.3 lda TmpIP,x
sta (ZPFrameBase1),y
dey
dex
bpl .3
ldy #S.ETH.SRCMAC+5
ldx #5
.4 lda (ZPFrameBase1),y
sta TmpMAC,x
dey
dex
bpl .4
>PUSHW L.TmpMAC
>PUSHW L.TmpIP
jsr ARP.ADD
jmp SEND.ICMP.FRAME.I
.9 sec .9 sec
rts rts
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE LIB/LIBTCPIP.S.ICMP SAVE LIB/LIBTCPIP.S.ICMP

View File

@ -5,9 +5,7 @@ INC 1
AUTO 6 AUTO 6
.LIST OFF .LIST OFF
*-------------------------------------- *--------------------------------------
IP.IN >PULLW ZPFrameBase1 IP.IN ldy #S.IP.PROTOCOL
>PULLW ZPFrameLen1
ldy #S.IP.PROTOCOL
lda (ZPFrameBase1),y lda (ZPFrameBase1),y
cmp #S.IP.PROTOCOL.ICMP cmp #S.IP.PROTOCOL.ICMP
bne .2 bne .2
@ -16,16 +14,7 @@ IP.IN >PULLW ZPFrameBase1
.2 cmp #S.IP.PROTOCOL.UDP .2 cmp #S.IP.PROTOCOL.UDP
bne .3 bne .3
ldy #S.UDP.DSTPORT jmp UDP.IN
lda /UDP.PORT.DNS
cmp (ZPFrameBase1),y
bne .21
iny
lda #UDP.PORT.DNS
cmp (ZPFrameBase1),y
bne .21
jmp DNS.IN
.21 jmp UDP.IN
.3 cmp #S.IP.PROTOCOL.TCP .3 cmp #S.IP.PROTOCOL.TCP
bne .9 bne .9
@ -57,23 +46,30 @@ IP.ComputeChecksum
adc ZPFrameBase1+1 adc ZPFrameBase1+1
sta TmpOffset+1 sta TmpOffset+1
stz IP.CHECKSUM RESET.IP.CHECKSUM stz IP.CHECKSUM
stz IP.CHECKSUM+1 stz IP.CHECKSUM+1
stz IP.CHECKSUM+2 stz IP.CHECKSUM+2
stz IP.CHECKSUM+3 stz IP.CHECKSUM+3
ldy #1 ldy #2
.1 lda (ZPTmpPtr1),y
clc .1 clc
iny
lda (ZPTmpPtr1),y
adc IP.CHECKSUM adc IP.CHECKSUM
sta IP.CHECKSUM sta IP.CHECKSUM
lda (ZPTmpPtr1)
dey
lda (ZPTmpPtr1),y
adc IP.CHECKSUM+1 adc IP.CHECKSUM+1
sta IP.CHECKSUM+1 sta IP.CHECKSUM+1
bcc .3 bcc .3
inc IP.CHECKSUM+2 inc IP.CHECKSUM+2
bne .3 bne .3
inc IP.CHECKSUM+3 inc IP.CHECKSUM+3
.3 lda ZPTmpPtr1 .3 lda ZPTmpPtr1
clc clc
adc #2 adc #2
@ -85,6 +81,7 @@ IP.ComputeChecksum
lda ZPTmpPtr1+1 lda ZPTmpPtr1+1
cmp TmpOffset+1 cmp TmpOffset+1
bne .1 bne .1
lda IP.CHECKSUM lda IP.CHECKSUM
clc clc
adc IP.CHECKSUM+2 adc IP.CHECKSUM+2

View File

@ -5,84 +5,127 @@ INC 1
AUTO 6 AUTO 6
.LIST OFF .LIST OFF
*-------------------------------------- *--------------------------------------
SKT.NEW >PULLW ZPPtrSKT * IN : PULLW = PTR to S.SOCKET template
* OUT :
stz bFound * YA=PTR to new S.SOCKET
* X hSocket 128<x<255
*--------------------------------------
SKT.NEW >PULLW ZPTmpPtr1
ldy #S.SOCKET.SRC.PORT+1 ldy #S.SOCKET.SRC.PORT+1
lda (ZPPtrSKT),y lda (ZPTmpPtr1),y
dey dey
ora (ZPPtrSKT),y ora (ZPTmpPtr1),y
bne .1 bne .1
jsr GetDynPort jsr GetDynPort
sta (ZPPtrSKT),y sta (ZPTmpPtr1),y
txa txa
iny iny
sta (ZPPtrSKT),y sta (ZPTmpPtr1),y
.1 >LDYA L.SKT.TABLE .1 >LDYA L.SKT.TABLE
>STYA ZPTmpPtr1 >STYA ZPTmpPtr2
stz TmpOffset to keep track of any free slot
ldx #0 ldx #0
.2 lda (ZPTmpPtr1) .2 lda (ZPTmpPtr2)
beq .4 beq .4
cmp (ZPTmpPtr1)
ldy #S.SOCKET.SRC.PORT+1
.3 lda (ZPPtrSKT),y
cmp (ZPTmpPtr1),y
bne .5 bne .5
dey
bpl .3 ldy #S.SOCKET.SRC.ADDR
.3 lda (ZPTmpPtr1),y
cmp (ZPTmpPtr2),y
bne .5
iny
cpy #S.SOCKET.DST.PORT+2
bne .3
lda ERR.SBUSY lda ERR.SBUSY
sec sec
rts rts
.4 bit bFound .4 bit TmpOffset
bmi .5 bmi .5 Already found an empty slot
sec >LDYA ZPTmpPtr2
ror bFound >STYA ZPTmpPtr3
stx hSocket txa
>LDYA ZPTmpPtr1 ora #$80
>STYA ZPTmpPtr2 sta TmpOffset
.5 lda ZPTmpPtr1 .5 lda ZPTmpPtr2
clc clc
adc #S.SOCKET adc #S.SOCKET
sta ZPTmpPtr1 sta ZPTmpPtr2
bcc .6 bcc .6
inc ZPTmpPtr1+1 inc ZPTmpPtr2+1
.6 inx .6 inx
cpx #K.SKTTABLE.SIZE cpx #K.SKTTABLE.SIZE
bne .2 bne .2
bit bFound bit TmpOffset Did we found an empty slot ?
bpl .9 bpl .9
ldy #S.SOCKET-1 ldy #S.SOCKET-1
.7 lda (ZPPtrSKT),y .7 lda (ZPTmpPtr1),y
sta (ZPTmpPtr2),y sta (ZPTmpPtr3),y
dey dey
bpl .7 bpl .7
lda hSocket lda ZPTmpPtr1
clc
adc #S.SOCKET.DST.ADDR
sta ZPPtrIP
lda ZPTmpPtr1+1
adc /S.SOCKET.DST.ADDR
sta ZPPtrIP+1
lda (ZPPtrIP)
beq .8
jsr ARP.REQUEST.I
.8 ldx TmpOffset
>LDYA ZPTmpPtr3
clc clc
rts rts
.9 lda ERR.OOS .9 lda #ERR.OOS
sec sec
rts rts
*-------------------------------------- *--------------------------------------
SKT.LISTEN SKT.ACCEPTA jsr SKT.GetA
sec bcs .9
ldy #S.SOCKET.SO
lda (ZPPtrSKT),y
and #S.SOCKET.SO.ACCEPTCONN
bne .99
ldy #S.SOCKET.LQ.HEAD
lda (ZPPtrSKT),y
ldy #S.SOCKET.LQ.TAIL
cmp (ZPPtrSKT),y Queue Empty
beq .9 CC
pha
inc
cmp #S.SOCKET.LQ.MAX
bne .1
lda #0
.1 sta (ZPPtrSKT),y
pla
clc
adc #S.SOCKET.LQ
tay
lda (ZPPtrSKT),y
clc
rts rts
*--------------------------------------
SKT.ACCEPT .99 lda #ERR.SBAD
sec sec
rts .9 rts
*-------------------------------------- *--------------------------------------
SKT.SENDA SKT.SENDA
sec sec
@ -97,25 +140,30 @@ SKT.SEND >PULLB hSocket
jsr SKT.GetA jsr SKT.GetA
bcs .9 bcs .9
cmp #S.SOCKET.SOCK.DGRAM cpx #S.SOCKET.SOCK.DGRAM
beq SKT.SEND.UDP beq SKT.SEND.UDP
bra * cpx #S.SOCKET.SOCK.STREAM
bne .99
jmp SKT.SEND.TCP
sec .99 sec
.9 rts .9 rts
*-------------------------------------- *--------------------------------------
SKT.SEND.UDP jsr NEW.UDP.FRAME SKT.SEND.UDP jsr NEW.UDP.FRAME
bcs .9 bcs .9
>STYA ZPFrameBase1 stx hFrame1
lda #S.UDP lda #S.UDP-2
clc clc
adc ZPDataLen adc ZPDataLen
sta (ZPFrameBase1)
sta ZPFrameLen1 sta ZPFrameLen1
lda /S.UDP lda /S.UDP-2
adc ZPDataLen+1 adc ZPDataLen+1
ldy #1
sta (ZPFrameBase1),y
sta ZPFrameLen1+1 sta ZPFrameLen1+1
ldy #S.SOCKET.SRC.PORT ldy #S.SOCKET.SRC.PORT
@ -129,7 +177,7 @@ SKT.SEND.UDP jsr NEW.UDP.FRAME
txa txa
sta (ZPFrameBase1),y sta (ZPFrameBase1),y
ldy #S.SOCKET.SRC.ADDR ldy #S.SOCKET.DST.ADDR
ldx #4 ldx #4
.1 lda (ZPPtrSKT),y .1 lda (ZPPtrSKT),y
@ -161,63 +209,224 @@ SKT.SEND.UDP jsr NEW.UDP.FRAME
lda #S.UDP lda #S.UDP
clc clc
adc ZPFrameBase1 adc ZPFrameBase1
sta ZPTmpPtr1 sta ZPFramePtr1
lda /S.UDP lda /S.UDP
adc ZPFrameBase1+1 adc ZPFrameBase1+1
sta ZPTmpPtr1+1 sta ZPFramePtr1+1
ldy #0 ldy #0
.3 jsr DecDataLen .3 jsr DecDataLen
beq .4 beq .4
lda (ZPDataPtr),y lda (ZPDataPtr),y
sta (ZPTmpPtr1),y sta (ZPFramePtr1),y
iny iny
bne .3 bne .3
inc ZPDataPtr inc ZPDataPtr
inc ZPTmpPtr1 inc ZPFramePtr1
bra .3 bra .3
.4 jmp SEND.UDP.FRAME.I .4 jsr SEND.UDP.FRAME.I
bcc .9
lda hFrame1
>SYSCALL SYS.FreeMemA
sec
.9 rts .9 rts
*-------------------------------------- *--------------------------------------
SKT.RCVDA SKT.SEND.TCP
bra *
sec sec
rts rts
*-------------------------------------- *--------------------------------------
SKT.RCVD SKT.RCVDA jsr SKT.GetA
sec bcs .9
ldy #S.SOCKET.DQ.TAIL
lda (ZPPtrSKT),y
ldy #S.SOCKET.DQ.HEAD
cmp (ZPPtrSKT),y
beq .99
pha
inc
cmp #S.SOCKET.DQ.MAX
bne .1
lda #0
.1 sta (ZPPtrSKT),y
pla
clc
adc #S.SOCKET.DQ
tay
lda (ZPPtrSKT),y
clc
rts rts
.99 sec
.9 rts
*-------------------------------------- *--------------------------------------
SKT.CLOSE SKT.CLOSEA jsr SKT.GetA
sec bcs .9
rts cpx #S.SOCKET.SOCK.DGRAM
beq .8
ldy #S.SOCKET.SO
lda (ZPPtrSKT),y
bit #S.SOCKET.SO.ACCEPTCONN
beq *
.8 lda #0
sta (ZPPtrSKT)
clc
.9 rts
*-------------------------------------- *--------------------------------------
SKT.GETTABLE >LDYA L.SKT.TABLE SKT.GETTABLE >LDYA L.SKT.TABLE
clc clc
rts rts
*-------------------------------------- *--------------------------------------
SKT.GetA stz ZPPtrSKT+1 SKT.GetA stz ZPPtrSKT
asl
rol ZPPtrSKT+1 and #$7f Strip off msb
asl lsr
rol ZPPtrSKT+1 ror ZPPtrSKT
asl lsr
rol ZPPtrSKT+1 ror ZPPtrSKT
asl lsr
rol ZPPtrSKT+1 ror ZPPtrSKT
pha
lda ZPPtrSKT
adc L.SKT.TABLE adc L.SKT.TABLE
sta ZPPtrSKT sta ZPPtrSKT
lda ZPPtrSKT+1 pla
adc L.SKT.TABLE+1 adc L.SKT.TABLE+1
sta ZPPtrSKT+1 sta ZPPtrSKT+1
lda (ZPPtrSKT) lda (ZPPtrSKT)
beq .9 beq .9
tax
>LDYA ZPPtrSKT
rts CC rts CC
.9 lda #ERR.SBAD .9 lda #ERR.SBAD
sec sec
rts rts
*-------------------------------------- *--------------------------------------
* ZPPtrSKT -> actual socket
* A = hSocket
*--------------------------------------
SKT.AddToQueueL pha
ldy #S.SOCKET.LQ.HEAD
lda (ZPPtrSKT),y
tax
inc
cmp #S.SOCKET.LQ.MAX
bne .1
lda #0
.1 ldy #S.SOCKET.LQ.TAIL
cmp (ZPPtrSKT),y
beq .9 Queue full!!
ldy #S.SOCKET.LQ.HEAD
sta (ZPPtrSKT),y
txa
clc
adc #S.SOCKET.LQ
tay
pla
sta (ZPPtrSKT),y
clc
rts
.9 pla
sec
rts
*--------------------------------------
SKT.AddToQueueD ldy #S.SOCKET.DQ.HEAD
lda (ZPPtrSKT),y
tax
inc
cmp #S.SOCKET.DQ.MAX
bne .1
lda #0
.1 ldy #S.SOCKET.DQ.TAIL
cmp (ZPPtrSKT),y
beq .9 Queue full!!
ldy #S.SOCKET.DQ.HEAD
sta (ZPPtrSKT),y
txa
clc
adc #S.SOCKET.DQ
tay
lda hFrame1
sta (ZPPtrSKT),y
clc
rts
.9 sec
rts
*--------------------------------------
SKT.AddToQueueS
clc
rts
.9 sec
rts
*--------------------------------------
SKT.TCPSendSYNACKA
jsr SKT.GetA
ldy #S.SOCKET.SRC.ADDR+3
ldx #3
.1 lda (ZPPtrSKT),y
sta TCP.MSG+S.IP.SRC,x
dey
dex
bpl .1
ldy #S.SOCKET.SRC.PORT
lda (ZPPtrSKT),y
sta TCP.MSG+S.TCP.SRCPORT+1
iny
lda (ZPPtrSKT),y
sta TCP.MSG+S.TCP.SRCPORT
ldy #S.SOCKET.DST.ADDR+3
ldx #3
.2 lda (ZPPtrSKT),y
sta TCP.MSG+S.IP.DST,x
dey
dex
bpl .2
ldy #S.SOCKET.DST.PORT
lda (ZPPtrSKT),y
sta TCP.MSG+S.TCP.DSTPORT+1
iny
lda (ZPPtrSKT),y
sta TCP.MSG+S.TCP.DSTPORT
ldy #S.SOCKET.SQ.SEQNUM+7
ldx #7
.3 lda (ZPPtrSKT),y
sta TCP.MSG+S.TCP.SEQ.NUMBER,x
dey
dex
bpl .3
lda #S.TCP.OPTIONS.SYN+S.TCP.OPTIONS.ACK
sta TCP.MSG+S.TCP.OPTIONS
>PUSHW L.TCP.MSG
jsr SEND.TCP.FRAME
clc
rts
*--------------------------------------
MAN MAN
SAVE LIB/LIBTCPIP.S.SKT SAVE LIB/LIBTCPIP.S.SKT
LOAD LIB/LIBTCPIP.S LOAD LIB/LIBTCPIP.S

View File

@ -5,9 +5,278 @@ INC 1
AUTO 6 AUTO 6
.LIST OFF .LIST OFF
*-------------------------------------- *--------------------------------------
TCP.IN clc TCP.IN ldy #S.IP.SRC+3
ldx #3
.1 lda (ZPFrameBase1),y
sta TmpSocket+S.SOCKET.DST.ADDR,x
dey
dex
bpl .1
ldy #S.TCP.SRCPORT
lda (ZPFrameBase1),y
sta TmpSocket+S.SOCKET.DST.PORT+1
iny
lda (ZPFrameBase1),y
sta TmpSocket+S.SOCKET.DST.PORT
ldy #S.IP.DST+3
ldx #3
.2 lda (ZPFrameBase1),y
sta TmpSocket+S.SOCKET.SRC.ADDR,x
dey
dex
bpl .2
ldy #S.TCP.DSTPORT
lda (ZPFrameBase1),y
sta TmpSocket+S.SOCKET.SRC.PORT+1
iny
lda (ZPFrameBase1),y
sta TmpSocket+S.SOCKET.SRC.PORT
>LDYA L.SKT.TABLE
>STYA ZPPtrSKT
ldx #0
.3 lda (ZPPtrSKT)
beq .7
cmp #S.SOCKET.SOCK.STREAM
bne .7
ldy #S.SOCKET.SRC.ADDR
.4 lda TmpSocket,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
ldy #S.TCP.OPTIONS yes, only accept SYN packet
lda (ZPFrameBase1),y
cmp #S.TCP.OPTIONS.SYN
bne .7 not for this listening socket
jmp TCP.IN.LISTEN.NEW
.5 ldy #S.SOCKET.DST.ADDR
.6 lda TmpSocket,y regular socket, check remote ADDR/PORT
cmp (ZPPtrSKT),y
bne .7
iny
cpy #S.SOCKET.DST.PORT+2
bne .6
jmp TCP.IN.ESTABLISHED
.7 lda ZPPtrSKT
clc
adc #S.SOCKET
sta ZPPtrSKT
bcc .8
inc ZPPtrSKT+1
.8 inx
cpx #K.SKTTABLE.SIZE
bne .3
clc Discard frame
rts rts
.9 sec *--------------------------------------
TCP.IN.LISTEN.NEW
lda #S.SOCKET.SOCK.STREAM
sta TmpSocket
stz TmpSocket+S.SOCKET.SO
ldy #S.TCP.SEQ.NUMBER+3
ldx #3
sec
.1 lda (ZPFrameBase1),y
adc #0
sta TmpSocket+S.SOCKET.SQ.ACKNUM,x
dey
dex
bpl .1
ldx #3
.2 lda A2osX.TIMER16,x
sta TmpSocket+S.SOCKET.SQ.SEQNUM,x
dex
bpl .2
>PUSHW L.TmpSocket
jsr SKT.NEW
bcs .9
txa
ldy #S.SOCKET.PARENT
sta (ZPPtrSKT),y
jsr SKT.TCPSendSYNACKA
ldy #S.SOCKET.STATUS
lda #S.SOCKET.STATUS.SYNRCVD
sta (ZPPtrSKT),y
clc
.9 rts
*--------------------------------------
TCP.IN.ESTABLISHED
stx hSocket
ldy #S.SOCKET.STATUS
lda (ZPPtrSKT),y
cmp #S.SOCKET.STATUS.SYNRCVD Waiting for ACK to establish?
bne .1
ldy #S.TCP.OPTIONS yes, only accept ACK packet
lda (ZPFrameBase1),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 (ZPFrameBase1),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.STATUS
lda #S.SOCKET.STATUS.ESTBLSH
sta (ZPPtrSKT),y
ldy #S.SOCKET.PARENT
lda (ZPPtrSKT),y
jsr SKT.GetA
lda hSocket
jsr SKT.AddToQueueL
.8 clc
rts
.1 cmp #S.SOCKET.STATUS.ESTBLSH
bne .99
bra *
.99 clc
rts
*--------------------------------------
TCP.ComputeChecksum
lda #0 RESET.TCP.CHECKSUM
ldy #S.TCP.CHECKSUM
sta (ZPFrameBase1),y
iny
sta (ZPFrameBase1),y
>LDYA ZPFrameBase1
>STYA ZPTmpPtr1
lda ZPFrameLen1
sec
sbc #S.IP-2
sta ZPDataLen
lda ZPFrameLen1+1
sbc /S.IP-2
sta ZPDataLen+1
clc
* lda ZPDataLen+1
* adc #0 RESERVED (all zero)
sta IP.CHECKSUM
lda ZPDataLen
adc #S.IP.PROTOCOL.TCP
sta IP.CHECKSUM+1
ldy #S.IP.SRC
ldx #4 4 words for SRC & DST IP
.10 lda (ZPFrameBase1),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
lda (ZPFrameBase1),y
adc IP.CHECKSUM+1
sta IP.CHECKSUM+1
iny
dex
bne .10
ldy #S.IP
.1 jsr DecDataLen
beq .8
lda (ZPTmpPtr1),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
bne .20
inc ZPTmpPtr1+1
.20 jsr DecDataLen
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 (ZPFrameBase1),y
iny
lda IP.CHECKSUM+1
adc #0 Don't forget to add last carry!!!
eor #$FF
sta (ZPFrameBase1),y
rts rts
*-------------------------------------- *--------------------------------------
MAN MAN

View File

@ -5,8 +5,161 @@ INC 1
AUTO 6 AUTO 6
.LIST OFF .LIST OFF
*-------------------------------------- *--------------------------------------
UDP.IN UDP.IN ldy #S.IP.SRC+3
ldx #3
.1 lda (ZPFrameBase1),y
sta TmpSocket+S.SOCKET.DST.ADDR,x
dey
dex
bpl .1
ldy #S.UDP.SRCPORT
lda (ZPFrameBase1),y
sta TmpSocket+S.SOCKET.DST.PORT+1
iny
lda (ZPFrameBase1),y
sta TmpSocket+S.SOCKET.DST.PORT
ldy #S.IP.DST+3
ldx #3
.2 lda (ZPFrameBase1),y
sta TmpSocket+S.SOCKET.SRC.ADDR,x
dey
dex
bpl .2
ldy #S.UDP.DSTPORT
lda (ZPFrameBase1),y
sta TmpSocket+S.SOCKET.SRC.PORT+1
iny
lda (ZPFrameBase1),y
sta TmpSocket+S.SOCKET.SRC.PORT
>LDYA L.SKT.TABLE
>STYA ZPPtrSKT
ldx #0
.3 lda (ZPPtrSKT)
beq .7
cmp #S.SOCKET.SOCK.DGRAM
bne .7
ldy #S.SOCKET.SRC.ADDR
.4 lda TmpSocket,y
cmp (ZPPtrSKT),y
bne .7
iny
cpy #S.SOCKET.DST.PORT+2
bne .4
jsr SKT.AddToQueueD
bcs .99
lda (pEvent) Make sure kernel not discard frame...
and #$FF^S.EVT.F.hMEM1
sta (pEvent)
clc ...when clearing event!!!!
rts
.7 lda ZPPtrSKT
clc
adc #S.SOCKET
sta ZPPtrSKT
bcc .8
inc ZPPtrSKT+1
.8 inx
cpx #K.SKTTABLE.SIZE
bne .3
.9 sec .9 sec
.99 rts
*--------------------------------------
UDP.ComputeChecksum
lda #0 RESET.TCP.CHECKSUM
ldy #S.UDP.CHECKSUM
sta (ZPFrameBase1),y
iny
sta (ZPFrameBase1),y
>LDYA ZPFrameBase1
>STYA ZPTmpPtr1
lda ZPFrameLen1
sec
sbc #S.IP-2
sta ZPDataLen
lda ZPFrameLen1+1
sbc /S.IP-2
sta ZPDataLen+1
clc
ldy #S.UDP.LENGTH
lda (ZPFrameBase1),y
* adc #0 RESERVED (all zero)
sta IP.CHECKSUM
iny
lda (ZPFrameBase1),y
adc #S.IP.PROTOCOL.UDP
sta IP.CHECKSUM+1
ldy #S.IP.SRC
ldx #4 4 words for SRC & DST IP
.10 lda (ZPFrameBase1),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
lda (ZPFrameBase1),y
adc IP.CHECKSUM+1
sta IP.CHECKSUM+1
iny
dex
bne .10
ldy #S.IP
.1 jsr DecDataLen
beq .8
lda (ZPTmpPtr1),y
adc IP.CHECKSUM
sta IP.CHECKSUM
iny
bne .20
inc ZPTmpPtr1+1
.20 jsr DecDataLen
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.UDP.CHECKSUM
lda IP.CHECKSUM
adc #0 Don't forget to add last carry!!!
eor #$FF
sta (ZPFrameBase1),y
iny
lda IP.CHECKSUM+1
adc #0 Don't forget to add last carry!!!
eor #$FF
sta (ZPFrameBase1),y
rts rts
*-------------------------------------- *--------------------------------------
MAN MAN

View File

@ -15,17 +15,15 @@ AUTO 6
ZPFrameBase1 .EQ ZPLIB ZPFrameBase1 .EQ ZPLIB
ZPFrameLen1 .EQ ZPLIB+2 ZPFrameLen1 .EQ ZPLIB+2
ZPFramePtr1 .EQ ZPLIB+4 ZPFramePtr1 .EQ ZPLIB+4
ZPFrameBase2 .EQ ZPBIN+6
ZPFrameLen2 .EQ ZPBIN+8
ZPFramePtr2 .EQ ZPBIN+10
ZPPtrIP .EQ ZPLIB+12 ZPPtrIP .EQ ZPLIB+12
ZPPtrMAC .EQ ZPLIB+14 ZPPtrMAC .EQ ZPLIB+14
ZPPtrDNS .EQ ZPLIB+16 ZPPtrDNS .EQ ZPLIB+16
ZPPtrSKT .EQ ZPLIB+18 ZPPtrSKT .EQ ZPLIB+18
ZPTmpPtr1 .EQ ZPLIB+20 ZPTmpPtr1 .EQ ZPLIB+20
ZPTmpPtr2 .EQ ZPLIB+22 ZPTmpPtr2 .EQ ZPLIB+22
ZPDataPtr .EQ ZPLIB+24 ZPTmpPtr3 .EQ ZPLIB+24
ZPDataLen .EQ ZPLIB+26 ZPDataPtr .EQ ZPLIB+26
ZPDataLen .EQ ZPLIB+28
*-------------------------------------- *--------------------------------------
* File Header (16 Bytes) * File Header (16 Bytes)
*-------------------------------------- *--------------------------------------
@ -71,32 +69,47 @@ CS.START cld
.DA DNS.ADD .DA DNS.ADD
.DA DNS.GETCACHE .DA DNS.GETCACHE
.DA ARP.IN .DA RCVD.FRAMEA
.DA IP.IN .DA RCVD.FRAME
.DA SKT.NEW .DA SKT.NEW
.DA SKT.LISTEN .DA $FFFF
.DA SKT.ACCEPT .DA SKT.ACCEPTA
.DA SKT.SENDA .DA SKT.SENDA
.DA SKT.SEND .DA SKT.SEND
.DA SKT.RCVDA .DA SKT.RCVDA
.DA SKT.RCVD .DA $FFFF
.DA SKT.CLOSE .DA SKT.CLOSEA
.DA SKT.GETTABLE .DA SKT.GETTABLE
.DA SKT.GETA
.DA HST.GETBYNAME
.DA HST.GETBYADDR
*-------------------------------------- *--------------------------------------
L.IPCFG .DA IPCFG L.IPCFG .DA IPCFG
L.ARP.REQ .DA ARP.REQ
L.ARP.REP .DA ARP.REP
L.DNS.SOCKET .DA DNS.SOCKET
L.DNS.MSG .DA DNS.MSG
L.ARP.CACHE .DA ARP.CACHE L.ARP.CACHE .DA ARP.CACHE
L.DNS.CACHE .DA DNS.CACHE L.DNS.CACHE .DA DNS.CACHE
L.SKT.TABLE .DA SKT.TABLE L.SKT.TABLE .DA SKT.TABLE
L.TmpMAC .DA TmpMAC
L.TmpIP .DA TmpIP
L.TmpSocket .DA TmpSocket
L.TCP.MSG .DA TCP.MSG
.DA 0 .DA 0
*-------------------------------------- *--------------------------------------
LIB.LOAD lda bFirstLoad LIB.LOAD lda bFirstLoad
bne .8 bne .8
jsr ARP.CLEAR jsr ARP.CLEAR
jsr DNS.CLEAR jsr DNS.CLEAR
>LDYA K.DYNPORT.START
>LDYAI K.DYNPORT.START
>STYA DYNPORT.LAST >STYA DYNPORT.LAST
inc bFirstLoad inc bFirstLoad
.8 clc .8 clc
rts rts
*-------------------------------------- *--------------------------------------
@ -113,6 +126,23 @@ SET.IPCFG >PULLW ZPTmpPtr1
cpy #S.IPCFG cpy #S.IPCFG
bne .1 bne .1
ldx #5
.2 lda IPCFG+S.IPCFG.MAC,x
sta ARP.REQ.SRCMAC,x
sta ARP.REQ.SHA,x
sta ARP.REP.SRCMAC,x
sta ARP.REP.SHA,x
dex
bpl .2
ldx #3
.3 lda IPCFG+S.IPCFG.IP,x
sta ARP.REQ.SPA,x
sta ARP.REP.SPA,x
sta DNS.SOCKET.SA,x
dex
bpl .3
lda IPCFG+S.IPCFG.HDEV lda IPCFG+S.IPCFG.HDEV
>SYSCALL SYS.GetDevByIDA >SYSCALL SYS.GetDevByIDA
@ -125,16 +155,54 @@ SET.IPCFG >PULLW ZPTmpPtr1
ldy #S.DEVINFO.FLAGS ldy #S.DEVINFO.FLAGS
lda (ZPTmpPtr2),y lda (ZPTmpPtr2),y
sta DevFlags sta DevFlags
and #S.DEVINFO.FLAGS.ARPOFFLOAD and #S.DEVINFO.NET.FLAGS.ARPOFFLOAD
beq .2 beq .4
>LDYA ZPTmpPtr1 >LDYA ZPTmpPtr1
ldx #DEVMGR.SETIPCFG ldx #DEVMGR.SETIPCFG
jsr NetDevJmp jsr NetDevJmp
.2 >LDYA ZPTmpPtr1 .4 lda hDNSSocket1
beq .41
jsr SKT.CLOSEA
.41 lda hDNSSocket2
beq .42
jsr SKT.CLOSEA
.42 lda IPCFG+S.IPCFG.DNS1
beq .6
ldx #3
.5 lda IPCFG+S.IPCFG.DNS1,x
sta DNS.SOCKET.DA,x
dex
bpl .5
>PUSHW L.DNS.SOCKET
jsr SKT.NEW
bcs .9
stx hDNSSocket1
.6 lda IPCFG+S.IPCFG.DNS2
beq .8
ldx #3
.7 lda IPCFG+S.IPCFG.DNS2,x
sta DNS.SOCKET.DA,x
dex
bpl .7
>PUSHW L.DNS.SOCKET
jsr SKT.NEW
bcs .9
stx hDNSSocket2
.8 >LDYA ZPTmpPtr1
clc clc
rts .9 rts
*-------------------------------------- *--------------------------------------
* grab a copy on the fly for lib function * grab a copy on the fly for lib function
* OUT : * OUT :
@ -151,28 +219,6 @@ ToLowerCaseA cmp #'A'
adc #$20 adc #$20
.1 rts .1 rts
*-------------------------------------- *--------------------------------------
MakeIPReply >LDAXI S.IP.SRC
jsr SetFramePtr1AX
>LDAXI S.IP.DST
jsr SetFramePtr2AX
ldy #4
jsr CopyFramePtr12
>LDAXI S.IP.DST
jsr SetFramePtr1AX
>LDAXI S.IP.SRC
jsr SetFramePtr2AX
ldy #4
jsr CopyFramePtr12
>LDAXI S.ETH.SRCMAC
jsr SetFramePtr1AX
>LDAXI S.ETH.DSTMAC
jsr SetFramePtr2AX
ldy #6
jsr CopyFramePtr12
rts
*--------------------------------------
* A,X = Frame PTR * A,X = Frame PTR
*-------------------------------------- *--------------------------------------
SetFramePtr1AX clc SetFramePtr1AX clc
@ -183,25 +229,6 @@ SetFramePtr1AX clc
sta ZPFramePtr1+1 sta ZPFramePtr1+1
rts rts
*-------------------------------------- *--------------------------------------
* A,X = Frame PTR
*--------------------------------------
SetFramePtr2AX clc
adc ZPFrameBase2
sta ZPFramePtr2
txa
adc ZPFrameBase2+1
sta ZPFramePtr2+1
rts
*--------------------------------------
* Y = bytes to copy from ZPFramePtr1 to ZPFramePtr2
*--------------------------------------
CopyFramePtr12 dey
lda (ZPFramePtr1),y
sta (ZPFramePtr2),y
tya
bne CopyFramePtr12
rts
*--------------------------------------
GetDynPort inc DYNPORT.LAST GetDynPort inc DYNPORT.LAST
bne .1 bne .1
inc DYNPORT.LAST+1 inc DYNPORT.LAST+1
@ -211,7 +238,7 @@ GetDynPort inc DYNPORT.LAST
lda DYNPORT.LAST+1 lda DYNPORT.LAST+1
sbc /K.DYNPORT.END sbc /K.DYNPORT.END
bcs .1 bcs .1
>LDAXI K.DYNPORT.END >LDAXI K.DYNPORT.START
>STAX DYNPORT.LAST >STAX DYNPORT.LAST
rts CC rts CC
@ -219,52 +246,6 @@ GetDynPort inc DYNPORT.LAST
clc clc
rts rts
*-------------------------------------- *--------------------------------------
PSTR2DNSHostName >STYA ZPTmpPtr1
lda (ZPTmpPtr1)
beq .9
cmp #K.DNS.MAXLEN-1
bcs .9
tay
inc
sta DNSHostNameLen
lda #0 Ending 0
sta DNSHostName+1,y
ldx #0
.1 lda (ZPTmpPtr1),y
and #$7f
cmp #'.'
beq .2
cmp #'A'
bcc .10
cmp #'Z'+1
bcs .10
adc #$20
.10 inx
bra .3
.2 txa
ldx #0
.3 sta DNSHostName,y
dey
bne .1
stx DNSHostName
clc
rts
.9 sec
rts
*--------------------------------------
DecDataLen lda ZPDataLen DecDataLen lda ZPDataLen
bne .1 bne .1
lda ZPDataLen+1 lda ZPDataLen+1
@ -284,27 +265,100 @@ NetDevJmp jmp *
.INB LIB/LIBTCPIP.S.TCP .INB LIB/LIBTCPIP.S.TCP
.INB LIB/LIBTCPIP.S.DNS .INB LIB/LIBTCPIP.S.DNS
.INB LIB/LIBTCPIP.S.SKT .INB LIB/LIBTCPIP.S.SKT
.INB LIB/LIBTCPIP.S.HST
*-------------------------------------- *--------------------------------------
CS.END CS.END
*-------------------------------------- *--------------------------------------
IPCFG .BS S.IPCFG
*--------------------------------------
ARP.REQ .DA S.ARP-2 Frame size
ARP.REQ.DSTMAC .HS FFFFFFFFFFFF
ARP.REQ.SRCMAC .BS 6
ARP.REQ.ETYPE .DA /S.ETH.ETHERTYPE.ARP
.DA #S.ETH.ETHERTYPE.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 .DA S.ARP-2 Frame size
ARP.REP.DSTMAC .BS 6
ARP.REP.SRCMAC .BS 6
ARP.REP.ETYPE .DA /S.ETH.ETHERTYPE.ARP
.DA #S.ETH.ETHERTYPE.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
*--------------------------------------
TCP.MSG .DA S.TCP-2+4 +4 bytes for MSS option
.BS 12 ETH:MAC+MAC
.DA /S.ETH.ETHERTYPE.IP
.DA #S.ETH.ETHERTYPE.IP
.DA $0045 IP:
.BS 6 LEN+ID+Frag
.DA #K.IP.TTL
.DA #S.IP.PROTOCOL.TCP
.BS 2 Checksum
.BS 8 IP:DST,SRC
.BS 4 TCP:Ports
.BS 8 SEQ,ACK
.DA #$60 6 DWORD
.BS 1 Options
.DA /K.TCP.WSIZE
.DA #K.TCP.WSIZE
.BS 4 CHK,URG
.HS 0204 MSS option
.DA /K.TCP.MSS
.DA #K.TCP.MSS
*--------------------------------------
DNS.SOCKET .DA #S.SOCKET.SOCK.DGRAM
.BS 3
DNS.SOCKET.SA .BS 4
DNS.SOCKET.SP .DA 0 Dynamic
DNS.SOCKET.DA .BS 4
DNS.SOCKET.DP .DA UDP.PORT.DNS
.BS 16
*--------------------------------------
DNS.MSG.LEN .BS 2
DNS.MSG .BS 2 ID
.DA /S.DNS.F.RD Flags=query
.DA #S.DNS.F.RD Flags=query
.DA $100 QDCOUNT
.BS 6 ANCOUNT,NSCOUNT,ARCOUNT
.BS K.DNS.MAXLEN+6 DNS.MSG+12
*--------------------------------------
ARP.CACHE .BS K.ARPCACHE.SIZE*S.ARPCACHE
DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE
SKT.TABLE .BS K.SKTTABLE.SIZE*S.SOCKET
*--------------------------------------
bFirstLoad .DA #0 bFirstLoad .DA #0
Status .BS 1 Status .BS 1
DevFlags .BS 1 DevFlags .BS 1
DNSMessageID .BS 2 hDNSSocket1 .BS 1
DNSDynamicPort .BS 2 hDNSSocket2 .BS 1
DNSHostTTL .BS 4 DNSHostTTL .BS 4
DNSHostName .BS K.DNS.MAXLEN+1
DNSHostNameLen .BS 1 DNSHostNameLen .BS 1
DNSHostName .BS K.DNS.MAXLEN+1
IP.CHECKSUM .BS 4 IP.CHECKSUM .BS 4
IPCFG .BS S.IPCFG TmpMAC .BS 6
ARP.CACHE .BS K.ARPCACHE.SIZE*S.ARPCACHE TmpIP .BS 4
DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE TmpDWord .BS 4
SKT.TABLE .BS K.SKTTABLE.SIZE*S.SOCKET TmpSocket .BS S.SOCKET
hFrame1 .BS 1
hSocket .BS 1 hSocket .BS 1
bFound .BS 1
DYNPORT.LAST .BS 2 DYNPORT.LAST .BS 2
*TmpCounter .BS 2
TmpOffset .BS 2 TmpOffset .BS 2
HST.DecStr .BS 4
HST.IP .BS 5
*-------------------------------------- *--------------------------------------
MAN MAN
SAVE LIB/LIBTCPIP.S SAVE LIB/LIBTCPIP.S