RE: [PATCH 9/9] ib/addr: fix ipv6 routing lookup

Sean Hefty
2009-11-23T22:07:09Z

>> +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