- added support for empty traffic selectors and empty sa payload in
[strongswan.git] / Source / charon / encoding / payloads / ts_payload.c
index 2e7df5b..59b7322 100644 (file)
@@ -128,7 +128,7 @@ encoding_rule_t ts_payload_encodings[] = {
 static status_t verify(private_ts_payload_t *this)
 {
        iterator_t *iterator;
-       status_t status;
+       status_t status = SUCCESS;
        
        if (this->critical)
        {
@@ -142,7 +142,6 @@ static status_t verify(private_ts_payload_t *this)
        }
        
        iterator = this->traffic_selectors->create_iterator(this->traffic_selectors,TRUE);
-       
        while(iterator->has_next(iterator))
        {
                payload_t *current_traffic_selector;
@@ -154,10 +153,8 @@ static status_t verify(private_ts_payload_t *this)
                        break;
                }
        }
-       
        iterator->destroy(iterator);
        
-       
        return status;
 }
 
@@ -175,7 +172,14 @@ static void get_encoding_rules(private_ts_payload_t *this, encoding_rule_t **rul
  */
 static payload_type_t get_payload_type(private_ts_payload_t *this)
 {
-       return ((this->is_initiator) ? TRAFFIC_SELECTOR_INITIATOR : TRAFFIC_SELECTOR_RESPONDER);
+       if (this->is_initiator)
+       {
+               return TRAFFIC_SELECTOR_INITIATOR;
+       }
+       else
+       {
+               return TRAFFIC_SELECTOR_RESPONDER;
+       }
 }
 
 /**
@@ -225,7 +229,7 @@ static void set_initiator (private_ts_payload_t *this,bool is_initiator)
 static void add_traffic_selector_substructure (private_ts_payload_t *this,traffic_selector_substructure_t *traffic_selector)
 {
        this->traffic_selectors->insert_last(this->traffic_selectors,traffic_selector);
-       this->number_of_traffic_selectors= this->traffic_selectors->get_count(this->traffic_selectors);
+       this->number_of_traffic_selectors = this->traffic_selectors->get_count(this->traffic_selectors);
 }
 
 /**
@@ -237,6 +241,31 @@ static iterator_t * create_traffic_selector_substructure_iterator (private_ts_pa
 }
 
 /**
+ * Implementation of ts_payload_t.get_traffic_selectors.
+ */
+static size_t get_traffic_selectors(private_ts_payload_t *this, traffic_selector_t **traffic_selectors[])
+{
+       traffic_selector_t **ts;
+       iterator_t *iterator;
+       int i = 0;
+       
+       ts = allocator_alloc(sizeof(traffic_selector_t*) * this->number_of_traffic_selectors);
+       iterator = this->traffic_selectors->create_iterator(this->traffic_selectors, TRUE);
+       while (iterator->has_next(iterator))
+       {
+               traffic_selector_substructure_t *ts_substructure;
+               iterator->current(iterator, (void**)&ts_substructure);
+               ts[i] = ts_substructure->get_traffic_selector(ts_substructure);
+               i++;
+       }
+       iterator->destroy(iterator);
+       
+       /* return values */
+       *traffic_selectors = ts;
+       return this->number_of_traffic_selectors;
+}
+
+/**
  * Implementation of private_ts_payload_t.compute_length.
  */
 static void compute_length (private_ts_payload_t *this)
@@ -301,6 +330,7 @@ ts_payload_t *ts_payload_create(bool is_initiator)
        this->public.set_initiator = (void (*) (ts_payload_t *,bool)) set_initiator;
        this->public.add_traffic_selector_substructure = (void (*) (ts_payload_t *,traffic_selector_substructure_t *)) add_traffic_selector_substructure;
        this->public.create_traffic_selector_substructure_iterator = (iterator_t* (*) (ts_payload_t *,bool)) create_traffic_selector_substructure_iterator;
+       this->public.get_traffic_selectors = (size_t (*) (ts_payload_t *, traffic_selector_t**[])) get_traffic_selectors;
        
        /* private functions */
        this->compute_length = compute_length;
@@ -310,8 +340,29 @@ ts_payload_t *ts_payload_create(bool is_initiator)
        this->next_payload = NO_PAYLOAD;
        this->payload_length =TS_PAYLOAD_HEADER_LENGTH;
        this->is_initiator = is_initiator;
-       this->number_of_traffic_selectors=0;
-       this->traffic_selectors = linked_list_create();
+       this->number_of_traffic_selectors = 0;
+       this->traffic_selectors = linked_list_create();  
 
-       return (&(this->public));
+       return &(this->public);
 }
+
+/*
+ * Described in header
+ */
+ts_payload_t *ts_payload_create_from_traffic_selectors(bool is_initiator, traffic_selector_t *traffic_selectors[], size_t count)
+{
+       int i;
+       private_ts_payload_t *this;
+       
+       this = (private_ts_payload_t*)ts_payload_create(is_initiator);
+       
+       for (i = 0; i < count; i++)
+       {
+               traffic_selector_substructure_t *ts_substructure;
+               ts_substructure = traffic_selector_substructure_create_from_traffic_selector(traffic_selectors[i]);
+               this->public.add_traffic_selector_substructure(&(this->public), ts_substructure);
+       }
+       
+       return &(this->public);
+}
+