|
@@ -459,7 +459,7 @@ int ip6_forward(struct sk_buff *skb)
|
|
|
else
|
|
|
target = &hdr->daddr;
|
|
|
|
|
|
- peer = inet_getpeer_v6(net->ipv6.peers, &rt->rt6i_dst.addr, 1);
|
|
|
+ peer = inet_getpeer_v6(net->ipv6.peers, &hdr->daddr, 1);
|
|
|
|
|
|
/* Limit redirects both by destination (here)
|
|
|
and by source (inside ndisc_send_redirect)
|
|
@@ -584,7 +584,8 @@ int ip6_fragment(struct sock *sk, struct sk_buff *skb,
|
|
|
}
|
|
|
mtu -= hlen + sizeof(struct frag_hdr);
|
|
|
|
|
|
- frag_id = ipv6_select_ident(net, rt);
|
|
|
+ frag_id = ipv6_select_ident(net, &ipv6_hdr(skb)->daddr,
|
|
|
+ &ipv6_hdr(skb)->saddr);
|
|
|
|
|
|
if (skb_has_frag_list(skb)) {
|
|
|
int first_len = skb_pagelen(skb);
|
|
@@ -1057,7 +1058,7 @@ static inline int ip6_ufo_append_data(struct sock *sk,
|
|
|
int odd, struct sk_buff *skb),
|
|
|
void *from, int length, int hh_len, int fragheaderlen,
|
|
|
int transhdrlen, int mtu, unsigned int flags,
|
|
|
- struct rt6_info *rt)
|
|
|
+ const struct flowi6 *fl6)
|
|
|
|
|
|
{
|
|
|
struct sk_buff *skb;
|
|
@@ -1102,7 +1103,9 @@ static inline int ip6_ufo_append_data(struct sock *sk,
|
|
|
skb_shinfo(skb)->gso_size = (mtu - fragheaderlen -
|
|
|
sizeof(struct frag_hdr)) & ~7;
|
|
|
skb_shinfo(skb)->gso_type = SKB_GSO_UDP;
|
|
|
- skb_shinfo(skb)->ip6_frag_id = ipv6_select_ident(sock_net(sk), rt);
|
|
|
+ skb_shinfo(skb)->ip6_frag_id = ipv6_select_ident(sock_net(sk),
|
|
|
+ &fl6->daddr,
|
|
|
+ &fl6->saddr);
|
|
|
|
|
|
append:
|
|
|
return skb_append_datato_frags(sk, skb, getfrag, from,
|
|
@@ -1327,7 +1330,7 @@ emsgsize:
|
|
|
(sk->sk_type == SOCK_DGRAM)) {
|
|
|
err = ip6_ufo_append_data(sk, queue, getfrag, from, length,
|
|
|
hh_len, fragheaderlen,
|
|
|
- transhdrlen, mtu, flags, rt);
|
|
|
+ transhdrlen, mtu, flags, fl6);
|
|
|
if (err)
|
|
|
goto error;
|
|
|
return 0;
|