Sample RPCDUMP util for testing UDP Socket API

This commit is contained in:
Rémy GIBERT 2016-02-24 21:01:26 +01:00
parent e40abd2bb4
commit 0c12a64225

View File

@ -13,12 +13,10 @@ AUTO 6
.INB INC/LIBSTR.I
.INB INC/LIBTCPIP.I
*--------------------------------------
RPCINFO.TIMEOUT .EQ 40 40*100ms = 4 sec.
TIMEOUT.MAX .EQ 40 40*100ms = 4 sec.
*--------------------------------------
ZPFrameBase1 .EQ ZPBIN
ZPFrameLen1 .EQ ZPBIN+2
ZPFramePtr1 .EQ ZPBIN+4
ZPIPCfgPtr .EQ ZPBIN+6
ZPIPCfgPtr .EQ ZPBIN
ZPFrameBase .EQ ZPBIN+2
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
@ -38,220 +36,151 @@ CS.START cld
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.LIBTCPIP .DA LIBTCPIP
L.SSCANF.IP .DA SSCANF.IP
L.MSG0 .DA MSG0
L.MSG1 .DA MSG1
L.MSG2 .DA MSG2
L.MSG3 .DA MSG3
L.Socket .DA Socket
L.Socket.Dst.Addr .DA Socket.Dst.Addr
L.RPC.Request .DA RPC.Request
L.MSG.USAGE .DA MSG.USAGE
L.MSG.UNKNOWN .DA MSG.UNKNOWN
L.MSG.TIMEOUT .DA MSG.TIMEOUT
L.MSG.DUMP0 .DA MSG.DUMP0
L.MSG.DUMP1 .DA MSG.DUMP1
.DA 0
*--------------------------------------
CS.INIT ldy #S.PS.hARGS
lda (pPs),y
bne .1
lda #SYSMGR.ERRSYN
sec
rts
.1 >LDYA L.LIBSTR
beq .99
>LDYA L.LIBSTR
>SYSCALL SYS.LoadLibYA
sta hLIBSTR
>LDYA L.LIBTCPIP
>SYSCALL SYS.LoadLibYA
sta hLIBTCPIP
>LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ?
bcs .9
bcs .99
>STYA ZPIPCfgPtr
lda (ZPIPCfgPtr) Configured ?
bpl .9
ldy #S.IPCFG.HDEV
lda (ZPIPCfgPtr),y
sta hDev
lda A2OSX.RANDOM16
ldy #XID
sta (pData),y
lda A2OSX.RANDOM16+1
iny
sta (pData),y
lda (pPs)
ora #S.PS.F.EVENT Now accept events
sta (pPs)
clc
.9 rts
*--------------------------------------
CS.RUN >PUSHW pData DST.IP
>PUSHW L.SSCANF.IP
ldy #S.PS.hARGS
lda (pPs),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBSTR,LIBSTR.SSCANF
bcc CS.RUN.IPOK
lda #RPCINFO.TIMEOUT
ldy #TimeOut
sta (pData),y
CS.RUN.DNSQUERY >PUSHW pData DST.IP
ldy #S.PS.hARGS
lda (pPs),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBTCPIP,LIBTCPIP.DNS.QUERY
bcc CS.RUN.IPOK
jsr A2osX.SLEEP
ldy #TimeOut
lda (pData),y
bne CS.RUN.DNSQUERY
ldy #S.PS.hARGS
lda (pPs),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>PUSHW L.MSG0
>LIBCALL hLIBSTR,LIBSTR.PRINTF
sec
CS.RUN.RTS rts
CS.RUN.IPOK ldy #S.PS.hARGS
lda (pPs),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
ldy #3
>PUSHB (pData),y DST.IP+3
dey
>PUSHB (pData),y DST.IP+2
dey
>PUSHB (pData),y DST.IP+1
>PUSHB (pData) DST.IP
>PUSHW L.MSG1
>LIBCALL hLIBSTR,LIBSTR.PRINTF
CS.RUN.RPCCALL >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.UDP.FRAME
bcs CS.RUN.RTS
>STYA ZPFrameBase1
txa
ldy #hFrame
sta (pData),y
ldx #3
ldy #DST.IP
.10 lda (pData),y
pha
iny
dex
bpl .10
bpl .99
ldx #3
ldy #S.IP.DST+3
.1 pla
sta (ZPFrameBase1),y
ldy #S.IPCFG.IP+3
.1 lda (ZPIPCfgPtr),y
sta Socket.Src.Addr,x
dey
dex
bpl .1
ldy #S.UDP.SRCPORT
lda #UDP.PORT.PMAP
sta (ZPFrameBase1),y
ldy #S.UDP.DSTPORT
sta (ZPFrameBase1),y
lda (pPs)
ora #S.PS.F.EVENT Now accept events
sta (pPs)
clc
rts
ldy #XID
lda (pData),y
tax
iny
lda (pData),y
.99 >LDYA L.MSG.USAGE
>SYSCALL SYS.PSTROutYA
lda #SYSMGR.ERRSYN
sec
rts
*--------------------------------------
CS.RUN jsr Init.Timeout
ldy #S.RPC.XID+1
sta (ZPFrameBase1),y
dey
txa
sta (ZPFrameBase1),y
.3 >PUSHWI S.RPC+32
ldy #hFrame
lda (pData),y
.1 >PUSHW L.Socket.Dst.Addr
ldy #S.PS.hARGS
lda (pPs),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LIBCALL hLIBTCPIP,LIBTCPIP.SEND.UDP.FRAME
>LIBCALL hLIBTCPIP,LIBTCPIP.HST.GETBYNAME
bcc .2
>SYSCALL SYS.Sleep
jsr Wait.Timeout
bcc .1
ldy #S.PS.hARGS
lda (pPs),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LDYA L.MSG.UNKNOWN
>SYSCALL SYS.PSTROutYA
sec
rts
.2 >PUSHW L.Socket
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.NEW
bcc .21
jsr Wait.Timeout
bcc .2
bra .99
.21 txa
ldy #hSocket
sta (pData),y
.3 >PUSHWI RPC.Request.End-RPC.Request
>PUSHW L.RPC.Request
ldy #hSocket
>PUSHB (pData),y
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND
bcc .4
jsr A2osX.SLEEP
ldy #TimeOut
lda (pData),y
bne .3
>SYSCALL SYS.Sleep
jsr Wait.Timeout
bcc .3
bra .99
.4 jsr Init.Timeout
.4 ldy #hFrame
.5 ldy #hSocket
lda (pData),y
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.RCVD
bcc .6
>SYSCALL SYS.Sleep
jsr Wait.Timeout
bcc .5
bra .99
.6 ldy #hFrame
sta (pData),y
>SYSCALL SYS.GetMemPtrA
>STYA ZPFrameBase
jsr DumpRPCFrame
ldy #hFrame
lda (pData),y
>SYSCALL SYS.FreeMemA
ldy #bReply
lda #0
sta (pData),y
lda #RPCINFO.TIMEOUT
ldy #TimeOut
sta (pData),y
sec
rts
CS.RUN.WAIT jsr A2osX.SLEEP
ldy #bReply
lda (pData),y
bne .1
ldy #bCTRLC
lda (pData),y
bne CS.RUN.ERROR
ldy #TimeOut
lda (pData),y
bne CS.RUN.WAIT
ldy #3
>PUSHB (pData),y DST.IP+3
dey
>PUSHB (pData),y DST.IP+2
dey
>PUSHB (pData),y DST.IP+1
>PUSHB (pData) DST.IP
>PUSHW L.MSG2
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.1 ldy #bCTRLC
lda (pData),y
bne CS.RUN.ERROR
ldy #TimeOut
lda (pData),y
beq .2
jsr A2osX.SLEEP
bra .1
.2
CS.RUN.ERROR sec
.99 ldy #S.PS.hARGS
lda (pPs),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>LDYA L.MSG.TIMEOUT
>SYSCALL SYS.PSTROutYA
sec
rts
*--------------------------------------
CS.DOEVENT lda (pEvent)
and #S.EVT.F.TIMER is it a TIMER event?
bit #S.EVT.F.TIMER is it a TIMER event?
beq .1 no....
ldy #TimeOut
lda (pData),y
beq .10
beq .9
dec
sta (pData),y
.10 sec do not discard TIMER event
.9 sec do not discard TIMER event
rts
.1 lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
beq .2
.1 bit #S.EVT.F.KEY is it a KEY event?
beq .8
ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
@ -273,126 +202,121 @@ CS.DOEVENT lda (pEvent)
sta (pData),y
bra .8
.2 lda (pEvent)
and #S.EVT.F.NET
beq .9
ldy #S.EVT.hDEV
lda (pEvent),y
cmp hDev
bne .9
ldy #S.EVT.DATALO Get Frame hMem
lda (pEvent),y
>SYSCALL SYS.GetMemPtrA
>STYA ZPFrameBase1
ldy #S.IP.PROTOCOL
lda (ZPFrameBase1),y
cmp #S.IP.PROTOCOL.UDP
bne .9
ldy #S.UDP.DSTPORT
lda (ZPFrameBase1),y
cmp #S.ICMP.TYPE.ECHOREP
bne .9
ldy #S.RPC.XID
lda (ZPFrameBase1),y
tax
iny
lda (ZPFrameBase1),y
ldy #XID+1
cmp (pData),y
bne .9
dey
txa
cmp (pData),y
bne .9
jsr CS.EVENT.REPLY
.8 clc
rts
*--------------------------------------
CS.QUIT ldy #hSocket
lda (pData),y
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA
.9 sec
lda hLIBSTR
beq .1
>SYSCALL SYS.UnloadLibA
.1 lda hLIBTCPIP
beq .8
>SYSCALL SYS.UnloadLibA
.8 clc
rts
*--------------------------------------
CS.EVENT.REPLY lda #RPCINFO.TIMEOUT
sec
sbc TimeOut
stz TimeOut.ms
stz TimeOut.ms+1
tay
beq .3
.1 lda TimeOut.ms
clc
adc #K.TIMER16RESOLUTION*20
sta TimeOut.ms
bcc .2
inc TimeOut
.2 dey
bne .1
.3 >PUSHW TimeOut.ms
ldy #S.IP.TTL
>PUSHB (ZPFrameBase1),y
ldy #S.ICMP.SEQUENCE+1
>PUSHB (ZPFrameBase1),y
dey
>PUSHB (ZPFrameBase1),y
ldy #S.IP.SRC+3
>PUSHB (ZPFrameBase1),y
dey
>PUSHB (ZPFrameBase1),y
dey
>PUSHB (ZPFrameBase1),y
dey
>PUSHB (ZPFrameBase1),y
>PUSHW L.MSG3
>LIBCALL hLIBSTR,LIBSTR.PRINTF
ldy #bReply
lda (pData),y
inc
Init.Timeout ldy #TimeOut
lda #TIMEOUT.MAX
sta (pData),y
rts
*--------------------------------------
CS.QUIT lda hLIBTCPIP
>SYSCALL SYS.UnloadLibA
lda hLIBSTR
>SYSCALL SYS.UnloadLibA
Wait.TimeOut sec
ldy #TimeOut
lda (pData),y
beq .9
ldy #bCTRLC
lda (pData),y
bmi .9
clc
rts
.9 rts
*--------------------------------------
DumpRPCFrame lda #S.UDP+24
clc
adc ZPFrameBase
sta ZPFrameBase
lda /S.UDP+24
adc ZPFrameBase+1
sta ZPFrameBase+1
>LDYA L.MSG.DUMP0
>SYSCALL SYS.PSTROutYA
.1 ldy #3
lda (ZPFrameBase),y Value follows?
beq .9
ldy #18 port
>PUSHB (ZPFrameBase),y
iny
>PUSHB (ZPFrameBase),y
ldy #15 proto
>PUSHB (ZPFrameBase),y
ldy #11 version
>PUSHB (ZPFrameBase),y
ldy #4 program
.7 >PUSHB (ZPFrameBase),y
iny
cpy #8
bne .7
>PUSHW L.MSG.DUMP1
>LIBCALL hLIBSTR,LIBSTR.PRINTF
lda #20
clc
adc ZPFrameBase
sta ZPFrameBase
bcc .1
inc ZPFrameBase+1
bra .1
.9 rts
*--------------------------------------
CS.END
LIBSTR >PSTRING "libstr.o"
LIBTCPIP >PSTRING "libtcpip.o"
SSCANF.IP >PSTRING "%d.%d.%d.%d"
MSG0 >CSTRING "%S: Unknown host\n"
MSG1 >CSTRING "PING %d.%d.%d.%d (%S)\n"
MSG2 >CSTRING "%d.%d.%d.%d: TimeOut/Host unreachable\n"
MSG3 >CSTRING "32 bytes from %d.%d.%d.%d, icmp_seq=%D, ttl=%d, time=%D ms\n"
hLIBSTR .BS 1
MSG.USAGE >PSTRING "Usage : RPCINFO <ip|host>\n"
MSG.UNKNOWN >PSTRING "%S: Unknown host\n"
MSG.TIMEOUT >PSTRING "No response from %S\n"
MSG.DUMP0 >PSTRING "Program Ver Proto:Port\n"
MSG.DUMP1 >CSTRING "%10L %2d %2d:%D\n"
Socket .DA #S.SOCKET.SOCK.DGRAM
.BS 3
Socket.Src.Addr .BS 4
Socket.Src.Port .DA 0 Dynamic
Socket.Dst.Addr .BS 4
Socket.Dst.Port .DA UDP.PORT.PMAP
.BS 16
*--------------------------------------
RPC.Request .HS 12345678 XID
.HS 00000000 0=CALL
.HS 00000002 RPCVERS
.HS 000186A0 PROG=portmapper
.HS 00000002 VERS
.HS 00000004 PMAPPROC_DUMP
.HS 00000000 CRED
.HS 00000000
.HS 00000000 VERF
.HS 00000000
RPC.Request.End .EQ *
hLIBSTR .BS 1
hLIBTCPIP .BS 1
hDev .BS 1
TimeOut.ms .BS 2
*--------------------------------------
.DUMMY
.OR 0
DS.START
DST.IP .BS 4
hSocket .BS 1
hFrame .BS 1
TimeOut .BS 1
XID .BS 4
bCTRLC .BS 1
bReply .BS 1
DS.END
.ED
*--------------------------------------