]> Pileus Git - ~andy/linux/blobdiff - net/ipv6/udp.c
Linux 3.14
[~andy/linux] / net / ipv6 / udp.c
index 089c741a399217b2c7dd90f7783df4aa89eb5424..1e586d92260e1e75957060b896a8748e9beaa61a 100644 (file)
@@ -460,9 +460,7 @@ try_again:
 
        /* Copy the address. */
        if (msg->msg_name) {
-               struct sockaddr_in6 *sin6;
-
-               sin6 = (struct sockaddr_in6 *) msg->msg_name;
+               DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);
                sin6->sin6_family = AF_INET6;
                sin6->sin6_port = udp_hdr(skb)->source;
                sin6->sin6_flowinfo = 0;
@@ -479,12 +477,16 @@ try_again:
                }
                *addr_len = sizeof(*sin6);
        }
+
+       if (np->rxopt.all)
+               ip6_datagram_recv_common_ctl(sk, msg, skb);
+
        if (is_udp4) {
                if (inet->cmsg_flags)
                        ip_cmsg_recv(msg, skb);
        } else {
                if (np->rxopt.all)
-                       ip6_datagram_recv_ctl(sk, msg, skb);
+                       ip6_datagram_recv_specific_ctl(sk, msg, skb);
        }
 
        err = copied;
@@ -538,8 +540,11 @@ void __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
        if (sk == NULL)
                return;
 
-       if (type == ICMPV6_PKT_TOOBIG)
+       if (type == ICMPV6_PKT_TOOBIG) {
+               if (!ip6_sk_accept_pmtu(sk))
+                       goto out;
                ip6_sk_update_pmtu(skb, sk, info);
+       }
        if (type == NDISC_REDIRECT) {
                ip6_sk_redirect(skb, sk);
                goto out;
@@ -1038,7 +1043,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
        struct udp_sock *up = udp_sk(sk);
        struct inet_sock *inet = inet_sk(sk);
        struct ipv6_pinfo *np = inet6_sk(sk);
-       struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) msg->msg_name;
+       DECLARE_SOCKADDR(struct sockaddr_in6 *, sin6, msg->msg_name);
        struct in6_addr *daddr, *final_p, final;
        struct ipv6_txoptions *opt = NULL;
        struct ip6_flowlabel *flowlabel = NULL;
@@ -1220,7 +1225,7 @@ do_udp_sendmsg:
 
        security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
 
-       dst = ip6_sk_dst_lookup_flow(sk, &fl6, final_p, true);
+       dst = ip6_sk_dst_lookup_flow(sk, &fl6, final_p);
        if (IS_ERR(dst)) {
                err = PTR_ERR(dst);
                dst = NULL;