Build: Improve dependencies

Makefile:
	doesn't build kernel.bin and the ISO when nothing has changed.
Fix doc indentation

DOC/CallingConvention.txt:
	fix indentation for code: don't generate a href.
ISO9660: don't report ATAPI only

kernel/fs/iso9660.s:
	do not report only atapi supported for cleaner output.
NET: Implement Multicast and IGMP; cloud: MCAST

	SUMMARY

		- implement IGMP protocol
		- implement multicast target MAC calculation
		- update checks for broadcast to check for mcast bit
		- add route for mcast
		- maintain IGMP group membership per NIC
		- find nics also by multicast address
		- add NIC transfer statistics
		- update NIC drivers MCAST filtering
		- store MCAST MAC/IP in ARP table
		- ipv4 packet sniffer size fixes
		- cloudnet protocol now uses multicast isntead of broadcast

kernel/net/net.s:
	include igmp.s;

	net_handle_packet: instead of checking broadcast MAC, check the
	IG bit (first bit of first byte) in the MAC, indicating broadcast
	and/or multicast.

	add net_protocol_checksum_verify.

	net_print_protocol: correct ecx for ethernet header.

	net_rx_packet: keep track of received packets/bytes in nic object.

	cmd_netstat: print IGMP group memberships for all nics.

kernel/net/route.s:
	add (disabled) debug in net_route_get;

	print route metric has hex4 rather than decimal;

kernel/net/arp.s:
	arp_table_put_mac_ipv4: return the entry added (ecx+edx),
	which prevents having to look up the entry in arp_table_getentry_by_ipv4
	just after adding it;

	arp_table_print: preserve eax;

	arp_table_getentry_by_ipv4: if entry not found, check if
	the address is multicast (224.0.0.0/3), and if so, generate
	the MCAST MAC and add the entry to the table.

		(note: adding the entry is not absolutely necessary as it can
		be calculated;
		however somewhere the MAC must be stored since a pointer must
		be passed on to the ethernet layer; doing it this way requires
		the least changes and conforms to how non-multicast IP's are
		resolved in both the routing table and ARP table).

	net_arp_handle: preserve (ecx,edx) now that arp_table_put_mac_ipv4
	returns the entry.

kernel/net/igmp.s:
	add IGMP implementation:

	net_igmp_header_put: version 1 (8 bytes).

	net_igmp_header_print: packet dump handler (as referenced by
	protocol declaration in ip.s).

	ph_ipv4_igmp: IGMP packet handler.

	net_igmp_send: creates and sends ETH/IP/IGMP(v1,v2) packet,
	parameterized by message type (report, query) and multicast IP and NIC.

	net_igmp_print: lists the MCAST ip's the NIC has joined.
	net_igmp_join: sends report and adds the IP to the NIC's mcast list;
	net_igmp_leave: sends leave and removes the IP from the NIC's mcast
	list;
	net_igmp_ismember: checks whether the NIC has joined the group specified
	by the IP; returns true (ZF=1) for 224.0.0.1.

kernel/net/ipv4.s:
	declare IP_PROTOCOL_IGMP and it's protocol handler pointers.

	net_ipv4_header_put: check dest ip for local network control
	block (224.0.0.0/24), and if so, force TTL to 1. This is convenient
	since the net_put_eth_ipv4_udp_headers uses edx for sport/dport,
	and has no parameter to specify IPv4 options (such as ttl).

	net_ipv4_print: set ecx to the IPV4 frame length as per packet; for
	small packets (<64 bytes) some/most NICS will set the packet size
	to 64.

	net_ipv4_handle: log reception of IPv4 packets with an unrecognized IP
	and clean up error printing.

kernel/net/ipv6.s:
	disable debug print on IPv6 packets, which are now received due to
	the AM79C971 accepting multicast packets.

kernel/net/udp.s:
	change indentation of .if UDP_LOG for dropped packets: just in case,
	since GAS behaves weird sometimes if a .if statement is on the same
	line as a label.

