Annotation of embedaddon/strongswan/src/libimcv/pwg/pwg_attr_vendor_smi_code.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2015 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 "pwg_attr_vendor_smi_code.h"
17:
18: #include <pa_tnc/pa_tnc_msg.h>
19: #include <bio/bio_writer.h>
20: #include <bio/bio_reader.h>
21: #include <utils/debug.h>
22:
23: typedef struct private_pwg_attr_vendor_smi_code_t private_pwg_attr_vendor_smi_code_t;
24:
25: /**
26: * PWG HCD PA-TNC Vendor SMI Code
27: *
28: * 1 2 3
29: * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
30: * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
31: * | Reserved | Vendor SMI Code |
32: * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
33: */
34:
35: #define VENDOR_SMI_CODE_SIZE 4
36:
37: /**
38: * Private data of an pwg_attr_vendor_smi_code_t object.
39: */
40: struct private_pwg_attr_vendor_smi_code_t {
41:
42: /**
43: * Public members of pwg_attr_vendor_smi_code_t
44: */
45: pwg_attr_vendor_smi_code_t public;
46:
47: /**
48: * Vendor-specific attribute type
49: */
50: pen_type_t type;
51:
52: /**
53: * Length of attribute value
54: */
55: size_t length;
56:
57: /**
58: * Attribute value or segment
59: */
60: chunk_t value;
61:
62: /**
63: * Noskip flag
64: */
65: bool noskip_flag;
66:
67: /**
68: * Vendor SMI code
69: */
70: pen_t vendor_smi_code;
71:
72: /**
73: * Reference count
74: */
75: refcount_t ref;
76: };
77:
78: METHOD(pa_tnc_attr_t, get_type, pen_type_t,
79: private_pwg_attr_vendor_smi_code_t *this)
80: {
81: return this->type;
82: }
83:
84: METHOD(pa_tnc_attr_t, get_value, chunk_t,
85: private_pwg_attr_vendor_smi_code_t *this)
86: {
87: return this->value;
88: }
89:
90: METHOD(pa_tnc_attr_t, get_noskip_flag, bool,
91: private_pwg_attr_vendor_smi_code_t *this)
92: {
93: return this->noskip_flag;
94: }
95:
96: METHOD(pa_tnc_attr_t, set_noskip_flag,void,
97: private_pwg_attr_vendor_smi_code_t *this, bool noskip)
98: {
99: this->noskip_flag = noskip;
100: }
101:
102: METHOD(pa_tnc_attr_t, build, void,
103: private_pwg_attr_vendor_smi_code_t *this)
104: {
105: bio_writer_t *writer;
106:
107: if (this->value.ptr)
108: {
109: return;
110: }
111: writer = bio_writer_create(VENDOR_SMI_CODE_SIZE);
112: writer->write_uint32(writer, this->vendor_smi_code);
113:
114: this->value = writer->extract_buf(writer);
115: this->length = this->value.len;
116: writer->destroy(writer);
117: }
118:
119: METHOD(pa_tnc_attr_t, process, status_t,
120: private_pwg_attr_vendor_smi_code_t *this, uint32_t *offset)
121: {
122: bio_reader_t *reader;
123: uint32_t vendor_smi_code;
124: uint8_t reserved;
125:
126: *offset = 0;
127:
128: if (this->value.len < this->length)
129: {
130: return NEED_MORE;
131: }
132: if (this->value.len != VENDOR_SMI_CODE_SIZE)
133: {
134: DBG1(DBG_TNC, "incorrect attribute length for PWG HCD Vendor SMI Code");
135: return FAILED;
136: }
137: reader = bio_reader_create(this->value);
138: reader->read_uint8 (reader, &reserved);
139: reader->read_uint24(reader, &vendor_smi_code);
140: reader->destroy(reader);
141: this->vendor_smi_code = vendor_smi_code;
142:
143: return SUCCESS;
144: }
145:
146: METHOD(pa_tnc_attr_t, add_segment, void,
147: private_pwg_attr_vendor_smi_code_t *this, chunk_t segment)
148: {
149: this->value = chunk_cat("mc", this->value, segment);
150: }
151:
152: METHOD(pa_tnc_attr_t, get_ref, pa_tnc_attr_t*,
153: private_pwg_attr_vendor_smi_code_t *this)
154: {
155: ref_get(&this->ref);
156: return &this->public.pa_tnc_attribute;
157: }
158:
159: METHOD(pa_tnc_attr_t, destroy, void,
160: private_pwg_attr_vendor_smi_code_t *this)
161: {
162: if (ref_put(&this->ref))
163: {
164: free(this->value.ptr);
165: free(this);
166: }
167: }
168:
169: METHOD(pwg_attr_vendor_smi_code_t, get_vendor_smi_code, pen_t,
170: private_pwg_attr_vendor_smi_code_t *this)
171: {
172: return this->vendor_smi_code;
173: }
174:
175: /**
176: * Described in header.
177: */
178: pa_tnc_attr_t *pwg_attr_vendor_smi_code_create(pen_t vendor_smi_code)
179: {
180: private_pwg_attr_vendor_smi_code_t *this;
181:
182: INIT(this,
183: .public = {
184: .pa_tnc_attribute = {
185: .get_type = _get_type,
186: .get_value = _get_value,
187: .get_noskip_flag = _get_noskip_flag,
188: .set_noskip_flag = _set_noskip_flag,
189: .build = _build,
190: .process = _process,
191: .add_segment = _add_segment,
192: .get_ref = _get_ref,
193: .destroy = _destroy,
194: },
195: .get_vendor_smi_code = _get_vendor_smi_code,
196: },
197: .type = { PEN_PWG, PWG_HCD_VENDOR_SMI_CODE },
198: .vendor_smi_code = vendor_smi_code,
199: .ref = 1,
200: );
201:
202: return &this->public.pa_tnc_attribute;
203: }
204:
205: /**
206: * Described in header.
207: */
208: pa_tnc_attr_t *pwg_attr_vendor_smi_code_create_from_data(size_t length,
209: chunk_t data)
210: {
211: private_pwg_attr_vendor_smi_code_t *this;
212:
213: INIT(this,
214: .public = {
215: .pa_tnc_attribute = {
216: .get_type = _get_type,
217: .get_value = _get_value,
218: .get_noskip_flag = _get_noskip_flag,
219: .set_noskip_flag = _set_noskip_flag,
220: .build = _build,
221: .process = _process,
222: .add_segment = _add_segment,
223: .get_ref = _get_ref,
224: .destroy = _destroy,
225: },
226: .get_vendor_smi_code = _get_vendor_smi_code,
227: },
228: .type = { PEN_PWG, PWG_HCD_VENDOR_SMI_CODE },
229: .length = length,
230: .value = chunk_clone(data),
231: .ref = 1,
232: );
233:
234: return &this->public.pa_tnc_attribute;
235: }
236:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>