Annotation of embedaddon/strongswan/src/libcharon/encoding/payloads/unknown_payload.c, revision 1.1.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>