IKEv1 daemon supports DNS and NBNS server assignment from database
This commit is contained in:
+85
-18
@@ -106,7 +106,7 @@ static void init_internal_addr(internal_addr_t *ia)
|
|||||||
anyaddr(AF_INET, &ia->dns[i]);
|
anyaddr(AF_INET, &ia->dns[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialize WINS server information */
|
/* initialize NBNS server information */
|
||||||
for (i = 0; i < NBNS_SERVER_MAX; i++)
|
for (i = 0; i < NBNS_SERVER_MAX; i++)
|
||||||
{
|
{
|
||||||
anyaddr(AF_INET, &ia->nbns[i]);
|
anyaddr(AF_INET, &ia->nbns[i]);
|
||||||
@@ -120,13 +120,15 @@ static void get_internal_addr(connection_t *c, host_t *requested_vip,
|
|||||||
internal_addr_t *ia)
|
internal_addr_t *ia)
|
||||||
{
|
{
|
||||||
int i, dns_idx = 0, nbns_idx = 0;
|
int i, dns_idx = 0, nbns_idx = 0;
|
||||||
|
enumerator_t *enumerator;
|
||||||
|
configuration_attribute_type_t type;
|
||||||
|
chunk_t value;
|
||||||
|
host_t *vip = NULL;
|
||||||
|
|
||||||
if (isanyaddr(&c->spd.that.host_srcip))
|
if (isanyaddr(&c->spd.that.host_srcip))
|
||||||
{
|
{
|
||||||
if (c->spd.that.pool)
|
if (c->spd.that.pool)
|
||||||
{
|
{
|
||||||
host_t *vip;
|
|
||||||
|
|
||||||
vip = lib->attributes->acquire_address(lib->attributes,
|
vip = lib->attributes->acquire_address(lib->attributes,
|
||||||
c->spd.that.pool, c->spd.that.id,
|
c->spd.that.pool, c->spd.that.id,
|
||||||
requested_vip);
|
requested_vip);
|
||||||
@@ -136,7 +138,7 @@ static void get_internal_addr(connection_t *c, host_t *requested_vip,
|
|||||||
|
|
||||||
plog("assigning virtual IP %H to peer", vip);
|
plog("assigning virtual IP %H to peer", vip);
|
||||||
initaddr(addr.ptr, addr.len, vip->get_family(vip), &ia->ipaddr);
|
initaddr(addr.ptr, addr.len, vip->get_family(vip), &ia->ipaddr);
|
||||||
vip->destroy(vip);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -146,12 +148,9 @@ static void get_internal_addr(connection_t *c, host_t *requested_vip,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char srcip[ADDRTOT_BUF];
|
|
||||||
|
|
||||||
ia->ipaddr = c->spd.that.host_srcip;
|
ia->ipaddr = c->spd.that.host_srcip;
|
||||||
|
vip = host_create_from_sockaddr((sockaddr_t*)&ia->ipaddr);
|
||||||
addrtot(&ia->ipaddr, 0, srcip, sizeof(srcip));
|
plog("assigning virtual IP %H to peer", vip);
|
||||||
plog("assigning virtual IP %s to peer", srcip);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isanyaddr(&ia->ipaddr)) /* We got an IP address, send it */
|
if (!isanyaddr(&ia->ipaddr)) /* We got an IP address, send it */
|
||||||
@@ -165,7 +164,7 @@ static void get_internal_addr(connection_t *c, host_t *requested_vip,
|
|||||||
| LELEM(INTERNAL_IP4_NETMASK);
|
| LELEM(INTERNAL_IP4_NETMASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* assign DNS servers */
|
/* assign DNS servers from strongswan.conf */
|
||||||
for (i = 1; i <= DNS_SERVER_MAX; i++)
|
for (i = 1; i <= DNS_SERVER_MAX; i++)
|
||||||
{
|
{
|
||||||
char dns_key[16], *dns_str;
|
char dns_key[16], *dns_str;
|
||||||
@@ -178,7 +177,7 @@ static void get_internal_addr(connection_t *c, host_t *requested_vip,
|
|||||||
sa_family_t family = strchr(dns_str, ':') ? AF_INET6 : AF_INET;
|
sa_family_t family = strchr(dns_str, ':') ? AF_INET6 : AF_INET;
|
||||||
|
|
||||||
ugh = ttoaddr(dns_str, 0, family, &ia->dns[dns_idx]);
|
ugh = ttoaddr(dns_str, 0, family, &ia->dns[dns_idx]);
|
||||||
if (ugh != NULL)
|
if (ugh)
|
||||||
{
|
{
|
||||||
plog("error in DNS server address: %s", ugh);
|
plog("error in DNS server address: %s", ugh);
|
||||||
continue;
|
continue;
|
||||||
@@ -191,7 +190,7 @@ static void get_internal_addr(connection_t *c, host_t *requested_vip,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* assign WINS servers */
|
/* assign NBNS servers from strongswan.conf */
|
||||||
for (i = 1; i <= NBNS_SERVER_MAX; i++)
|
for (i = 1; i <= NBNS_SERVER_MAX; i++)
|
||||||
{
|
{
|
||||||
char nbns_key[16], *nbns_str;
|
char nbns_key[16], *nbns_str;
|
||||||
@@ -204,9 +203,9 @@ static void get_internal_addr(connection_t *c, host_t *requested_vip,
|
|||||||
sa_family_t family = strchr(nbns_str, ':') ? AF_INET6 : AF_INET;
|
sa_family_t family = strchr(nbns_str, ':') ? AF_INET6 : AF_INET;
|
||||||
|
|
||||||
ugh = ttoaddr(nbns_str, 0, family, &ia->nbns[nbns_idx]);
|
ugh = ttoaddr(nbns_str, 0, family, &ia->nbns[nbns_idx]);
|
||||||
if (ugh != NULL)
|
if (ugh)
|
||||||
{
|
{
|
||||||
plog("error in WINS server address: %s", ugh);
|
plog("error in NBNS server address: %s", ugh);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
plog("assigning NBNS server %s to peer", nbns_str);
|
plog("assigning NBNS server %s to peer", nbns_str);
|
||||||
@@ -216,6 +215,74 @@ static void get_internal_addr(connection_t *c, host_t *requested_vip,
|
|||||||
nbns_idx++;
|
nbns_idx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* assign attributes from registered providers */
|
||||||
|
enumerator = lib->attributes->create_responder_enumerator(lib->attributes,
|
||||||
|
c->spd.that.id, vip);
|
||||||
|
while (enumerator->enumerate(enumerator, &type, &value))
|
||||||
|
{
|
||||||
|
err_t ugh;
|
||||||
|
host_t *server;
|
||||||
|
sa_family_t family = AF_INET;
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case INTERNAL_IP6_DNS:
|
||||||
|
family = AF_INET6;
|
||||||
|
/* fallthrough */
|
||||||
|
case INTERNAL_IP4_DNS:
|
||||||
|
if (dns_idx >= DNS_SERVER_MAX)
|
||||||
|
{
|
||||||
|
plog("exceeded the maximum number of %d DNS servers",
|
||||||
|
DNS_SERVER_MAX);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ugh = initaddr(value.ptr, value.len, family, &ia->dns[dns_idx]);
|
||||||
|
if (ugh)
|
||||||
|
{
|
||||||
|
plog("error in DNS server address: %s", ugh);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
server = host_create_from_chunk(family, value, 0);
|
||||||
|
plog("assigning DNS server %H to peer", server);
|
||||||
|
server->destroy(server);
|
||||||
|
|
||||||
|
/* differentiate between IP4 and IP6 in modecfg_build_msg() */
|
||||||
|
ia->attr_set |= LELEM(INTERNAL_IP4_DNS);
|
||||||
|
dns_idx++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case INTERNAL_IP6_NBNS:
|
||||||
|
family = AF_INET6;
|
||||||
|
/* fallthrough */
|
||||||
|
case INTERNAL_IP4_NBNS:
|
||||||
|
if (nbns_idx >= NBNS_SERVER_MAX)
|
||||||
|
{
|
||||||
|
plog("exceeded the maximum number of %d NBNS servers",
|
||||||
|
NBNS_SERVER_MAX);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ugh = initaddr(value.ptr, value.len, family, &ia->nbns[nbns_idx]);
|
||||||
|
if (ugh)
|
||||||
|
{
|
||||||
|
plog("error in NBNS server address: %s", ugh);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
server = host_create_from_chunk(family, value, 0);
|
||||||
|
plog("assigning NBNS server %H to peer", server);
|
||||||
|
server->destroy(server);
|
||||||
|
|
||||||
|
/* differentiate between IP4 and IP6 in modecfg_build_msg() */
|
||||||
|
ia->attr_set |= LELEM(INTERNAL_IP4_NBNS);
|
||||||
|
nbns_idx++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
DESTROY_IF(vip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -627,12 +694,12 @@ static stf_status modecfg_parse_attributes(pb_stream *attrs, internal_addr_t *ia
|
|||||||
ugh = initaddr((char *)(strattr.cur), 4, AF_INET, &ia->nbns[nbns_idx]);
|
ugh = initaddr((char *)(strattr.cur), 4, AF_INET, &ia->nbns[nbns_idx]);
|
||||||
if (ugh != NULL)
|
if (ugh != NULL)
|
||||||
{
|
{
|
||||||
plog("received invalid IPv4 WINS server address: %s", ugh);
|
plog("received invalid IPv4 NBNS server address: %s", ugh);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
addrtot(&ia->nbns[nbns_idx], 0, buf, BUF_LEN);
|
addrtot(&ia->nbns[nbns_idx], 0, buf, BUF_LEN);
|
||||||
plog("received IPv4 WINS server address %s", buf);
|
plog("received IPv4 NBNS server address %s", buf);
|
||||||
nbns_idx++;
|
nbns_idx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -661,12 +728,12 @@ static stf_status modecfg_parse_attributes(pb_stream *attrs, internal_addr_t *ia
|
|||||||
ugh = initaddr((char *)(strattr.cur), 16, AF_INET6, &ia->nbns[nbns_idx]);
|
ugh = initaddr((char *)(strattr.cur), 16, AF_INET6, &ia->nbns[nbns_idx]);
|
||||||
if (ugh != NULL)
|
if (ugh != NULL)
|
||||||
{
|
{
|
||||||
plog("received invalid IPv6 WINS server address: %s", ugh);
|
plog("received invalid IPv6 NBNS server address: %s", ugh);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
addrtot(&ia->nbns[nbns_idx], 0, buf, BUF_LEN);
|
addrtot(&ia->nbns[nbns_idx], 0, buf, BUF_LEN);
|
||||||
plog("received IPv6 WINS server address %s", buf);
|
plog("received IPv6 NBNS server address %s", buf);
|
||||||
nbns_idx++;
|
nbns_idx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user