diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/addrconf.c | 9 | ||||
-rw-r--r-- | net/ipv6/fib6_rules.c | 14 | ||||
-rw-r--r-- | net/ipv6/ip6_fib.c | 8 | ||||
-rw-r--r-- | net/ipv6/ip6_input.c | 8 | ||||
-rw-r--r-- | net/ipv6/ipv6_sockglue.c | 14 | ||||
-rw-r--r-- | net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c | 1 | ||||
-rw-r--r-- | net/ipv6/raw.c | 4 | ||||
-rw-r--r-- | net/ipv6/route.c | 120 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 1 | ||||
-rw-r--r-- | net/ipv6/udp.c | 2 | ||||
-rw-r--r-- | net/ipv6/xfrm6_tunnel.c | 4 |
11 files changed, 103 insertions, 82 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index e16f1bba5dff..7552663aa125 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -342,10 +342,9 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) | |||
342 | } | 342 | } |
343 | #endif | 343 | #endif |
344 | 344 | ||
345 | if (netif_carrier_ok(dev)) | 345 | if (netif_running(dev) && netif_carrier_ok(dev)) |
346 | ndev->if_flags |= IF_READY; | 346 | ndev->if_flags |= IF_READY; |
347 | 347 | ||
348 | |||
349 | ipv6_mc_init_dev(ndev); | 348 | ipv6_mc_init_dev(ndev); |
350 | ndev->tstamp = jiffies; | 349 | ndev->tstamp = jiffies; |
351 | #ifdef CONFIG_SYSCTL | 350 | #ifdef CONFIG_SYSCTL |
@@ -808,7 +807,7 @@ struct ipv6_saddr_score { | |||
808 | #define IPV6_SADDR_SCORE_LABEL 0x0020 | 807 | #define IPV6_SADDR_SCORE_LABEL 0x0020 |
809 | #define IPV6_SADDR_SCORE_PRIVACY 0x0040 | 808 | #define IPV6_SADDR_SCORE_PRIVACY 0x0040 |
810 | 809 | ||
811 | static int inline ipv6_saddr_preferred(int type) | 810 | static inline int ipv6_saddr_preferred(int type) |
812 | { | 811 | { |
813 | if (type & (IPV6_ADDR_MAPPED|IPV6_ADDR_COMPATv4| | 812 | if (type & (IPV6_ADDR_MAPPED|IPV6_ADDR_COMPATv4| |
814 | IPV6_ADDR_LOOPBACK|IPV6_ADDR_RESERVED)) | 813 | IPV6_ADDR_LOOPBACK|IPV6_ADDR_RESERVED)) |
@@ -817,7 +816,7 @@ static int inline ipv6_saddr_preferred(int type) | |||
817 | } | 816 | } |
818 | 817 | ||
819 | /* static matching label */ | 818 | /* static matching label */ |
820 | static int inline ipv6_saddr_label(const struct in6_addr *addr, int type) | 819 | static inline int ipv6_saddr_label(const struct in6_addr *addr, int type) |
821 | { | 820 | { |
822 | /* | 821 | /* |
823 | * prefix (longest match) label | 822 | * prefix (longest match) label |
@@ -3322,7 +3321,7 @@ errout: | |||
3322 | rtnl_set_sk_err(RTNLGRP_IPV6_IFADDR, err); | 3321 | rtnl_set_sk_err(RTNLGRP_IPV6_IFADDR, err); |
3323 | } | 3322 | } |
3324 | 3323 | ||
3325 | static void inline ipv6_store_devconf(struct ipv6_devconf *cnf, | 3324 | static inline void ipv6_store_devconf(struct ipv6_devconf *cnf, |
3326 | __s32 *array, int bytes) | 3325 | __s32 *array, int bytes) |
3327 | { | 3326 | { |
3328 | BUG_ON(bytes < (DEVCONF_MAX * 4)); | 3327 | BUG_ON(bytes < (DEVCONF_MAX * 4)); |
diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c index 0862809ffcf7..ea3035b4e3e8 100644 --- a/net/ipv6/fib6_rules.c +++ b/net/ipv6/fib6_rules.c | |||
@@ -131,8 +131,6 @@ static int fib6_rule_match(struct fib_rule *rule, struct flowi *fl, int flags) | |||
131 | 131 | ||
132 | static struct nla_policy fib6_rule_policy[FRA_MAX+1] __read_mostly = { | 132 | static struct nla_policy fib6_rule_policy[FRA_MAX+1] __read_mostly = { |
133 | FRA_GENERIC_POLICY, | 133 | FRA_GENERIC_POLICY, |
134 | [FRA_SRC] = { .len = sizeof(struct in6_addr) }, | ||
135 | [FRA_DST] = { .len = sizeof(struct in6_addr) }, | ||
136 | }; | 134 | }; |
137 | 135 | ||
138 | static int fib6_rule_configure(struct fib_rule *rule, struct sk_buff *skb, | 136 | static int fib6_rule_configure(struct fib_rule *rule, struct sk_buff *skb, |
@@ -142,9 +140,6 @@ static int fib6_rule_configure(struct fib_rule *rule, struct sk_buff *skb, | |||
142 | int err = -EINVAL; | 140 | int err = -EINVAL; |
143 | struct fib6_rule *rule6 = (struct fib6_rule *) rule; | 141 | struct fib6_rule *rule6 = (struct fib6_rule *) rule; |
144 | 142 | ||
145 | if (frh->src_len > 128 || frh->dst_len > 128) | ||
146 | goto errout; | ||
147 | |||
148 | if (rule->action == FR_ACT_TO_TBL) { | 143 | if (rule->action == FR_ACT_TO_TBL) { |
149 | if (rule->table == RT6_TABLE_UNSPEC) | 144 | if (rule->table == RT6_TABLE_UNSPEC) |
150 | goto errout; | 145 | goto errout; |
@@ -155,11 +150,11 @@ static int fib6_rule_configure(struct fib_rule *rule, struct sk_buff *skb, | |||
155 | } | 150 | } |
156 | } | 151 | } |
157 | 152 | ||
158 | if (tb[FRA_SRC]) | 153 | if (frh->src_len) |
159 | nla_memcpy(&rule6->src.addr, tb[FRA_SRC], | 154 | nla_memcpy(&rule6->src.addr, tb[FRA_SRC], |
160 | sizeof(struct in6_addr)); | 155 | sizeof(struct in6_addr)); |
161 | 156 | ||
162 | if (tb[FRA_DST]) | 157 | if (frh->dst_len) |
163 | nla_memcpy(&rule6->dst.addr, tb[FRA_DST], | 158 | nla_memcpy(&rule6->dst.addr, tb[FRA_DST], |
164 | sizeof(struct in6_addr)); | 159 | sizeof(struct in6_addr)); |
165 | 160 | ||
@@ -186,11 +181,11 @@ static int fib6_rule_compare(struct fib_rule *rule, struct fib_rule_hdr *frh, | |||
186 | if (frh->tos && (rule6->tclass != frh->tos)) | 181 | if (frh->tos && (rule6->tclass != frh->tos)) |
187 | return 0; | 182 | return 0; |
188 | 183 | ||
189 | if (tb[FRA_SRC] && | 184 | if (frh->src_len && |
190 | nla_memcmp(tb[FRA_SRC], &rule6->src.addr, sizeof(struct in6_addr))) | 185 | nla_memcmp(tb[FRA_SRC], &rule6->src.addr, sizeof(struct in6_addr))) |
191 | return 0; | 186 | return 0; |
192 | 187 | ||
193 | if (tb[FRA_DST] && | 188 | if (frh->dst_len && |
194 | nla_memcmp(tb[FRA_DST], &rule6->dst.addr, sizeof(struct in6_addr))) | 189 | nla_memcmp(tb[FRA_DST], &rule6->dst.addr, sizeof(struct in6_addr))) |
195 | return 0; | 190 | return 0; |
196 | 191 | ||
@@ -240,6 +235,7 @@ static size_t fib6_rule_nlmsg_payload(struct fib_rule *rule) | |||
240 | static struct fib_rules_ops fib6_rules_ops = { | 235 | static struct fib_rules_ops fib6_rules_ops = { |
241 | .family = AF_INET6, | 236 | .family = AF_INET6, |
242 | .rule_size = sizeof(struct fib6_rule), | 237 | .rule_size = sizeof(struct fib6_rule), |
238 | .addr_size = sizeof(struct in6_addr), | ||
243 | .action = fib6_rule_action, | 239 | .action = fib6_rule_action, |
244 | .match = fib6_rule_match, | 240 | .match = fib6_rule_match, |
245 | .configure = fib6_rule_configure, | 241 | .configure = fib6_rule_configure, |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index f4d7be77eb0f..268f476ef3db 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
@@ -658,6 +658,10 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt, | |||
658 | ins = &iter->u.dst.rt6_next; | 658 | ins = &iter->u.dst.rt6_next; |
659 | } | 659 | } |
660 | 660 | ||
661 | /* Reset round-robin state, if necessary */ | ||
662 | if (ins == &fn->leaf) | ||
663 | fn->rr_ptr = NULL; | ||
664 | |||
661 | /* | 665 | /* |
662 | * insert node | 666 | * insert node |
663 | */ | 667 | */ |
@@ -1109,6 +1113,10 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp, | |||
1109 | rt6_stats.fib_rt_entries--; | 1113 | rt6_stats.fib_rt_entries--; |
1110 | rt6_stats.fib_discarded_routes++; | 1114 | rt6_stats.fib_discarded_routes++; |
1111 | 1115 | ||
1116 | /* Reset round-robin state, if necessary */ | ||
1117 | if (fn->rr_ptr == rt) | ||
1118 | fn->rr_ptr = NULL; | ||
1119 | |||
1112 | /* Adjust walkers */ | 1120 | /* Adjust walkers */ |
1113 | read_lock(&fib6_walker_lock); | 1121 | read_lock(&fib6_walker_lock); |
1114 | FOR_WALKERS(w) { | 1122 | FOR_WALKERS(w) { |
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c index 11bfc7c43182..61e7a6c8141d 100644 --- a/net/ipv6/ip6_input.c +++ b/net/ipv6/ip6_input.c | |||
@@ -108,8 +108,10 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt | |||
108 | 108 | ||
109 | /* pkt_len may be zero if Jumbo payload option is present */ | 109 | /* pkt_len may be zero if Jumbo payload option is present */ |
110 | if (pkt_len || hdr->nexthdr != NEXTHDR_HOP) { | 110 | if (pkt_len || hdr->nexthdr != NEXTHDR_HOP) { |
111 | if (pkt_len + sizeof(struct ipv6hdr) > skb->len) | 111 | if (pkt_len + sizeof(struct ipv6hdr) > skb->len) { |
112 | goto truncated; | 112 | IP6_INC_STATS_BH(idev, IPSTATS_MIB_INTRUNCATEDPKTS); |
113 | goto drop; | ||
114 | } | ||
113 | if (pskb_trim_rcsum(skb, pkt_len + sizeof(struct ipv6hdr))) { | 115 | if (pskb_trim_rcsum(skb, pkt_len + sizeof(struct ipv6hdr))) { |
114 | IP6_INC_STATS_BH(idev, IPSTATS_MIB_INHDRERRORS); | 116 | IP6_INC_STATS_BH(idev, IPSTATS_MIB_INHDRERRORS); |
115 | goto drop; | 117 | goto drop; |
@@ -128,8 +130,6 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt | |||
128 | rcu_read_unlock(); | 130 | rcu_read_unlock(); |
129 | 131 | ||
130 | return NF_HOOK(PF_INET6,NF_IP6_PRE_ROUTING, skb, dev, NULL, ip6_rcv_finish); | 132 | return NF_HOOK(PF_INET6,NF_IP6_PRE_ROUTING, skb, dev, NULL, ip6_rcv_finish); |
131 | truncated: | ||
132 | IP6_INC_STATS_BH(idev, IPSTATS_MIB_INTRUNCATEDPKTS); | ||
133 | err: | 133 | err: |
134 | IP6_INC_STATS_BH(idev, IPSTATS_MIB_INHDRERRORS); | 134 | IP6_INC_STATS_BH(idev, IPSTATS_MIB_INHDRERRORS); |
135 | drop: | 135 | drop: |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 286c86735aed..f5f9582a8d39 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -413,7 +413,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, | |||
413 | } | 413 | } |
414 | 414 | ||
415 | /* routing header option needs extra check */ | 415 | /* routing header option needs extra check */ |
416 | if (optname == IPV6_RTHDR && opt->srcrt) { | 416 | if (optname == IPV6_RTHDR && opt && opt->srcrt) { |
417 | struct ipv6_rt_hdr *rthdr = opt->srcrt; | 417 | struct ipv6_rt_hdr *rthdr = opt->srcrt; |
418 | switch (rthdr->type) { | 418 | switch (rthdr->type) { |
419 | case IPV6_SRCRT_TYPE_0: | 419 | case IPV6_SRCRT_TYPE_0: |
@@ -795,12 +795,16 @@ int compat_ipv6_setsockopt(struct sock *sk, int level, int optname, | |||
795 | EXPORT_SYMBOL(compat_ipv6_setsockopt); | 795 | EXPORT_SYMBOL(compat_ipv6_setsockopt); |
796 | #endif | 796 | #endif |
797 | 797 | ||
798 | static int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_opt_hdr *hdr, | 798 | static int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_txoptions *opt, |
799 | char __user *optval, int len) | 799 | char __user *optval, int len) |
800 | { | 800 | { |
801 | if (!hdr) | 801 | struct ipv6_opt_hdr *hdr; |
802 | |||
803 | if (!opt || !opt->hopopt) | ||
802 | return 0; | 804 | return 0; |
803 | len = min_t(int, len, ipv6_optlen(hdr)); | 805 | hdr = opt->hopopt; |
806 | |||
807 | len = min_t(unsigned int, len, ipv6_optlen(hdr)); | ||
804 | if (copy_to_user(optval, hdr, ipv6_optlen(hdr))) | 808 | if (copy_to_user(optval, hdr, ipv6_optlen(hdr))) |
805 | return -EFAULT; | 809 | return -EFAULT; |
806 | return len; | 810 | return len; |
@@ -940,7 +944,7 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, | |||
940 | { | 944 | { |
941 | 945 | ||
942 | lock_sock(sk); | 946 | lock_sock(sk); |
943 | len = ipv6_getsockopt_sticky(sk, np->opt->hopopt, | 947 | len = ipv6_getsockopt_sticky(sk, np->opt, |
944 | optval, len); | 948 | optval, len); |
945 | release_sock(sk); | 949 | release_sock(sk); |
946 | return put_user(len, optlen); | 950 | return put_user(len, optlen); |
diff --git a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c index 6f19c4a49560..d1102455668d 100644 --- a/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c +++ b/net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c | |||
@@ -257,6 +257,7 @@ static unsigned int ipv6_conntrack_in(unsigned int hooknum, | |||
257 | } | 257 | } |
258 | nf_conntrack_get(reasm->nfct); | 258 | nf_conntrack_get(reasm->nfct); |
259 | (*pskb)->nfct = reasm->nfct; | 259 | (*pskb)->nfct = reasm->nfct; |
260 | (*pskb)->nfctinfo = reasm->nfctinfo; | ||
260 | return NF_ACCEPT; | 261 | return NF_ACCEPT; |
261 | } | 262 | } |
262 | 263 | ||
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 306d5d83c068..203e069e7fe9 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -687,9 +687,9 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
687 | int err; | 687 | int err; |
688 | 688 | ||
689 | /* Rough check on arithmetic overflow, | 689 | /* Rough check on arithmetic overflow, |
690 | better check is made in ip6_build_xmit | 690 | better check is made in ip6_append_data(). |
691 | */ | 691 | */ |
692 | if (len < 0) | 692 | if (len > INT_MAX) |
693 | return -EMSGSIZE; | 693 | return -EMSGSIZE; |
694 | 694 | ||
695 | /* Mirror BSD error message compatibility */ | 695 | /* Mirror BSD error message compatibility */ |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 0e1f4b2cd3dd..ad9b285692ba 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -308,27 +308,18 @@ static inline void rt6_probe(struct rt6_info *rt) | |||
308 | /* | 308 | /* |
309 | * Default Router Selection (RFC 2461 6.3.6) | 309 | * Default Router Selection (RFC 2461 6.3.6) |
310 | */ | 310 | */ |
311 | static int inline rt6_check_dev(struct rt6_info *rt, int oif) | 311 | static inline int rt6_check_dev(struct rt6_info *rt, int oif) |
312 | { | 312 | { |
313 | struct net_device *dev = rt->rt6i_dev; | 313 | struct net_device *dev = rt->rt6i_dev; |
314 | int ret = 0; | 314 | if (!oif || dev->ifindex == oif) |
315 | |||
316 | if (!oif) | ||
317 | return 2; | ||
318 | if (dev->flags & IFF_LOOPBACK) { | ||
319 | if (!WARN_ON(rt->rt6i_idev == NULL) && | ||
320 | rt->rt6i_idev->dev->ifindex == oif) | ||
321 | ret = 1; | ||
322 | else | ||
323 | return 0; | ||
324 | } | ||
325 | if (dev->ifindex == oif) | ||
326 | return 2; | 315 | return 2; |
327 | 316 | if ((dev->flags & IFF_LOOPBACK) && | |
328 | return ret; | 317 | rt->rt6i_idev && rt->rt6i_idev->dev->ifindex == oif) |
318 | return 1; | ||
319 | return 0; | ||
329 | } | 320 | } |
330 | 321 | ||
331 | static int inline rt6_check_neigh(struct rt6_info *rt) | 322 | static inline int rt6_check_neigh(struct rt6_info *rt) |
332 | { | 323 | { |
333 | struct neighbour *neigh = rt->rt6i_nexthop; | 324 | struct neighbour *neigh = rt->rt6i_nexthop; |
334 | int m = 0; | 325 | int m = 0; |
@@ -363,55 +354,76 @@ static int rt6_score_route(struct rt6_info *rt, int oif, | |||
363 | return m; | 354 | return m; |
364 | } | 355 | } |
365 | 356 | ||
366 | static struct rt6_info *rt6_select(struct rt6_info **head, int oif, | 357 | static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict, |
367 | int strict) | 358 | int *mpri, struct rt6_info *match) |
359 | { | ||
360 | int m; | ||
361 | |||
362 | if (rt6_check_expired(rt)) | ||
363 | goto out; | ||
364 | |||
365 | m = rt6_score_route(rt, oif, strict); | ||
366 | if (m < 0) | ||
367 | goto out; | ||
368 | |||
369 | if (m > *mpri) { | ||
370 | if (strict & RT6_LOOKUP_F_REACHABLE) | ||
371 | rt6_probe(match); | ||
372 | *mpri = m; | ||
373 | match = rt; | ||
374 | } else if (strict & RT6_LOOKUP_F_REACHABLE) { | ||
375 | rt6_probe(rt); | ||
376 | } | ||
377 | |||
378 | out: | ||
379 | return match; | ||
380 | } | ||
381 | |||
382 | static struct rt6_info *find_rr_leaf(struct fib6_node *fn, | ||
383 | struct rt6_info *rr_head, | ||
384 | u32 metric, int oif, int strict) | ||
368 | { | 385 | { |
369 | struct rt6_info *match = NULL, *last = NULL; | 386 | struct rt6_info *rt, *match; |
370 | struct rt6_info *rt, *rt0 = *head; | ||
371 | u32 metric; | ||
372 | int mpri = -1; | 387 | int mpri = -1; |
373 | 388 | ||
374 | RT6_TRACE("%s(head=%p(*head=%p), oif=%d)\n", | 389 | match = NULL; |
375 | __FUNCTION__, head, head ? *head : NULL, oif); | 390 | for (rt = rr_head; rt && rt->rt6i_metric == metric; |
391 | rt = rt->u.dst.rt6_next) | ||
392 | match = find_match(rt, oif, strict, &mpri, match); | ||
393 | for (rt = fn->leaf; rt && rt != rr_head && rt->rt6i_metric == metric; | ||
394 | rt = rt->u.dst.rt6_next) | ||
395 | match = find_match(rt, oif, strict, &mpri, match); | ||
376 | 396 | ||
377 | for (rt = rt0, metric = rt0->rt6i_metric; | 397 | return match; |
378 | rt && rt->rt6i_metric == metric && (!last || rt != rt0); | 398 | } |
379 | rt = rt->u.dst.rt6_next) { | ||
380 | int m; | ||
381 | 399 | ||
382 | if (rt6_check_expired(rt)) | 400 | static struct rt6_info *rt6_select(struct fib6_node *fn, int oif, int strict) |
383 | continue; | 401 | { |
402 | struct rt6_info *match, *rt0; | ||
384 | 403 | ||
385 | last = rt; | 404 | RT6_TRACE("%s(fn->leaf=%p, oif=%d)\n", |
405 | __FUNCTION__, fn->leaf, oif); | ||
386 | 406 | ||
387 | m = rt6_score_route(rt, oif, strict); | 407 | rt0 = fn->rr_ptr; |
388 | if (m < 0) | 408 | if (!rt0) |
389 | continue; | 409 | fn->rr_ptr = rt0 = fn->leaf; |
390 | 410 | ||
391 | if (m > mpri) { | 411 | match = find_rr_leaf(fn, rt0, rt0->rt6i_metric, oif, strict); |
392 | if (strict & RT6_LOOKUP_F_REACHABLE) | ||
393 | rt6_probe(match); | ||
394 | match = rt; | ||
395 | mpri = m; | ||
396 | } else if (strict & RT6_LOOKUP_F_REACHABLE) { | ||
397 | rt6_probe(rt); | ||
398 | } | ||
399 | } | ||
400 | 412 | ||
401 | if (!match && | 413 | if (!match && |
402 | (strict & RT6_LOOKUP_F_REACHABLE) && | 414 | (strict & RT6_LOOKUP_F_REACHABLE)) { |
403 | last && last != rt0) { | 415 | struct rt6_info *next = rt0->u.dst.rt6_next; |
416 | |||
404 | /* no entries matched; do round-robin */ | 417 | /* no entries matched; do round-robin */ |
405 | static DEFINE_SPINLOCK(lock); | 418 | if (!next || next->rt6i_metric != rt0->rt6i_metric) |
406 | spin_lock(&lock); | 419 | next = fn->leaf; |
407 | *head = rt0->u.dst.rt6_next; | 420 | |
408 | rt0->u.dst.rt6_next = last->u.dst.rt6_next; | 421 | if (next != rt0) |
409 | last->u.dst.rt6_next = rt0; | 422 | fn->rr_ptr = next; |
410 | spin_unlock(&lock); | ||
411 | } | 423 | } |
412 | 424 | ||
413 | RT6_TRACE("%s() => %p, score=%d\n", | 425 | RT6_TRACE("%s() => %p\n", |
414 | __FUNCTION__, match, mpri); | 426 | __FUNCTION__, match); |
415 | 427 | ||
416 | return (match ? match : &ip6_null_entry); | 428 | return (match ? match : &ip6_null_entry); |
417 | } | 429 | } |
@@ -657,7 +669,7 @@ restart_2: | |||
657 | fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src); | 669 | fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src); |
658 | 670 | ||
659 | restart: | 671 | restart: |
660 | rt = rt6_select(&fn->leaf, fl->iif, strict | reachable); | 672 | rt = rt6_select(fn, fl->iif, strict | reachable); |
661 | BACKTRACK(&fl->fl6_src); | 673 | BACKTRACK(&fl->fl6_src); |
662 | if (rt == &ip6_null_entry || | 674 | if (rt == &ip6_null_entry || |
663 | rt->rt6i_flags & RTF_CACHE) | 675 | rt->rt6i_flags & RTF_CACHE) |
@@ -752,7 +764,7 @@ restart_2: | |||
752 | fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src); | 764 | fn = fib6_lookup(&table->tb6_root, &fl->fl6_dst, &fl->fl6_src); |
753 | 765 | ||
754 | restart: | 766 | restart: |
755 | rt = rt6_select(&fn->leaf, fl->oif, strict | reachable); | 767 | rt = rt6_select(fn, fl->oif, strict | reachable); |
756 | BACKTRACK(&fl->fl6_src); | 768 | BACKTRACK(&fl->fl6_src); |
757 | if (rt == &ip6_null_entry || | 769 | if (rt == &ip6_null_entry || |
758 | rt->rt6i_flags & RTF_CACHE) | 770 | rt->rt6i_flags & RTF_CACHE) |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index f57a9baa6b27..92f99927d12d 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1453,6 +1453,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
1453 | First: no IPv4 options. | 1453 | First: no IPv4 options. |
1454 | */ | 1454 | */ |
1455 | newinet->opt = NULL; | 1455 | newinet->opt = NULL; |
1456 | newnp->ipv6_fl_list = NULL; | ||
1456 | 1457 | ||
1457 | /* Clone RX bits */ | 1458 | /* Clone RX bits */ |
1458 | newnp->rxopt.all = np->rxopt.all; | 1459 | newnp->rxopt.all = np->rxopt.all; |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 0ad471909881..f590db57a7c9 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -615,7 +615,7 @@ do_udp_sendmsg: | |||
615 | return udp_sendmsg(iocb, sk, msg, len); | 615 | return udp_sendmsg(iocb, sk, msg, len); |
616 | 616 | ||
617 | /* Rough check on arithmetic overflow, | 617 | /* Rough check on arithmetic overflow, |
618 | better check is made in ip6_build_xmit | 618 | better check is made in ip6_append_data(). |
619 | */ | 619 | */ |
620 | if (len > INT_MAX - sizeof(struct udphdr)) | 620 | if (len > INT_MAX - sizeof(struct udphdr)) |
621 | return -EMSGSIZE; | 621 | return -EMSGSIZE; |
diff --git a/net/ipv6/xfrm6_tunnel.c b/net/ipv6/xfrm6_tunnel.c index ee4b84a33ff4..93c42232aa39 100644 --- a/net/ipv6/xfrm6_tunnel.c +++ b/net/ipv6/xfrm6_tunnel.c | |||
@@ -58,7 +58,7 @@ static struct kmem_cache *xfrm6_tunnel_spi_kmem __read_mostly; | |||
58 | static struct hlist_head xfrm6_tunnel_spi_byaddr[XFRM6_TUNNEL_SPI_BYADDR_HSIZE]; | 58 | static struct hlist_head xfrm6_tunnel_spi_byaddr[XFRM6_TUNNEL_SPI_BYADDR_HSIZE]; |
59 | static struct hlist_head xfrm6_tunnel_spi_byspi[XFRM6_TUNNEL_SPI_BYSPI_HSIZE]; | 59 | static struct hlist_head xfrm6_tunnel_spi_byspi[XFRM6_TUNNEL_SPI_BYSPI_HSIZE]; |
60 | 60 | ||
61 | static unsigned inline xfrm6_tunnel_spi_hash_byaddr(xfrm_address_t *addr) | 61 | static inline unsigned xfrm6_tunnel_spi_hash_byaddr(xfrm_address_t *addr) |
62 | { | 62 | { |
63 | unsigned h; | 63 | unsigned h; |
64 | 64 | ||
@@ -70,7 +70,7 @@ static unsigned inline xfrm6_tunnel_spi_hash_byaddr(xfrm_address_t *addr) | |||
70 | return h; | 70 | return h; |
71 | } | 71 | } |
72 | 72 | ||
73 | static unsigned inline xfrm6_tunnel_spi_hash_byspi(u32 spi) | 73 | static inline unsigned xfrm6_tunnel_spi_hash_byspi(u32 spi) |
74 | { | 74 | { |
75 | return spi % XFRM6_TUNNEL_SPI_BYSPI_HSIZE; | 75 | return spi % XFRM6_TUNNEL_SPI_BYSPI_HSIZE; |
76 | } | 76 | } |