On Fri, Mar 18, 2016 at 10:19:43PM +0000, Vasiliy Tolstov wrote: > Assign peer address if it provided [snip] > @@ -1039,21 +1039,28 @@ virNetDevCreateNetlinkAddressMessage(int messageType, > const char *ifname, > virSocketAddr *addr, > unsigned int prefix, > - virSocketAddr *broadcast) > + virSocketAddr *broadcast, > + virSocketAddr *peer) > { > struct nl_msg *nlmsg = NULL; > struct ifaddrmsg ifa; > unsigned int ifindex; > void *addrData = NULL; > + void *peerData = NULL; > void *broadcastData = NULL; > size_t addrDataLen; > > if (virNetDevGetIPAddressBinary(addr, &addrData, &addrDataLen) < 0) > return NULL; > > - if (broadcast && virNetDevGetIPAddressBinary(broadcast, &broadcastData, > - &addrDataLen) < 0) > - return NULL; > + if (peer && VIR_SOCKET_ADDR_VALID(peer)) { > + if (virNetDevGetIPAddressBinary(peer, &peerData, &addrDataLen) < 0) > + return NULL; > + } else if (broadcast) { > + if (virNetDevGetIPAddressBinary(broadcast, &broadcastData, > + &addrDataLen) < 0) > + return NULL; > + } > > /* Get the interface index */ > if ((ifindex = if_nametoindex(ifname)) == 0) > @@ -1078,12 +1085,15 @@ virNetDevCreateNetlinkAddressMessage(int messageType, > if (nla_put(nlmsg, IFA_LOCAL, addrDataLen, addrData) < 0) > goto buffer_too_small; > > - if (nla_put(nlmsg, IFA_ADDRESS, addrDataLen, addrData) < 0) > - goto buffer_too_small; > + if (peerData) { > + if (nla_put(nlmsg, IFA_ADDRESS, addrDataLen, peerData) < 0) > + goto buffer_too_small; > + } > > - if (broadcastData && > - nla_put(nlmsg, IFA_BROADCAST, addrDataLen, broadcastData) < 0) > - goto buffer_too_small; > + if (broadcastData) { > + if (nla_put(nlmsg, IFA_BROADCAST, addrDataLen, broadcastData) < 0) > + goto buffer_too_small; > + } > > return nlmsg; Ok, I took me a while to understand what the point of this is. I eventually found this comment in /usr/include/linux/if_addr.h * IFA_ADDRESS is prefix address, rather than local interface address. * It makes no difference for normally configured broadcast interfaces, * but for point-to-point IFA_ADDRESS is DESTINATION address, * local address is supplied in IFA_LOCAL attribute. Likewise in ip-address(8) manpage peer ADDRESS the address of the remote endpoint for pointopoint inter‐ faces. Again, the ADDRESS may be followed by a slash and a decimal number, encoding the network prefix length. If a peer address is specified, the local address cannot have a prefix length. The network prefix is associated with the peer rather than with the local address. So, if we accept ip, broader & route info, it makes sense that we also accept a peer address. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list