- Log("[IPv6 ] hdr = {");
- Log("[IPv6 ] .Version = %i", (hdr->Head >> (20+8)) & 0xF );
- Log("[IPv6 ] .TrafficClass = %i", (hdr->Head >> (20)) & 0xFF );
- Log("[IPv6 ] .FlowLabel = %i", hdr->Head & 0xFFFFF );
- Log("[IPv6 ] .PayloadLength = 0x%04x", ntohs(hdr->PayloadLength) );
- Log("[IPv6 ] .NextHeader = 0x%02x", hdr->NextHeader );
- Log("[IPv6 ] .HopLimit = 0x%02x", hdr->HopLimit );
- Log("[IPv6 ] .Source = %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x", hdr->Source );
- Log("[IPv6 ] .Destination = %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x", hdr->Destination );
- Log("[IPv6 ] }");
+ #if 1
+ Log_Debug("IPv6", "hdr = {");
+ Log_Debug("IPv6", " .Version = %i", hdr->Version );
+ Log_Debug("IPv6", " .TrafficClass = %i", hdr->TrafficClass );
+ Log_Debug("IPv6", " .FlowLabel = %i", hdr->FlowLabel );
+ Log_Debug("IPv6", " .PayloadLength = 0x%04x", ntohs(hdr->PayloadLength) );
+ Log_Debug("IPv6", " .NextHeader = 0x%02x", hdr->NextHeader );
+ Log_Debug("IPv6", " .HopLimit = 0x%02x", hdr->HopLimit );
+ Log_Debug("IPv6", " .Source = %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x", hdr->Source );
+ Log_Debug("IPv6", " .Destination = %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x", hdr->Destination );
+ Log_Debug("IPv6", "}");
+ #endif
+
+ // No checksum in IPv6
+
+ // Check Packet length
+ if( ntohs(hdr->PayloadLength)+sizeof(tIPv6Header) > Length) {
+ Log_Log("IPv6", "hdr->PayloadLength(%i) > Length(%i)", ntohs(hdr->PayloadLength), Length);
+ return;
+ }
+
+ // Process Options
+ nextHeader = hdr->NextHeader;
+ dataPtr = hdr->Data;
+ dataLength = hdr->PayloadLength;
+ for( ;; )
+ {
+ struct {
+ Uint8 NextHeader;
+ Uint8 Length; // In 8-byte chunks, with 0 being 8 bytes long
+ Uint8 Data[];
+ } *optionHdr;
+ optionHdr = (void*)dataPtr;
+ // Hop-by-hop options
+ if(nextHeader == 0)
+ {
+ // TODO: Parse the options (actually, RFC2460 doesn't specify any)
+ }
+ // Routing Options
+ else if(nextHeader == 43)
+ {
+ // TODO: Routing Header options
+ }
+ else
+ {
+ break; // Unknown, pass on
+ }
+ nextHeader = optionHdr->NextHeader;
+ dataPtr += (optionHdr->Length + 1) * 8; // 8-octet length (0 = 8 bytes long)
+ }
+
+ // Get Interface (allowing broadcasts)
+ iface = IPv6_GetInterface(Adapter, hdr->Destination, 1);