[libvirt] Re: [netcf-devel] [RFC] Reporting host interface status/statistics via netcf/libvirt, and listing active vs. inactive interfaces
David Lutterkort
lutter at redhat.com
Wed Jun 17 18:16:28 UTC 2009
On Tue, 2009-06-16 at 15:12 -0400, Laine Stump wrote:
> I've already been working on incorporating physical host interface
> configuration into libvirt by way of using libnetcf on the backend. It's
> becoming apparent that, in addition to modifying and reporting the
> current configuration of interfaces, libvirt users also want to query
> current status of each interface (up/down, possibly other flags,
> packet/byte/error counts, current IP address, etc).
>
> There are two possible ways of doing this:
>
> 1) maintain libnetcf's focus on just interface configuration, and
> add code directly into libvirt to grab this information via
> appropriate ioctls
>
> or
>
> 2) add the functionality to libnetcf, and have libvirt call the
> new libnetcf API.
>
> (2) seems to make the most sense, because likely other libnetcf
> consumers will want this capability too.
I agree that netcf is the right place for this functionality; the
downside either way is that we'll wind up reimplementing a good bit of
ifconfig's functionality. But seeing how net-tools does not expose a
library that's inevitable (and it's mostly an exercise in calling ioctl
anyway).
> I'm thinking of a single API, something like:
>
> int netcf_if_status(netcf_if *, netcf_if_stats *);
>
> (or maybe int netcf_if_info(netcf_if *, netcf_if_info *))
>
> I haven't really put much thought into the details of what should be in
> netcf_if_stats yet (beyond what I listed above), but wanted to get this
> idea out there so people can start sounding off (if I'm going down the
> wrong road, I'd rather be put on the right path before I get too far along!)
There should really be multiple API's to cover the functionality;
rolling it all into one giant struct seems too inflexible. I am thinking
there should be at least 3 calls
* int netcf_if_operstate(netcf_if *) - return 1 if interface is
up, 0 if not
* int netcf_if_stats(netcf_if *, netcf_if_stats *) - get rx/tx
statistics; which ones needs to be figured out in detail
* int netcf_if_addrinfo(netcf_if *, netcf_if_addrinfo *) - get
address info, i.e. IPv4 and/or IPv6 addresses assigned to the
interface
One wrinkle is that netcf operates at the level of 'connections', not
with individual interfaces, e.g. when a physical NIC eth0 is enslaved to
a bridge br0, only the bridge is currently visible through the netcf
API. So for statistics gathering, you'd only see the statistics for br0
- if statistics for individual devices on the bridge are needed, we can
either report all of them in netcf_if_stats, or provide a mechanism to
get at the subinterfaces so that netcf_if_stats etc. can be called
separately for br0 and eth0.
> But netcf could do it with an extra argument to ncf_list_interfaces().
> If the latter, should the default behavior be to list all interfaces,
> with flags set to eliminate up or down interfaces?
>
> 0 (list all)
> NETCF_NOLIST_UP
> NETCF_NOLIST_DOWN
>
> Or should the values be something like this:
>
> 0 (list all)
> NETCF_LIST_UP_ONLY
> NETCF_LIST_DOWN_ONLY
>
> (UP_ONLY + DOWN_ONLY would be equivalent to 0. As long as nobody came up
> with a good reason for "0".
>
> So should we do one of those, or should we mimic libirt's virNetwork API
> in libnetcf too?
I'd lean towards the flag approach, but without the special meaning for
0 - if you specify any flags, you won't get any interfaces ;)
Since we're dealing with compound interfaces, we also need to define
what it means for a bridge to be up - e.g., the bridge device and all
enslaved physical NICs need to be up.
David
More information about the libvir-list
mailing list