NEW
PREFIX
AUTO 4,1
				.LIST OFF
*--------------------------------------
DHCP.INIT		lda IPCFG+S.NETCFG.STATUS
				and #S.IPCFG.STATUS.OK
				bne .99					Already Configured, exit
				stz IPCFG+S.NETCFG.STATUS

				ldx #3
.1				lda A2osX.TIMER16,x
				sta DHCP.DISC.XID,x
				sta DHCP.REQ.XID,x
				dex
				bpl .1

				ldx #5

.2				lda IPCFG+S.NETCFG.MAC,x
				sta DHCP.DISC.CHADDR,x
				sta DHCP.REQ.CHADDR,x
				dex
				bpl .2
				clc
.9				rts

.99				>LDYA L.MSG.DHCP.NA

				>SYSCALL puts
				lda #0
				sec
				rts
*--------------------------------------
DHCP.RUN		>PUSHBI 0				no protocol
				lda #S.SOCKET.T.DGRAM
				>LIBCALL hLIBTCPIP,LIBTCPIP.Socket
				bcc	.1
.9				jmp DHCP.RUN.KO
.1				>STA.G hSocket
				pha
				>PUSHW L.SA.LOCAL
				pla
				>LIBCALL hLIBTCPIP,LIBTCPIP.Bind
				bcs .9
				>PUSHWI S.SOCKET.O.BROADCAST
				>LDA.G hSocket
				>LIBCALL hLIBTCPIP,LIBTCPIP.setsockopt
				>PUSHW L.SA.REMOTE
				>LDA.G hSocket
				>LIBCALL hLIBTCPIP,LIBTCPIP.Connect
				bcs .9
				>LDYA L.MSG.DHCP.CFG1
				>SYSCALL puts

				jsr Init.Timeout
DHCP.RUN.SDISC	>PUSHW L.SA.DEST
				>PUSHWI DHCP.DISC.LEN
				>PUSHW L.DHCP.DISC
				>LDA.G hSocket

				>LIBCALL hLIBTCPIP,LIBTCPIP.SendTo
				bcc .1
				jmp DHCP.RUN.KO

.1				lda #S.IPCFG.STATUS.SDISC
				sta IPCFG

DHCP.RUN.ROFFER	>SLEEP
				jsr DHCP.RUN.SKT.RCVD
				bcc .1
				jsr Wait.Timeout
				bne DHCP.RUN.ROFFER

				lda #1
				jmp DHCP.RUN.KO
.1				jsr CheckDHCPOffer
				bcs DHCP.RUN.ROFFER
				lda #S.IPCFG.STATUS.ROFFER
				sta IPCFG
			
DHCP.RUN.SREQ	>PUSHW L.MSG.DHCP.CFG2
				ldx #0

.1				>PUSHB IPCFG+S.IPCFG.DHCPSRVR,x
				inx
				cpx #4
				bne .1
				>PUSHBI 4
				>SYSCALL printf

				>PUSHW L.SA.DEST
				>PUSHWI DHCP.REQ.LEN
				>PUSHW L.DHCP.REQ
				>LDA.G hSocket
				>LIBCALL hLIBTCPIP,LIBTCPIP.SendTo
				bcs DHCP.RUN.KO

				lda #S.IPCFG.STATUS.SREQ
				sta IPCFG
DHCP.RUN.RACK	>SLEEP
				jsr DHCP.RUN.SKT.RCVD
				bcc .1
				jsr Wait.Timeout
				bne DHCP.RUN.RACK
				lda #2
				bra DHCP.RUN.KO
.1				jsr CheckDHCPAck
				bcs DHCP.RUN.RACK

DHCP.RUN.OK		lda #S.IPCFG.STATUS.OK
				sta IPCFG
				>PUSHW L.IPCFG
				>LIBCALL hLIBTCPIP,LIBTCPIP.SETCFG

				>PUSHW L.MSG.DHCP.OK
				
				ldx #0

.1				lda IPCFG+S.IPCFG.IP,x
				>PUSHA
				inx
				cpx #4
				bne .1
				
				ldx #0

.2				lda IPCFG+S.IPCFG.IP,x
				>PUSHA
				inx
				cpx #4
				bne .2
				
				>PUSHBI 8
				>SYSCALL printf
				lda #0					Leave with NO ERROR
				sec
				rts
DHCP.RUN.KO		pha
				>PUSHW L.MSG.DHCP.KO
				pla
				pha
				>PUSHA
				>PUSHBI 1
				>SYSCALL printf
				pla
				sec
				rts
*--------------------------------------
DHCP.RUN.SKT.RCVD
				>LDA.G hSocket
				>LIBCALL hLIBTCPIP,LIBTCPIP.Recv
				bcs .9
				>STA.G hFrame

				>SYSCALL GetMemPtr
				>STYA ZPFrameBase
.9				rts
*--------------------------------------
DHCP.QUIT		>LDA.G hSocket
				beq .1

				>LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown
.1				clc
				rts
