Hi, there.
I'm recently analyzing the kernel source for IPv6 router.
I found that when the kernel has no forwarding entry of a packet,
the kernel sends an ICMPV6_DEST_UNREACH icmp message with
ICMPV6_ADDR_UNREACH code
to the source of the packet.
But According to RFC 2463, If the kerenl has no forwarding entry of a
packet,
the kernel must send an ICMPV6_DEST_UNREACH icmp message with ICMPV6_NOROUTE
code.
In my opinion, ip6_pkt_discard() should be modified as follows :
int ip6_pkt_discard(struct sk_buff *skb)
{
IP6_INC_STATS(Ip6OutNoRoutes);
/* icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_ADDR_UNREACH, 0,
skb->dev); */
icmpv6_send(skb, ICMPV6_DEST_UNREACH, ICMPV6_NOROUTE, 0, skb->dev);
kfree_skb(skb);
return 0;
}
How about you ? Am I right ?
And I found another doubtable thing,
ipv6_routing_header() sends an ICMPv6 Parameter Problem message if the
extention header's length is odd value.
Then ICMPv6 Parameter Problem Message includes the pointer that indicates
the byte offset of errorneous field in a packet.
ipv6_routing_header() calculates the byte offset from the beginning of the
extention header.
In my opinion, ipv6_routing_header() must calculates the byte offset from
the beginning of the
IPv6 packet.
Is this right ?
bye.
|