[Kimchi-devel] [RFC]: help, how to get the mac after create a VM interface.

Shu Ming shuming at linux.vnet.ibm.com
Tue Jan 21 00:46:40 UTC 2014


于 2014/1/20 23:22, Sheldon 写道:
> On 01/20/2014 09:34 PM, Sheldon wrote:
>> when I create a interface, There is no mac attribute in the xml.
>> After create successfully, libvirt will allocate a mac.
>> The problem is that, How can I get the mac.
>>
>> Should the CREATE method always needs to return an interface info?
>>
>> Here is some of create code.
>>
>> def vmifaces_create(self, vm, params):
>> dom = self._get_vm(vm)
>> xml = """
>> <interface type='network'>
>> <source network='default'/>
>> </interface>
>> """
>>
>> dom.attachDeviceFlags(xml,
>> libvirt.VIR_DOMAIN_AFFECT_CURRENT)
>>
>> # here I need to return the mac
>> return ????
>>
>>
>>
>> The libvirt will create a xml like the follow? The problem is that 
>> the a vm may have several interfaces.

If the vm have several interfaces, dictionary may help you to return 
these interfaces.

>> xml = """
>> <interface type='network'>
>> <mac address='52:54:00:2a:53:8f'/>
>> <source network='default'/>
>> <model type='rtl8139'/>
>> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' 
>> function='0x0'/>
>> </interface>
>> """
>>
>>
> check the libvirt code:
> libvirt will generate a mac address,  and the mac starts with "52:52:00"
> and the others bit are generated by virRandomBits
>
>
> virDomainNetGenerateMAC(xmlopt, &def->mac);
>
> void
> virDomainNetGenerateMAC(virDomainXMLOptionPtr xmlopt,
>                         virMacAddrPtr mac)
> {
>     virMacAddrGenerate(xmlopt->config.macPrefix, mac);
> }
>
>
>
> void virMacAddrGenerate(const unsigned char 
> prefix[VIR_MAC_PREFIX_BUFLEN],
>                         virMacAddrPtr addr)
> {
>     addr->addr[0] = prefix[0];
>     addr->addr[1] = prefix[1];
>     addr->addr[2] = prefix[2];
>     addr->addr[3] = virRandomBits(8);
>     addr->addr[4] = virRandomBits(8);
>     addr->addr[5] = virRandomBits(8);
> }
>
>
> /**
>  * virRandomBits:
>  * @nbits: Number of bits of randommess required
>  *
>  * Generate an evenly distributed random number between [0,2^nbits), 
> where
>  * @nbits must be in the range (0,64].
>  *
>  * Return: a random number with @nbits entropy
>  */
> uint64_t virRandomBits(int nbits)
> {
>     uint64_t ret = 0;
>     int32_t bits;
>
>     if (virRandomInitialize() < 0) {
>         /* You're already hosed, so this particular non-random value
>          * isn't any worse.  */
>         VIR_WARN("random number generation is broken");
>         return 0;
>     }
>
>     virMutexLock(&randomLock);
>
>     while (nbits > RANDOM_BITS_PER_ITER) {
>         random_r(&randomData, &bits);
>         ret = (ret << RANDOM_BITS_PER_ITER) | (bits & RANDOM_BITS_MASK);
>         nbits -= RANDOM_BITS_PER_ITER;
>     }
>
>     random_r(&randomData, &bits);
>     ret = (ret << nbits) | (bits & ((1 << nbits) - 1));
>
>     virMutexUnlock(&randomLock);
>     return ret;
> }
>
>
> /**
>  * virDomainXMLOptionNew:
>  *
>  * Allocate a new domain XML configuration
>  */
> virDomainXMLOptionPtr
> virDomainXMLOptionNew(virDomainDefParserConfigPtr config,
>                       virDomainXMLPrivateDataCallbacksPtr priv,
>                       virDomainXMLNamespacePtr xmlns)
> {
>     virDomainXMLOptionPtr xmlopt;
>
> ...
>
>     /* Technically this forbids to use one of Xerox's MAC address 
> prefixes in
>      * our hypervisor drivers. This shouldn't ever be a problem.
>      *
>      * Use the KVM prefix as default as it's in the privately 
> administered
>      * range */
>     if (xmlopt->config.macPrefix[0] == 0 &&
>         xmlopt->config.macPrefix[1] == 0 &&
>         xmlopt->config.macPrefix[2] == 0) {
>         xmlopt->config.macPrefix[0] = 0x52;
>         xmlopt->config.macPrefix[1] = 0x54;
>     }
>
>     return xmlopt;
> }
>
>




More information about the Kimchi-devel mailing list