mirror of
https://github.com/libvirt/libvirt.git
synced 2026-08-09 12:38:27 -05:00
network: Add support for local PTR domains
Similarly to localOnly DNS domain, localPtr attribute can be used to tell the DNS server not to forward reverse lookups for unknown IPs which belong to the virtual network. Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
@@ -1507,6 +1507,7 @@ virNetworkIPDefParseXML(const char *networkName,
|
||||
unsigned long prefix = 0;
|
||||
int prefixRc;
|
||||
int result = -1;
|
||||
char *localPtr = NULL;
|
||||
|
||||
save = ctxt->node;
|
||||
ctxt->node = node;
|
||||
@@ -1549,6 +1550,17 @@ virNetworkIPDefParseXML(const char *networkName,
|
||||
else
|
||||
def->prefix = prefix;
|
||||
|
||||
localPtr = virXPathString("string(./@localPtr)", ctxt);
|
||||
if (localPtr) {
|
||||
def->localPTR = virTristateBoolTypeFromString(localPtr);
|
||||
if (def->localPTR <= 0) {
|
||||
virReportError(VIR_ERR_XML_ERROR,
|
||||
_("Invalid localPtr value '%s' in network '%s'"),
|
||||
localPtr, networkName);
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
/* validate address, etc. for each family */
|
||||
if ((def->family == NULL) || (STREQ(def->family, "ipv4"))) {
|
||||
if (!(VIR_SOCKET_ADDR_IS_FAMILY(&def->address, AF_INET) ||
|
||||
@@ -1627,6 +1639,7 @@ virNetworkIPDefParseXML(const char *networkName,
|
||||
virNetworkIPDefClear(def);
|
||||
VIR_FREE(address);
|
||||
VIR_FREE(netmask);
|
||||
VIR_FREE(localPtr);
|
||||
|
||||
ctxt->node = save;
|
||||
return result;
|
||||
@@ -2652,6 +2665,12 @@ virNetworkIPDefFormat(virBufferPtr buf,
|
||||
}
|
||||
if (def->prefix > 0)
|
||||
virBufferAsprintf(buf, " prefix='%u'", def->prefix);
|
||||
|
||||
if (def->localPTR) {
|
||||
virBufferAsprintf(buf, " localPtr='%s'",
|
||||
virTristateBoolTypeToString(def->localPTR));
|
||||
}
|
||||
|
||||
virBufferAddLit(buf, ">\n");
|
||||
virBufferAdjustIndent(buf, 2);
|
||||
|
||||
|
||||
@@ -162,6 +162,8 @@ struct _virNetworkIPDef {
|
||||
unsigned int prefix; /* ipv6 - only prefix allowed */
|
||||
virSocketAddr netmask; /* ipv4 - either netmask or prefix specified */
|
||||
|
||||
int localPTR; /* virTristateBool */
|
||||
|
||||
size_t nranges; /* Zero or more dhcp ranges */
|
||||
virSocketAddrRangePtr ranges;
|
||||
|
||||
|
||||
@@ -994,6 +994,43 @@ networkBuildDnsmasqHostsList(dnsmasqContext *dctx,
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
networkDnsmasqConfLocalPTRs(virBufferPtr buf,
|
||||
virNetworkDefPtr def)
|
||||
{
|
||||
virNetworkIPDefPtr ip;
|
||||
size_t i;
|
||||
char *ptr = NULL;
|
||||
int rc;
|
||||
|
||||
for (i = 0; i < def->nips; i++) {
|
||||
ip = def->ips + i;
|
||||
|
||||
if (ip->localPTR != VIR_TRISTATE_BOOL_YES)
|
||||
continue;
|
||||
|
||||
if ((rc = virSocketAddrPTRDomain(&ip->address,
|
||||
virNetworkIPDefPrefix(ip),
|
||||
&ptr)) < 0) {
|
||||
if (rc == -2) {
|
||||
int family = VIR_SOCKET_ADDR_FAMILY(&ip->address);
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||
_("PTR domain for %s network with prefix %u "
|
||||
"cannot be automatically created"),
|
||||
(family == AF_INET) ? "IPv4" : "IPv6",
|
||||
virNetworkIPDefPrefix(ip));
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
virBufferAsprintf(buf, "local=/%s/\n", ptr);
|
||||
VIR_FREE(ptr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
networkDnsmasqConfContents(virNetworkObjPtr network,
|
||||
const char *pidfile,
|
||||
@@ -1079,6 +1116,10 @@ networkDnsmasqConfContents(virNetworkObjPtr network,
|
||||
network->def->domain);
|
||||
}
|
||||
|
||||
if (wantDNS &&
|
||||
networkDnsmasqConfLocalPTRs(&configbuf, network->def) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (wantDNS && network->def->dns.forwardPlainNames == VIR_TRISTATE_BOOL_NO) {
|
||||
virBufferAddLit(&configbuf, "domain-needed\n");
|
||||
/* need to specify local=// whether or not a domain is
|
||||
|
||||
Reference in New Issue
Block a user