NEW PREFIX /A2OSX.BUILD AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 .TF LIB/LIBTCPIP.O *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/MLI.ERR.I .INB INC/NIC.I .INB INC/ETH.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 ZPPtrIP .EQ ZPLIB+16 ZPPtrMAC .EQ ZPLIB+18 ZPPtrDNS .EQ ZPLIB+20 ZPPtrSKT .EQ ZPLIB+22 ZPCachePtr .EQ ZPLIB+24 ZPTmpPtr1 .EQ ZPLIB+26 ZPTmpPtr2 .EQ ZPLIB+28 ZPTmpPtr3 .EQ ZPLIB+30 *-------------------------------------- * 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 SET.IPCFG .DA GET.IPCFG .DA POLL .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.New .DA SKT.Close .DA SKT.GetTable .DA SKT.Get .DA SKT.Accept .DA SKT.MkNod .DA SKT.Write .DA SKT.Read .DA SKT.ReadFrame *-------------------------------------- L.DEVNAME .DA DEVNAME L.MSG.DEV.KO .DA MSG.DEV.KO L.MSG.DEV.OK .DA MSG.DEV.OK L.MSG.CFG .DA MSG.CFG L.MSG.CFG.KO .DA MSG.CFG.KO L.MSG.CFG.OK .DA MSG.CFG.OK L.MSG.DNS.ADD .DA MSG.DNS.ADD L.MSG.DNS.ERR .DA MSG.DNS.ERR L.HOSTNAME .DA HOSTNAME L.TCPIP.CONF .DA TCPIP.CONF L.HOSTS .DA HOSTS L.IPCFG .DA IPCFG L.CFG.IP .DA CFG.IP L.CFG.HOSTNAME .DA CFG.HOSTNAME L.CFG.ALIAS .DA CFG.ALIAS L.CFG.HOSTS.SScanF .DA CFG.HOSTS.SScanF L.CFG.Keywords .DA CFG.Keywords J.CFG.Keywords .DA CFG.Read.address .DA CFG.Read.netmask .DA CFG.Read.gateway .DA CFG.Read.nameserver .DA CFG.Read.dnsdomain 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.DNS.CACHE .DA DNS.CACHE L.SKT.Template .DA SKT.Template L.HST.SScanF .DA HST.SScanF L.TmpByte .DA TmpByte L.IOCTL .DA IOCTL L.DCB.NIC .DA DCB.NIC L.TCP.IN.JMP .DA TCP.IN.JMP.CLOSED .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 .DA 0 *-------------------------------------- LIB.LOAD ldx RefCount bne .8 sta FD.SSOCK+S.FD.HANDLER jsr ARP.CLEAR jsr DNS.CLEAR >LDYAI K.SKTTABLE.SIZE*S.SOCKET >SYSCALL getmem0 bcs .9 stx hSocketTable jsr CFG.Init bcs .9 .8 inc RefCount clc .9 rts *-------------------------------------- LIB.UNLOAD dec RefCount bne LIB.UNLOAD.8 lda IPCFG+S.IPCFG.hFD beq .1 >PUSHWI 0 >PUSHBI IOCTL.CLOSE lda IPCFG+S.IPCFG.hFD >SYSCALL IOCTL .1 lda hSocketTable beq LIB.UNLOAD.8 >SYSCALL FreeMem LIB.UNLOAD.8 clc rts *-------------------------------------- POLL >PUSHW L.IOCTL >PUSHBI IOCTL.READ lda IPCFG+S.IPCFG.hFD >SYSCALL IOCTL bcs .99 No Frame sta hFrameIn ldx #3 .10 lda IOCTL+S.IOCTL.BUFPTR,x Get Frame Ptr & Len sta ZPFrameInPtr,x dex bpl .10 ldy #S.ETH.ETHERTYPE lda (ZPFrameInPtr),y tax iny lda (ZPFrameInPtr),y cmp #S.ETH.ETHERTYPE.ARP bne .1 cpx /S.ETH.ETHERTYPE.ARP bne .1 jmp ARP.IN .1 cmp #S.ETH.ETHERTYPE.IP bne .9 cpx /S.ETH.ETHERTYPE.IP bne .9 jmp IP.IN .9 lda hFrameIn beq LIB.UNLOAD.8 >SYSCALL FreeMem .99 rts *-------------------------------------- * Expire = every sec * Retry = every 100 msec *-------------------------------------- PULSE and #S.EVT.F.T1SEC beq .1 * jsr ARP.EXPIRE jsr DNS.EXPIRE .1 jsr DNS.POLL jmp FRM.RETRY *-------------------------------------- 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 /A2OSX.SRC/LIB/LIBTCPIP.S.ARP .INB /A2OSX.SRC/LIB/LIBTCPIP.S.CFG .INB /A2OSX.SRC/LIB/LIBTCPIP.S.DNS .INB /A2OSX.SRC/LIB/LIBTCPIP.S.FRM .INB /A2OSX.SRC/LIB/LIBTCPIP.S.HST .INB /A2OSX.SRC/LIB/LIBTCPIP.S.ICMP .INB /A2OSX.SRC/LIB/LIBTCPIP.S.IP .INB /A2OSX.SRC/LIB/LIBTCPIP.S.SKT .INB /A2OSX.SRC/LIB/LIBTCPIP.S.TCP .INB /A2OSX.SRC/LIB/LIBTCPIP.S.UDP *-------------------------------------- CS.END *-------------------------------------- DEVNAME .AZ "/DEV/ETH1" MSG.DEV.KO .AZ "TCPIPD:No Device Found, exiting.\r\n" MSG.DEV.OK .AZ "TCPIPD:Bound To Device : %s\r\n" MSG.CFG .AZ "TCPIPD:Reading %s..." MSG.CFG.KO .AZ "Failed!!! [%h]\r\n" MSG.CFG.OK .AZ "OK.\r\n" MSG.DNS.ADD .AZ "Added static host %d.%d.%d.%d %s\r\n" MSG.DNS.ERR .AZ "***ERROR adding static host %d.%d.%d.%d %s\r\n" *-------------------------------------- HOSTNAME .AZ "${A2OSX}ETC/HOSTNAME" TCPIP.CONF .AZ "${A2OSX}ETC/TCPIP.CONF" HOSTS .AZ "${A2OSX}ETC/HOSTS" *-------------------------------------- CFG.DefaultHost .AZ "a2osx-XXXX" CFG.Keywords >PSTR "address" >PSTR "netmask" >PSTR "gateway" >PSTR "nameserver" >PSTR "dnsdomain" .DA #0 CFG.hBuf .BS 1 CFG.hCfgPath .BS 1 CFG.hCfgFile .BS 1 CFG.IP .BS 4 CFG.HostName .BS K.DNS.MAXLEN+1 CFG.Alias .BS K.DNS.MAXLEN+1 CFG.HOSTS.SScanF .AZ "%d.%d.%d.%d %s %s" *-------------------------------------- FD.SSOCK .BS 1 S.FD.HANDLER .DA #S.FD.T.SSOCK .BS 1 S.FD.SSOCK.HSKT .DA #0 S.FD.SSOCK.OPEN .DA #0 S.FD.SSOCK.CLOSE .DA #0 .DA #0 .DA #0 S.FD.SSOCK.STATUS *-------------------------------------- IOCTL .BS S.IOCTL DCB.NIC .BS S.DCB.NIC IPCFG .BS S.IPCFG ARP.CACHE .BS K.ARPCACHE.SIZE*S.ARPCACHE DNS.CACHE .BS K.DNSCACHE.SIZE*S.DNSCACHE *-------------------------------------- ARP.REQ .EQ * 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 .EQ * 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 *-------------------------------------- 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 *-------------------------------------- DNS.MSG.LEN .BS 2 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 *-------------------------------------- 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 hSocketTable .BS 1 DYNPORT.LAST .DA K.DYNPORT.START hDNSSocket1 .BS 1 hDNSSocket2 .BS 1 DNS.HostName .BS K.DNS.MAXLEN+1 DNS.TmpCache .BS S.DNSCACHE ARP.TmpCache .BS S.ARP SKT.Template .BS S.SOCKET SKT.TCBCache .BS S.TCB TmpByte .BS 1 TmpDWord .BS 4 TmpOffset .BS 2 hFrameIn .BS 1 hFrameOut .BS 1 bTextMode .BS 1 HST.SScanF .AZ "%d.%d.%d.%d" IP.ID .BS 2 IP.CHECKSUM .BS 4 *-------------------------------------- MAN SAVE /A2OSX.SRC/LIB/LIBTCPIP.S ASM