> On Wed, 2006-29-03 at 11:14 -0800, Jouni Malinen wrote:
> [..]
>
> A digression: One of the problems of the bridge in my opinion is having
> STP, a control protocol, inside the kernel. I do hope someone with time
> will rip it out of the kernel some day.

I looked into it, but the size of STP is less than the amount of stuff
needed to make it have the control hooks in user space. Plus there would
be a lot of new race issues to deal with.

>> With STP disabled it is still possible to use the same type of packet
>> socket to receive EAPOL frames. However, the frames will now end up
>> being received from the bridge interface (e.g., br0), not Ethernet
>> (eth0). In other words, the supplicant will need to know that it needs
>> to bind to another interface.

That is fixed in 2.6.17, STP and other link local frames go up
through the stack, but are not forwarded.

>
> It would probably be fine if you are able to tell that the original
> source of the packet was eth0; are you able to do that?
>
>> With STP enabled, the EAPOL frames to 01:80:c2:00:00:03 are not received
>> anymore, so IEEE 802.1X authentication does not work with this kind of
>> packet socket use. br_handle_frame() (called via br_handle_frame_hook)
>> has code that processes all 01:80:c2:00:00:0? frames differently.
>> 01:80:c2:00:00:00 will be delivered to NF_BR_LOCAL_IN and consumed
>> internally (I would assume). Packets to other 01:80:c2:00:00:0?
>> addresses get dropped. This is understandable since these are special
>> addresses that bridges are not supposed to forward. However, IEEE 802.1X
>> uses one of these addresses and those frames should be made available to
>> user space programs (but without forwarding them to other ports).
>>
>
> yes, that is a nasty assumption.

Already fixed in the current -git kernel tree.  All packets get pushed
up stack but 01:80:c2:00:00:xx addresses are not forwareded. It is actually
in one of the 802.1 standards that these should not be forwarded.

>> What could be done to make this work better? If the supplicant would not
>> bind to a specific sll_protocol, the packets are received at eth0 and
>> this works. However, lots of other packets would also be received and
>> user space filtering for these is not really a good idea. One could
>> probably use Linux socket filters to do filtering in kernel (if those
>> are processed before packet sockets; I did not yet verify this),
>
> this works fine. Need a little libpcap magic.
>
>>  but
>> even that is somewhat complex solution compared to binding a packet
>> socket to sll_protocol=EAPOL.
>>
>> One option would be to move packet socket handlers to be called before
>> handle_bridge() call for both the cases where they are bound to a
>> specific protocol and where they are not. This would allow EAPOL frames
>> to be received from eth0 regardless of whether the device is in a bridge
>> or not. This sounds like the cleanest solution from the user space
>> viewpoint.
>
> In the future you should be able to use tc action to redirect to user
> space packet socket. You can do it today but only redirect to a
> netdevice. As an example you can redirect to a tuntap and then process
> in user space - if that is sufficient for you; you just need a 2.6.x
> kernel (x>=8) and i will be willing to spend some time explaining the
> details to you (its not that complicated actually).
>
>> Would this be feasible? Can all protocol (ptype_base[type])
>> handlers be called before handle_bridge() or would there need to be
>> special case for packet sockets?
>>
>> Another option would be to teach bridge code about this special-special
>> case and make br_handle_frame() return 0 if destination address is
>> 01:80:c2:00:00:03.
>
> This is also acceptable in my view. The bridge code should have an
> exception table of what not to swallow. You should be able to add such
> packet descriptions via the ioctl interface that exists right now.
>
>> Doing this for the stp_enabled case seemed to resolve
>> the problem I was seeing with wpa_supplicant not receiving the frames
>> when STP was enabled. However, since this was only for stp_enabled, the
>> frames in STP disabled case were received from br0, not eth0. It would
>> be possible to return 0 from br_handle_frame() for both cases with some
>> extra CPU use (i.e., one new memcmp() regardless of whether STP is
>> enabled or not). This should allow EAPOL frames to be received from eth0
>> in all cases using packet socket with sll_protocol bound to EAPOL, so
>> user space side would be as clean as the first option I mentioned above.
>> However, this would be a specific solution for this particular issue
>> with IEEE 802.1X. Would this be acceptable, if moving packet socket
>> handlers in netif_receive_skb() is consider too expensive?
>>
>> Is anyone aware of a better solution for this issue?
>>
>
> Consider the option of redirect packets as an option.
>
> cheers,
> jamal
>
> -
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>

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

Reply via email to