New Socket based Dhcp Client

This commit is contained in:
Rémy GIBERT 2016-03-27 23:00:19 +02:00
parent 700b408efc
commit 996c301e92

View File

@ -12,12 +12,11 @@ AUTO 6
.INB INC/A2OSX.I .INB INC/A2OSX.I
.INB INC/LIBTCPIP.I .INB INC/LIBTCPIP.I
*-------------------------------------- *--------------------------------------
TIMEOUT.MAX .EQ 4 4 sec. TIMEOUT.MAX .EQ 50 5 sec.
*-------------------------------------- *--------------------------------------
ZPFrameBase1 .EQ ZPBIN ZPIPCfgPtr .EQ ZPBIN
ZPFrameLen1 .EQ ZPBIN+2 ZPFrameBase .EQ ZPBIN+2
ZPFramePtr1 .EQ ZPBIN+4 ZPFramePtr .EQ ZPBIN+4
ZPPtr1 .EQ ZPBIN+6
*-------------------------------------- *--------------------------------------
* File Header (16 Bytes) * File Header (16 Bytes)
*-------------------------------------- *--------------------------------------
@ -39,12 +38,15 @@ CS.START cld
.DA CS.QUIT .DA CS.QUIT
L.LIBTCPIP .DA LIBTCPIP L.LIBTCPIP .DA LIBTCPIP
L.IPCFG .DA IPCFG L.IPCFG .DA IPCFG
L.Socket .DA Socket
L.MSG.CFG1 .DA MSG.CFG1 L.MSG.CFG1 .DA MSG.CFG1
L.MSG.CFG2 .DA MSG.CFG2 L.MSG.CFG2 .DA MSG.CFG2
L.MSG.CFG.KO .DA MSG.CFG.KO L.MSG.CFG.KO .DA MSG.CFG.KO
L.MSG.CFG.OK .DA MSG.CFG.OK L.MSG.CFG.OK .DA MSG.CFG.OK
L.MSG.CFG.ND .DA MSG.CFG.ND L.MSG.CFG.ND .DA MSG.CFG.ND
L.MSG.CFG.NA .DA MSG.CFG.NA L.MSG.CFG.NA .DA MSG.CFG.NA
L.DHCP.DISC .DA DHCP.DISC
L.DHCP.REQ .DA DHCP.REQ
.DA 0 .DA 0
*-------------------------------------- *--------------------------------------
CS.INIT >LDYA L.LIBTCPIP CS.INIT >LDYA L.LIBTCPIP
@ -53,37 +55,35 @@ CS.INIT >LDYA L.LIBTCPIP
>LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG
bcs .9 bcs .9
>STYA ZPPtr1 >STYA ZPIPCfgPtr
lda (ZPPtr1) lda (ZPIPCfgPtr)
and #S.IPCFG.STATUS.OK and #S.IPCFG.STATUS.OK
bne .99 Already Configured, exit bne .99 Already Configured, exit
ldy #S.IPCFG.HDEV ldy #S.IPCFG.HDEV
lda (ZPPtr1),y lda (ZPIPCfgPtr),y
beq .98 beq .98
ldy #0 ldy #S.IPCFG-1
.1 lda (ZPPtr1),y .1 lda (ZPIPCfgPtr),y
sta IPCFG,y sta IPCFG,y
iny dey
cpy #S.IPCFG bne .1
bne .1
>LDYA A2OSX.TIMER16 stz IPCFG
>STYA FRAME.DISC.XID
>STYA FRAME.REQ.XID
>LDYA A2OSX.RANDOM16
>STYA FRAME.DISC.XID+2
>STYA FRAME.REQ.XID+2
lda #0 >LDYA A2OSX.TIMER16
sta IPCFG >STYA DHCP.DISC.XID
>STYA DHCP.REQ.XID
>LDYA A2OSX.RANDOM16
>STYA DHCP.DISC.XID+2
>STYA DHCP.REQ.XID+2
ldx #5 ldx #5
.2 lda IPCFG+S.IPCFG.MAC,x .2 lda IPCFG+S.IPCFG.MAC,x
sta FRAME.DISC.CHADDR,x sta DHCP.DISC.CHADDR,x
sta FRAME.REQ.CHADDR,x sta DHCP.REQ.CHADDR,x
dex dex
bpl .2 bpl .2
@ -102,27 +102,49 @@ CS.INIT >LDYA L.LIBTCPIP
sec sec
rts rts
*-------------------------------------- *--------------------------------------
CS.RUN >LDYA L.MSG.CFG1 CS.RUN >PUSHW L.Socket
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.NEW
bcc .1
jmp CS.RUN.KO
.1 txa
ldy #hSocket
sta (pData),y
>LDYA L.MSG.CFG1
>SYSCALL SYS.PSTROutYA >SYSCALL SYS.PSTROutYA
CS.RUN.DISC jsr SendDHCPDiscFrame
bcs CS.RUN.KO
lda #S.IPCFG.STATUS.SDISC
sta IPCFG
jsr Init.Timeout jsr Init.Timeout
CS.RUN.OFFER >SYSCALL SYS.Sleep CS.RUN.SDISC >PUSHWI DHCP.DISC.LEN
lda IPCFG >PUSHW L.DHCP.DISC
and #S.IPCFG.STATUS.ROFFER jsr CS.RUN.SKT.SEND
bne CS.RUN.REQ
jsr Wait.Timeout bcc .1
bcc CS.RUN.OFFER jmp CS.RUN.KO
lda #1
bra CS.RUN.KO
CS.RUN.REQ ldx #3 .1 lda #S.IPCFG.STATUS.SDISC
sta IPCFG
CS.RUN.ROFFER >SYSCALL SYS.Sleep
jsr CS.RUN.SKT.RCVD
bcc .1
jsr Wait.Timeout
bcc CS.RUN.ROFFER
lda #1
jmp CS.RUN.KO
.1 jsr CheckDHCPOffer
bcs CS.RUN.ROFFER
lda #S.IPCFG.STATUS.ROFFER
sta IPCFG
CS.RUN.SREQ ldx #3
.1 >PUSHB IPCFG+S.IPCFG.DHCPSRVR,x .1 >PUSHB IPCFG+S.IPCFG.DHCPSRVR,x
dex dex
@ -131,28 +153,26 @@ CS.RUN.REQ ldx #3
>LDYA L.MSG.CFG2 >LDYA L.MSG.CFG2
>SYSCALL SYS.PSTROutYA >SYSCALL SYS.PSTROutYA
jsr SendDHCPReqFrame >PUSHWI DHCP.REQ.LEN
>PUSHW L.DHCP.REQ
jsr CS.RUN.SKT.SEND
bcs CS.RUN.KO bcs CS.RUN.KO
lda #S.IPCFG.STATUS.SREQ lda #S.IPCFG.STATUS.SREQ
sta IPCFG sta IPCFG
CS.RUN.RACK >SYSCALL SYS.Sleep CS.RUN.RACK >SYSCALL SYS.Sleep
lda IPCFG
and #S.IPCFG.STATUS.RACK jsr CS.RUN.SKT.RCVD
bne CS.RUN.OK bcc .1
jsr Wait.Timeout jsr Wait.Timeout
bcc CS.RUN.RACK bcc CS.RUN.RACK
lda #2 lda #2
bra CS.RUN.KO
CS.RUN.KO pha .1 jsr CheckDHCPAck
>PUSHA bcs CS.RUN.RACK
>LDYA L.MSG.CFG.KO
>SYSCALL SYS.PSTROutYA
pla
sec
rts
CS.RUN.OK lda #S.IPCFG.STATUS.OK CS.RUN.OK lda #S.IPCFG.STATUS.OK
sta IPCFG sta IPCFG
@ -176,128 +196,99 @@ CS.RUN.OK lda #S.IPCFG.STATUS.OK
lda #0 Leave with NO ERROR lda #0 Leave with NO ERROR
sec sec
rts rts
CS.RUN.KO pha
>PUSHA
>LDYA L.MSG.CFG.KO
>SYSCALL SYS.PSTROutYA
pla
sec
rts
*--------------------------------------
CS.RUN.SKT.SEND ldy #hSocket
>PUSHB (pData),y
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.SEND
rts
*--------------------------------------
CS.RUN.SKT.RCVD ldy #hSocket
lda (pData),y
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.RCVDA
bcs .9
ldy #hFrame
sta (pData),y
>SYSCALL SYS.GetMemPtrA
>STYA ZPFrameBase
.9 rts
*-------------------------------------- *--------------------------------------
CS.DOEVENT lda (pEvent) CS.DOEVENT lda (pEvent)
bpl .1 is it a TIMER event? bpl .1 is it a TIMER event?
asl One second ?
bpl .9
ldy #TimeOut ldy #TimeOut
lda (pData),y lda (pData),y
beq .9 beq .9
dec
dec
sta (pData),y sta (pData),y
sec do not discard TIMER event .9 sec do not discard TIMER event
rts rts
.1 bit #S.EVT.F.NET
beq .9
ldy #S.IPCFG.HDEV .1 bit #S.EVT.F.KEY is it a KEY event?
lda IPCFG,y beq .8
ldy #S.EVT.hDEV
cmp (pEvent),y ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
ldy #S.PS.hINDEV
cmp (pPs),y
bne .9 bne .9
ldy #S.EVT.DATALO Get Frame hMem ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (pEvent),y lda (pEvent),y
>SYSCALL SYS.GetMemPtrA bne .9
>STYA ZPFrameBase1
lda (ZPFrameBase1) ldy #S.EVT.DATALO
sta ZPFrameLen1 lda (pEvent),y
ldy #1 cmp #$03 Ctrl-C
lda (ZPFrameBase1),y bne .8
sta ZPFrameLen1+1
lda IPCFG lda #$FF
and #S.IPCFG.STATUS.SDISC ldy #bCTRLC
beq .2 sta (pData),y
jsr CheckDHCPOfferFrame bra .8
bcs .9
lda #S.IPCFG.STATUS.ROFFER
sta IPCFG
clc
rts
.2 lda IPCFG .8 clc
and #S.IPCFG.STATUS.SREQ rts
beq .9
jsr CheckDHCPAckFrame
bcs .9
lda #S.IPCFG.STATUS.RACK
sta IPCFG
clc
rts
.9 sec
rts
*-------------------------------------- *--------------------------------------
CS.QUIT lda hLIBTCPIP CS.QUIT ldy #hSocket
lda (pData),y
beq .1
>LIBCALL hLIBTCPIP,LIBTCPIP.SKT.CLOSEA
.1 lda hLIBTCPIP
>SYSCALL SYS.UnloadLibA >SYSCALL SYS.UnloadLibA
clc clc
rts rts
*-------------------------------------- *--------------------------------------
SendDHCPDiscFrame CheckDHCPOffer jsr CheckDHCPXID
jsr NewDHCPFrame
bcs .9
phx
lda ZPFrameBase1
clc
adc #S.UDP
sta ZPPtr1
lda ZPFrameBase1+1
adc /S.UDP
sta ZPPtr1+1
ldy #FRAME.DISC.LEN
.1 dey
lda FRAME.DISC,y
sta (ZPPtr1),y
tya
bne .1
lda #S.UDP+FRAME.DISC.LEN-2
sta (ZPFrameBase1)
ldy #1
lda /S.UDP+FRAME.DISC.LEN-2
sta (ZPFrameBase1),y
>PUSHW ZPFrameBase1
>LIBCALL hLIBTCPIP,LIBTCPIP.SEND.UDP.FRAME
pla
php
>SYSCALL SYS.FreeMemA
plp
.9 rts
*--------------------------------------
CheckDHCPOfferFrame
jsr CheckDHCPXID
bcs .9 bcs .9
>LDAXI S.DHCP.OPTIONS >LDAXI S.DHCP.OPTIONS
jsr SetFramePtr1AX jsr SetFramePtr1AX
ldy #2 DHCPOffer ? ldy #2 DHCPOffer ?
lda (ZPFramePtr1),y lda (ZPFramePtr),y
cmp #S.DHCP.OPTIONS.DHCPOffer cmp #S.DHCP.OPTIONS.DHCPOffer
bne .9 bne .9
ldy #S.DHCP.YIADDR+3 ldy #S.DHCP.YIADDR+3
ldx #3 ldx #3
.1 lda (ZPFrameBase1),y .1 lda (ZPFrameBase),y
sta FRAME.REQ.OPT.REQIP,x sta DHCP.REQ.OPT.REQIP,x
dey dey
dex dex
bpl .1 bpl .1
ldx #3 ldx #3
ldy #S.IPCFG.IP+3 ldy #S.IPCFG.IP+3
.2 lda FRAME.REQ.OPT.REQIP,x .2 lda DHCP.REQ.OPT.REQIP,x
sta IPCFG,y sta IPCFG,y
dey dey
dex dex
@ -305,31 +296,31 @@ CheckDHCPOfferFrame
ldy #S.IP.SRC+3 ldy #S.IP.SRC+3
ldx #3 ldx #3
.3 lda (ZPFrameBase1),y .3 lda (ZPFrameBase),y
sta FRAME.REQ.OPT.SVRIP,x sta DHCP.REQ.OPT.SVRIP,x
dey dey
dex dex
bpl .3 bpl .3
ldx #3 ldx #3
ldy #S.IPCFG.DHCPSRVR+3 ldy #S.IPCFG.DHCPSRVR+3
.4 lda FRAME.REQ.OPT.SVRIP,x .4 lda DHCP.REQ.OPT.SVRIP,x
sta IPCFG,y sta IPCFG,y
dey dey
dex dex
bpl .4 bpl .4
.5 inc ZPFramePtr1 skip Option 53 (DHCPOffer:530102) .5 inc ZPFramePtr skip Option 53 (DHCPOffer:530102)
bne .6 bne .6
inc ZPFramePtr1+1 inc ZPFramePtr+1
.6 lda (ZPFramePtr1) .6 lda (ZPFramePtr)
sec sec
adc ZPFramePtr1 add option len + 1 adc ZPFramePtr add option len + 1
sta ZPFramePtr1 sta ZPFramePtr
bcc .7 bcc .7
inc ZPFramePtr1+1 inc ZPFramePtr+1
.7 lda (ZPFramePtr1) .7 lda (ZPFramePtr)
cmp #S.DHCP.OPTIONS.END cmp #S.DHCP.OPTIONS.END
beq .8 beq .8
jsr GetDHCPOption jsr GetDHCPOption
@ -362,7 +353,7 @@ GetDHCPOption cmp #S.DHCP.OPTIONS.MASK
ldx #$FF ldx #$FF
.4 iny .4 iny
inx inx
lda (ZPFramePtr1),y lda (ZPFramePtr),y
sta TmpBuffer256,x sta TmpBuffer256,x
bne .4 bne .4
ldy #S.IPCFG.DOMAIN-1 ldy #S.IPCFG.DOMAIN-1
@ -379,7 +370,7 @@ GetDHCPOption.CopyIP
phy phy
ldy #2 ldy #2
ldx #0 ldx #0
.1 lda (ZPFramePtr1),y .1 lda (ZPFramePtr),y
sta TmpBuffer256,x sta TmpBuffer256,x
iny iny
inx inx
@ -395,49 +386,14 @@ GetDHCPOption.CopyIP
bne .2 bne .2
rts rts
*-------------------------------------- *--------------------------------------
SendDHCPReqFrame CheckDHCPAck jsr CheckDHCPXID
jsr NewDHCPFrame
bcs .9
phx
lda ZPFrameBase1
clc
adc #S.UDP
sta ZPPtr1
lda ZPFrameBase1+1
adc /S.UDP
sta ZPPtr1+1
ldy #FRAME.REQ.LEN
.1 dey
lda FRAME.REQ,y
sta (ZPPtr1),y
tya
bne .1
lda #S.UDP+FRAME.REQ.LEN-2
sta (ZPFrameBase1)
ldy #1
lda /S.UDP+FRAME.REQ.LEN-2
sta (ZPFrameBase1),y
>PUSHW ZPFrameBase1
>LIBCALL hLIBTCPIP,LIBTCPIP.SEND.UDP.FRAME
pla
php
>SYSCALL SYS.FreeMemA
plp
.9 rts
*--------------------------------------
CheckDHCPAckFrame
jsr CheckDHCPXID
bcs .9 bcs .9
>LDAXI S.DHCP.OPTIONS >LDAXI S.DHCP.OPTIONS
jsr SetFramePtr1AX jsr SetFramePtr1AX
ldy #2 DHCPAck ? ldy #2 DHCPAck ?
lda (ZPFramePtr1),y lda (ZPFramePtr),y
cmp #S.DHCP.OPTIONS.DHCPAck cmp #S.DHCP.OPTIONS.DHCPAck
bne .9 bne .9
@ -449,8 +405,8 @@ CheckDHCPAckFrame
*-------------------------------------- *--------------------------------------
CheckDHCPXID ldy #S.DHCP.XID+3 CheckDHCPXID ldy #S.DHCP.XID+3
ldx #3 ldx #3
.1 lda (ZPFrameBase1),y .1 lda (ZPFrameBase),y
cmp FRAME.DISC.XID,x same XID ? cmp DHCP.DISC.XID,x same XID ?
bne .9 bne .9
dey dey
dex dex
@ -460,39 +416,12 @@ CheckDHCPXID ldy #S.DHCP.XID+3
.9 sec .9 sec
rts rts
*-------------------------------------- *--------------------------------------
NewDHCPFrame >LIBCALL hLIBTCPIP,LIBTCPIP.NEW.UDP.FRAME
bcs .9
>STYA ZPFrameBase1
ldy #S.UDP.SRCPORT
lda /UDP.PORT.DHCPC
sta (ZPFrameBase1),y
iny
lda #UDP.PORT.DHCPC
sta (ZPFrameBase1),y
ldy #S.UDP.DSTPORT
lda /UDP.PORT.DHCPS
sta (ZPFrameBase1),y
iny
lda #UDP.PORT.DHCPS
sta (ZPFrameBase1),y
lda #255 S.IP.DST = 255.255.255.255
ldy #S.IP.DST
.1 sta (ZPFrameBase1),y
iny
cpy #S.IP.DST+4
bne .1
clc x = hMem
.9 rts
*--------------------------------------
SetFramePtr1AX clc SetFramePtr1AX clc
adc ZPFrameBase1 adc ZPFrameBase
sta ZPFramePtr1 sta ZPFramePtr
txa txa
adc ZPFrameBase1+1 adc ZPFrameBase+1
sta ZPFramePtr1+1 sta ZPFramePtr+1
rts rts
*-------------------------------------- *--------------------------------------
Init.Timeout ldy #TimeOut Init.Timeout ldy #TimeOut
@ -520,46 +449,59 @@ MSG.CFG.ND >PSTRING "DHCPCLNT:No Device, exiting.\n"
MSG.CFG.NA >PSTRING "DHCPCLNT:TCPIP Already configured, exiting.\n" MSG.CFG.NA >PSTRING "DHCPCLNT:TCPIP Already configured, exiting.\n"
hLIBTCPIP .BS 1 hLIBTCPIP .BS 1
IPCFG .BS S.IPCFG IPCFG .BS S.IPCFG
FRAME.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS FrameLen .BS 2
FRAME.DISC.XID .BS 4 *--------------------------------------
Socket .DA #S.SOCKET.SOCK.DGRAM
.BS 3
.HS 00.00.00.00 Socket.Src.Addr
.DA UDP.PORT.DHCPC Socket.Src.Port
.HS FF.FF.FF.FF Socket.Dst.Addr
.DA UDP.PORT.DHCPS Socket.Dst.Port
.BS 16
*--------------------------------------
DHCP.DISC .HS 01010600 OP,HTYPE,HLEN,HOPS
DHCP.DISC.XID .BS 4
.HS 0000 SECS .HS 0000 SECS
.HS 0000 FLAGS .HS 0000 FLAGS
.HS 00000000 CIADDR .HS 00000000 CIADDR
FRAME.DISC.YIADDR .HS 00000000 DHCP.DISC.YIADDR .HS 00000000
.HS 00000000 SIADDR .HS 00000000 SIADDR
.HS 00000000 GIADDR .HS 00000000 GIADDR
FRAME.DISC.CHADDR .HS 00000000.00000000.00000000.00000000 DHCP.DISC.CHADDR .HS 00000000.00000000.00000000.00000000
.BS 64 SNAME .BS 64 SNAME
.BS 128 FILE .BS 128 FILE
.HS 63825363 COOKIE .HS 63825363 COOKIE
.HS 3501 OPT .HS 3501 OPT
.DA #S.DHCP.OPTIONS.DHCPDiscover .DA #S.DHCP.OPTIONS.DHCPDiscover
.HS 37040103060FFF .HS 37040103060FFF
FRAME.DISC.LEN .EQ *-FRAME.DISC DHCP.DISC.LEN .EQ *-DHCP.DISC
FRAME.REQ .HS 01010600 OP,HTYPE,HLEN,HOPS *--------------------------------------
FRAME.REQ.XID .BS 4 DHCP.REQ .HS 01010600 OP,HTYPE,HLEN,HOPS
DHCP.REQ.XID .BS 4
.HS 0000 SECS .HS 0000 SECS
.HS 0000 FLAGS .HS 0000 FLAGS
.HS 00000000 CIADDR .HS 00000000 CIADDR
FRAME.REQ.YIADDR .HS 00000000 DHCP.REQ.YIADDR .HS 00000000
.HS 00000000 SIADDR .HS 00000000 SIADDR
.HS 00000000 GIADDR .HS 00000000 GIADDR
FRAME.REQ.CHADDR .HS 00000000.00000000.00000000.00000000 DHCP.REQ.CHADDR .HS 00000000.00000000.00000000.00000000
.BS 64 SNAME .BS 64 SNAME
.BS 128 FILE .BS 128 FILE
.HS 63825363 COOKIE .HS 63825363 COOKIE
.HS 3501 OPT .HS 3501 OPT
.DA #S.DHCP.OPTIONS.DHCPRequest .DA #S.DHCP.OPTIONS.DHCPRequest
.HS 3204 .HS 3204
FRAME.REQ.OPT.REQIP .BS 4 DHCP.REQ.OPT.REQIP .BS 4
.HS 3604 .HS 3604
FRAME.REQ.OPT.SVRIP .BS 4 DHCP.REQ.OPT.SVRIP .BS 4
.HS FF .HS FF
FRAME.REQ.LEN .EQ *-FRAME.REQ DHCP.REQ.LEN .EQ *-DHCP.REQ
*-------------------------------------- *--------------------------------------
DS.START DS.START
TimeOut .BS 1 TimeOut .BS 1
bCTRLC .BS 1 bCTRLC .BS 1
hSocket .BS 1
hFrame .BS 1
DS.END DS.END
MAN MAN
SAVE SBIN/DHCPCLNT.S SAVE SBIN/DHCPCLNT.S