>> +static int cma_check_linklocal(struct rdma_dev_addr *dev_addr,
>> +                           struct sockaddr *addr)
>> +{
>> +    struct sockaddr_in6 *sin6;
>> +
>> +    if (addr->sa_family != AF_INET6)
>> +            return 0;
>> +
>> +    sin6 = (struct sockaddr_in6 *) addr;
>> +    if ((ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL) &&
>> +        !sin6->sin6_scope_id)
>> +                    return -EINVAL;
>> +
>> +    dev_addr->bound_dev_if = sin6->sin6_scope_id;
>> +    return 0;
>> +}
>
>There is something missing here to match the TCP sin6_scope_id
>semantics..
>
>I think what you have is OK for the non-error cases, but the
>rdma_resolve_addr path does need to check that an input sin6_scope_id
>is either 0 or matches bound_dev_if and return EINVAL.

cma_check_linklocal() is only called from rdma_bind_addr(), and is the only
place where bound_dev_if is set in cma.c.  So this if statement:

>                if (dev_addr->bound_dev_if &&
>                    dev_addr->bound_dev_if != addr6->sin6_scope_id)
>                        return -EINVAL;

would always be false.  bound_dev_if should be 0.

>The main missing test from the new version is:
>                if (dev_addr->bound_dev_if &&
>                    dev_addr->bound_dev_if != addr6->sin6_scope_id)
>                        return -EINVAL;
>
>Done on the 2nd src and dest address.
>
>Any thoughts on how to fit that in?

A separate check can be added to rdma_resolve_addr if it's really needed, but
I'm not sure that we need to require that the source and destination use the
same device or RDMA port.

- Sean

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to