提交 b3d06987 编写于 作者: V Vasiliy Tolstov 提交者: Daniel P. Berrange

virnetdev allow to set peer address

Signed-off-by: NVasiliy Tolstov <v.tolstov@selfip.ru>
上级 216650f1
...@@ -520,7 +520,7 @@ static int lxcContainerRenameAndEnableInterfaces(virDomainDefPtr vmDef, ...@@ -520,7 +520,7 @@ static int lxcContainerRenameAndEnableInterfaces(virDomainDefPtr vmDef,
VIR_DEBUG("Adding IP address '%s/%u' to '%s'", VIR_DEBUG("Adding IP address '%s/%u' to '%s'",
ipStr, ip->prefix, newname); ipStr, ip->prefix, newname);
if (virNetDevSetIPAddress(newname, &ip->address, prefix) < 0) { if (virNetDevSetIPAddress(newname, &ip->address, NULL, prefix) < 0) {
virReportError(VIR_ERR_SYSTEM_ERROR, virReportError(VIR_ERR_SYSTEM_ERROR,
_("Failed to set IP address '%s' on %s"), _("Failed to set IP address '%s' on %s"),
ipStr, newname); ipStr, newname);
......
...@@ -1971,7 +1971,7 @@ networkAddAddrToBridge(virNetworkObjPtr network, ...@@ -1971,7 +1971,7 @@ networkAddAddrToBridge(virNetworkObjPtr network,
} }
if (virNetDevSetIPAddress(network->def->bridge, if (virNetDevSetIPAddress(network->def->bridge,
&ipdef->address, prefix) < 0) &ipdef->address, NULL, prefix) < 0)
return -1; return -1;
return 0; return 0;
......
...@@ -1039,21 +1039,28 @@ virNetDevCreateNetlinkAddressMessage(int messageType, ...@@ -1039,21 +1039,28 @@ virNetDevCreateNetlinkAddressMessage(int messageType,
const char *ifname, const char *ifname,
virSocketAddr *addr, virSocketAddr *addr,
unsigned int prefix, unsigned int prefix,
virSocketAddr *broadcast) virSocketAddr *broadcast,
virSocketAddr *peer)
{ {
struct nl_msg *nlmsg = NULL; struct nl_msg *nlmsg = NULL;
struct ifaddrmsg ifa; struct ifaddrmsg ifa;
unsigned int ifindex; unsigned int ifindex;
void *addrData = NULL; void *addrData = NULL;
void *peerData = NULL;
void *broadcastData = NULL; void *broadcastData = NULL;
size_t addrDataLen; size_t addrDataLen;
if (virNetDevGetIPAddressBinary(addr, &addrData, &addrDataLen) < 0) if (virNetDevGetIPAddressBinary(addr, &addrData, &addrDataLen) < 0)
return NULL; return NULL;
if (broadcast && virNetDevGetIPAddressBinary(broadcast, &broadcastData, if (peer && VIR_SOCKET_ADDR_VALID(peer)) {
&addrDataLen) < 0) if (virNetDevGetIPAddressBinary(peer, &peerData, &addrDataLen) < 0)
return NULL; return NULL;
} else if (broadcast) {
if (virNetDevGetIPAddressBinary(broadcast, &broadcastData,
&addrDataLen) < 0)
return NULL;
}
/* Get the interface index */ /* Get the interface index */
if ((ifindex = if_nametoindex(ifname)) == 0) if ((ifindex = if_nametoindex(ifname)) == 0)
...@@ -1078,12 +1085,15 @@ virNetDevCreateNetlinkAddressMessage(int messageType, ...@@ -1078,12 +1085,15 @@ virNetDevCreateNetlinkAddressMessage(int messageType,
if (nla_put(nlmsg, IFA_LOCAL, addrDataLen, addrData) < 0) if (nla_put(nlmsg, IFA_LOCAL, addrDataLen, addrData) < 0)
goto buffer_too_small; goto buffer_too_small;
if (nla_put(nlmsg, IFA_ADDRESS, addrDataLen, addrData) < 0) if (peerData) {
goto buffer_too_small; if (nla_put(nlmsg, IFA_ADDRESS, addrDataLen, peerData) < 0)
goto buffer_too_small;
}
if (broadcastData && if (broadcastData) {
nla_put(nlmsg, IFA_BROADCAST, addrDataLen, broadcastData) < 0) if (nla_put(nlmsg, IFA_BROADCAST, addrDataLen, broadcastData) < 0)
goto buffer_too_small; goto buffer_too_small;
}
return nlmsg; return nlmsg;
...@@ -1098,6 +1108,7 @@ virNetDevCreateNetlinkAddressMessage(int messageType, ...@@ -1098,6 +1108,7 @@ virNetDevCreateNetlinkAddressMessage(int messageType,
* virNetDevSetIPAddress: * virNetDevSetIPAddress:
* @ifname: the interface name * @ifname: the interface name
* @addr: the IP address (IPv4 or IPv6) * @addr: the IP address (IPv4 or IPv6)
* @peer: The IP address of peer (IPv4 or IPv6)
* @prefix: number of 1 bits in the netmask * @prefix: number of 1 bits in the netmask
* *
* Add an IP address to an interface. This function *does not* remove * Add an IP address to an interface. This function *does not* remove
...@@ -1108,6 +1119,7 @@ virNetDevCreateNetlinkAddressMessage(int messageType, ...@@ -1108,6 +1119,7 @@ virNetDevCreateNetlinkAddressMessage(int messageType,
*/ */
int virNetDevSetIPAddress(const char *ifname, int virNetDevSetIPAddress(const char *ifname,
virSocketAddr *addr, virSocketAddr *addr,
virSocketAddr *peer,
unsigned int prefix) unsigned int prefix)
{ {
virSocketAddr *broadcast = NULL; virSocketAddr *broadcast = NULL;
...@@ -1116,9 +1128,8 @@ int virNetDevSetIPAddress(const char *ifname, ...@@ -1116,9 +1128,8 @@ int virNetDevSetIPAddress(const char *ifname,
struct nlmsghdr *resp = NULL; struct nlmsghdr *resp = NULL;
unsigned int recvbuflen; unsigned int recvbuflen;
/* The caller needs to provide a correct address */ /* The caller needs to provide a correct address */
if (VIR_SOCKET_ADDR_FAMILY(addr) == AF_INET) { if (VIR_SOCKET_ADDR_FAMILY(addr) == AF_INET && !VIR_SOCKET_ADDR_VALID(peer)) {
/* compute a broadcast address if this is IPv4 */ /* compute a broadcast address if this is IPv4 */
if (VIR_ALLOC(broadcast) < 0) if (VIR_ALLOC(broadcast) < 0)
return -1; return -1;
...@@ -1129,7 +1140,7 @@ int virNetDevSetIPAddress(const char *ifname, ...@@ -1129,7 +1140,7 @@ int virNetDevSetIPAddress(const char *ifname,
if (!(nlmsg = virNetDevCreateNetlinkAddressMessage(RTM_NEWADDR, ifname, if (!(nlmsg = virNetDevCreateNetlinkAddressMessage(RTM_NEWADDR, ifname,
addr, prefix, addr, prefix,
broadcast))) broadcast, peer)))
goto cleanup; goto cleanup;
if (virNetlinkCommand(nlmsg, &resp, &recvbuflen, 0, 0, if (virNetlinkCommand(nlmsg, &resp, &recvbuflen, 0, 0,
...@@ -1288,7 +1299,7 @@ int virNetDevClearIPAddress(const char *ifname, ...@@ -1288,7 +1299,7 @@ int virNetDevClearIPAddress(const char *ifname,
if (!(nlmsg = virNetDevCreateNetlinkAddressMessage(RTM_DELADDR, ifname, if (!(nlmsg = virNetDevCreateNetlinkAddressMessage(RTM_DELADDR, ifname,
addr, prefix, addr, prefix,
NULL))) NULL, NULL)))
goto cleanup; goto cleanup;
if (virNetlinkCommand(nlmsg, &resp, &recvbuflen, 0, 0, if (virNetlinkCommand(nlmsg, &resp, &recvbuflen, 0, 0,
...@@ -1423,21 +1434,27 @@ virNetDevWaitDadFinish(virSocketAddrPtr *addrs, size_t count) ...@@ -1423,21 +1434,27 @@ virNetDevWaitDadFinish(virSocketAddrPtr *addrs, size_t count)
int virNetDevSetIPAddress(const char *ifname, int virNetDevSetIPAddress(const char *ifname,
virSocketAddr *addr, virSocketAddr *addr,
virSocketAddr *peer,
unsigned int prefix) unsigned int prefix)
{ {
virCommandPtr cmd = NULL; virCommandPtr cmd = NULL;
char *addrstr = NULL, *bcaststr = NULL; char *addrstr = NULL, *bcaststr = NULL, *peerstr = NULL;
virSocketAddr broadcast; virSocketAddr broadcast;
int ret = -1; int ret = -1;
if (!(addrstr = virSocketAddrFormat(addr))) if (!(addrstr = virSocketAddrFormat(addr)))
goto cleanup; goto cleanup;
if (VIR_SOCKET_ADDR_VALID(peer) && !(peerstr = virSocketAddrFormat(&peer)))
goto cleanup;
/* format up a broadcast address if this is IPv4 */ /* format up a broadcast address if this is IPv4 */
if ((VIR_SOCKET_ADDR_IS_FAMILY(addr, AF_INET)) && if (!peerstr && ((VIR_SOCKET_ADDR_IS_FAMILY(addr, AF_INET)) &&
((virSocketAddrBroadcastByPrefix(addr, prefix, &broadcast) < 0) || ((virSocketAddrBroadcastByPrefix(addr, prefix, &broadcast) < 0) ||
!(bcaststr = virSocketAddrFormat(&broadcast)))) { !(bcaststr = virSocketAddrFormat(&broadcast))))) {
goto cleanup; goto cleanup;
} }
# ifdef IFCONFIG_PATH # ifdef IFCONFIG_PATH
cmd = virCommandNew(IFCONFIG_PATH); cmd = virCommandNew(IFCONFIG_PATH);
virCommandAddArg(cmd, ifname); virCommandAddArg(cmd, ifname);
...@@ -1446,6 +1463,8 @@ int virNetDevSetIPAddress(const char *ifname, ...@@ -1446,6 +1463,8 @@ int virNetDevSetIPAddress(const char *ifname,
else else
virCommandAddArg(cmd, "inet"); virCommandAddArg(cmd, "inet");
virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix); virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix);
if (peerstr)
virCommandAddArgList(cmd, "pointopoint", peerstr, NULL);
if (bcaststr) if (bcaststr)
virCommandAddArgList(cmd, "broadcast", bcaststr, NULL); virCommandAddArgList(cmd, "broadcast", bcaststr, NULL);
virCommandAddArg(cmd, "alias"); virCommandAddArg(cmd, "alias");
...@@ -1453,6 +1472,8 @@ int virNetDevSetIPAddress(const char *ifname, ...@@ -1453,6 +1472,8 @@ int virNetDevSetIPAddress(const char *ifname,
cmd = virCommandNew(IP_PATH); cmd = virCommandNew(IP_PATH);
virCommandAddArgList(cmd, "addr", "add", NULL); virCommandAddArgList(cmd, "addr", "add", NULL);
virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix); virCommandAddArgFormat(cmd, "%s/%u", addrstr, prefix);
if (peerstr)
virCommandAddArgList(cmd, "peer", peerstr, NULL);
if (bcaststr) if (bcaststr)
virCommandAddArgList(cmd, "broadcast", bcaststr, NULL); virCommandAddArgList(cmd, "broadcast", bcaststr, NULL);
virCommandAddArgList(cmd, "dev", ifname, NULL); virCommandAddArgList(cmd, "dev", ifname, NULL);
...@@ -1465,6 +1486,7 @@ int virNetDevSetIPAddress(const char *ifname, ...@@ -1465,6 +1486,7 @@ int virNetDevSetIPAddress(const char *ifname,
cleanup: cleanup:
VIR_FREE(addrstr); VIR_FREE(addrstr);
VIR_FREE(bcaststr); VIR_FREE(bcaststr);
VIR_FREE(peerstr);
virCommandFree(cmd); virCommandFree(cmd);
return ret; return ret;
} }
......
...@@ -90,6 +90,7 @@ int virNetDevGetOnline(const char *ifname, ...@@ -90,6 +90,7 @@ int virNetDevGetOnline(const char *ifname,
int virNetDevSetIPAddress(const char *ifname, int virNetDevSetIPAddress(const char *ifname,
virSocketAddr *addr, virSocketAddr *addr,
virSocketAddr *peer,
unsigned int prefix) unsigned int prefix)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
int virNetDevAddRoute(const char *ifname, int virNetDevAddRoute(const char *ifname,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册