diff options
Diffstat (limited to 'src/charon/plugins/stroke/stroke_config.c')
-rw-r--r-- | src/charon/plugins/stroke/stroke_config.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/src/charon/plugins/stroke/stroke_config.c b/src/charon/plugins/stroke/stroke_config.c index ef8ceed91..f4f3dbc99 100644 --- a/src/charon/plugins/stroke/stroke_config.c +++ b/src/charon/plugins/stroke/stroke_config.c @@ -354,7 +354,7 @@ static peer_cfg_t *build_peer_cfg(private_stroke_config_t *this, { identification_t *me, *other, *peer_id = NULL; peer_cfg_t *mediated_by = NULL; - host_t *my_vip = NULL, *other_vip = NULL; + host_t *vip = NULL; certificate_t *cert; u_int32_t rekey = 0, reauth = 0, over, jitter; @@ -457,21 +457,43 @@ static peer_cfg_t *build_peer_cfg(private_stroke_config_t *this, { rekey = msg->add_conn.rekey.ike_lifetime - over; } - if (msg->add_conn.me.virtual_ip && msg->add_conn.me.sourceip) + if (msg->add_conn.me.sourceip_size) { - my_vip = host_create_from_string(msg->add_conn.me.sourceip, 0); - } - if (msg->add_conn.other.virtual_ip && msg->add_conn.other.sourceip) - { - other_vip = host_create_from_string(msg->add_conn.other.sourceip, 0); + if (msg->add_conn.me.sourceip) + { + vip = host_create_from_string(msg->add_conn.me.sourceip, 0); + } + if (!vip) + { /* if it is set to something like %poolname, request an address */ + if (msg->add_conn.me.subnet) + { /* use the same addreass as in subnet, if any */ + if (strchr(msg->add_conn.me.subnet, '.')) + { + vip = host_create_any(AF_INET); + } + else + { + vip = host_create_any(AF_INET6); + } + } + else + { + host_t* my_host = ike_cfg->get_my_host(ike_cfg); + vip = host_create_any(my_host->get_family(my_host)); + } + } } + /* other.sourceip is managed in stroke_attributes. If it is set, we define + * the pool name as the connection name, which the attribute provider + * uses to serve pool addresses. */ return peer_cfg_create(msg->add_conn.name, msg->add_conn.ikev2 ? 2 : 1, ike_cfg, me, other, msg->add_conn.me.sendcert, msg->add_conn.auth_method, msg->add_conn.eap_type, msg->add_conn.eap_vendor, msg->add_conn.rekey.tries, rekey, reauth, jitter, over, msg->add_conn.mobike, msg->add_conn.dpd.delay, msg->add_conn.dpd.action, - my_vip, other_vip, msg->add_conn.ikeme.mediation, mediated_by, peer_id); + vip, msg->add_conn.other.sourceip ? msg->add_conn.name : NULL, + msg->add_conn.ikeme.mediation, mediated_by, peer_id); } /** |