On 12/08/09 06:20 PM, Sebastien Roy wrote:
> On Wed, 2009-08-12 at 14:58 -0700, Darren Reed wrote:
>   
>>>>> * 1168: What's the purpose of this addition?  This function only gets
>>>>>   called for ipnet_t streams that are on the /dev/lo0 device.
>>>>>       
>>>>>           
>>>> Discuss.
>>>> ipnet_loaccept() is used twice: once in ipnet_open() and once in
>>>> ipnet_promisc_add().
>>>>     
>>>>         
>>> I don't follow.  ipnet_acceptfn should only be set to ipnet_loaccept()
>>> if /dev/lo0 is opened, and in no other case.  Therefore the check you
>>> added in the function itself: "if (getminor(ipnet->ipnet_if->if_dev) ==
>>> IPNET_MINOR_LO)" is redundant.  If ipnet_loaccept() is getting called
>>> when it shouldn't be, then something else is wrong.
>>>   
>>>       
>> So lets examine ipnet_accept vs ipnet_loaccept for the purpose of
>> lo0 packets going through ipnet, into BPF, in a local zone with a
>> shared stack.
>>
>> If we set ipnet_acceptfn to ipnet_accept for lo0 packets that are
>> going to end up in BPF:
>> - the IP address of the packet isn't important, so what address type
>>   it is does not matter, thus calls to ipnet_get_addrtype() are not
>>   required;
>>     
>
> The address is important.  A consumer of an ipnet device receives
> packets if they contain an IP address assigned to that interface (this
> is described in the IP Observability PSARC case).  That's the
> distinction between /dev/lo0 and /dev/ipnet/lo0 (and thus the difference
> between ipnet_accept() and ipnet_loaccept()).
>
>   
>> - the lo0 interface has no special behaviour for promiscuous mode,
>>   so that flag and the SAP one are meaningless;
>> - thus there's lots of code in that function that gets executed for
>>   seemingly no reason.
>>     
>
> ipnet_accept() implements the semantics of _all_ ipnet observability
> nodes including /dev/ipnet/lo0.  ipnet_loaccept() only implements the
> semantics of /dev/lo0 (which are deliberately different as described in
> the PSARC case).  If you feel that ipnet_accept() does not perform well
> enough for the special case of /dev/ipnet/lo0 in a shared stack zone,
> then the answer isn't to break its semantic by using ipnet_loaccept(),
> but rather to address its performance issues (if indeed there are any).
>
>   
>> The goal of using BPF in a local zone with a shared stack is to
>> see all of the traffic in that zone which is associated with the
>> lo0 "interface". The ipnet_loaccept function provides a filter
>> that does exactly that - except for the filter on the hook type.
>> I suppose i could add an ipnet_bpf_loaccept but it would be
>> a carbon copy of ipnet_loaccept with that check removed.
>>
>> I think what I'm saying is that BPF on lo0 in a zone has the
>> same semantics as /dev/lo0 and not /dev/ipnet/lo0.
>>     
>
> I don't understand.  I thought that there were different "levels" of
> observability for BPF, where if one enabled DLT_IPNET, one would get the
> ipnet semantics (/dev/ipnet/* for any device).  I would then assume that
> for "lo0", if one does not use DLT_IPNET, then one gets the /dev/lo0
> semantics, but if one enables DLT_IPNET, one gets /dev/ipnet/lo0
> semantics.
>   

Ah, I see what you're driving at.

So I suppose the task then is to implement both DLT_NULL and
DLT_IPNET for lo0 as opposed to just DLT_IPNET.

I hadn't considered that...

Darren

-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.opensolaris.org/pipermail/clearview-discuss/attachments/20090812/cfaa7e6f/attachment.html>

Reply via email to