Beispiel #1
0
static bool test_function_icmp4_minimum_mtu(void)
{
	bool success = true;

	success &= assert_equals_u16(2, be16_to_cpu(icmp4_minimum_mtu(2, 4, 6)), "First is min");
	success &= assert_equals_u16(8, be16_to_cpu(icmp4_minimum_mtu(10, 8, 12)), "Second is min");
	success &= assert_equals_u16(14, be16_to_cpu(icmp4_minimum_mtu(16, 18, 14)), "Third is min");

	return success;
}
Beispiel #2
0
static void ipv4_mtu_hack(struct sk_buff *skb_in, struct sk_buff *skb_out)
{
	struct icmp6hdr *hdr6 = icmp6_hdr(skb_in);
	struct icmphdr *hdr4 = icmp_hdr(skb_out);

	unsigned int ipv6_mtu = skb_in->dev->mtu;
	unsigned int ipv4_mtu = skb_out->dev->mtu;

	if (!skb_in)
		return;

	if (ip_hdr(skb_out)->protocol != IPPROTO_ICMP)
		return;

	if (hdr4->type != ICMP_DEST_UNREACH || hdr4->code != ICMP_FRAG_NEEDED)
		return;

	hdr4->un.frag.mtu = icmp4_minimum_mtu(be32_to_cpu(hdr6->icmp6_mtu) - 20,
			ipv4_mtu,
			ipv6_mtu - 20);
}