af_inet6.c (84a73014d86fd660822a20c032625e3afe99ca58) af_inet6.c (45f6fad84cc305103b28d73482b344d7f5b76f39)
1/*
2 * PF_INET6 socket protocol family
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 *
8 * Adapted from linux/net/ipv4/af_inet.c

--- 414 unchanged lines hidden (view full) ---

423 if (skb)
424 kfree_skb(skb);
425
426 /* Free flowlabels */
427 fl6_free_socklist(sk);
428
429 /* Free tx options */
430
1/*
2 * PF_INET6 socket protocol family
3 * Linux INET6 implementation
4 *
5 * Authors:
6 * Pedro Roque <roque@di.fc.ul.pt>
7 *
8 * Adapted from linux/net/ipv4/af_inet.c

--- 414 unchanged lines hidden (view full) ---

423 if (skb)
424 kfree_skb(skb);
425
426 /* Free flowlabels */
427 fl6_free_socklist(sk);
428
429 /* Free tx options */
430
431 opt = xchg(&np->opt, NULL);
432 if (opt)
433 sock_kfree_s(sk, opt, opt->tot_len);
431 opt = xchg((__force struct ipv6_txoptions **)&np->opt, NULL);
432 if (opt) {
433 atomic_sub(opt->tot_len, &sk->sk_omem_alloc);
434 txopt_put(opt);
435 }
434}
435EXPORT_SYMBOL_GPL(inet6_destroy_sock);
436
437/*
438 * This does both peername and sockname.
439 */
440
441int inet6_getname(struct socket *sock, struct sockaddr *uaddr,

--- 212 unchanged lines hidden (view full) ---

654 fl6.saddr = np->saddr;
655 fl6.flowlabel = np->flow_label;
656 fl6.flowi6_oif = sk->sk_bound_dev_if;
657 fl6.flowi6_mark = sk->sk_mark;
658 fl6.fl6_dport = inet->inet_dport;
659 fl6.fl6_sport = inet->inet_sport;
660 security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
661
436}
437EXPORT_SYMBOL_GPL(inet6_destroy_sock);
438
439/*
440 * This does both peername and sockname.
441 */
442
443int inet6_getname(struct socket *sock, struct sockaddr *uaddr,

--- 212 unchanged lines hidden (view full) ---

656 fl6.saddr = np->saddr;
657 fl6.flowlabel = np->flow_label;
658 fl6.flowi6_oif = sk->sk_bound_dev_if;
659 fl6.flowi6_mark = sk->sk_mark;
660 fl6.fl6_dport = inet->inet_dport;
661 fl6.fl6_sport = inet->inet_sport;
662 security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
663
662 final_p = fl6_update_dst(&fl6, np->opt, &final);
664 rcu_read_lock();
665 final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt),
666 &final);
667 rcu_read_unlock();
663
664 dst = ip6_dst_lookup_flow(sk, &fl6, final_p);
665 if (IS_ERR(dst)) {
666 sk->sk_route_caps = 0;
667 sk->sk_err_soft = -PTR_ERR(dst);
668 return PTR_ERR(dst);
669 }
670

--- 364 unchanged lines hidden ---
668
669 dst = ip6_dst_lookup_flow(sk, &fl6, final_p);
670 if (IS_ERR(dst)) {
671 sk->sk_route_caps = 0;
672 sk->sk_err_soft = -PTR_ERR(dst);
673 return PTR_ERR(dst);
674 }
675

--- 364 unchanged lines hidden ---