kernel/nic.s:
	repurpose nic_mcast field to nic_mcast_list: an array of IGMP
	multicast group memberships.

	move nic_netmask back to base structure (no longer OLDSKOOL).
	Update zeroconf's ifconfig to specify the network mask for the nic.
	Update ifconfig to take 'mask' argument for the nic IP's netmask.

	add nic_(tx|rx)_(count|bytes) statistical fields.
	Update nic_print to print these values, aswell as the IP/MASK/NET/BCAST.

	nic_get_by_ipv4:
	* positive match on NIC's network (IP | ~MASK)
	* positive match on 224/3, and optionally:
	* match multicast group membership using net_igmp_ismember
	* preserve eax (ip)

	nic_zeroconf: add static multicast routing rule.

kernel/nic/am79c971.s:
	define/document LADRF registers (logical (MAC) address filter);

	am79c971_init:
		when checking for MODE_PORTSEL0 to be set correctly
		after IDON (init done), mask out the flags (such as PROMISC).

		am79c_init_ladr field renamed to _ladrf;

		store -1 in the 64 bit am79c_init_ladr field to accept
		all multicast packets. (promiscuous mode would yield the
		same result but would also trigger reception of non-mcast
		packets for different MACs).

	_send: keep track of tx packets/bytes in nic obj

kernel/nic/rtl8139.s:
	initialize MAR (multicast address registers) to -1;
	(same method as with AM79c: high 6 bits of CRC32(MAC) = flag).

	disable reading mcast into nic_mcast (field repurposed).

	_send: keep track of tx packets/bytes in nic obj

kernel/nic/i8254.s:
	_send: keep track of tx packets/bytes in nic obj

kernel/net/cloudnet.s:
	use multicast instead of broadcast (compile-time flag CLOUD_MCAST=1).

	arpwatch: print requestor ip.

kernel/net/dhcp.s:
	prepare for sending proper hostname in dhcp request. Can't be used
	yet due to hardcoded packet offsets.

	set NIC's netmask.

kernel/net/tcp.s:
	print source IP on portscan detection.
HTTPD: fix & refactor expressions

kernel/net/httpd.s:
	some expressions were producing a prefix of zeroes in the HTML output.
	Refactored / cleaned up the code, problem solved.
Cloudnet: add MCAST response decision

kernel/net/cloudnet.s:
	update the response condition for MCAST (as there now can be no
	check whether the target IP is a broadcast): change protocol,
	use bit 0x20 of first char to determine notify/response:
	- set (lowercase ASCII alpha)=notify or request,
	- unset (uppercase) = response).
	Thus: 'hello' = request, 'Hello' = response.
	(Remember: the purpose of this is to prevent infinite identical
	responses).
WEB: make QuRe homepage validate HTML5/CSS3.
DEBUG: add macros

kernel/debugger/export.s:
	add macro DEBUGz "ZF=1", "ZF=0".
	delete macro DEBUGc.
	add macro DEBUGc "CF=1", "CF=0".

kernel/fs/fat.s:
	use macro DEBUG instead of DEBUGc.
Add stats: kernel calls, httpd requests

kernel/kapi/kapi.s:
	maintain stats_kernel_calls, and define macro for KAPI implementations.

kernel/kapi/kapi_page_int.s:
	call that macro in the page handler

kernel/net/httpd.s:
	maintain stats_httpd_kernel_calls;

	add www expressions for the stats: stats.kernel.kc, stats.httpd.rc.

root/www/shell.html:
root/www/index.html:
	display the new stats.
NET: fix ip_route_get

kernel/net/route.s:
	remove legacy 'jz good_gw' when ip&mask=0.
	indent debug for more clarity.
[minor] add cmd_iproute to test route table

kernel/net/net.s:
	make net_print_ipv4, net_parse_ip global for shell access.

kernel/shell.s:
	add cmd_iproute which prints the gateway route for the given IP.