Annotation of embedaddon/strongswan/src/libcharon/plugins/dhcp/dhcp_transaction.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2010 Martin Willi
3: * Copyright (C) 2010 revosec AG
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 "dhcp_transaction.h"
17:
18: #include <collections/linked_list.h>
19:
20: typedef struct private_dhcp_transaction_t private_dhcp_transaction_t;
21:
22: /**
23: * Private data of an dhcp_transaction_t object.
24: */
25: struct private_dhcp_transaction_t {
26:
27: /**
28: * Public dhcp_transaction_t interface.
29: */
30: dhcp_transaction_t public;
31:
32: /**
33: * DHCP transaction ID
34: */
35: uint32_t id;
36:
37: /**
38: * Peer identity
39: */
40: identification_t *identity;
41:
42: /**
43: * received DHCP address
44: */
45: host_t *address;
46:
47: /**
48: * discovered DHCP server address
49: */
50: host_t *server;
51:
52: /**
53: * List of added attributes, as attribute_entry_t
54: */
55: linked_list_t *attributes;
56: };
57:
58: /**
59: * Entry for an added attribute
60: */
61: typedef struct {
62: configuration_attribute_type_t type;
63: chunk_t data;
64: } attribute_entry_t;
65:
66: METHOD(dhcp_transaction_t, get_id, uint32_t,
67: private_dhcp_transaction_t *this)
68: {
69: return this->id;
70: }
71:
72: METHOD(dhcp_transaction_t, get_identity, identification_t*,
73: private_dhcp_transaction_t *this)
74: {
75: return this->identity;
76: }
77:
78: METHOD(dhcp_transaction_t, set_address, void,
79: private_dhcp_transaction_t *this, host_t *address)
80: {
81: DESTROY_IF(this->address);
82: this->address = address;
83: }
84:
85: METHOD(dhcp_transaction_t, get_address, host_t*,
86: private_dhcp_transaction_t *this)
87: {
88: return this->address;
89: }
90:
91: METHOD(dhcp_transaction_t, set_server, void,
92: private_dhcp_transaction_t *this, host_t *server)
93: {
94: DESTROY_IF(this->server);
95: this->server = server;
96: }
97:
98: METHOD(dhcp_transaction_t, get_server, host_t*,
99: private_dhcp_transaction_t *this)
100: {
101: return this->server;
102: }
103:
104: METHOD(dhcp_transaction_t, add_attribute, void,
105: private_dhcp_transaction_t *this, configuration_attribute_type_t type,
106: chunk_t data)
107: {
108: attribute_entry_t *entry;
109:
110: INIT(entry,
111: .type = type,
112: .data = chunk_clone(data),
113: );
114: this->attributes->insert_last(this->attributes, entry);
115: }
116:
117: CALLBACK(attribute_filter, bool,
118: void *null, enumerator_t *orig, va_list args)
119: {
120: configuration_attribute_type_t *type;
121: attribute_entry_t *entry;
122: chunk_t *data;
123:
124: VA_ARGS_VGET(args, type, data);
125:
126: if (orig->enumerate(orig, &entry))
127: {
128: *type = entry->type;
129: *data = entry->data;
130: return TRUE;
131: }
132: return FALSE;
133: }
134:
135: METHOD(dhcp_transaction_t, create_attribute_enumerator, enumerator_t*,
136: private_dhcp_transaction_t *this)
137: {
138: return enumerator_create_filter(
139: this->attributes->create_enumerator(this->attributes),
140: attribute_filter, NULL, NULL);
141: }
142:
143: /**
144: * Clean up an attribute entry
145: */
146: static void attribute_entry_destroy(attribute_entry_t *entry)
147: {
148: free(entry->data.ptr);
149: free(entry);
150: }
151:
152: METHOD(dhcp_transaction_t, destroy, void,
153: private_dhcp_transaction_t *this)
154: {
155: this->identity->destroy(this->identity);
156: DESTROY_IF(this->address);
157: DESTROY_IF(this->server);
158: this->attributes->destroy_function(this->attributes,
159: (void*)attribute_entry_destroy);
160: free(this);
161: }
162:
163: /**
164: * See header
165: */
166: dhcp_transaction_t *dhcp_transaction_create(uint32_t id,
167: identification_t *identity)
168: {
169: private_dhcp_transaction_t *this;
170:
171: INIT(this,
172: .public = {
173: .get_id = _get_id,
174: .get_identity = _get_identity,
175: .set_address = _set_address,
176: .get_address = _get_address,
177: .set_server = _set_server,
178: .get_server = _get_server,
179: .add_attribute = _add_attribute,
180: .create_attribute_enumerator = _create_attribute_enumerator,
181: .destroy = _destroy,
182: },
183: .id = id,
184: .identity = identity->clone(identity),
185: .attributes = linked_list_create(),
186: );
187:
188: return &this->public;
189: }
190:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>