Support of multiple directed segmentation contracts
[strongswan.git] / src / libimcv / seg / seg_contract_manager.c
1 /*
2 * Copyright (C) 2014 Andreas Steffen
3 * HSR Hochschule fuer Technik Rapperswil
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * for more details.
14 */
15
16 #include "seg_contract_manager.h"
17
18 typedef struct private_seg_contract_manager_t private_seg_contract_manager_t;
19
20 /**
21 * Private data of a seg_contract_manager_t object.
22 *
23 */
24 struct private_seg_contract_manager_t {
25
26 /**
27 * Public seg_contract_manager_t interface.
28 */
29 seg_contract_manager_t public;
30
31 /**
32 * List of PA-TNC segmentation contracts
33 */
34 linked_list_t *contracts;
35
36 };
37
38 METHOD(seg_contract_manager_t, add_contract, void,
39 private_seg_contract_manager_t *this, seg_contract_t *contract)
40 {
41 this->contracts->insert_last(this->contracts, contract);
42 }
43
44 METHOD(seg_contract_manager_t, get_contract, seg_contract_t*,
45 private_seg_contract_manager_t *this, pen_type_t msg_type, bool is_issuer,
46 TNC_UInt32 id)
47 {
48 enumerator_t *enumerator;
49 seg_contract_t *contract, *found = NULL;
50
51 enumerator = this->contracts->create_enumerator(this->contracts);
52 while (enumerator->enumerate(enumerator, &contract))
53 {
54 if (contract->is_issuer(contract) == is_issuer &&
55 pen_type_equals(contract->get_msg_type(contract), msg_type) &&
56 id == (is_issuer ? contract->get_responder(contract) :
57 contract->get_issuer(contract)))
58 {
59 found = contract;
60 break;
61 }
62 }
63 enumerator->destroy(enumerator);
64
65 return found;
66 }
67
68 METHOD(seg_contract_manager_t, destroy, void,
69 private_seg_contract_manager_t *this)
70 {
71 this->contracts->destroy_offset(this->contracts,
72 offsetof(seg_contract_t, destroy));
73 free(this);
74 }
75
76 /**
77 * See header
78 */
79 seg_contract_manager_t *seg_contract_manager_create(void)
80 {
81 private_seg_contract_manager_t *this;
82
83 INIT(this,
84 .public = {
85 .add_contract = _add_contract,
86 .get_contract = _get_contract,
87 .destroy = _destroy,
88 },
89 .contracts = linked_list_create(),
90 );
91
92 return &this->public;
93 }
94