Re: [Qemu-devel] [PATCH 3/4] qemu:virtio-net: Add support for qemu_vlan_rxfilter

Jamie Lokier
2009-02-12T20:26:53Z

Alex Williamson wrote:
> They don't, but they do need to know whether a filter they previously
> applied successfully is no longer in place. If they don't know this,
> they have to assume the filter on the other side of the vlan is
> transient and always double check it with their own filtering, which
> seems like a waste of cache and cycles.

Double checking is not a waste of cycles if the host filtering is good
but not guaranteed, as it still means fewer packets cross the host
kernel/user boundary.

How reliable are the host filter interfaces anyway?

- Are they 100% reliable? For example, I remember at one time on
Linux, when application A listened for broadcast IP packets, you
wouldn't receive any which has a unicast MAC address for a
different host, except for the times when tcpdump was run in
parallel. That's an example of when the app sees the host filtering
behave differently depending on other apps run at the same time.
Multicast hash filtering is similar, but also depends on the host NIC.

- When updated, do the host filters take effect from the instant
the host syscall returned, or can there be already queued
packets which bypass the new filter?

> - A device requests a filter and is told if the request is successful
> - On success the device may skip it's own filtering
> - If another vlan client is added, the following _must_ occur:
> - The "filterer" must clear (remove) the filter
> - The "filteree" must revert to using their own filtering
> - If a vlan client is removed, the following _may_ occur:
> - vlan clients are notified that they may retry their filter
>
> The added()/removed() interface feels like the right solution to this.
> We could use a changed() function, but it would need to know the
> direction of the change, which leads back to the same mechanics. If
> there's a better way, please suggest it. Thanks,

If there are two vlan clients, you don't necessarily need them to use
their own filters, if they are both the same, or compatible in some way.

How about this:

- On any change, notify all clients by walking the list twice.
- Phase 1. For each client:
- The client requests a filter.
- Phase 2. For each client:
- The client enquires whether its filter is in place.
If yes, it relies on it. If no or unreliable, it filters itself.

During this procedure, don't do any packet I/O.

During phase 1, don't send a request to the host kernel until just one
at the end (if the filter has changed), otherwise there will be a
brief time window with no host filter which could leak packets despite
no real change wanted and no packet I/O performed.

The same procedure is done for any configuration change, and together
with that change. Actually: Stop packet I/O, then phase 1, then
update host kernel taps if they've changed, then phase 2, then restart
packet I/O.

-- Jamie