354 } |
354 } |
355 |
355 |
356 static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, |
356 static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, |
357 int type, int code, int offset, __be32 info) |
357 int type, int code, int offset, __be32 info) |
358 { |
358 { |
|
359 struct net *net = dev_net(skb->dev); |
359 struct ipv6hdr *iph = (struct ipv6hdr*)skb->data; |
360 struct ipv6hdr *iph = (struct ipv6hdr*)skb->data; |
360 struct ip_esp_hdr *esph = (struct ip_esp_hdr *)(skb->data + offset); |
361 struct ip_esp_hdr *esph = (struct ip_esp_hdr *)(skb->data + offset); |
361 struct xfrm_state *x; |
362 struct xfrm_state *x; |
362 |
363 |
363 if (type != ICMPV6_DEST_UNREACH && |
364 if (type != ICMPV6_DEST_UNREACH && |
364 type != ICMPV6_PKT_TOOBIG) |
365 type != ICMPV6_PKT_TOOBIG) |
365 return; |
366 return; |
366 |
367 |
367 x = xfrm_state_lookup((xfrm_address_t *)&iph->daddr, esph->spi, IPPROTO_ESP, AF_INET6); |
368 x = xfrm_state_lookup(net, (xfrm_address_t *)&iph->daddr, esph->spi, IPPROTO_ESP, AF_INET6); |
368 if (!x) |
369 if (!x) |
369 return; |
370 return; |
370 printk(KERN_DEBUG "pmtu discovery on SA ESP/%08x/" NIP6_FMT "\n", |
371 printk(KERN_DEBUG "pmtu discovery on SA ESP/%08x/%pI6\n", |
371 ntohl(esph->spi), NIP6(iph->daddr)); |
372 ntohl(esph->spi), &iph->daddr); |
372 xfrm_state_put(x); |
373 xfrm_state_put(x); |
373 } |
374 } |
374 |
375 |
375 static void esp6_destroy(struct xfrm_state *x) |
376 static void esp6_destroy(struct xfrm_state *x) |
376 { |
377 { |