Code Review
/
kvmfornfv.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git]
/
kernel
/
net
/
ipv6
/
datagram.c
diff --git
a/kernel/net/ipv6/datagram.c
b/kernel/net/ipv6/datagram.c
index
b10a889
..
4281621
100644
(file)
--- a/
kernel/net/ipv6/datagram.c
+++ b/
kernel/net/ipv6/datagram.c
@@
-162,13
+162,18
@@
ipv4_connected:
fl6.fl6_dport = inet->inet_dport;
fl6.fl6_sport = inet->inet_sport;
fl6.fl6_dport = inet->inet_dport;
fl6.fl6_sport = inet->inet_sport;
+ if (!fl6.flowi6_oif)
+ fl6.flowi6_oif = np->sticky_pktinfo.ipi6_ifindex;
+
if (!fl6.flowi6_oif && (addr_type&IPV6_ADDR_MULTICAST))
fl6.flowi6_oif = np->mcast_oif;
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
if (!fl6.flowi6_oif && (addr_type&IPV6_ADDR_MULTICAST))
fl6.flowi6_oif = np->mcast_oif;
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
- opt = flowlabel ? flowlabel->opt : np->opt;
+ rcu_read_lock();
+ opt = flowlabel ? flowlabel->opt : rcu_dereference(np->opt);
final_p = fl6_update_dst(&fl6, opt, &final);
final_p = fl6_update_dst(&fl6, opt, &final);
+ rcu_read_unlock();
dst = ip6_dst_lookup_flow(sk, &fl6, final_p);
err = 0;
dst = ip6_dst_lookup_flow(sk, &fl6, final_p);
err = 0;
@@
-199,7
+204,7
@@
ipv4_connected:
NULL);
sk->sk_state = TCP_ESTABLISHED;
NULL);
sk->sk_state = TCP_ESTABLISHED;
-
ip6
_set_txhash(sk);
+
sk
_set_txhash(sk);
out:
fl6_sock_release(flowlabel);
return err;
out:
fl6_sock_release(flowlabel);
return err;
@@
-263,7
+268,7
@@
void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info)
{
void ipv6_local_error(struct sock *sk, int err, struct flowi6 *fl6, u32 info)
{
- struct ipv6_pinfo *np = inet6_sk(sk);
+
const
struct ipv6_pinfo *np = inet6_sk(sk);
struct sock_exterr_skb *serr;
struct ipv6hdr *iph;
struct sk_buff *skb;
struct sock_exterr_skb *serr;
struct ipv6hdr *iph;
struct sk_buff *skb;
@@
-568,8
+573,8
@@
void ip6_datagram_recv_specific_ctl(struct sock *sk, struct msghdr *msg,
}
/* HbH is allowed only once */
}
/* HbH is allowed only once */
- if (np->rxopt.bits.hopopts &&
opt->hop
) {
- u8 *ptr = nh +
opt->hop
;
+ if (np->rxopt.bits.hopopts &&
(opt->flags & IP6SKB_HOPBYHOP)
) {
+ u8 *ptr = nh +
sizeof(struct ipv6hdr)
;
put_cmsg(msg, SOL_IPV6, IPV6_HOPOPTS, (ptr[1]+1)<<3, ptr);
}
put_cmsg(msg, SOL_IPV6, IPV6_HOPOPTS, (ptr[1]+1)<<3, ptr);
}
@@
-630,8
+635,8
@@
void ip6_datagram_recv_specific_ctl(struct sock *sk, struct msghdr *msg,
int hlim = ipv6_hdr(skb)->hop_limit;
put_cmsg(msg, SOL_IPV6, IPV6_2292HOPLIMIT, sizeof(hlim), &hlim);
}
int hlim = ipv6_hdr(skb)->hop_limit;
put_cmsg(msg, SOL_IPV6, IPV6_2292HOPLIMIT, sizeof(hlim), &hlim);
}
- if (np->rxopt.bits.ohopopts &&
opt->hop
) {
- u8 *ptr = nh +
opt->hop
;
+ if (np->rxopt.bits.ohopopts &&
(opt->flags & IP6SKB_HOPBYHOP)
) {
+ u8 *ptr = nh +
sizeof(struct ipv6hdr)
;
put_cmsg(msg, SOL_IPV6, IPV6_2292HOPOPTS, (ptr[1]+1)<<3, ptr);
}
if (np->rxopt.bits.odstopts && opt->dst0) {
put_cmsg(msg, SOL_IPV6, IPV6_2292HOPOPTS, (ptr[1]+1)<<3, ptr);
}
if (np->rxopt.bits.odstopts && opt->dst0) {