[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] Looking for good example API function(s)



On 03/11/2009 09:55 AM, Daniel P. Berrange wrote:
- Application connects to libvirt (virConnectOpen()
 - in src/libvirt.c we activate a hypervisor driver based on the
   URI given. If successful, we then try to activate a number of
   secondary drivers (eg virtual network, storage, node device)
 - in src/libvirt.c, virConenctPtr is populted with callbacks for
   each of the activated drivers

Now....

 - Application calls  virNetworkCreateXML()
 - in src/libvirt.c, this runs virNetworkCreateXML code
 - this uses the networkDriver callback sets, invoking
   the networkCreateXML() callback, eg

       conn->networkDriver->networkCreateXML()


For something like the network driver, in the application process
the driver that's activated will be the generic remote driver.

 - So, networkCreateXML() is pointing to remoteNetworkCreateXML()
   in src/remote_driver.c

 - remoteNetworkCreateXML() now serializes the parameters into
   XDR format, and makes an RPC call REMOTE_PROC_NETWORK_CREATE_XML

I had figured out everything up to here with no problems...


The RPC calls are handling by the libvirtd daemon.

 - libvirtd gets REMOTE_PROC_NETWORK_CREATE_XML and dispatches
   it to remoteDispatchNetworkCreateXML() in qemud/remote.c

This is where I got stuck. As DV says, the dispatch table is generated, and doesn't reference the enum value directly (it's just implied via the index into the table). Also, the name of the remoteDispatchxxx function is generated, and the way that it's generated causes "XML" to be "Xml".

Anyway, thanks to both of you for filling in the missing links. I think I understand how it works now!
 - libvirtd itself uses libvirt.so, so it once against calls
   into the public API  virNetworkCreateXML() as the application
   did much earlier.
 - in src/libvirt.c, this runs virNetworkCreateXML code
 - this uses the networkDriver callback sets, invoking
   the networkCreateXML() callback, eg

       conn->networkDriver->networkCreateXML()

When run inside libvirtd though, libvirt.so does not activate
the 'remote' driver. Instead it activates the real driver,
in this case provided by src/network_driver.c

 - So, networkCreateXML() is pointing to networkCreate()
   in src/network_driver.c

 - networkCreate() finally does whatever interesting stuff
   needs to be done to complete the operation.



Summarizing

  app -> libvirt.so -> remote driver -> XDR ->...

     ... TCP socket ...

  ... XDR -> libvirtd -> libvirt.so -> network driver


Daniel


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]