Hi Paolo
Paolo Galtieri wrote:
What is happening is that the check for IPV6_ADDR_MAPPED that occurs
during the add is missing when you do the remove and hence the IPv6
address is never mapped to the IPv4 address causing the lookup to
fail. Below is the patch to add the necessary checks to do the
mapping. This patch is against 2.6.21-rc5
Does this make sense? Any comments are appreciated.
Yes, it makes perfect sense; however, I think you can just use
af->addr_valid() instead of adding a special case below.
If that works, can you regenerate the patch and provide a
Signed-off-by line so I can incorporate that.
Thanks
-vlad
Thank you,
Paolo
I've attached the test program - compile as gcc -o bindx-test-ipv6
bindx-test-ipv6.c -lsctp
================================ >8
==========================================
--- net/sctp/socket.c.orig 2007-04-04 13:22:59.000000000 -0700
+++ net/sctp/socket.c 2007-04-04 13:25:35.000000000 -0700
@@ -627,6 +627,27 @@ int sctp_bindx_rem(struct sock *sk, stru
retval = -EINVAL;
goto err_bindx_rem;
}
+ /*
+ * It's possible that we mapped an IPV6 addr to an IPV4
addr
+ * during the sctp_bindx_add() operation. This will
happen if
+ * the IPV6 address we assigned to an interface is a mapped
+ * address, e.g. ::ffff:192.0.2.128. If we have mapped
an IPV6
+ * address to an IPV4 address during the add we need to
make
+ * sure we do the same thing during the remove,
otherwise we
+ * wont find a match on the address_list.
+ */
+
+ if (af->sa_family == AF_INET6) {
+ struct in6_addr *in6;
+ int type;
+
+ in6 = (struct in6_addr *)&sa_addr->v6.sin6_addr;
+ type = ipv6_addr_type(in6);
+
+ if (type == IPV6_ADDR_MAPPED)
+ sctp_v6_map_v4(sa_addr);
+ }
+
if (sa_addr->v4.sin_port != htons(bp->port)) {
retval = -EINVAL;
goto err_bindx_rem;
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html