From: Joshua Wise <joshua@rebirth.joshuawise.com>
Date: Tue, 27 May 2008 05:08:28 +0000 (-0400)
Subject: IP
X-Git-Url: http://git.joshuawise.com/fpgaboy.git/commitdiff_plain/f8fc136727e9a5259529a58e2a2ada1c93d0dd17

IP
---

diff --git a/ethernet.asm b/ethernet.asm
index 5e49ef6..8fb4fed 100644
--- a/ethernet.asm
+++ b/ethernet.asm
@@ -277,6 +277,131 @@ arp_input:
 	ret
 
 ip_input:
+	; check for ipv4
+	ld a, [hl]
+	ld c, a
+	and $F0
+	swap a
+	sub $04
+	jr z, .ip_isv4
+	PUTSIL "ip_input: not ipv4 -- fuck off"
+	ret
+.ip_isv4
+	; get length
+	ld a, c
+	and $0F
+	sla a
+	ld c, a
+	sla a
+	sub $14
+	ld b, a
+	push bc
+
+	; check checksum
+	xor a
+	ld d, a
+	ld e, a
+	push hl
+.ip_cksumloop:
+	ld a, [hli]
+	ld b, a
+	ld a, [hli]
+	add e
+	ld e, a
+	ld a, b
+	add d
+	ld d, a
+	jr nc, .ip_noinc
+	inc de
+.ip_noinc:
+	dec c
+	jr nz, .ip_cksumloop
+
+	; checksum ok
+	pop hl
+	ld a, d
+	or e
+	jr z, .ip_cksumgood
+	ld a, d
+	and e
+	cpl
+	or a
+	jr z, .ip_cksumgood
+	PUTSIL "ip_input: checksum fail -- bailing"
+	pop hl
+	ret
+.ip_cksumgood:
+	PUTSIL "ip_input: checksum good"
+	ld b, $00
+	ld c, $0C
+	add hl, bc
+	ld c, $04
+
+	; print source IP
+	PUTSI "ip_input: this packet is from 0x"
+.ip_get_srcip:
+	ld a, [hli]
+	PUTHEX a
+	dec c
+	jr nz, .ip_get_srcip
+	PUTSIL "."
+
+	; check dest IP
+	ld d, myIP >> 8
+	ld e, myIP & $FF
+	ld c, $04
+.ip_chkip:
+	ld b, [hl]
+	inc hl
+	ld a, [de]
+	inc de
+	cp b
+	jr nz, .ip_ipfail
+	dec c
+	jr nz, .ip_chkip
+
+	PUTSIL "ip_input: wheeeeeeeeeeeeeeee"
+	; get protocol in A
+	ld d, $FF
+	ld e, -$0B
+	add hl, de
+	ld a, [hl]
+	ld d, $00
+	ld e, $0B
+	add hl, de
+
+	; make hl point at beginning of data
+	pop bc
+	ld c, b
+	ld b, $00
+	add hl, bc
+
+	; ok, pass it off to something else
+	cp $01
+	jr z, .ip_icmp
+	cp $11
+	jr z, .ip_udp
+	ret
+
+.ip_icmp:
+	call icmp_input
+	ret
+
+.ip_udp:
+	call udp_input
+	ret
+
+.ip_ipfail:
+	PUTSIL "ip_input: this packet is not to our IP address. Bailing."
+	pop hl
+	ret
+
+icmp_input:
+	PUTSIL "icmp_input: too lazy to parse -- fuck off"
+	ret
+
+udp_input:
+	PUTSIL "udp_input: too lazy to parse -- fuck off"
 	ret
 
 packet_send: