Annotation of embedaddon/strongswan/src/conftest/hooks/set_reserved.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2010 Martin Willi
                      3:  * Copyright (C) 2010 revosec AG
                      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 "hook.h"
                     17: 
                     18: #include <encoding/payloads/sa_payload.h>
                     19: 
                     20: typedef struct private_set_reserved_t private_set_reserved_t;
                     21: 
                     22: /**
                     23:  * Private data of an set_reserved_t object.
                     24:  */
                     25: struct private_set_reserved_t {
                     26: 
                     27:        /**
                     28:         * Implements the hook_t interface.
                     29:         */
                     30:        hook_t hook;
                     31: 
                     32:        /**
                     33:         * Alter requests or responses?
                     34:         */
                     35:        bool req;
                     36: 
                     37:        /**
                     38:         * ID of message to alter.
                     39:         */
                     40:        int id;
                     41: 
                     42:        /**
                     43:         * Hook name
                     44:         */
                     45:        char *name;
                     46: };
                     47: 
                     48: /**
                     49:  * Set reserved bit of a payload
                     50:  */
                     51: static void set_bit(private_set_reserved_t *this, message_t *message,
                     52:                                        payload_type_t type, u_int nr)
                     53: {
                     54:        enumerator_t *payloads;
                     55:        payload_t *payload;
                     56:        bool *bit;
                     57: 
                     58:        if (type == PL_HEADER)
                     59:        {
                     60:                message->set_reserved_header_bit(message, nr);
                     61:                DBG1(DBG_CFG, "setting reserved bit %d of %N",
                     62:                          nr, payload_type_short_names, type);
                     63:        }
                     64:        else
                     65:        {
                     66:                payloads = message->create_payload_enumerator(message);
                     67:                while (payloads->enumerate(payloads, &payload))
                     68:                {
                     69:                        if (payload->get_type(payload) == type)
                     70:                        {
                     71:                                bit = payload_get_field(payload, RESERVED_BIT, nr);
                     72:                                if (bit)
                     73:                                {
                     74:                                        DBG1(DBG_CFG, "setting reserved bit %d of %N",
                     75:                                                 nr, payload_type_short_names, type);
                     76:                                        *bit = TRUE;
                     77:                                }
                     78:                        }
                     79:                }
                     80:                payloads->destroy(payloads);
                     81:        }
                     82: }
                     83: 
                     84: /**
                     85:  * Set reserved byte of a payload
                     86:  */
                     87: static void set_byte(private_set_reserved_t *this, message_t *message,
                     88:                                        payload_type_t type, u_int nr, uint8_t byteval)
                     89: {
                     90:        enumerator_t *payloads;
                     91:        payload_t *payload;
                     92:        uint8_t *byte;
                     93: 
                     94:        if (type == PLV2_TRANSFORM_SUBSTRUCTURE || type == PLV2_PROPOSAL_SUBSTRUCTURE)
                     95:        {
                     96:                enumerator_t *transforms, *proposals;
                     97:                transform_substructure_t *transform;
                     98:                proposal_substructure_t *proposal;
                     99:                sa_payload_t *sa;
                    100: 
                    101:                payloads = message->create_payload_enumerator(message);
                    102:                while (payloads->enumerate(payloads, &payload))
                    103:                {
                    104:                        if (payload->get_type(payload) == PLV2_SECURITY_ASSOCIATION)
                    105:                        {
                    106:                                sa = (sa_payload_t*)payload;
                    107:                                proposals = sa->create_substructure_enumerator(sa);
                    108:                                while (proposals->enumerate(proposals, &proposal))
                    109:                                {
                    110:                                        if (type == PLV2_PROPOSAL_SUBSTRUCTURE)
                    111:                                        {
                    112:                                                byte = payload_get_field(&proposal->payload_interface,
                    113:                                                                                                 RESERVED_BYTE, nr);
                    114:                                                if (byte)
                    115:                                                {
                    116:                                                        DBG1(DBG_CFG, "setting reserved byte %d of %N to %d",
                    117:                                                                 nr, payload_type_short_names, type, byteval);
                    118:                                                        *byte = byteval;
                    119:                                                }
                    120:                                        }
                    121:                                        else if (type == PLV2_TRANSFORM_SUBSTRUCTURE)
                    122:                                        {
                    123:                                                transforms = proposal->create_substructure_enumerator(
                    124:                                                                                                                                        proposal);
                    125:                                                while (transforms->enumerate(transforms, &transform))
                    126:                                                {
                    127:                                                        byte = payload_get_field(&transform->payload_interface,
                    128:                                                                                                         RESERVED_BYTE, nr);
                    129:                                                        if (byte)
                    130:                                                        {
                    131:                                                                DBG1(DBG_CFG, "setting reserved byte %d of %N to %d",
                    132:                                                                         nr, payload_type_short_names, type, byteval);
                    133:                                                                *byte = byteval;
                    134:                                                        }
                    135:                                                }
                    136:                                                transforms->destroy(transforms);
                    137:                                        }
                    138:                                }
                    139:                                proposals->destroy(proposals);
                    140:                        }
                    141:                }
                    142:                payloads->destroy(payloads);
                    143:        }
                    144:        else
                    145:        {
                    146:                payloads = message->create_payload_enumerator(message);
                    147:                while (payloads->enumerate(payloads, &payload))
                    148:                {
                    149:                        if (payload->get_type(payload) == type)
                    150:                        {
                    151:                                byte = payload_get_field(payload, RESERVED_BYTE, nr);
                    152:                                if (byte)
                    153:                                {
                    154:                                        DBG1(DBG_CFG, "setting reserved byte %d of %N to %d",
                    155:                                                  nr, payload_type_short_names, type, byteval);
                    156:                                        *byte = byteval;
                    157:                                }
                    158:                        }
                    159:                }
                    160:                payloads->destroy(payloads);
                    161:        }
                    162: }
                    163: 
                    164: METHOD(listener_t, message, bool,
                    165:        private_set_reserved_t *this, ike_sa_t *ike_sa, message_t *message,
                    166:        bool incoming, bool plain)
                    167: {
                    168:        if (!incoming && plain &&
                    169:                message->get_request(message) == this->req &&
                    170:                message->get_message_id(message) == this->id)
                    171:        {
                    172:                enumerator_t *bits, *bytes, *types;
                    173:                payload_type_t type;
                    174:                char *nr, *name;
                    175:                uint8_t byteval;
                    176: 
                    177:                types = conftest->test->create_section_enumerator(conftest->test,
                    178:                                                                                                        "hooks.%s", this->name);
                    179:                while (types->enumerate(types, &name))
                    180:                {
                    181:                        type = atoi(name);
                    182:                        if (!type)
                    183:                        {
                    184:                                if (!enum_from_name(payload_type_short_names, name, &type))
                    185:                                {
                    186:                                        DBG1(DBG_CFG, "invalid payload name '%s'", name);
                    187:                                        break;
                    188:                                }
                    189:                        }
                    190:                        nr = conftest->test->get_str(conftest->test,
                    191:                                                                "hooks.%s.%s.bits", "", this->name, name);
                    192:                        bits = enumerator_create_token(nr, ",", " ");
                    193:                        while (bits->enumerate(bits, &nr))
                    194:                        {
                    195:                                set_bit(this, message, type, atoi(nr));
                    196:                        }
                    197:                        bits->destroy(bits);
                    198: 
                    199:                        nr = conftest->test->get_str(conftest->test,
                    200:                                                                "hooks.%s.%s.bytes", "", this->name, name);
                    201:                        byteval = conftest->test->get_int(conftest->test,
                    202:                                                                "hooks.%s.%s.byteval", 255, this->name, name);
                    203:                        bytes = enumerator_create_token(nr, ",", " ");
                    204:                        while (bytes->enumerate(bytes, &nr))
                    205:                        {
                    206:                                set_byte(this, message, type, atoi(nr), byteval);
                    207:                        }
                    208:                        bytes->destroy(bytes);
                    209:                }
                    210:                types->destroy(types);
                    211:        }
                    212:        return TRUE;
                    213: }
                    214: 
                    215: METHOD(hook_t, destroy, void,
                    216:        private_set_reserved_t *this)
                    217: {
                    218:        free(this->name);
                    219:        free(this);
                    220: }
                    221: 
                    222: /**
                    223:  * Create the IKE_AUTH fill hook
                    224:  */
                    225: hook_t *set_reserved_hook_create(char *name)
                    226: {
                    227:        private_set_reserved_t *this;
                    228: 
                    229:        INIT(this,
                    230:                .hook = {
                    231:                        .listener = {
                    232:                                .message = _message,
                    233:                        },
                    234:                        .destroy = _destroy,
                    235:                },
                    236:                .req = conftest->test->get_bool(conftest->test,
                    237:                                                                                "hooks.%s.request", TRUE, name),
                    238:                .id = conftest->test->get_int(conftest->test,
                    239:                                                                                "hooks.%s.id", 0, name),
                    240:                .name = strdup(name),
                    241:        );
                    242: 
                    243:        return &this->hook;
                    244: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>