*--------------------------------------
CheckDHCPOffer	jsr CheckDHCPXID
				bcs .9
				lda ZPFrameBase
				clc 
				adc #S.DHCP.OPTIONS
				sta ZPFramePtr

				lda ZPFrameBase+1
				adc /S.DHCP.OPTIONS
				sta ZPFramePtr+1
				lda (ZPFramePtr)
				cmp #S.DHCP.OPTIONS.MSGTYPE
				bne .9
				ldy #2
				lda (ZPFramePtr),y
				cmp #S.DHCP.OPTIONS.DHCPOffer
				bne .9
*				ldy #S.DHCP.YIADDR+11	Copy YIADDR,SIADDR+GIADDR
*				ldx #11
*.1				lda (ZPFrameBase),y
*				sta DHCP.REQ.YIADDR,x
*				dey
*				dex
*				bpl .1
				ldy #S.DHCP.YIADDR+3
				ldx #3
.2				lda (ZPFrameBase),y
				sta DHCP.REQ.OPT.REQIP,x
				sta IPCFG+S.IPCFG.IP,x
				dey
				dex
				bpl .2
				ldy #S.DHCP.SIADDR+3
				lda (ZPFrameBase),y
				bne .3
				ldy #S.IP.SRC+3
.3				ldx #3
.4				lda (ZPFrameBase),y
				sta IPCFG+S.IPCFG.DHCPSRVR,x
				sta DHCP.REQ.OPT.SVRIP,x
				dey
				dex
				bpl .4

.5				inc	ZPFramePtr				skip Option 53 (DHCPOffer:530102)
				bne .6
				inc ZPFramePtr+1
.6				lda (ZPFramePtr)
				sec
				adc ZPFramePtr				add option len + 1
				sta ZPFramePtr
				bcc .7
				inc ZPFramePtr+1
.7				lda (ZPFramePtr)
				cmp #S.DHCP.OPTIONS.END
				beq .8
				jsr GetDHCPOption			May override SVRIP
				bra .5
.8				jsr CS.RUN.DISCARD
				clc
				rts
.9				jsr CS.RUN.DISCARD
				sec
				rts
*--------------------------------------
GetDHCPOption	cmp #S.DHCP.OPTIONS.MASK
				bne .1
				ldx #S.IPCFG.MASK
				bra GetDHCPOption.CopyIP
.1				cmp #S.DHCP.OPTIONS.GW
				bne .2
				ldx #S.IPCFG.GW
				bra GetDHCPOption.CopyIP
.2				cmp #S.DHCP.OPTIONS.DNS
				bne .3
				ldx #S.IPCFG.DNS1
				bra GetDHCPOption.CopyIP

.3				cmp #S.DHCP.OPTIONS.SRVID
				bne .4

				ldy #5
				ldx #3
.31				lda (ZPFramePtr),y
				sta DHCP.REQ.OPT.SVRIP,x
				dey
				dex
				bpl .31
				rts
.4				cmp #S.DHCP.OPTIONS.DOMAIN
				bne .9
				ldy #1
				lda (ZPFramePtr),y		Get String len
				cmp #45
				bcc .6
				lda #44
.6				sta IPCFG+S.IPCFG.DOMAIN	store len
				tax
.7				iny
				lda (ZPFramePtr),y
				sta IPCFG+S.IPCFG.DOMAIN-1,y
				dex
				bne .7
			
.9				rts
*--------------------------------------
GetDHCPOption.CopyIP
				ldy #1
				lda (ZPFramePtr),y		Get Byte count
				cmp #9
				bcc .1
				lda #8					max 8 bytes (2 DNS)
.1				iny
.2				pha
				lda (ZPFramePtr),y
				sta IPCFG,x
				iny
				inx
				pla
				dec
				bne .2
				rts
*--------------------------------------
CheckDHCPAck	jsr CheckDHCPXID
				bcs .9
				lda ZPFrameBase
				clc 
				adc #S.DHCP.OPTIONS
				sta ZPFramePtr

				lda ZPFrameBase+1
				adc /S.DHCP.OPTIONS
				sta ZPFramePtr+1
				lda (ZPFramePtr)
				cmp #S.DHCP.OPTIONS.MSGTYPE
				bne .9
				ldy #2
				lda (ZPFramePtr),y
				cmp #S.DHCP.OPTIONS.DHCPAck
				bne .9
				jsr CS.RUN.DISCARD
				clc
				rts
.9				jsr CS.RUN.DISCARD
				sec
				rts
*--------------------------------------
CS.RUN.DISCARD	>LDA.G hFrame
				>SYSCALL FreeMem
				rts
*--------------------------------------
CheckDHCPXID	ldy #S.DHCP.XID+3
				ldx #3
.1				lda (ZPFrameBase),y
				cmp DHCP.DISC.XID,x	same XID ?
				bne .9
				dey
				dex
				bpl .1
				clc
				rts
.9				sec
				rts
*--------------------------------------
MAN
SAVE USR/SRC/SBIN/IPCONFIG.S.DHCP
LOAD USR/SRC/SBIN/IPCONFIG.S
ASM
