[PATCH 1/4] Core changes to support SADR

Dean dluga93 at gmail.com
Mon May 22 15:50:44 CEST 2017


On 05/22/2017 03:30 PM, Ondrej Zajicek wrote:
>
>> @@ -231,6 +232,20 @@ fib_find(struct fib *f, const net_addr *a)
>>     case NET_ROA6: return FIB_FIND(f, a, roa6);
>>     case NET_FLOW4: return FIB_FIND(f, a, flow4);
>>     case NET_FLOW6: return FIB_FIND(f, a, flow6);
>> +  case NET_SADR_IP6:
>> +    {
>> +      if (a->length != sizeof(net_addr_sadr_ip6))
>> +      {
>> +        // dst only search
>> +        net_addr_ip6 a0;
>> +        net_copy((net_addr *)&a0, a);
>> +        a0.length = sizeof(net_addr_sadr_ip6);
>> +
>> +        return FIB_FIND(f, &a0, sadr_dst);
>> +      }
>> +      else
>> +        return FIB_FIND(f, a, sadr_ip6);
>> +    }
> No. Generic fib_find() should implement exact-match search with matching
> net_addr type. If you need/want partial match, it should be done as a
> separate function. BTW, where do you need that?
I use it in net_route_sadr_ip6 below, the call to net_route_ip6 does 
destination only search. I wouldn't want to search all source prefix 
lengths for a specific dst length if there is no entry for that dst 
length at all.
> Perhaps we should add some generic function partial-match IP-based search
> for network types that support it (e.g., ROA, SADR). But it would need
> a different interface, so caller could enumerate all valid matches.
This seems like a good idea.
>
>> +static inline void *
>> +net_route_sadr_ip6(rtable *t, net_addr_sadr_ip6 *n)
>> +{
>> +  net *r;
>> +
>> +  net_addr_ip6 dst = NET_ADDR_IP6(n->dst_prefix, n->dst_pxlen);
>> +  dst.type = NET_SADR_IP6;
>> +
>> +  // search for matching dst
>> +  while (r = net_route_ip6(t, &dst))
>> +  {
>> +    // found a matching dst, start search for entries that match both prefixes
>> +    net_addr_sadr_ip6 full_addr =
>> +      NET_ADDR_SADR_IP6(dst.prefix, dst.pxlen, n->src_prefix, n->src_pxlen);
>> +
>> +    while (r = net_find_valid(t, (net_addr *) &full_addr), (!r) && (full_addr.src_pxlen > 0))
>> +    {
>> +      full_addr.src_pxlen--;
>> +      ip6_clrbit(&full_addr.src_prefix, full_addr.src_pxlen);
>> +    }
>> +
>> +    if (r)
>> +      return r;
>> +    dst.pxlen--;
> You should set dst.pxlen based on r found by net_route_ip6(),
> to avoid repeated iteration over the same prefix lengths that
> did not match in the inner cycle.
That would be set in the call to net_route_ip6.




More information about the Bird-users mailing list