aboutsummaryrefslogtreecommitdiffstats
path: root/src/charon/config/traffic_selector.c
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2006-07-20 10:09:32 +0000
committerMartin Willi <martin@strongswan.org>2006-07-20 10:09:32 +0000
commit8dfbe71b34badd4a277b46e4bfd9a70cfa9db06b (patch)
treec85c7059d723cb76a0db9dd51f9cb984c3ad7f8f /src/charon/config/traffic_selector.c
parent92ee45a0eedfa4b58d5814d7ffad0671165f3f06 (diff)
downloadstrongswan-8dfbe71b34badd4a277b46e4bfd9a70cfa9db06b.tar.bz2
strongswan-8dfbe71b34badd4a277b46e4bfd9a70cfa9db06b.tar.xz
introduced refcounting on policy and connections
aren't stored in the IKE_SA anymore, they are queried on the fly are immutable now, allows it to share them policy selection based on traffic selectors, leads to valid lookup results rekeying queries the policy based on its traffic selectors
Diffstat (limited to 'src/charon/config/traffic_selector.c')
-rw-r--r--src/charon/config/traffic_selector.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/charon/config/traffic_selector.c b/src/charon/config/traffic_selector.c
index b0b0a13ce..3a9480f77 100644
--- a/src/charon/config/traffic_selector.c
+++ b/src/charon/config/traffic_selector.c
@@ -356,16 +356,18 @@ static void update_address_range(private_traffic_selector_t *this, host_t *host)
*/
static traffic_selector_t *clone_(private_traffic_selector_t *this)
{
- private_traffic_selector_t *clone = traffic_selector_create(this->protocol, this->type, this->from_port, this->to_port);
- clone->type = this->type;
- clone->string = strdup(this->string);
+ private_traffic_selector_t *clone;
+
+ clone = traffic_selector_create(this->protocol, this->type,
+ this->from_port, this->to_port);
switch (clone->type)
{
case TS_IPV4_ADDR_RANGE:
{
clone->from_addr_ipv4 = this->from_addr_ipv4;
clone->to_addr_ipv4 = this->to_addr_ipv4;
- return &(clone->public);
+ update_string(clone);
+ return &clone->public;
}
case TS_IPV6_ADDR_RANGE:
default:
@@ -391,8 +393,7 @@ static void destroy(private_traffic_selector_t *this)
traffic_selector_t *traffic_selector_create_from_bytes(u_int8_t protocol, ts_type_t type, chunk_t from_addr, u_int16_t from_port, chunk_t to_addr, u_int16_t to_port)
{
private_traffic_selector_t *this = traffic_selector_create(protocol, type, from_port, to_port);
-
- this->type = type;
+
switch (type)
{
case TS_IPV4_ADDR_RANGE:
@@ -400,12 +401,12 @@ traffic_selector_t *traffic_selector_create_from_bytes(u_int8_t protocol, ts_typ
if (from_addr.len != 4 || to_addr.len != 4)
{
free(this);
- return NULL;
+ return NULL;
}
/* chunk contains network order, convert! */
this->from_addr_ipv4 = ntohl(*((u_int32_t*)from_addr.ptr));
this->to_addr_ipv4 = ntohl(*((u_int32_t*)to_addr.ptr));
- break;
+ break;
}
case TS_IPV6_ADDR_RANGE:
default: