Annotation of embedaddon/strongswan/src/libcharon/encoding/payloads/unknown_payload.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2015 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 <stddef.h>
! 19:
! 20: #include "unknown_payload.h"
! 21:
! 22: typedef struct private_unknown_payload_t private_unknown_payload_t;
! 23:
! 24: /**
! 25: * Private data of an unknown_payload_t object.
! 26: */
! 27: struct private_unknown_payload_t {
! 28:
! 29: /**
! 30: * Public unknown_payload_t interface.
! 31: */
! 32: unknown_payload_t public;
! 33:
! 34: /**
! 35: * Type of this payload
! 36: */
! 37: payload_type_t type;
! 38:
! 39: /**
! 40: * Next payload type.
! 41: */
! 42: uint8_t next_payload;
! 43:
! 44: /**
! 45: * Critical flag.
! 46: */
! 47: bool critical;
! 48:
! 49: /**
! 50: * Reserved bits
! 51: */
! 52: bool reserved[7];
! 53:
! 54: /**
! 55: * Length of this payload.
! 56: */
! 57: uint16_t payload_length;
! 58:
! 59: /**
! 60: * The contained data.
! 61: */
! 62: chunk_t data;
! 63: };
! 64:
! 65: /**
! 66: * Encoding rules to parse an payload which is not further specified.
! 67: *
! 68: * The defined offsets are the positions in a object of type
! 69: * private_unknown_payload_t.
! 70: *
! 71: */
! 72: static encoding_rule_t encodings[] = {
! 73: /* 1 Byte next payload type, stored in the field next_payload */
! 74: { U_INT_8, offsetof(private_unknown_payload_t, next_payload) },
! 75: /* the critical bit */
! 76: { FLAG, offsetof(private_unknown_payload_t, critical) },
! 77: /* 7 Bit reserved bits */
! 78: { RESERVED_BIT, offsetof(private_unknown_payload_t, reserved[0]) },
! 79: { RESERVED_BIT, offsetof(private_unknown_payload_t, reserved[1]) },
! 80: { RESERVED_BIT, offsetof(private_unknown_payload_t, reserved[2]) },
! 81: { RESERVED_BIT, offsetof(private_unknown_payload_t, reserved[3]) },
! 82: { RESERVED_BIT, offsetof(private_unknown_payload_t, reserved[4]) },
! 83: { RESERVED_BIT, offsetof(private_unknown_payload_t, reserved[5]) },
! 84: { RESERVED_BIT, offsetof(private_unknown_payload_t, reserved[6]) },
! 85: /* Length of the whole payload*/
! 86: { PAYLOAD_LENGTH, offsetof(private_unknown_payload_t, payload_length) },
! 87: /* some unknown data bytes, length is defined in PAYLOAD_LENGTH */
! 88: { CHUNK_DATA, offsetof(private_unknown_payload_t, data) },
! 89: };
! 90:
! 91: /*
! 92: 1 2 3
! 93: 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
! 94: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 95: ! Next Payload !C! RESERVED ! Payload Length !
! 96: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 97: ! !
! 98: ~ Data of any type ~
! 99: ! !
! 100: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 101: */
! 102:
! 103: METHOD(payload_t, verify, status_t,
! 104: private_unknown_payload_t *this)
! 105: {
! 106: return SUCCESS;
! 107: }
! 108:
! 109: METHOD(payload_t, get_encoding_rules, int,
! 110: private_unknown_payload_t *this, encoding_rule_t **rules)
! 111: {
! 112: *rules = encodings;
! 113: return countof(encodings);
! 114: }
! 115:
! 116: METHOD(payload_t, get_header_length, int,
! 117: private_unknown_payload_t *this)
! 118: {
! 119: return 4;
! 120: }
! 121:
! 122: METHOD(payload_t, get_payload_type, payload_type_t,
! 123: private_unknown_payload_t *this)
! 124: {
! 125: return PL_UNKNOWN;
! 126: }
! 127:
! 128: METHOD(unknown_payload_t, get_type, payload_type_t,
! 129: private_unknown_payload_t *this)
! 130: {
! 131: return this->type;
! 132: }
! 133:
! 134: METHOD(payload_t, get_next_type, payload_type_t,
! 135: private_unknown_payload_t *this)
! 136: {
! 137: return this->next_payload;
! 138: }
! 139:
! 140: METHOD(payload_t, set_next_type, void,
! 141: private_unknown_payload_t *this,payload_type_t type)
! 142: {
! 143: this->next_payload = type;
! 144: }
! 145:
! 146: METHOD(payload_t, get_length, size_t,
! 147: private_unknown_payload_t *this)
! 148: {
! 149: return this->payload_length;
! 150: }
! 151:
! 152: METHOD(unknown_payload_t, is_critical, bool,
! 153: private_unknown_payload_t *this)
! 154: {
! 155: return this->critical;
! 156: }
! 157:
! 158: METHOD(unknown_payload_t, get_data, chunk_t,
! 159: private_unknown_payload_t *this)
! 160: {
! 161: return this->data;
! 162: }
! 163:
! 164: METHOD2(payload_t, unknown_payload_t, destroy, void,
! 165: private_unknown_payload_t *this)
! 166: {
! 167: free(this->data.ptr);
! 168: free(this);
! 169: }
! 170:
! 171: /*
! 172: * Described in header
! 173: */
! 174: unknown_payload_t *unknown_payload_create(payload_type_t type)
! 175: {
! 176: private_unknown_payload_t *this;
! 177:
! 178: INIT(this,
! 179: .public = {
! 180: .payload_interface = {
! 181: .verify = _verify,
! 182: .get_encoding_rules = _get_encoding_rules,
! 183: .get_header_length = _get_header_length,
! 184: .get_length = _get_length,
! 185: .get_next_type = _get_next_type,
! 186: .set_next_type = _set_next_type,
! 187: .get_type = _get_payload_type,
! 188: .destroy = _destroy,
! 189: },
! 190: .is_critical = _is_critical,
! 191: .get_type = _get_type,
! 192: .get_data = _get_data,
! 193: .destroy = _destroy,
! 194: },
! 195: .next_payload = PL_NONE,
! 196: .payload_length = get_header_length(this),
! 197: .type = type,
! 198: );
! 199:
! 200: return &this->public;
! 201: }
! 202:
! 203:
! 204: /*
! 205: * Described in header
! 206: */
! 207: unknown_payload_t *unknown_payload_create_data(payload_type_t type,
! 208: bool critical, chunk_t data)
! 209: {
! 210: private_unknown_payload_t *this;
! 211:
! 212: this = (private_unknown_payload_t*)unknown_payload_create(type);
! 213: this->data = data;
! 214: this->critical = critical;
! 215: this->payload_length = get_header_length(this) + data.len;
! 216:
! 217: return &this->public;
! 218: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>