[libvirt] [PATCHv2 1/4] net-dhcp-leases: Implement the public APIs
Osier Yang
jyang at redhat.com
Fri Sep 13 08:59:13 UTC 2013
On 13/09/13 05:53, Nehal J Wani wrote:
> Introduce 3 new APIs, virNetworkGetDHCPLeases, virNetworkGetDHCPLeasesForMAC
> and virNetworkDHCPLeaseFree.
>
> * virNetworkGetDHCPLeases: returns the dhcp leases information for a given
> virtual network. The information includes lease expirytime, MAC Address,
> IP Address, hostname and clientid.
Trivial, but "type" and "prefix" are new in this set.
>
> * virNetworkGetDHCPLeasesForMAC: returns the dhcp leases information for a
> given virtual network and specified MAC Address.
>
> * virNetworkDHCPLeaseFree: allows the upper layer application to free the
> network interface object conveniently.
>
> There is no support for flags, so user is expected to pass 0 for
> both the APIs.
>
> include/libvirt/libvirt.h.in:
> * Define virNetworkGetDHCPLeases
> * Define virNetworkGetDHCPLeasesForMAC
> * Define virNetworkDHCPLeaseFree
>
> python/generator.py:
> * Skip the auto-generation for virNetworkGetDHCPLeases
> * Skip the auto-generation for virNetworkGetDHCPLeasesForMAC
> * Skip the auto-generation for virNetworkDHCPLeaseFree
>
> src/driver.h:
> * Define networkGetDHCPLeases
> * Define networkGetDHCPLeasesForMAC
>
> src/libvirt.c:
> * Implement virNetworkGetDHCPLeases
> * Implement virNetworkGetDHCPLeasesForMAC
> * Implement virNetworkDHCPLeaseFree
>
> src/libvirt_public.syms:
> * Export the new symbols
>
> src/libvirt_private.syms:
> * Export the symbol: virSocketAddrGetNumNetmaskBits
>
> ---
> include/libvirt/libvirt.h.in | 33 +++++++++
> python/generator.py | 3 +
> src/driver.h | 13 ++++
> src/libvirt.c | 173 +++++++++++++++++++++++++++++++++++++++++++
> src/libvirt_private.syms | 1 +
> src/libvirt_public.syms | 7 ++
> 6 files changed, 230 insertions(+)
>
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index a47e33c..d92a720 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -2800,6 +2800,39 @@ int virConnectNumOfDefinedInterfaces (virConnectPtr conn);
> int virConnectListDefinedInterfaces (virConnectPtr conn,
> char **const names,
> int maxnames);
> +
> +typedef enum {
> + VIR_IP_ADDR_TYPE_IPV4,
> + VIR_IP_ADDR_TYPE_IPV6,
> +
> +#ifdef VIR_ENUM_SENTINELS
> + VIR_IP_ADDR_TYPE_LAST
> +#endif
> +} virIPAddrType;
> +
Okay, assuming that this set of API will be pushed before the
interfaceAddresses
API, this is fine.
> +typedef struct _virNetworkDHCPLeases virNetworkDHCPLeases;
> +typedef virNetworkDHCPLeases *virNetworkDHCPLeasesPtr;
> +struct _virNetworkDHCPLeases {
> + long long expirytime;
> + char *mac; /* MAC address */
> + char *ipaddr; /* IP address */
> + char *hostname; /* Hostname */
> + char *clientid; /* Client ID */
> + int type; /* virIPAddrType */
> + unsigned int prefix; /* IP address prefix */
> +};
> +
> +void virNetworkDHCPLeaseFree(virNetworkDHCPLeasesPtr lease);
> +
> +int virNetworkGetDHCPLeases(virNetworkPtr network,
> + virNetworkDHCPLeasesPtr **leases,
> + unsigned int flags);
> +
> +int virNetworkGetDHCPLeasesForMAC(virNetworkPtr network,
> + const char *mac,
> + virNetworkDHCPLeasesPtr **leases,
> + unsigned int flags);
> +
> /*
> * virConnectListAllInterfaces:
> *
> diff --git a/python/generator.py b/python/generator.py
> index a91dde8..e76cbfc 100755
> --- a/python/generator.py
> +++ b/python/generator.py
> @@ -460,6 +460,8 @@ skip_impl = (
> 'virNodeGetCPUMap',
> 'virDomainMigrate3',
> 'virDomainMigrateToURI3',
> + 'virNetworkGetDHCPLeases',
> + 'virNetworkGetDHCPLeasesForMAC',
> )
>
> lxc_skip_impl = (
> @@ -560,6 +562,7 @@ skip_function = (
> "virTypedParamsGetString",
> "virTypedParamsGetUInt",
> "virTypedParamsGetULLong",
> + 'virNetworkDHCPLeaseFree',
> )
>
> lxc_skip_function = (
> diff --git a/src/driver.h b/src/driver.h
> index be64333..698e0ca 100644
> --- a/src/driver.h
> +++ b/src/driver.h
> @@ -1121,6 +1121,17 @@ typedef int
> int cookieinlen,
> unsigned int flags,
> int cancelled);
> +typedef int
> +(*virDrvNetworkGetDHCPLeases)(virNetworkPtr network,
> + virNetworkDHCPLeasesPtr **leases,
> + unsigned int flags);
> +
> +typedef int
> +(*virDrvNetworkGetDHCPLeasesForMAC)(virNetworkPtr network,
> + const char *mac,
> + virNetworkDHCPLeasesPtr **leases,
> + unsigned int flags);
> +
>
> typedef struct _virDriver virDriver;
> typedef virDriver *virDriverPtr;
> @@ -1451,6 +1462,8 @@ struct _virNetworkDriver {
> virDrvNetworkSetAutostart networkSetAutostart;
> virDrvNetworkIsActive networkIsActive;
> virDrvNetworkIsPersistent networkIsPersistent;
> + virDrvNetworkGetDHCPLeases networkGetDHCPLeases;
> + virDrvNetworkGetDHCPLeasesForMAC networkGetDHCPLeasesForMAC;
> };
>
>
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 20a2d4c..aa6a2fe 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -68,6 +68,7 @@
> #include "virstring.h"
> #include "virutil.h"
> #include "virtypedparam.h"
> +#include "virmacaddr.h"
>
> #ifdef WITH_TEST
> # include "test/test_driver.h"
> @@ -21965,3 +21966,175 @@ error:
> virDispatchError(dom->conn);
> return -1;
> }
> +
> +/**
> + * virNetworkGetDHCPLeases:
> + * @network: pointer to network object
> + * @leases: pointer to an array of pointers pointing to the obtained leases
> + * @flags: extra flags, not used yet, so callers should always pass 0
> + *
> + * The API returns lease info for all network interfaces connected to the
> + * given virtual network.
> + *
> + * Returns the number of leases found or -1 and sets @leases to NULL in case
> + * of error. On success, the array stored into @leases is guaranteed to have an
> + * extra allocated element set to NULL but not included in the return count,
> + * to make iteration easier. The caller is responsible for calling
> + * virNetworkDHCPLeaseFree on each array element, then calling free() on @leases.
> + *
> + * Example of usage:
> + *
> + * virNetworkDHCPLeasesPtr *leases = NULL;
> + * virNetworkPtr network = ... obtain a network pointer here ...;
> + * size_t i;
> + * int nleases;
> + * unsigned int flags = 0;
> + *
> + * nleases = virNetworkGetDHCPLeases(network, &leases, flags);
> + * if (nleases < 0)
> + * error();
> + *
> + * ... do something with returned values, for example:
> + *
> + * for (i = 0; i < nleases; i++) {
> + * virNetworkDHCPLeasesPtr lease = leases[i];
> + * printf("Time(epoch): %lu, MAC address: %s,
Missed the terminating " character.
> + * IP address: %s, Hostname: %s, ClientID: %s\n",
> + * expirytime, lease->mac,
lease->expirytime
> + * lease->ipaddr, lease->hostname, lease->clientid);
> + * }
> + *
> + * if (leases) {
> + * for (i = 0; i < nleases; i++)
> + * virNetworkDHCPLeaseFree(leases[i]);
> + * }
> + * free(leases);
> + *
> + */
> +int
> +virNetworkGetDHCPLeases(virNetworkPtr network,
> + virNetworkDHCPLeasesPtr **leases,
> + unsigned int flags)
> +{
> + virConnectPtr conn;
> + VIR_DEBUG("network=%p, leases=%p, flags=%x",
> + network, leases, flags);
> +
> + virResetLastError();
> +
> + virCheckNonNullArgGoto(network, error);
> +
> + if (leases)
> + *leases = NULL;
> +
> + if (!VIR_IS_CONNECTED_NETWORK(network)) {
> + virLibNetworkError(VIR_ERR_INVALID_NETWORK, __FUNCTION__);
> + virDispatchError(NULL);
> + return -1;
> + }
> +
> + conn = network->conn;
> +
> + if (conn->networkDriver && conn->networkDriver->networkGetDHCPLeases) {
> + int ret;
> + ret = conn->networkDriver->networkGetDHCPLeases(network,leases, flags);
> + if (ret < 0)
> + goto error;
> + return ret;
> + }
> +
> + virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> + virDispatchError(network->conn);
> + return -1;
> +}
> +
> +/**
> + * virNetworkGetDHCPLeasesForMAC:
> + * @network: pointer to network object
> + * @mac: MAC Address of an interface
> + * @leases: pointer to an array of pointers pointing to the obtained leases
> + * @flags: extra flags, not used yet, so callers should always pass 0
> + *
> + * The API returns the leases info of the interfaces which match with the
s/interfaces/interface/, s/match/matches/,
> + * given @mac. There can be multiple leases for a single @mac because this
> + * API intends to support DHCP v6 too.
s/DHCP v6/DHCPv6/,
> + *
> + * Returns the number of leases found or -1 and sets @leases to NULL in case
> + * of error. On success, the array stored into @leases is guaranteed to have an
> + * extra allocated element set to NULL but not included in the return count,
> + * to make iteration easier. The caller is responsible for calling
> + * virNetworkDHCPLeaseFree on each array element, then calling free() on @leases.
> + */
> +int
> +virNetworkGetDHCPLeasesForMAC(virNetworkPtr network,
> + const char *mac,
> + virNetworkDHCPLeasesPtr **leases,
> + unsigned int flags)
> +{
> + virConnectPtr conn;
> + virMacAddr addr;
> +
> + VIR_DEBUG("network=%p, mac=%s, leases=%p, flags=%x",
> + network, mac, leases, flags);
> +
> + virResetLastError();
> +
> + virCheckNonNullArgGoto(network, error);
> + virCheckNonNullArgGoto(mac, error);
> +
> + if (leases)
> + *leases = NULL;
> +
> + if (!VIR_IS_CONNECTED_NETWORK(network)) {
> + virLibNetworkError(VIR_ERR_INVALID_NETWORK, __FUNCTION__);
> + virDispatchError(NULL);
> + return -1;
> + }
> +
> + /* Validate the MAC address */
> + if (mac && virMacAddrParse(mac, &addr) < 0) {
> + virReportInvalidArg(mac,
> + _("Given MAC Address doesn't comply "
> + "with the standard (IEEE 802) format in %s"),
> + __FUNCTION__);
> + goto error;
> + }
> +
> + conn = network->conn;
> +
> + if (conn->networkDriver &&
> + conn->networkDriver->networkGetDHCPLeasesForMAC) {
> + int ret;
> + ret = conn->networkDriver->networkGetDHCPLeasesForMAC(network, mac,
> + leases, flags);
> + if (ret < 0)
> + goto error;
> + return ret;
> + }
> +
> + virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> + virDispatchError(network->conn);
> + return -1;
> +}
> +
> +/**
> + * virNetworkDHCPLeaseFree:
> + * @lease: pointer to a leases object
> + *
> + * Frees all the memory occupied by @lease.
> + */
> +void
> +virNetworkDHCPLeaseFree(virNetworkDHCPLeasesPtr lease)
> +{
> + if (!lease)
> + return;
> + VIR_FREE(lease->mac);
> + VIR_FREE(lease->ipaddr);
> + VIR_FREE(lease->hostname);
> + VIR_FREE(lease->clientid);
> + VIR_FREE(lease);
> +}
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 35f0f1b..7d60c51 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1869,6 +1869,7 @@ virSocketAddrCheckNetmask;
> virSocketAddrEqual;
> virSocketAddrFormat;
> virSocketAddrFormatFull;
> +virSocketAddrGetNumNetmaskBits;
Mistake, I don't see virSocketAddrGetNumNetmaskBits is ever used in this
patch.
ACK with the nits fixed.
Osier
More information about the libvir-list
mailing list