Annotation of embedaddon/strongswan/src/libstrongswan/networking/packet.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2012 Tobias Brunner
3: * Copyright (C) 2005-2006 Martin Willi
4: * Copyright (C) 2005 Jan Hutter
5: * HSR Hochschule fuer Technik Rapperswil
6: *
7: * This program is free software; you can redistribute it and/or modify it
8: * under the terms of the GNU General Public License as published by the
9: * Free Software Foundation; either version 2 of the License, or (at your
10: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
11: *
12: * This program is distributed in the hope that it will be useful, but
13: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15: * for more details.
16: */
17:
18: #include "packet.h"
19:
20: typedef struct private_packet_t private_packet_t;
21:
22: /**
23: * Private data of an packet_t object.
24: */
25: struct private_packet_t {
26:
27: /**
28: * Public part of a packet_t object.
29: */
30: packet_t public;
31:
32: /**
33: * source address
34: */
35: host_t *source;
36:
37: /**
38: * destination address
39: */
40: host_t *destination;
41:
42: /**
43: * DSCP value on packet
44: */
45: uint8_t dscp;
46:
47: /**
48: * message data
49: */
50: chunk_t data;
51:
52: /**
53: * actual chunk returned from get_data, adjusted when skip_bytes is called
54: */
55: chunk_t adjusted_data;
56: };
57:
58: METHOD(packet_t, set_source, void,
59: private_packet_t *this, host_t *source)
60: {
61: DESTROY_IF(this->source);
62: this->source = source;
63: }
64:
65: METHOD(packet_t, set_destination, void,
66: private_packet_t *this, host_t *destination)
67: {
68: DESTROY_IF(this->destination);
69: this->destination = destination;
70: }
71:
72: METHOD(packet_t, get_source, host_t*,
73: private_packet_t *this)
74: {
75: return this->source;
76: }
77:
78: METHOD(packet_t, get_destination, host_t*,
79: private_packet_t *this)
80: {
81: return this->destination;
82: }
83:
84: METHOD(packet_t, get_data, chunk_t,
85: private_packet_t *this)
86: {
87: return this->adjusted_data;
88: }
89:
90: METHOD(packet_t, set_data, void,
91: private_packet_t *this, chunk_t data)
92: {
93: free(this->data.ptr);
94: this->adjusted_data = this->data = data;
95: }
96:
97: METHOD(packet_t, get_dscp, uint8_t,
98: private_packet_t *this)
99: {
100: return this->dscp;
101: }
102: METHOD(packet_t, set_dscp, void,
103: private_packet_t *this, uint8_t value)
104: {
105: this->dscp = value;
106: }
107:
108: METHOD(packet_t, skip_bytes, void,
109: private_packet_t *this, size_t bytes)
110: {
111: this->adjusted_data = chunk_skip(this->adjusted_data, bytes);
112: }
113:
114: METHOD(packet_t, destroy, void,
115: private_packet_t *this)
116: {
117: DESTROY_IF(this->source);
118: DESTROY_IF(this->destination);
119: free(this->data.ptr);
120: free(this);
121: }
122:
123: METHOD(packet_t, clone_, packet_t*,
124: private_packet_t *this)
125: {
126: packet_t *other;
127:
128: other = packet_create();
129: if (this->destination)
130: {
131: other->set_destination(other,
132: this->destination->clone(this->destination));
133: }
134: if (this->source)
135: {
136: other->set_source(other, this->source->clone(this->source));
137: }
138: if (this->data.ptr)
139: {
140: other->set_data(other, chunk_clone(this->adjusted_data));
141: }
142: other->set_dscp(other, this->dscp);
143: return other;
144: }
145:
146: /**
147: * Described in header.
148: */
149: packet_t *packet_create_from_data(host_t *src, host_t *dst, chunk_t data)
150: {
151: private_packet_t *this;
152:
153: INIT(this,
154: .public = {
155: .set_data = _set_data,
156: .get_data = _get_data,
157: .set_source = _set_source,
158: .get_source = _get_source,
159: .set_destination = _set_destination,
160: .get_destination = _get_destination,
161: .get_dscp = _get_dscp,
162: .set_dscp = _set_dscp,
163: .skip_bytes = _skip_bytes,
164: .clone = _clone_,
165: .destroy = _destroy,
166: },
167: .source = src,
168: .destination = dst,
169: .adjusted_data = data,
170: .data = data,
171: );
172:
173: return &this->public;
174: }
175:
176: /*
177: * Described in header.
178: */
179: packet_t *packet_create()
180: {
181: return packet_create_from_data(NULL, NULL, chunk_empty);
182: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>