NEW AUTO 3,1 *-------------------------------------- IP.IN ldy #S.IP.PROTOCOL lda (ZPFrameInPtr),y cmp #S.IP.PROTOCOL.ICMP bne .2 jmp ICMP.IN .2 cmp #S.IP.PROTOCOL.UDP bne .3 jsr FRM.GetTargetSKT.TCPUDP jsr SKT.FindMatchingLocRem bcs .9 lda hFrameIn jsr SKT.AddToQueueA bcs .9 Q full, discard... rts .3 cmp #S.IP.PROTOCOL.TCP bne .9 jsr TCP.IN TCP may NOT discard FrameIn .9 jmp FRM.DiscardIn *-------------------------------------- IP.ComputeICMPChecksum stz IP.CHECKSUM stz IP.CHECKSUM+1 lda ZPFrameOutLen sec sbc #S.IP eor #$ff tax lda ZPFrameOutLen+1 sbc /S.IP eor #$ff ldy #S.ICMP.CHECKSUM clc jmp IP.ComputeChecksum *-------------------------------------- IP.ComputeUDPChecksum clc ldy #S.UDP.LENGTH+1 lda (ZPFrameOutPtr),y adc #S.IP.PROTOCOL.UDP sta IP.CHECKSUM+1 dey lda (ZPFrameOutPtr),y adc /S.IP.PROTOCOL.UDP (all zero) sta IP.CHECKSUM jsr IP.AddSrcDstIPToChecksum ldy #S.UDP.LENGTH+1 lda (ZPFrameOutPtr),y eor #$ff tax dey lda (ZPFrameOutPtr),y eor #$ff ldy #S.UDP.CHECKSUM bra IP.ComputeChecksum *-------------------------------------- IP.ComputeTCPChecksum lda ZPFrameOutLen sec sbc #S.IP sta IP.CHECKSUM.TMP lda ZPFrameOutLen+1 sbc /S.IP sta IP.CHECKSUM.TMP+1 clc * lda IP.CHECKSUM.TMP+1 * adc /S.IP.PROTOCOL.TCP (all zero) sta IP.CHECKSUM lda IP.CHECKSUM.TMP adc #S.IP.PROTOCOL.TCP sta IP.CHECKSUM+1 jsr IP.AddSrcDstIPToChecksum lda IP.CHECKSUM.TMP eor #$ff tax lda IP.CHECKSUM.TMP+1 eor #$ff ldy #S.TCP.CHECKSUM *-------------------------------------- * X,A = !ByteCount, Y = Offset in Frame *-------------------------------------- IP.ComputeChecksum phy Save Offset pha Save !ByteCount.HI lda #0 Reset Checksum sta (ZPFrameOutPtr),y iny sta (ZPFrameOutPtr),y >LDYA ZPFrameOutPtr >STYA ZPTmpPtr1 ldy #S.IP .1 inx bne .11 pla inc beq .8 pha .11 lda (ZPTmpPtr1),y adc IP.CHECKSUM sta IP.CHECKSUM iny bne .20 inc ZPTmpPtr1+1 .20 inx bne .2 pla inc beq .7 pha .2 lda (ZPTmpPtr1),y adc IP.CHECKSUM+1 sta IP.CHECKSUM+1 iny bne .1 inc ZPTmpPtr1+1 bra .1 .7 adc IP.CHECKSUM+1 A=0 from beq .7 sta IP.CHECKSUM+1 .8 ply lda IP.CHECKSUM adc #0 Don't forget to add last carry!!! eor #$FF sta (ZPFrameOutPtr),y iny lda IP.CHECKSUM+1 adc #0 Don't forget to add last carry!!! eor #$FF sta (ZPFrameOutPtr),y rts *-------------------------------------- IP.AddSrcDstIPToChecksum ldy #S.IP.SRC ldx #4 4 words for SRC & DST IP .1 lda (ZPFrameOutPtr),y adc IP.CHECKSUM sta IP.CHECKSUM iny lda (ZPFrameOutPtr),y adc IP.CHECKSUM+1 sta IP.CHECKSUM+1 iny dex bne .1 rts *-------------------------------------- IP.SetDestMAC ldy #S.IP.DST lda (ZPFrameOutPtr),y iny .1 and (ZPFrameOutPtr),y iny cpy #S.IP.DST+4 bne .1 cmp #$FF bne .3 not a broadcast.... ldy #S.ETH.DSTMAC .2 sta (ZPFrameOutPtr),y iny cpy #S.ETH.DSTMAC+6 bne .2 clc rts .3 ldy #S.IP.DST+3 ldx #3 .4 lda (ZPFrameOutPtr),y eor IPCFG+S.IPCFG.IP,x and IPCFG+S.IPCFG.MASK,x bne .6 dey dex bpl .4 ldy #S.IP.DST+3 Same network, query ARP for dest IP ldx #3 .5 lda (ZPFrameOutPtr),y sta ARP.TmpCache+S.ARPCACHE.IP,x dey dex bpl .5 bra .8 .6 ldx #3 Not Same network, query ARP for GW .7 lda IPCFG+S.IPCFG.GW,x sta ARP.TmpCache+S.ARPCACHE.IP,x dex bpl .7 .8 jsr ARP.QUERY.I bcs .99 ldx #5 ldy #S.ETH.DSTMAC+5 .11 lda ARP.TmpCache+S.ARPCACHE.MAC,x sta (ZPFrameOutPtr),y dey dex bpl .11 clc .99 rts *-------------------------------------- MAN SAVE usr/src/lib/libtcpip.s.ip LOAD usr/src/lib/libtcpip.s ASM