<div dir="ltr"><pre style="color:rgb(0,0,0);word-wrap:break-word;white-space:pre-wrap">Hello, fellow developers! 
      I am a GSoC candidate this year working for <a href="http://libvirt.org">libvirt.org</a>. My project is "Introduce API to query IP addresses for given domain".  
The discussion regarding this feature had started here: <a href="http://www.mail-archive.com/libvir-list@redhat.com/msg51857.html">http://www.mail-archive.com/libvir-list@redhat.com/msg51857.html</a> and then Michal had sent a patch too (refer: <a href="http://www.mail-archive.com/libvir-list@redhat.com/msg57141.html">http://www.mail-archive.com/libvir-list@redhat.com/msg57141.html</a>). But it was not pushed upstream due to lack of extensibility. 

So far I've come up with an API and I want to get your opinion before I start writing the rest so I don't follow the wrong direction.

Following are the valid commands:

domifaddr <domain-name>
domifaddr <domain-name> <interface-name> 
domifaddr <domain-name> <interface-name> <method>
domifaddr <domain-name> <method>

methods:
(i) Querying qemu-guest-agent
(ii) Getting info from dnsmasq.leases file
(iii) Using the nwfilter to snoop the traffic

If no method is mentioned, qemu-guest-agent will be used.

Previous attempts by Michal had used structs and xml. Structs bring in restrictions and xml has to be parsed. Hence I am not planning to continue with either of these.

As a start, I would like to know your comments about my API which queries the qemu-guest-agent and returns the results in virTypedParameter **params.

Format(JSON) in which the qemu guest agent returns info:

[{"name":"lo",
        "ip-addresses":
                [{"ip-address-type":"ipv4","ip-address":"127.0.0.1","prefix":8},
                {"ip-address-type":"ipv6","ip-address":"::1","prefix":128}],
        "hardware-address":"00:00:00:00:00:00"},
{"name":"eth0",
        "ip-addresses":
                [{"ip-address-type":"ipv4","ip-address":"192.168.122.42","prefix":24},
                {"ip-address-type":"ipv6","ip-address":"fe80::5054:ff:fe09:d240","prefix":64}],
        "hardware-address":"52:54:00:09:d2:40"}]

//Possible 1-D Structure (A little hassle to maintain)

params[0] = {"iface-count",int,2}
params[1] = {"iface-name",string,"lo"}
params[2] = {"iface-hwaddr",string,"00:00:00:00:00:00"}
params[3] = {"iface-addr-count",int,2}
params[4] = {"iface-addr-type",string,"ipv4"}
params[5] = {"iface-addr",string,"127.0.0.1"}
params[6] = {"iface-addr-prefix",int,8}
params[7] = {"iface-addr-type",string,"ipv6"}
params[8] = {"iface-addr",string,"::1"}
params[9] = {"iface-addr-prefix",int,128}
....
....
....

//2D Structure: (Not very hasslefree, but easier to maintain as one interface per row)

params[0] = {"iface-name",string,"lo"}{"iface-hwaddr",string,"00:00:00:00:00:00"}{"iface-addr-type",string,"ipv4"}{"iface-addr",string,"127.0.0.1"}{"iface-addr-prefix",int,8}{"iface-addr-type",string,"ipv6"}{"iface-addr",string,"::1"}{"iface-addr-prefix",int,128}
params[1] = {"iface-name",string,"eth0"}{"iface-hwaddr",string,"52:54:00:09:d2:40"}{"iface-addr-type",string,"ipv4"}{"iface-addr",string,"192.168.122.42"}{"iface-addr-prefix",int,8}{"iface-addr-type",string,"ipv6"}{"iface-addr",string,"fe80::5054:ff:fe09:d240"}{"iface-addr-prefix",int,64}


Function definitions that I intend to use are:

static int
remoteDispatchDomainInterfacesAddresses(
    virNetServerPtr server ATTRIBUTE_UNUSED,
    virNetServerClientPtr client,
    virNetMessagePtr msg ATTRIBUTE_UNUSED,
    virNetMessageErrorPtr rerr,
    remote_domain_interfaces_addresses_args *args,
    remote_domain_interfaces_addresses_ret *ret)

int virDomainInterfacesAddresses (virDomainPtr dom,
                                 virTypedParameterPtr *params,
                                  int *nparams,
                                  unsigned int flags);


typedef int
(*virDrvDomainInterfacesAddresses)   (virDomainPtr dom,
                                      virTypedParameterPtr *params,
                                      int *nparams,
                                      unsigned int flags);
 


int
virDomainInterfacesAddresses (virDomainPtr dom,
                             virTypedParameterPtr *params,
                             int *nparams,
                             unsigned int flags)

int
qemuAgentGetInterfaces(qemuAgentPtr mon,
                       virTypedParameterPtr *params,
                       int *nparams)


int qemuAgentGetInterfaces(qemuAgentPtr mon,
                           virTypedParameterPtr *params,
                           int *nparams);


static int
qemuDomainInterfacesAddresses(virDomainPtr dom,
                              virTypedParameterPtr *params,
                              int *nparams,
                              unsigned int flags)

static int
remoteDomainInterfacesAddresses(virDomainPtr dom,
                               virTypedParameterPtr *params,
                               int *nparams,
                                unsigned int flags)

static bool
cmdDomIfAddr(vshControl *ctl, const vshCmd *cmd)

Also, It will be helpful to know whether we want the client to first query for the number of parameters and then send the request or have the server side allocate appropriate memory and return the result once in for all. In the latter case, I'll be using something of the kind virTypedParameterPtr ***params.</pre>
<div><br></div>Thanking You,<br><div dir="ltr">Nehal J. Wani<br>
UG2, BTech CS+MS(CL)<br>
IIIT-Hyderabad<div><a href="http://commanlinewani.blogspot.com" target="_blank">http://commanlinewani.blogspot.com</a></div></div>
</div>