]> err.no Git - linux-2.6/blobdiff - net/sctp/socket.c
Manual merge of rsync://rsync.kernel.org/pub/scm/linux/kernel/git/jgarzik/netdev...
[linux-2.6] / net / sctp / socket.c
index 0b338eca6dc0b1559e2392af2964f5d7fcfe1820..2a3c0e08a090eedf7c9a41d96cc7f263e002730b 100644 (file)
@@ -4686,6 +4686,7 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
        struct sctp_endpoint *newep = newsp->ep;
        struct sk_buff *skb, *tmp;
        struct sctp_ulpevent *event;
+       int flags = 0;
 
        /* Migrate socket buffer sizes and all the socket level options to the
         * new socket.
@@ -4707,6 +4708,17 @@ static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk,
        sctp_sk(newsk)->bind_hash = pp;
        inet_sk(newsk)->num = inet_sk(oldsk)->num;
 
+       /* Copy the bind_addr list from the original endpoint to the new
+        * endpoint so that we can handle restarts properly
+        */
+       if (assoc->peer.ipv4_address)
+               flags |= SCTP_ADDR4_PEERSUPP;
+       if (assoc->peer.ipv6_address)
+               flags |= SCTP_ADDR6_PEERSUPP;
+       sctp_bind_addr_copy(&newsp->ep->base.bind_addr,
+                            &oldsp->ep->base.bind_addr,
+                            SCTP_SCOPE_GLOBAL, GFP_KERNEL, flags);
+
        /* Move any messages in the old socket's receive queue that are for the
         * peeled off association to the new socket's receive queue.
         */