On 4/25/18 1:55 PM, Daniel Borkmann wrote:
>> @@ -3861,6 +4090,8 @@ sk_filter_func_proto(enum bpf_func_id func_id, const 
>> struct bpf_prog *prog)
>>              return &bpf_get_socket_cookie_proto;
>>      case BPF_FUNC_get_socket_uid:
>>              return &bpf_get_socket_uid_proto;
>> +    case BPF_FUNC_fib_lookup:
>> +            return &bpf_fib_lookup_proto;
> This part doesn't belong to sk_filter_func_proto(), but to the
> tc_cls_act_func_proto() instead.

oops, somewhere in all of the re-basing it got added to the wrong
function. Will fix.

> 
>>      default:
>>              return bpf_base_func_proto(func_id);
>>      }
>> @@ -3957,6 +4188,8 @@ xdp_func_proto(enum bpf_func_id func_id, const struct 
>> bpf_prog *prog)
>>              return &bpf_xdp_redirect_map_proto;
>>      case BPF_FUNC_xdp_adjust_tail:
>>              return &bpf_xdp_adjust_tail_proto;
>> +    case BPF_FUNC_fib_lookup:
>> +            return &bpf_fib_lookup_proto;
> Basically, you're using the very same bpf_fib_lookup_proto for
> both XDP and skb. In the skb case, you're reusing the two functions
> bpf_ipv{4,6}_fib_lookup(), so when you get the netdev pointer for
> retrieving the netns, you'll crash at dev_net(ctx->rxq->dev) since
> this is XDP only and not skb meta data.
> 
> Therefore, as mentioned, pass the netdev to bpf_ipv{4,6}_fib_lookup()
> to have it generic and have bpf_xdp_fib_lookup_proto and
> bpf_skb_fib_lookup_proto where both are under the case BPF_FUNC_fib_lookup
> in the respective *func_proto(), but using the proper prototypes according
> to their correct context. Meaning, both reuse bpf_ipv{4,6}_fib_lookup()
> from each of their BPF_CALL_4() helper implementation.

ok. I have been focused on the xdp program and not the tc path. Will fix.

Reply via email to