Annotation of embedaddon/strongswan/src/libcharon/encoding/payloads/traffic_selector_substructure.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2005-2010 Martin Willi
! 3: * Copyright (C) 2010 revosec AG
! 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 "traffic_selector_substructure.h"
! 19:
! 20: #include <encoding/payloads/encodings.h>
! 21: #include <collections/linked_list.h>
! 22:
! 23: typedef struct private_traffic_selector_substructure_t private_traffic_selector_substructure_t;
! 24:
! 25: /**
! 26: * Private data of an traffic_selector_substructure_t object.
! 27: */
! 28: struct private_traffic_selector_substructure_t {
! 29:
! 30: /**
! 31: * Public traffic_selector_substructure_t interface.
! 32: */
! 33: traffic_selector_substructure_t public;
! 34:
! 35: /**
! 36: * Type of traffic selector.
! 37: */
! 38: uint8_t ts_type;
! 39:
! 40: /**
! 41: * IP Protocol ID.
! 42: */
! 43: uint8_t ip_protocol_id;
! 44:
! 45: /**
! 46: * Length of this payload.
! 47: */
! 48: uint16_t payload_length;
! 49:
! 50: /**
! 51: * Start port number.
! 52: */
! 53: uint16_t start_port;
! 54:
! 55: /**
! 56: * End port number.
! 57: */
! 58: uint16_t end_port;
! 59:
! 60: /**
! 61: * Starting address.
! 62: */
! 63: chunk_t starting_address;
! 64:
! 65: /**
! 66: * Ending address.
! 67: */
! 68: chunk_t ending_address;
! 69: };
! 70:
! 71: /**
! 72: * Encoding rules to parse or generate a TS payload
! 73: *
! 74: * The defined offsets are the positions in a object of type
! 75: * private_traffic_selector_substructure_t.
! 76: */
! 77: static encoding_rule_t encodings[] = {
! 78: /* 1 Byte next ts type*/
! 79: { TS_TYPE, offsetof(private_traffic_selector_substructure_t, ts_type) },
! 80: /* 1 Byte IP protocol id*/
! 81: { U_INT_8, offsetof(private_traffic_selector_substructure_t, ip_protocol_id) },
! 82: /* Length of the whole payload*/
! 83: { PAYLOAD_LENGTH,offsetof(private_traffic_selector_substructure_t, payload_length) },
! 84: /* 2 Byte start port*/
! 85: { U_INT_16, offsetof(private_traffic_selector_substructure_t, start_port) },
! 86: /* 2 Byte end port*/
! 87: { U_INT_16, offsetof(private_traffic_selector_substructure_t, end_port) },
! 88: /* starting address is either 4 or 16 byte */
! 89: { ADDRESS, offsetof(private_traffic_selector_substructure_t, starting_address) },
! 90: /* ending address is either 4 or 16 byte */
! 91: { ADDRESS, offsetof(private_traffic_selector_substructure_t, ending_address) }
! 92: };
! 93:
! 94: /*
! 95: 1 2 3
! 96: 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
! 97: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 98: ! TS Type !IP Protocol ID*| Selector Length |
! 99: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 100: | Start Port* | End Port* |
! 101: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 102: ! !
! 103: ~ Starting Address* ~
! 104: ! !
! 105: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 106: ! !
! 107: ~ Ending Address* ~
! 108: ! !
! 109: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 110: */
! 111:
! 112: METHOD(payload_t, verify, status_t,
! 113: private_traffic_selector_substructure_t *this)
! 114: {
! 115: if (this->start_port > this->end_port)
! 116: {
! 117: /* OPAQUE ports are the only exception */
! 118: if (this->start_port != 0xffff && this->end_port != 0)
! 119: {
! 120: return FAILED;
! 121: }
! 122: }
! 123: switch (this->ts_type)
! 124: {
! 125: case TS_IPV4_ADDR_RANGE:
! 126: {
! 127: if ((this->starting_address.len != 4) ||
! 128: (this->ending_address.len != 4))
! 129: {
! 130: /* ipv4 address must be 4 bytes long */
! 131: return FAILED;
! 132: }
! 133: break;
! 134: }
! 135: case TS_IPV6_ADDR_RANGE:
! 136: {
! 137: if ((this->starting_address.len != 16) ||
! 138: (this->ending_address.len != 16))
! 139: {
! 140: /* ipv6 address must be 16 bytes long */
! 141: return FAILED;
! 142: }
! 143: break;
! 144: }
! 145: default:
! 146: {
! 147: /* not supported ts type */
! 148: return FAILED;
! 149: }
! 150: }
! 151:
! 152: return SUCCESS;
! 153: }
! 154:
! 155: METHOD(payload_t, get_encoding_rules, int,
! 156: private_traffic_selector_substructure_t *this, encoding_rule_t **rules)
! 157: {
! 158: *rules = encodings;
! 159: return countof(encodings);
! 160: }
! 161:
! 162: METHOD(payload_t, get_header_length, int,
! 163: private_traffic_selector_substructure_t *this)
! 164: {
! 165: return 8;
! 166: }
! 167:
! 168: METHOD(payload_t, get_type, payload_type_t,
! 169: private_traffic_selector_substructure_t *this)
! 170: {
! 171: return PLV2_TRAFFIC_SELECTOR_SUBSTRUCTURE;
! 172: }
! 173:
! 174: METHOD(payload_t, get_next_type, payload_type_t,
! 175: private_traffic_selector_substructure_t *this)
! 176: {
! 177: return PL_NONE;
! 178: }
! 179:
! 180: METHOD(payload_t, set_next_type, void,
! 181: private_traffic_selector_substructure_t *this,payload_type_t type)
! 182: {
! 183: }
! 184:
! 185: METHOD(payload_t, get_length, size_t,
! 186: private_traffic_selector_substructure_t *this)
! 187: {
! 188: return this->payload_length;
! 189: }
! 190:
! 191: METHOD(traffic_selector_substructure_t, get_traffic_selector, traffic_selector_t*,
! 192: private_traffic_selector_substructure_t *this)
! 193: {
! 194: return traffic_selector_create_from_bytes(
! 195: this->ip_protocol_id, this->ts_type,
! 196: this->starting_address, this->start_port,
! 197: this->ending_address, this->end_port);
! 198: }
! 199:
! 200: METHOD2(payload_t, traffic_selector_substructure_t, destroy, void,
! 201: private_traffic_selector_substructure_t *this)
! 202: {
! 203: free(this->starting_address.ptr);
! 204: free(this->ending_address.ptr);
! 205: free(this);
! 206: }
! 207:
! 208: /*
! 209: * Described in header
! 210: */
! 211: traffic_selector_substructure_t *traffic_selector_substructure_create()
! 212: {
! 213: private_traffic_selector_substructure_t *this;
! 214:
! 215: INIT(this,
! 216: .public = {
! 217: .payload_interface = {
! 218: .verify = _verify,
! 219: .get_encoding_rules = _get_encoding_rules,
! 220: .get_header_length = _get_header_length,
! 221: .get_length = _get_length,
! 222: .get_next_type = _get_next_type,
! 223: .set_next_type = _set_next_type,
! 224: .get_type = _get_type,
! 225: .destroy = _destroy,
! 226: },
! 227: .get_traffic_selector = _get_traffic_selector,
! 228: .destroy = _destroy,
! 229: },
! 230: .payload_length = get_header_length(this),
! 231: /* must be set to be valid */
! 232: .ts_type = TS_IPV4_ADDR_RANGE,
! 233: );
! 234: return &this->public;
! 235: }
! 236:
! 237: /*
! 238: * Described in header
! 239: */
! 240: traffic_selector_substructure_t *traffic_selector_substructure_create_from_traffic_selector(
! 241: traffic_selector_t *ts)
! 242: {
! 243: private_traffic_selector_substructure_t *this;
! 244:
! 245: this = (private_traffic_selector_substructure_t*)traffic_selector_substructure_create();
! 246: this->ts_type = ts->get_type(ts);
! 247: this->ip_protocol_id = ts->get_protocol(ts);
! 248: this->start_port = ts->get_from_port(ts);
! 249: this->end_port = ts->get_to_port(ts);
! 250: this->starting_address = chunk_clone(ts->get_from_address(ts));
! 251: this->ending_address = chunk_clone(ts->get_to_address(ts));
! 252: this->payload_length = get_header_length(this) +
! 253: this->ending_address.len + this->starting_address.len;
! 254:
! 255: return &this->public;
! 256: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>