File novell-ipsec-tools_plugins-support-core.patch of Package novell-ipsec-tools
Index: ipsec-tools-0.7.3/src/plugin_frame/common.h
===================================================================
--- /dev/null
+++ ipsec-tools-0.7.3/src/plugin_frame/common.h
@@ -0,0 +1,160 @@
+
+/************************************************************************************
+* Copyright (c) 2005, Novell Inc., *
+* All rights reserved. *
+* *
+* Redistribution and use in source and binary forms, with or without *
+* modification, are permitted provided that the following conditions *
+* are met: *
+* 1. Redistributions of source code must retain the above copyright *
+* notice, this list of conditions and the following disclaimer. *
+* 2. Redistributions in binary form must reproduce the above copyright *
+* notice, this list of conditions and the following disclaimer in the *
+* documentation and/or other materials provided with the distribution. *
+* 3. Neither the name of the Novell nor the names of its contributors *
+* may be used to endorse or promote products derived from this software *
+* without specific prior written permission. *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *
+* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE *
+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS *
+* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) *
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY *
+* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF *
+* SUCH DAMAGE. *
+*************************************************************************************/
+
+#ifndef __TPIKE_COMMON_H__
+#define __TPIKE_COMMON_H__
+
+/****************NOTES ************************
+1. Multiple plugins will be stored in the struct pluginlist with priority.
+2. A Global priv data for each plugin (in addition to the hook point specific priv data) that will be opaque to framework.
+3. Register Handler returns ALREADYREGISTERED if someother plugins has registered.
+4. Before registering the plugin should check for dependencies with other plugins using isPluginRegisterted,
+*************************************************/
+
+#include <sys/types.h>
+
+/* Defines */
+
+/* DataTypes */
+#define TPIKE_DTYPE_STRUCTISAKMPGEN 0x0001
+#define TPIKE_DTYPE_STRUCTISAKMPDATA 0x0002
+#define TPIKE_DTYPE_STRUCTVCHAR 0x0004
+#define TPIKE_DTYPE_STRUCTPAYLOADLIST 0x0008
+#define TPIKE_DTYPE_INT32PT 0x0010
+#define TPIKE_DTYPE_STRUCTIPH1 0x0020
+#define TPIKE_DTYPE_STRUCTNATTOPTIONS 0x0040
+
+//Payload types
+#define PRIVATE_NATTVID_PAYLOAD_TYPE 0x0001
+#define PRIVATE_VID_PAYLOAD_TYPE 0x0002
+
+//#define STRUCTIPH1 0x0010
+//#define STRUCTIPH2 0x0020
+//#define STRUCTCADDRT 0x0040
+
+/* Types */
+#define PAYLOAD_TYPE 0x01
+#define ATTRIBUTE_TYPE 0x02
+#define NATT_OPTIONS_TYPE 0x03
+
+#define IS_REKEYREQ_TYPE 0x04
+#define IS_PLECHECK_TYPE 0x05
+
+#define PFKEY_MSG_TYPE 0x06
+#define IKE_NEGO_STATE_TYPE 0x07
+
+
+/* Attribute types */
+#define IKE_ATTRIB_TYPE 0x01
+#define CONFIG_ATTRIB_TYPE 0x02
+#define IPSEC_ATTRIB_TYPE 0x03
+#define ISAKMP_ATTRIB_TYPE 0x04
+#define CONFIG_ATTRIB_ACK_TYPE 0x05
+
+#if 0
+/* Attribute types */
+#define IKEATTR_TYPE 0x01
+#define CFGATTR_TYPE 0x02
+#endif
+
+/* Data Structures */
+
+/*TV */
+typedef struct tv
+{
+ int type;
+ void *val;
+}TV;
+
+struct tvarr {
+ int noofvals;
+ struct tv tv[1];
+};
+
+/* Updated Hookpoint */
+struct hookpoint {
+ u_int8_t type;
+ u_int8_t payloadtype; /*If type==payload => payload type as defined, else 0 */
+ u_int8_t subtype; /* Config attr => SET/ACK/REQ/REP/PrivType. Payload => SubType */
+ u_int32_t position; /* ijk */
+ u_int8_t isoptional;
+ /*Identifying the payload/ike attr type */
+ u_int32_t keylen;
+ void *key; /*Payload =>, attribute etc. */
+};
+
+/* Updated Handler Info */
+struct handlerinfo {
+ char *plugin_name;
+ void *hprivdata; /*Plug-in's priv data */
+ u_int32_t datatypein; /* Flag logical OR of IN DataTypes defiend above */
+ u_int32_t datatypeout; /* Flag logical OR of OUT DataTypes defiend above */
+ int (*callback)(void *, void *, void *, void **); /* Prototype will be int func(void *gprivdata, void *hprivdata, void *INARRAY, void **OUTARRAY); */
+};
+
+typedef int (*plugin_init)(void *gprivdata, void *hprivdata,
+ void *inarray, void **outarray);
+typedef int (*plugin_getdata)(int inlen, char *inbuf,
+ int *outlen, char **outbuf);
+
+/* Consumed by plugin */
+u_int8_t tpike_is_plugin_registered(char *plugin_name);
+int tpike_register_handler(struct hookpoint *,
+ struct handlerinfo *);
+int tpike_deregister_handlers(char *plugin_name);
+
+/* Consumed by Racoon */
+int tpike_gethook_handlerinfo(struct hookpoint *hp,
+ int absolutepos, struct handlerinfo **hi,
+ int *incount, void **tv);
+int tpike_dispatch_generic(struct hookpoint *hp, void *in, void **out);
+int tpike_pack_in(void **inarr, u_int32_t noofparams, ...);
+int tpike_pack_out(void *outarr, u_int32_t noofparams, ...);
+
+/* Consumed by adminport */
+int tpike_register_plugin(short ver, const char *pluginso, char *pluginname, void *cp);
+int tpike_plugin_getdata(short ver, char *pluginname, int inlen, char *inbuf,
+ int *outlen, char **outbuf);
+int tpike_deregister_plugin_all();
+
+
+/* Helper macro to make the 'hookpoint'. Consumed by racoon alone. */
+#define mk_hookpoint(typ, pratype, prasubtype, pos, optional, klen, keyval, hp) \
+ { \
+ hp->type = (typ); hp->payloadtype = (pratype); hp->subtype = (prasubtype); hp->position = (pos); \
+ hp->keylen = (klen); \
+ if (hp->keylen == 0) \
+ hp->key = 0; \
+ else { \
+ hp->key = vmalloc(hp->keylen); \
+ if (hp->key && (keyval)) memcpy(hp->key, (keyval), (klen)); else hp->keylen = 0; \
+ }\
+ }
+
+#endif
Index: ipsec-tools-0.7.3/src/plugin_frame/dispatch.c
===================================================================
--- /dev/null
+++ ipsec-tools-0.7.3/src/plugin_frame/dispatch.c
@@ -0,0 +1,140 @@
+
+/************************************************************************************
+* Copyright (c) 2005, Novell Inc., *
+* All rights reserved. *
+* *
+* Redistribution and use in source and binary forms, with or without *
+* modification, are permitted provided that the following conditions *
+* are met: *
+* 1. Redistributions of source code must retain the above copyright *
+* notice, this list of conditions and the following disclaimer. *
+* 2. Redistributions in binary form must reproduce the above copyright *
+* notice, this list of conditions and the following disclaimer in the *
+* documentation and/or other materials provided with the distribution. *
+* 3. Neither the name of the Novell nor the names of its contributors *
+* may be used to endorse or promote products derived from this software *
+* without specific prior written permission. *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *
+* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE *
+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS *
+* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) *
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY *
+* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF *
+* SUCH DAMAGE. *
+*************************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include "common.h"
+#include "framework.h"
+#include "error.h"
+#include "hashtable.h"
+
+int get_hook_handler_info(struct hookpoint *hp, int absolutepos, struct handlerinfo **hi, int *incount, void **tv)
+{
+ int status = TPIKE_ERR_HASH_MATCH_NOT_FOUND;
+
+ status = get_handler_match_in_hash_bucket(hp, hi);
+
+ // *incount = getType((*hi)->DataTypeToBeSent, tv); //return value?
+
+ return status;
+}
+
+#if 0
+int getType (u_int32_t dataTypeMask, TV *tvl)
+{
+ int i = 0;
+ u_int32_t j = 1;
+ while (j != 0x80000000 ){
+ if ( dataTypeMask & j )
+ {
+ tvl[i].t = j;
+ tvl[i].v = NULL;
+ i++;
+ }
+ j<<=1;
+ }
+ return i;
+}
+#endif
+
+int tpike_dispatch_generic(struct hookpoint *hp, void *in, void **out)
+{
+ struct handlerinfo *hi;
+ int status;
+ struct plugininfo *plugin;
+
+ if ((status = get_handler_match_in_hash_bucket(hp, &hi)) == TPIKE_STATUS_SUCCESS) {
+ // TODO: Validate that the minimum input arguments are present
+ // TODO: Validate that the output arguments are sufficient
+ if (hi->callback) {
+ // Obtain gpriv data
+ plugin = get_plugin_info(hi->plugin_name);
+
+ if(!plugin)
+ return TPIKE_ERR_PLUGIN_NOT_REGISTERED;
+
+ status = (*(hi->callback))(plugin->gprivdata, hi->hprivdata, in, out);
+ return status;
+ }
+ else
+ return TPIKE_ERR_HASH_MATCH_NOT_FOUND;
+ }
+ return status;
+}
+
+int tpike_pack_in(void **inarr, u_int32_t noofparams, ...)
+{
+ int i;
+ struct tvarr *in;
+ va_list(ap);
+
+ if (noofparams == 0) /* no parameters to pass, send NULL */
+ return TPIKE_STATUS_SUCCESS;
+
+ va_start(ap, noofparams);
+ if (((*inarr) = malloc(sizeof(struct tvarr) + (noofparams - 1) * (sizeof(struct tv)))) == NULL)
+ return TPIKE_ERR_MEM_ALLOC_FAILED;
+ in = (*inarr);
+
+ in->noofvals = noofparams;
+ for (i = 0; i < noofparams; i++)
+ {
+ in->tv[i].type = va_arg(ap, int);
+ in->tv[i].val = va_arg(ap, void *);
+ }
+ return TPIKE_STATUS_SUCCESS;
+}
+
+int tpike_pack_out(void *outarr, u_int32_t noofparams, ...)
+{
+ int i, j;
+ int type, found = 0;
+ struct tvarr *out = (struct tvarr *)(outarr);
+ va_list(ap);
+
+ va_start(ap, noofparams);
+ for (i = 0; i < noofparams; i++)
+ {
+ type = va_arg(ap, int);
+ found = 0;
+ for (j = 0; j < out->noofvals; j++)
+ {
+ if (type == out->tv[i].type)
+ {
+ *(va_arg(ap, void **)) = out->tv[i].val;
+ found = 1;
+ break;
+ }
+ if (!found)
+ return TPIKE_ERR_PLUGIN_ARG_MISMATCH;
+ }
+ }
+ return TPIKE_STATUS_SUCCESS;
+}
Index: ipsec-tools-0.7.3/src/plugin_frame/error.h
===================================================================
--- /dev/null
+++ ipsec-tools-0.7.3/src/plugin_frame/error.h
@@ -0,0 +1,53 @@
+
+/************************************************************************************
+* Copyright (c) 2005, Novell Inc., *
+* All rights reserved. *
+* *
+* Redistribution and use in source and binary forms, with or without *
+* modification, are permitted provided that the following conditions *
+* are met: *
+* 1. Redistributions of source code must retain the above copyright *
+* notice, this list of conditions and the following disclaimer. *
+* 2. Redistributions in binary form must reproduce the above copyright *
+* notice, this list of conditions and the following disclaimer in the *
+* documentation and/or other materials provided with the distribution. *
+* 3. Neither the name of the Novell nor the names of its contributors *
+* may be used to endorse or promote products derived from this software *
+* without specific prior written permission. *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *
+* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE *
+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS *
+* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) *
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY *
+* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF *
+* SUCH DAMAGE. *
+*************************************************************************************/
+
+#ifndef _PLUGIN_ERROR_H
+#define _PLUGIN_ERROR_H
+
+#define TPIKE_STATUS_SUCCESS 0x00000000
+#define PLUGIN_FRAME_STATUS_SUCCESS 0x00000000
+
+/* Framework errors start at 0xFFFFFFFF (-1) */
+#define TPIKE_ERR_HASH_TABLE_OVERFLOW 0xFFFFFFFF
+#define TPIKE_ERR_MEM_ALLOC_FAILED 0xFFFFFFFE
+#define TPIKE_ERR_PLUGIN_NOT_REGISTERED 0xFFFFFFFD
+#define TPIKE_ERR_HOOK_ALREADY_REGISTERED 0xFFFFFFFC
+#define TPIKE_ERR_PLUGIN_REGISTRATION_FAILURE 0xFFFFFFFB
+#define TPIKE_ERR_SYM_LOAD_FAILURE 0xFFFFFFFA
+#define TPIKE_ERR_HASH_MATCH_NOT_FOUND 0xFFFFFFF9
+#define TPIKE_ERR_SO_LOAD_FAILURE 0xFFFFFFF8
+#define TPIKE_ERR_PLUGIN_ARG_MISMATCH 0xFFFFFFF9
+
+/* Generic plugin errors start at 0xFFFFFF00 (-255) */
+#define TPIKE_ERR_PLUGIN_GENERIC 0xFFFFFF00
+#define TPIKE_ERR_PLUGIN_MEM_ALLOC_FAILED 0xFFFFFE00
+
+#define TPIKE_OK(x) ((x) == TPIKE_STATUS_SUCCESS)
+
+#endif /* _PLUGIN_ERROR_H */
Index: ipsec-tools-0.7.3/src/plugin_frame/framework.h
===================================================================
--- /dev/null
+++ ipsec-tools-0.7.3/src/plugin_frame/framework.h
@@ -0,0 +1,87 @@
+
+/************************************************************************************
+* Copyright (c) 2005, Novell Inc., *
+* All rights reserved. *
+* *
+* Redistribution and use in source and binary forms, with or without *
+* modification, are permitted provided that the following conditions *
+* are met: *
+* 1. Redistributions of source code must retain the above copyright *
+* notice, this list of conditions and the following disclaimer. *
+* 2. Redistributions in binary form must reproduce the above copyright *
+* notice, this list of conditions and the following disclaimer in the *
+* documentation and/or other materials provided with the distribution. *
+* 3. Neither the name of the Novell nor the names of its contributors *
+* may be used to endorse or promote products derived from this software *
+* without specific prior written permission. *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *
+* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE *
+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS *
+* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) *
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY *
+* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF *
+* SUCH DAMAGE. *
+*************************************************************************************/
+
+#ifndef __TPIKE_FRAMEWORK__
+#define __TPIKE_FRAMEWORK__
+
+/****************NOTES ************************
+1. Multiple plugins will be stored in the struct pluginlist with priority.
+2. A Global priv data for each plugin (in addition to the hook point specific priv data) that will be opaque to framework.
+3. Register Handler returns ALREADYREGISTERED if someother plugins has registered.
+4. Before registering the plugin should check for dependencies with other plugins using isPluginRegisterted,
+*************************************************/
+
+#include <sys/types.h>
+#include <stdlib.h>
+
+/* Defines */
+
+#if 0
+/* Types */
+#define PAYLOAD_TYPE 0x01
+#define ATTRIBUTE_TYPE 0x02
+
+/* Attribute types */
+#define IKE_ATTRIB_TYPE 0x01
+#define CONFIG_ATTRIB_TYPE 0x02
+#endif
+
+typedef int (tpike_plugin_init_func_t)(short ver, void *cp, void **privdata);
+typedef int (tpike_plugin_getdata_func_t)(short version, void *gpdata, int inlen, char *inbuf, int *outlen, char **outbuf);
+typedef int (tpike_plugin_deregister_func_t)(void *privdata);
+/* Data Structures */
+
+/* Structure handling multiple plugins */
+struct plugininfo {
+ char *plugin_name; /* Got thru' adminport */
+ void *gprivdata; /* Global (common to whole plugin) priv data */
+ void *so_handle;
+
+ tpike_plugin_init_func_t *init_fn;
+ tpike_plugin_getdata_func_t *getdata_fn;
+ tpike_plugin_deregister_func_t *deregister_fn;
+
+ struct plugininfo *next;
+};
+
+
+
+/* Functions to be implemented by Framework for framework only!*/
+struct plugininfo *get_plugin_info(char *plugin_name);
+
+
+/*Updated Register Handler */
+
+/*Consumed by plugin */
+struct plugininfo *get_registered_plugin(char *);
+struct plugininfo *add_plugin_to_list(char *);
+void remove_plugin_from_list(char *);
+void free_plugin_info_all(struct plugininfo *);
+
+#endif
Index: ipsec-tools-0.7.3/src/plugin_frame/hashtable.c
===================================================================
--- /dev/null
+++ ipsec-tools-0.7.3/src/plugin_frame/hashtable.c
@@ -0,0 +1,384 @@
+
+/************************************************************************************
+ * Copyright (c) 2005, Novell Inc., *
+ * All rights reserved. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * 2. Redistributions in binary form must reproduce the above copyright *
+ * notice, this list of conditions and the following disclaimer in the *
+ * documentation and/or other materials provided with the distribution. *
+ * 3. Neither the name of the Novell nor the names of its contributors *
+ * may be used to endorse or promote products derived from this software *
+ * without specific prior written permission. *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE *
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS *
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) *
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY *
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF *
+ * SUCH DAMAGE. *
+ *************************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <malloc.h>
+#include <sys/types.h>
+
+#include "config.h"
+#include "misc.h"
+
+#include "position.h"
+#include "hashtable.h"
+#include "common.h"
+#include "framework.h"
+#include "error.h"
+
+static int get_hash_index(struct hookpoint *hp);
+
+void init_hash_table()
+{
+ int i;
+
+ for(i = 0; i < MAX_TURN_HASH_SIZE; i++)
+ turnhash[i] = NULL;
+}
+
+void clear_hash_table()
+{
+ int i;
+ struct hookdata *hd, *temp = NULL;
+
+ for(i = 0; i < MAX_TURN_HASH_SIZE; i++)
+ {
+ for(hd = turnhash[i]; hd; hd = temp)
+ {
+ if(hd->hi)
+ free(hd->hi);
+ if(hd->hp)
+ {
+ if(hd->hp->keylen)
+ free(hd->hp->key);
+ free(hd->hp);
+ }
+ temp = hd->next;
+ free(hd);
+ }
+ turnhash[i] = NULL;
+ }
+}
+
+int dump_hash(void)
+{
+ int i;
+ struct hookdata *hd;
+ struct hookpoint *hp;
+ for (i = 0; i < MAX_TURN_HASH_SIZE; i++)
+ {
+ if (!(hd = turnhash[i]))
+ continue;
+#if 0
+ plog(LLV_DEBUG2, LOCATION, NULL, "Hash Bucket: %d\n", i);
+#else
+ printf("Hash Bucket: %d\n", i);
+#endif
+
+ while (hd)
+ {
+ hp = hd->hp;
+#if 0
+ plog(LLV_DEBUG2, LOCATION, NULL, "\n--------- Entry Info ---------\n");
+#else
+ printf("\n--------- Entry Info ---------\n");
+#endif
+ printf( "type = 0x%x, payloadtype = 0x%x, AttrOrPayloadSubtype = 0x%x, \
+ Exchange = 0x%x, Message Index = 0x%x, Payload1 = 0x%x, Payload2 = 0x%x, \
+ Keylen = 0x%x callback:%p\n",
+ (unsigned int) hp->type,
+ (unsigned int) hp->payloadtype,
+ (unsigned int) hp->subtype,
+ GET_EXCH(hp->position),
+ GET_MIDX(hp->position),
+ GET_PAYLOAD_1(hp->position),
+ GET_PAYLOAD_2(hp->position),
+ hp->keylen,
+ hd->hi->callback);
+ hd = hd->next;
+ }
+ }
+ return 0;
+}
+
+static int get_hash_index(struct hookpoint *hp)
+{
+ u_int32_t hash_index = 0, temp = 0;
+ size_t i;
+
+ // For incoming paths: Mode(i), Position(j), type, payloadtype, Key are used for hashing
+ // For outgoing paths: Mode(i), Position(j), type, payloadtype, AttrOrPayloadSubtype are used for hashing
+
+
+ if ((temp = GET_EXCH(hp->position)) != ISAKMP_ETYPE_ALL) {
+ hash_index |= SET_EXCH(temp);
+ }
+ if ((temp = GET_MIDX(hp->position)) != TPIKE_MIDX_ANY) {
+ hash_index |= SET_MIDX(temp);
+ }
+ if (hp->type == PAYLOAD_TYPE) {
+ hash_index ^= (hp->type ^ hp->payloadtype ^ hp->subtype);
+ }
+ else {
+ hash_index ^= (hp->type ^ hp->payloadtype ^ ((hp->payloadtype == CONFIG_ATTRIB_TYPE)?hp->subtype:0));
+ }
+ if (GET_MIDX(hp->position) & TPIKE_MIDX_RECEIVE) {
+ for (i = 0; (i + 3) <= hp->keylen; i+=sizeof(u_int32_t)) {
+ temp ^= (((char *)(hp->key))[i] << 24) |
+ (((char *)(hp->key))[i + 1] << 16) |
+ (((char *)(hp->key))[i + 2] << 8) |
+ (((char *)(hp->key))[i + 3]);
+ }
+ for (; i < hp->keylen; i++)
+ temp |= ((char *)(hp->key))[i];
+ }
+ hash_index ^= temp;
+ hash_index = hash_index % MAX_TURN_HASH_PRIME_SIZE;
+ return hash_index;
+}
+
+/* TODO -Ramu : As of now the only wild card handled is etype. Extend/Rewrite this to others also */
+static int get_handler_match_wild_card(struct hookpoint *hp, struct handlerinfo **hi )
+{
+ struct hookdata *hd;
+ u_int16_t hash_index = 0;
+ int status = TPIKE_ERR_HASH_MATCH_NOT_FOUND;
+ int etype = 0;
+ int is_all_phases_checked = 0;
+ *hi = NULL;
+
+ /*Logic: Considering only wild cards are etypes. For generic stuff this logic may be too narrow.
+ * 1. Determine whether the etype belongs to the class of phase1 or phase2.
+ * 2. Depending on 1 check either phase1 bucket or phase2 bucket.
+ * 3. If no match found in both these buckets check all phases bucket.
+ */
+ etype = GET_EXCH(hp->position);
+
+ if(etype == ISAKMP_ETYPE_IDENT || etype == ISAKMP_ETYPE_AGG || etype == ISAKMP_ETYPE_BASE || etype == ISAKMP_ETYPE_ALLPHASE1){
+ // etype = ISAKMP_ETYPE_ALLPHASE1;
+ hash_index = MAX_TURN_HASH_PRIME_SIZE;
+
+ }
+ else
+ if(etype == ISAKMP_ETYPE_QUICK || etype == ISAKMP_ETYPE_ALLPHASE2)
+ //etype = ISAKMP_ETYPE_ALLPHASE2;
+ hash_index = MAX_TURN_HASH_PRIME_SIZE + 1;
+ else //all phases
+ hash_index = MAX_TURN_HASH_PRIME_SIZE + 2;
+
+wildcardloop:
+
+ hd = turnhash[hash_index];
+
+ /* As of now i am scanning for REKEYREQ_TYPE alone. Extend this for all other types */
+ while(hd)
+ {
+ if(hd->hp && !memcmp(hd->hp, hp, sizeof(hd->hp->type) + sizeof(hd->hp->payloadtype) + sizeof(hd->hp->subtype) /*+ sizeof(u_int16_t)*/))
+ {
+ /* TODO: As this is always put into fixed buckets we need to check the position (and other variable params) also while matching. */
+ if (GET_MIDX (hp->position) == GET_MIDX(hd->hp->position) &&
+ hd->hi->callback){
+ (*hi) = hd->hi;
+ status = TPIKE_STATUS_SUCCESS;
+ break;
+ }
+ }
+ hd = hd->next;
+ }
+
+ if(status != TPIKE_STATUS_SUCCESS && is_all_phases_checked == 0 && hash_index != MAX_TURN_HASH_PRIME_SIZE + 2){
+ /* Check in ALL phases bucket */
+ hash_index = MAX_TURN_HASH_PRIME_SIZE + 2;
+ is_all_phases_checked = 1;
+ goto wildcardloop; //TODO: Remove this goto.
+
+ }
+ return status;
+}
+
+int get_handler_match_in_hash_bucket(struct hookpoint *hp, struct handlerinfo **hi )
+{
+ struct hookdata *hd;
+ u_int16_t hash_index = 0;
+ int status = TPIKE_ERR_HASH_MATCH_NOT_FOUND;
+
+ *hi = NULL;
+
+ //compute hash index
+ hash_index = get_hash_index(hp);
+ printf("Hash index in get_handler_match = %d\n",hash_index);
+ //sanity check
+ if(hash_index > MAX_TURN_HASH_SIZE - 1)
+ return TPIKE_ERR_HASH_TABLE_OVERFLOW;
+
+ hd = turnhash[hash_index];
+
+ while(hd)
+ {
+ /*
+ if(hd->hp && !memcmp(hd->hp, hp, sizeof(struct hookpoint) - sizeof(void *) -sizeof(hd->hp->keylen) - sizeof(hd->hp->isoptional) - sizeof(u_int16_t)))
+ */
+ if(hd->hp && !memcmp(hd->hp, hp, sizeof(hd->hp->type) + sizeof(hd->hp->payloadtype) + sizeof(hd->hp->subtype) /*+ sizeof(u_int16_t)*/))
+ {
+ if(hp->payloadtype == CONFIG_ATTRIB_TYPE && hp->subtype == 3 /* SET */){
+ if((hd->hp->keylen == hp->keylen) && (memcmp(hp->key, hd->hp->key, (size_t) hd->hp->keylen) == 0)){
+ if(hd->hi->callback){
+ (*hi) = hd->hi;
+ status = TPIKE_STATUS_SUCCESS;
+ break;
+ }
+
+ }
+ }
+ else{
+
+ if(hd->hi->callback){
+ (*hi) = hd->hi;
+ status = TPIKE_STATUS_SUCCESS;
+ break;
+ }
+ }
+ }
+ hd = hd->next;
+ }
+
+ if(status != TPIKE_STATUS_SUCCESS)
+ status = get_handler_match_wild_card(hp,hi);
+
+ return status;
+
+}
+
+u_int32_t insert_in_hash_bucket(struct hookpoint *hp, struct handlerinfo *hi, struct plugininfo *plugin)
+{
+ int hash_index = 0;
+ int status = TPIKE_STATUS_SUCCESS;
+ struct hookdata *hd = NULL;
+ struct handlerinfo *hi_already = NULL;
+
+ //compute hash index
+
+ /* TODO - Ramu: As of now handle wildcards by assigning one bucket for allphase1, one for allphase2 and one for allphases. Later change them to take other params also. */
+
+ switch(GET_EXCH(hp->position)){
+
+ case ISAKMP_ETYPE_ALLPHASE1:
+
+ hash_index = MAX_TURN_HASH_PRIME_SIZE;
+ break;
+
+ case ISAKMP_ETYPE_ALLPHASE2:
+
+ hash_index = MAX_TURN_HASH_PRIME_SIZE + 1;
+ break;
+
+ case ISAKMP_ETYPE_ALL:
+
+ hash_index = MAX_TURN_HASH_PRIME_SIZE + 2;
+ break;
+
+ default: /* Not a wild card case */
+ hash_index = get_hash_index(hp);
+ }
+
+
+ //sanity check
+ if(hash_index < 0 || hash_index > MAX_TURN_HASH_SIZE - 1)
+ {
+ status = TPIKE_ERR_HASH_TABLE_OVERFLOW;
+ goto end_func;
+ }
+#if 0
+ plog(LLV_DEBUG2, LOCATION, NULL, "Inserting in %d\n",hash_index);
+#else
+ printf("Inserting in %d\n",hash_index);
+#endif
+
+ /* FIX:
+ *
+ * 'hi' was used as second param which gets destroyed after
+ * the call to this function (becomes NULL as it is the first time
+ * insertion. So passing a temperory handlerinfo
+ * to check if it is already inserted
+ *
+ */
+
+ if(get_handler_match_in_hash_bucket(hp, &hi_already) == 0 )
+ {
+ status = TPIKE_ERR_HOOK_ALREADY_REGISTERED;
+ goto end_func;
+ }
+
+ if((hd = (struct hookdata *)malloc(sizeof(struct hookdata))) == NULL)
+ {
+ status = TPIKE_ERR_MEM_ALLOC_FAILED;
+ goto end_func;
+ }
+
+ hd->hi = (struct handlerinfo *)malloc(sizeof(struct handlerinfo));
+ if(hd->hi && hi )
+ memcpy(hd->hi, hi, sizeof(struct handlerinfo));//TODO: For hprivdata, we need the length of the data, so that we malloc and copy the priv data locally
+ else
+ {
+ status = TPIKE_ERR_MEM_ALLOC_FAILED;
+ goto end_func;
+ }
+
+ hd->hp = (struct hookpoint *)malloc(sizeof(struct hookpoint));
+ if(hd->hp && hp)
+ memcpy(hd->hp, hp, sizeof(struct hookpoint));//TODO: For KEY, we need the length of the data, so that we malloc and copy the priv data locally
+ else
+ {
+ status = TPIKE_ERR_MEM_ALLOC_FAILED;
+ goto end_func;
+ }
+ if(hd->hp->keylen){
+ // NOTE: KEY LEN IS COPIED IN PRV MEMCPY
+ hd->hp->key = malloc(hd->hp->keylen);
+ memcpy(hd->hp->key,hp->key,hd->hp->keylen);
+ }
+ hd->plugin = plugin; // back pointer to plugin
+
+ hd->next = turnhash[hash_index];
+
+ turnhash[hash_index] = hd;
+
+end_func:
+ if(status != TPIKE_STATUS_SUCCESS)
+ {
+ //cleanup all that we've malloced
+ if (hd)
+ {
+ if(hd->hi)
+ {
+ free(hd->hi);
+ hd->hi = NULL;
+ }
+ if(hd->hp)
+ {
+ free(hd->hp);
+ hd->hp = NULL;
+ }
+ if(hd)
+ {
+ free(hd);
+ }
+ }
+ }
+ return status;
+}
Index: ipsec-tools-0.7.3/src/plugin_frame/hashtable.h
===================================================================
--- /dev/null
+++ ipsec-tools-0.7.3/src/plugin_frame/hashtable.h
@@ -0,0 +1,57 @@
+
+/************************************************************************************
+* Copyright (c) 2005, Novell Inc., *
+* All rights reserved. *
+* *
+* Redistribution and use in source and binary forms, with or without *
+* modification, are permitted provided that the following conditions *
+* are met: *
+* 1. Redistributions of source code must retain the above copyright *
+* notice, this list of conditions and the following disclaimer. *
+* 2. Redistributions in binary form must reproduce the above copyright *
+* notice, this list of conditions and the following disclaimer in the *
+* documentation and/or other materials provided with the distribution. *
+* 3. Neither the name of the Novell nor the names of its contributors *
+* may be used to endorse or promote products derived from this software *
+* without specific prior written permission. *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *
+* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE *
+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS *
+* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) *
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY *
+* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF *
+* SUCH DAMAGE. *
+*************************************************************************************/
+
+#ifndef __TPIKE_HASHTABLE_H__
+#define __TPIKE_HASHTABLE_H__
+
+/*Hash Table for Hook Point Info*/
+#include <sys/types.h>
+
+#define MAX_TURN_HASH_PRIME_SIZE 553
+#define MAX_TURN_HASH_SIZE MAX_TURN_HASH_PRIME_SIZE + 3 /* bucket 553 for all phase1, bucket 554 for all phase 2 and bucket 555 for all phases */
+
+struct hookdata {
+ struct handlerinfo *hi;
+ struct hookpoint *hp;
+ struct plugininfo *plugin;
+ struct hookdata *next;
+};
+
+/* Global Hash Table */
+struct hookdata *turnhash[MAX_TURN_HASH_SIZE];
+
+/* Functions for the Hash Table */
+void init_hash_table();
+void clear_hash_table();
+u_int32_t insert_in_hash_bucket(struct hookpoint *, struct handlerinfo *, struct plugininfo *plugin);
+int get_handler_match_in_hash_bucket(struct hookpoint *, struct handlerinfo **);
+
+int dump_hash(void);
+
+#endif
Index: ipsec-tools-0.7.3/src/plugin_frame/position.h
===================================================================
--- /dev/null
+++ ipsec-tools-0.7.3/src/plugin_frame/position.h
@@ -0,0 +1,175 @@
+
+/************************************************************************************
+* Copyright (c) 2005, Novell Inc., *
+* All rights reserved. *
+* *
+* Redistribution and use in source and binary forms, with or without *
+* modification, are permitted provided that the following conditions *
+* are met: *
+* 1. Redistributions of source code must retain the above copyright *
+* notice, this list of conditions and the following disclaimer. *
+* 2. Redistributions in binary form must reproduce the above copyright *
+* notice, this list of conditions and the following disclaimer in the *
+* documentation and/or other materials provided with the distribution. *
+* 3. Neither the name of the Novell nor the names of its contributors *
+* may be used to endorse or promote products derived from this software *
+* without specific prior written permission. *
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *
+* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE *
+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS *
+* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) *
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY *
+* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF *
+* SUCH DAMAGE. *
+*************************************************************************************/
+
+/*
+The paylaod state will be defined as follows:
+
+u_int32_t payload_state = i|j|k1|k2
+
+i- 0ne byte
+j - One byte
+k1 -One byte
+k2 - One byte
+
+i- exchange type
+j- Message index
+k1- after payload
+k2- before payload
+*/
+
+/*'i' - exchange type is defined as in RFC as follows: u_int8_t*/
+
+#define ISAKMP_ETYPE_BASE 1 /* Base */
+#define ISAKMP_ETYPE_IDENT 2 /* Identity Proteciton */
+/*#define ISAKMP_ETYPE_AUTH 3*/ /* Authentication Only */
+#define ISAKMP_ETYPE_AGG 4 /* Aggressive */
+#define ISAKMP_ETYPE_INFO 5 /* Informational */
+#define ISAKMP_ETYPE_CFG 6 /* Mode config */
+#define ISAKMP_ETYPE_QUICK 32/* Quick Mode */
+#define ISAKMP_ETYPE_ALLPHASE1 0xfd
+#define ISAKMP_ETYPE_ALLPHASE2 0xfe
+#define ISAKMP_ETYPE_ALL 0xff
+
+/*'j' - Message Index - u_int8_t*/
+/*
+MSb:
+Initiator - 0
+Responsder - 1
+
+Next bit:
+Recv: 0
+Send: 1
+
+Next 6 bits:
+Message Index
+*/
+
+#define TPIKE_MIDX_INITIATOR 0x10
+#define TPIKE_MIDX_RESPONDER 0x20
+#define TPIKE_MIDX_RECEIVE 0x40
+#define TPIKE_MIDX_SEND 0x80
+#define TPIKE_MIDX_ANY 0x00
+
+#define TPIKE_MAX_MESSAGE 16
+
+#define ONE 1
+
+/*Initiator */
+
+#define INITIATOR_RECIEVE TPIKE_MIDX_INITIATOR|TPIKE_MIDX_RECEIVE
+#define INITIATOR_SEND TPIKE_MIDX_INITIATOR|TPIKE_MIDX_SEND
+
+/*Responder*/
+#define RESPONDER_RECEIVE TPIKE_MIDX_RESPONDER|TPIKE_MIDX_RECEIVE
+#define RESPONDER_SEND TPIKE_MIDX_RESPONDER|TPIKE_MIDX_SEND|(ONE)
+
+/*Initiator */
+
+#define INITIATOR_RECIEVE_ONE INITIATOR_RECIEVE|ONE
+#define INITIATOR_SEND_ONE INITIATOR_SEND|ONE
+
+#define INITIATOR_RECIEVE_TWO INITIATOR_RECIEVE|(ONE<<1)
+#define INITIATOR_SEND_TWO INITIATOR_SEND|(ONE<<1)
+
+#define INITIATOR_RCVD_THREE INITIATOR_RECIEVE|(ONE<<2)
+#define INITIATOR_SEND_THREE INITIATOR_SEND|(ONE<<2)
+
+/*Responder*/
+#define RESPONDER_RCVD_ONE RESPONDER_RECEIVE|(ONE)
+#define RESPONDER_SEND_ONE RESPONDER_SEND|(ONE)
+
+#define RESPONDER_RCVD_TWO RESPONDER_RECEIVE|(ONE<<1)
+#define RESPONDER_SEND_TWO RESPONDER_SEND|(ONE<<1)
+
+#define RESPONDER_RCVD_THREE RESPONDER_RECEIVE|(ONE<<2)
+#define RESPONDER_SEND_THREE RESPONDER_SEND|(ONE<<2)
+
+/*
+
+'k1' (is payload after) - u_int8_t
+'k2' (is payload before) - u_int8_t
+
+Wild card positions
+k1=k2=0 => First Payload in message
+k1=k2=0xff => Any, Last Payload in Message
+
+Relative position
+k1=0,k2=x => before payload x , where x- payload type defined below
+k1=x,k2=0 => after payload x , where x- payload type defined below
+k1=x,k2=y => after payload x and before payload y, where x,y - payload types defined below.
+
+Absolute position
+k1=k2=i => at absolute 'ith' payload. 1<=i<=0xfe
+
+*/
+
+#define ISAKMP_NPTYPE_SA 1 /* Security Association */
+#define ISAKMP_NPTYPE_P 2 /* Proposal */
+#define ISAKMP_NPTYPE_T 3 /* Transform */
+#define ISAKMP_NPTYPE_KE 4 /* Key Exchange */
+#define ISAKMP_NPTYPE_ID 5 /* Identification */
+#define ISAKMP_NPTYPE_CERT 6 /* Certificate */
+#define ISAKMP_NPTYPE_CR 7 /* Certificate Request */
+#define ISAKMP_NPTYPE_HASH 8 /* Hash */
+#define ISAKMP_NPTYPE_SIG 9 /* Signature */
+#define ISAKMP_NPTYPE_NONCE 10 /* Nonce */
+#define ISAKMP_NPTYPE_N 11 /* Notification */
+#define ISAKMP_NPTYPE_D 12 /* Delete */
+#define ISAKMP_NPTYPE_VID 13 /* Vendor ID */
+#define ISAKMP_NPTYPE_ATTR 14 /* Attribute */
+
+#define ISAKMP_NPTYPE_NATD_BADDRAFT 15 /* NAT Discovery */
+#define ISAKMP_NPTYPE_NATOA_BADDRAFT 16 /* NAT Original Address */
+
+#define ISAKMP_NPTYPE_NATD_RFC 20 /* NAT Discovery */
+#define ISAKMP_NPTYPE_NATOA_RFC 21 /* NAT Original Address */
+
+/* 128 - 255 -Private Payloads */
+
+
+#define ISAKMP_NPTYPE_NATD_DRAFT 130 /* NAT Discovery */
+#define ISAKMP_NPTYPE_NATOA_DRAFT 131 /* NAT Original Address */
+#define ISAKMP_NPTYPE_FRAG 132 /* IKE fragmentation payload */
+
+#define GET_EXCH(x) ((((u_int32_t) (x) & 0xff000000) >> 24))
+#define SET_EXCH(x) (((u_int32_t)(x) << 24))
+#define GET_MIDX(x) ((((u_int32_t)(x) & 0x00ff0000) >> 16))
+#define SET_MIDX(x) (((u_int32_t) (x) << 16))
+#define GET_PAYLOAD_1(x) (((u_int32_t) (x) & 0x0000ff00) >> 8)
+#define GET_PAYLOAD_2(y) ((u_int32_t) (y) & 0xff)
+#define SET_PAYLOADS(x, y) ((((u_int32_t) (x) << 8) | (y)))
+
+#define MAKE_POS2(exch, j, payload1, payload2) \
+ (u_int32_t) (((exch) << 24) | \
+ (j << 16) | \
+ ((payload1) << 8) | \
+ ((payload2)))
+
+#define MAKE_POS(exch, initorresp, sendorrecv, messageno, payload1, payload2) \
+ ( (u_int32_t) MAKE_POS2(exch, ((initorresp)|(sendorrecv)|(messageno)) , payload1, payload2) )
Index: ipsec-tools-0.7.3/src/plugin_frame/registration.c
===================================================================
--- /dev/null
+++ ipsec-tools-0.7.3/src/plugin_frame/registration.c
@@ -0,0 +1,357 @@
+
+/************************************************************************************
+ * Copyright (c) 2005, Novell Inc., *
+ * All rights reserved. *
+ * *
+ * Redistribution and use in source and binary forms, with or without *
+ * modification, are permitted provided that the following conditions *
+ * are met: *
+ * 1. Redistributions of source code must retain the above copyright *
+ * notice, this list of conditions and the following disclaimer. *
+ * 2. Redistributions in binary form must reproduce the above copyright *
+ * notice, this list of conditions and the following disclaimer in the *
+ * documentation and/or other materials provided with the distribution. *
+ * 3. Neither the name of the Novell nor the names of its contributors *
+ * may be used to endorse or promote products derived from this software *
+ * without specific prior written permission. *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND *
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE *
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE *
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE *
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL *
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS *
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) *
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT *
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY *
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF *
+ * SUCH DAMAGE. *
+ *************************************************************************************/
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <string.h>
+#include <dlfcn.h>
+
+#include "config.h"
+/* Framework headers */
+#include "common.h"
+#include "framework.h"
+#include "hashtable.h"
+#include "error.h"
+
+/* Racoon headers for logging */
+#include "plog.h"
+#include "misc.h"
+
+/* Global plugininfo list */
+struct plugininfo *plugin_info = NULL;
+
+
+struct plugininfo *get_plugin_info(char *plugin_name)
+{
+ struct plugininfo *temp;
+
+ temp = plugin_info;
+ while(temp != NULL) {
+ if(strcmp(temp->plugin_name, plugin_name) == 0)
+ return temp;
+ temp = temp->next;
+ }
+ return NULL;
+}
+
+/************************************************************************************************************
+Function - is_plugin_registered
+Input - plugin name
+Output - pointer to the plugin
+Description - This will search for the plugin in the pluginInfo list based on the plugin name.
+************************************************************************************************************/
+
+u_int8_t is_plugin_registered(char *plugin_name)
+{
+ if(get_plugin_info(plugin_name))
+ return 1;
+
+ return 0;
+}
+
+/************************************************************************************************************
+Function - addPluginToList
+Input - plugin name
+Output - pointer to the plugin
+Description - This will add the plugin in the pluginInfo list based on the plugin name.
+************************************************************************************************************/
+struct plugininfo *add_plugin_to_list(char *plugin_name)
+{
+ struct plugininfo *newinfo, *temp;
+ int plugin_len = 0;
+
+ if(plugin_name == NULL)
+ return NULL;
+
+ newinfo = (struct plugininfo *)malloc(sizeof(struct plugininfo));
+ if(newinfo == NULL)
+ return NULL;
+
+ memset(newinfo,0,sizeof(newinfo));
+
+ plugin_len = strlen(plugin_name);
+
+ newinfo->plugin_name = (char *)malloc(plugin_len + 1);
+ if(newinfo->plugin_name == NULL) //malloc failed
+ return NULL;
+
+ memset(newinfo->plugin_name, 0, plugin_len + 1);
+ strncpy(newinfo->plugin_name, plugin_name, plugin_len);
+
+ newinfo->gprivdata = NULL;
+ newinfo->so_handle = NULL;
+ newinfo->next = NULL;
+
+ //add to end of list
+ temp = plugin_info;
+ if(!temp)
+ {
+ plugin_info = newinfo;
+ }
+ else
+ {
+ while(temp->next)
+ {
+ temp = temp->next;
+ }
+ temp->next = newinfo;
+ }
+ return newinfo;
+}
+
+
+/* *****************************************************************************/
+/* Function - removePluginFromList */
+/* Input - plugin name */
+/* Output - */
+/* Description - This will remove the plugin in the pluginInfo list */
+/* based on the plugin name */
+/* ******************************************************************************/
+void remove_plugin_from_list(char *plugin_name)
+{
+ struct plugininfo *toremove, *temp;
+
+ if(!strcmp(plugin_info->plugin_name, plugin_name))
+ {
+ toremove = plugin_info;
+ plugin_info = plugin_info->next;
+ //deep free plugin info
+ free_plugin_info_all(toremove);
+ free(toremove);
+ }
+ else
+ {
+ temp = plugin_info;
+ while(temp->next)
+ {
+ if(!strcmp(temp->next->plugin_name, plugin_name))
+ {
+ toremove = temp->next;
+ temp->next = temp->next->next;
+ //deep free plugin info
+ free_plugin_info_all(toremove);
+ free(toremove);
+ }
+ temp = temp->next;
+ }
+ }
+
+}
+
+void free_plugin_info_all(struct plugininfo *plugin)
+{
+ if(plugin->plugin_name)
+ free(plugin->plugin_name);
+ /* Plugin would have freed the private data by now */
+ /*
+ // No need to free so_handle as it never got allocated (9.3 racoon crash on disconnect problem fix )
+ if(plugin->so_handle)
+ free(plugin->so_handle);
+ */
+}
+
+/***************************************************************************
+ * Function - registerHandler
+ * Input - plugin name, hookpoint, handlerinfo
+ * Output - success or failure or already registered
+ * Description - This function will be called by the IKE plugin for each
+ * hookpoint to register the handlerinfo.
+ **************************************************************************/
+int tpike_register_handler(struct hookpoint *hp, struct handlerinfo *hi)
+{
+ int status;
+ struct plugininfo *plugin;
+
+ if((plugin = get_plugin_info(hi->plugin_name)) == NULL)
+ return TPIKE_ERR_PLUGIN_NOT_REGISTERED;
+
+ // update the handlerInfo for each hookpoint to have a backpointer to the plugin.
+ //handlerInfo->plugin = plugin;
+
+ //insert in hash table
+ status = insert_in_hash_bucket(hp, hi, plugin);
+
+ return status;
+}
+
+int tpike_deregister_handlers(char *plugin_name)
+{
+ /* just clean up the hash_table.
+TODO: Maintain a chain of handlers for each plugin,
+clean up only the handlers registered by this plugin
+*/
+ clear_hash_table ();
+ return 0;
+}
+
+int tpike_deregister_plugin_all()
+{
+ struct plugininfo *plugin = NULL;
+ char sym_name[256];
+ char *plugin_name = NULL;
+ int retval = TPIKE_ERR_PLUGIN_GENERIC;
+ int (*deregister_fn)(void *) = NULL;
+
+ //de-register all plugins
+ plugin = plugin_info;
+
+ while(plugin)
+ {
+ if (!plugin->so_handle)
+ return TPIKE_ERR_SO_LOAD_FAILURE;
+
+ plugin_name = plugin->plugin_name;
+
+ sprintf(sym_name, "turnpike_%s_deregister", plugin_name);
+ if (!(deregister_fn = dlsym(plugin->so_handle, sym_name)))
+ return TPIKE_ERR_SYM_LOAD_FAILURE;
+
+ plugin->deregister_fn = deregister_fn;
+
+ /* plugin's deregister function will clean-up private data
+ and deregister handlers */
+ retval = (*deregister_fn)(plugin->gprivdata);
+
+ /* plugin's IKE .so related clean-up is over, unload the .so */
+ if(retval == TPIKE_STATUS_SUCCESS)
+ retval = dlclose(plugin->so_handle);
+
+ plugin = plugin->next;
+
+ /* remove the plugin from the framework's plugin list */
+ if(!retval)
+ {
+ remove_plugin_from_list(plugin_name);
+ }
+ }
+ return retval;
+}
+
+int tpike_register_plugin(short ver, const char *pluginso, char *pluginname, void *cp)
+{
+ char sym_name[256] = "\0";
+ void *so_handle = NULL;
+ tpike_plugin_init_func_t *plugin_init_fn = NULL;
+ struct plugininfo *plugin = NULL;
+
+#if 0
+ plog(LLV_DEBUG2, LOCATION, NULL, "about to call so: %s plugin name is :%s \n",pluginso, pluginname);
+#else
+ printf("about to call so: %s plugin name is :%s \n",pluginso, pluginname);
+#endif
+ if (is_plugin_registered(pluginname) == 0 )
+ {
+ //Add this plugin to my plugin list
+ plugin = add_plugin_to_list(pluginname); //(plugin name)
+ if(plugin == NULL)
+ return TPIKE_ERR_PLUGIN_REGISTRATION_FAILURE;
+ }
+ else
+ {
+ plugin = get_plugin_info(pluginname);
+ }
+
+ //load plugin.
+ if (!plugin)
+ return TPIKE_ERR_PLUGIN_REGISTRATION_FAILURE;
+
+ sprintf(sym_name, "turnpike_%s_init", pluginname);
+
+ //so_handle = dlopen(pluginso, RTLD_LAZY);
+ if (!plugin->so_handle)
+ plugin->so_handle = dlopen(pluginso, RTLD_GLOBAL | RTLD_LAZY);
+
+ if (plugin->so_handle){
+#if 0
+ plog(LLV_DEBUG, LOCATION, NULL, "Opened so: %s -- Searching for symbol %s\n",pluginso, sym_name);
+#else
+ printf("Opened so: %s -- Searching for symbol %s\n",pluginso, sym_name);
+
+#endif
+
+ plugin_init_fn = dlsym(plugin->so_handle, sym_name);
+ }
+ else
+ {
+#if 0
+ plog(LLV_ERROR, LOCATION, NULL, "Failed opening so:%s, dlopen returned error:%s\n", pluginso, dlerror());
+#else
+ printf( "Failed opening so:%s, dlopen returned error:%s\n", pluginso, dlerror());
+
+#endif
+ //remove plugin from plugin list
+ remove_plugin_from_list(pluginname);
+ return TPIKE_ERR_SO_LOAD_FAILURE;
+ }
+
+#if 0
+ plog(LLV_DEBUG2, LOCATION, NULL, "About to call init at memory location %x with cp %x and plugin %x\n", plugin_init_fn, cp, plugin);
+#else
+ printf("About to call init at memory location %p with cp %p and plugin %p\n", plugin_init_fn,
+ cp, plugin);
+
+#endif
+
+ if(plugin_init_fn){
+ (*plugin_init_fn)(ver, cp, &(plugin->gprivdata)); //(short, void *cp, void **gp)
+ plugin->init_fn = plugin_init_fn;
+ }
+ else
+ {
+ //remove plugin from plugin list
+ // Commenting for debugging
+ remove_plugin_from_list(pluginname);
+ return TPIKE_ERR_SYM_LOAD_FAILURE;
+ }
+#ifndef NODEBUG
+ dump_hash();
+#endif
+
+ return 0;
+}
+
+int tpike_plugin_getdata(short ver, char *pluginname, int inlen, char *inbuf,
+ int *outlen, char **outbuf)
+{
+ struct plugininfo *plugin = NULL;
+ char sym_name[256];
+ tpike_plugin_getdata_func_t *getdata_fn = NULL;
+
+ if ((plugin = get_plugin_info(pluginname)) == NULL)
+ return TPIKE_ERR_PLUGIN_NOT_REGISTERED;
+
+ if (!plugin->so_handle)
+ return TPIKE_ERR_SO_LOAD_FAILURE;
+ sprintf(sym_name, "turnpike_%s_getdata", pluginname);
+ if (!(getdata_fn = dlsym(plugin->so_handle, sym_name)))
+ return TPIKE_ERR_SYM_LOAD_FAILURE;
+ plugin->getdata_fn = getdata_fn;
+ return (int) ((*getdata_fn)(ver, plugin->gprivdata, inlen, inbuf, outlen, outbuf));
+}
+
Index: ipsec-tools-0.7.3/src/plugin_frame/Makefile.am
===================================================================
--- /dev/null
+++ ipsec-tools-0.7.3/src/plugin_frame/Makefile.am
@@ -0,0 +1,17 @@
+include_plugin_framedir = ${includedir}/plugin_frame
+
+noinst_LTLIBRARIES = libplugin_frame.la
+
+INCLUDES=-I${srcdir}/../racoon/ -I${srcdir}/../libipsec/
+AM_CFLAGS = -D_GNU_SOURCE @GLIBC_BUGS@ -DSYSCONFDIR=\"${sysconfdir}\" \
+ -DADMINPORTDIR=\"${adminsockdir}\"
+
+libplugin_frame_la_SOURCES = \
+ hashtable.c registration.c dispatch.c
+
+libplugin_framedir = $(includedir)/plugin_frame
+
+include_plugin_frame_HEADERS= \
+ hashtable.h common.h framework.h error.h position.h
+
+libplugin_frame_la_LDFLAGS = -version-info 1:0:0 -static
Index: ipsec-tools-0.7.3/src/Makefile.am
===================================================================
--- ipsec-tools-0.7.3.orig/src/Makefile.am
+++ ipsec-tools-0.7.3/src/Makefile.am
@@ -1,3 +1,3 @@
-SUBDIRS = @INCLUDE_GLIBC@ libipsec setkey racoon
+SUBDIRS = @INCLUDE_GLIBC@ plugin_frame libipsec setkey racoon
-DIST_SUBDIRS = include-glibc libipsec setkey racoon
+DIST_SUBDIRS = include-glibc plugin_frame libipsec setkey racoon
Index: ipsec-tools-0.7.3/src/racoon/admin.h
===================================================================
--- ipsec-tools-0.7.3.orig/src/racoon/admin.h
+++ ipsec-tools-0.7.3/src/racoon/admin.h
@@ -77,11 +77,22 @@ struct admin_com {
*/
#define ADMIN_ESTABLISH_SA_PSK 0x0203
+/* 0x03xx is used for supporting plugin_frame features*/
+#define ADMIN_PUSH_PHASE1CONFIG 0x0301
+#define ADMIN_PUSH_PHASE1PROPOSAL 0x0302
+#define ADMIN_PUSH_PHASE2CONFIG 0x0303
+#define ADMIN_DISCONNECT_DST 0x0304
+#define ADMIN_REPARSE_RACOON_CONF 0x0305
+#define ADMIN_REPLACE_SAINFO 0x0306
+#define ADMIN_SET_VENDOR_CONFIG_DATA 0x0307
+#define ADMIN_GET_VENDOR_PRIV_DATA 0X0308
+
/*
* user login follows
*/
#define ADMIN_LOGOUT_USER 0x0205 /* Delete SA for a given Xauth user */
+
/*
* Range 0x08xx is reserved for privilege separation, see privsep.h
*/
@@ -93,6 +104,11 @@ struct admin_com {
#define ADMIN_PROTO_ESP 0x0202
#define ADMIN_PROTO_INTERNAL 0x0301
+/* the value of policy action for supporting plugin_frame features*/
+#define ACTION_ENCRYPT 0x0000
+#define ACTION_DENY 0x0001
+#define ACTION_BYPASS 0x0002
+
struct admin_com_indexes {
u_int8_t prefs;
u_int8_t prefd;
@@ -109,6 +125,89 @@ struct admin_com_psk {
/* Followed by id and key */
};
+struct peer_identifier {
+ u_int8_t id_type;
+ u_int16_t id_len;
+ char idv[1];
+};
+
+struct admin_com_ph1config {
+ struct sockaddr_storage dst;
+ u_int8_t mode; /* exchange type*/
+ u_int8_t verify_cert;
+ u_int8_t verify_identifier;
+ u_int8_t my_identifier_type;
+ u_int16_t my_identifier_len;
+ u_int16_t num_peer_identifier;
+ char id[1];
+ /* id[1] format:my_identifier followed by peer_identifier struct(s)*/
+};
+
+struct admin_com_ph1proposal {
+ u_int8_t encryption_algo;
+ u_int8_t hash_algo;
+ u_int8_t auth_method;
+ u_int8_t dh_group;
+};
+
+struct admin_com_ph1proposal_list{
+ struct sockaddr_storage dst;
+ u_int8_t num_proposal; /* number of proposals being sent */
+ struct admin_com_ph1proposal ph1proposal[1];/* if num_proposal > 1, */
+ /*this will be a list of proposals */
+};
+
+struct admin_com_ph2_ikeattrib {
+ u_int8_t pfs_group;
+ u_int8_t encryption_algorithm;
+ u_int8_t authentication_algorithm;
+ u_int8_t compression_algorithm;
+ u_int32_t lifetime;
+};
+
+struct admin_com_ph2policy {
+ struct sockaddr_storage dst_addr;
+ u_int8_t dst_prefixlen;
+ u_int8_t upperspec;
+ u_int8_t direction;
+ u_int8_t action;
+ u_int8_t protocol;
+ u_int8_t mode;
+};
+
+struct admin_com_ph2config {
+ struct sockaddr_storage src_end_point;
+ struct sockaddr_storage dst_end_point;
+ short num_ph2_policies;
+ char pad;
+ char policy[1];
+};
+
+typedef struct {
+ int addrtype; /* Use IPSECDOI_ID_xxxx_xxxx types. eg. IPSECDOI_ID_IPV4_ADDR */
+ union {
+ struct sockaddr_storage addr;
+ struct {
+ struct sockaddr_storage laddr;
+ struct sockaddr_storage haddr;
+ } range;
+ } addrt;
+} admin_com_addrinfo;
+
+struct admin_com_replace_sainfo{
+ admin_com_addrinfo old_src_addr;
+ admin_com_addrinfo old_dst_addr;
+ admin_com_addrinfo new_src_addr;
+ admin_com_addrinfo new_dst_addr;
+ struct sockaddr_storage peeraddr;
+};
+
+
extern int admin2pfkey_proto __P((u_int));
+#define POLICY_STR_LEN 512
+
+/* TEMPORARY STUFF for supporting plugin_frame */
+extern int add_default_policy_to_SPD(int);
+
#endif /* _ADMIN_H */
Index: ipsec-tools-0.7.3/src/racoon/admin.c
===================================================================
--- ipsec-tools-0.7.3.orig/src/racoon/admin.c
+++ ipsec-tools-0.7.3/src/racoon/admin.c
@@ -5,7 +5,7 @@
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
* All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -17,7 +17,7 @@
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -40,6 +40,7 @@
#include <sys/stat.h>
#include <sys/un.h>
+#include <arpa/inet.h>
#include <net/pfkeyv2.h>
#include <netinet/in.h>
@@ -85,16 +86,37 @@
#include "session.h"
#include "gcmalloc.h"
+#include "algorithm.h"
+#include "sainfo.h"
+
+#ifdef PLUGINS_SUPPORT
+#include "plugin_frame/common.h"
+#endif
+
+#include "cfparse_proto.h"
+
#ifdef ENABLE_ADMINPORT
char *adminsock_path = ADMINSOCK_PATH;
uid_t adminsock_owner = 0;
gid_t adminsock_group = 0;
mode_t adminsock_mode = 0600;
+static const char *protocol[] = {
+ "esp", "ah", "ipcomp"
+};
+
+static const char *mode[] = {
+ "tunnel", "transport"
+};
+
static struct sockaddr_un sunaddr;
static int admin_process __P((int, char *));
static int admin_reply __P((int, struct admin_com *, vchar_t *));
+static void isakmp_flush_sa __P((struct ph1handle *, char *, char *));
+int add_policy_to_SPD __P((struct sockaddr_storage *,
+ struct sockaddr_storage *, struct admin_com_ph2policy *));
+
int
admin_handler()
{
@@ -166,7 +188,7 @@ admin_handler()
/*
* main child's process.
*/
-static int
+int
admin_process(so2, combuf)
int so2;
char *combuf;
@@ -177,6 +199,7 @@ admin_process(so2, combuf)
vchar_t *key = NULL;
int idtype = 0;
int error = -1;
+ int i = 0;
com->ac_errno = 0;
@@ -210,7 +233,7 @@ out2:
case ADMIN_SHOW_EVT:
/* It's not really an error, don't force racoonctl to quit */
if ((buf = evt_dump()) == NULL)
- com->ac_errno = 0;
+ com->ac_errno = 0;
break;
case ADMIN_SHOW_SA:
@@ -290,7 +313,7 @@ out2:
STRDUP_FATAL(rem);
if ((iph1 = getph1byaddrwop(src, dst)) == NULL) {
- plog(LLV_ERROR, LOCATION, NULL,
+ plog(LLV_ERROR, LOCATION, NULL,
"phase 1 for %s -> %s not found\n", loc, rem);
} else {
if (iph1->status == PHASE1ST_ESTABLISHED)
@@ -320,7 +343,7 @@ out2:
user[len] = 0;
found = purgeph1bylogin(user);
- plog(LLV_INFO, LOCATION, NULL,
+ plog(LLV_INFO, LOCATION, NULL,
"deleted %d SA for user \"%s\"\n", found, user);
break;
@@ -339,7 +362,7 @@ out2:
rem = racoon_strdup(saddrwop2str(dst));
STRDUP_FATAL(rem);
- plog(LLV_INFO, LOCATION, NULL,
+ plog(LLV_INFO, LOCATION, NULL,
"Flushing all SAs for peer %s\n", rem);
while ((iph1 = getph1bydstaddrwop(dst)) != NULL) {
@@ -365,14 +388,14 @@ out2:
com->ac_cmd = ADMIN_ESTABLISH_SA;
acp = (struct admin_com_psk *)
- ((char *)com + sizeof(*com) +
+ ((char *)com + sizeof(*com) +
sizeof(struct admin_com_indexes));
idtype = acp->id_type;
if ((id = vmalloc(acp->id_len)) == NULL) {
plog(LLV_ERROR, LOCATION, NULL,
- "cannot allocate memory: %s\n",
+ "cannot allocate memory: %s\n",
strerror(errno));
break;
}
@@ -381,7 +404,7 @@ out2:
if ((key = vmalloc(acp->key_len)) == NULL) {
plog(LLV_ERROR, LOCATION, NULL,
- "cannot allocate memory: %s\n",
+ "cannot allocate memory: %s\n",
strerror(errno));
vfree(id);
id = NULL;
@@ -455,7 +478,7 @@ out2:
rmconf->xauth->pass = key;
}
#endif
-
+
plog(LLV_INFO, LOCATION, NULL,
"accept a request to establish IKE-SA: "
"%s\n", saddrwop2str(remote));
@@ -481,6 +504,626 @@ out1:
}
}
break;
+#ifdef ENABLE_AP_CLIENTMODE
+ case ADMIN_PUSH_PHASE1CONFIG:
+ {
+ struct sockaddr *dst = NULL;
+ struct remoteconf *remoteconf = NULL, *new_rmconf = NULL;
+ struct admin_com_ph1config *ph1ptr = NULL;
+ struct idspec *id = NULL;
+ vchar_t *my_id = NULL;
+ vchar_t *peer_id_val = NULL;
+
+#if 0
+ cfreparse();
+#endif
+
+ ph1ptr = (struct admin_com_ph1config *)
+ ((caddr_t)com + sizeof(*com));
+
+ dst = (struct sockaddr *)&ph1ptr->dst;
+
+ remoteconf = getrmconf(dst);
+
+ if(!remoteconf || remoteconf->remote->sa_family == AF_UNSPEC){
+ /* we've hit the anonymous remote configuration */
+ remoteconf = new_rmconf = newrmconf();
+ if(remoteconf == NULL){
+ plog(LLV_ERROR, LOCATION, NULL,
+ "Failed to get new remoteconf\n");
+ goto out;
+ }
+ remoteconf->remote = (struct sockaddr *)
+ racoon_calloc(1,sizeof(struct sockaddr));
+ if(remoteconf->remote == NULL){
+ plog(LLV_ERROR, LOCATION, NULL,
+ "Failed to allocate for remote IPAddr\n");
+ delrmconf(remoteconf);
+ goto out;
+ }
+ memcpy(remoteconf->remote, dst, sizeof(struct sockaddr));
+ }
+
+ if(remoteconf->etypes == NULL){
+ remoteconf->etypes = (struct etypes *)racoon_calloc
+ (1,sizeof(struct etypes));
+ if(remoteconf->etypes == NULL){
+ plog(LLV_ERROR, LOCATION, NULL,
+ "Failed to allocate for exchange type list\n");
+ delrmconf(remoteconf);
+ goto out;
+ }
+ }
+
+ remoteconf->etypes->type = ph1ptr->mode;
+ remoteconf->proposal = NULL;
+ remoteconf->verify_cert = ph1ptr->verify_cert;
+#if 0
+ //changes to be made - begin
+ remoteconf->certtype = ISAKMP_CERT_X509SIGN;
+ remoteconf->mycertfile = strdup("usercert.pem");
+ remoteconf->myprivfile = strdup("userkeyunenc.pem");
+ //changes to be made - end
+
+
+ remoteconf->certtype = ph1ptr->certtype;
+ strcpy(remoteconf->mycertfile, ph1ptr->mycertfile);
+ strcpy(remoteconf->myprivfile,ph1ptr->myprivfile);
+ strcpy(remoteconf->peerscertfile,ph1ptr->peerscertfile);
+#endif
+ /* my Identifier */
+ remoteconf->idvtype = ph1ptr->my_identifier_type;
+ if(ph1ptr->my_identifier_len > 0){
+ /* populate my_identifier's value */
+ if ((my_id = vmalloc(ph1ptr->my_identifier_len))
+ == NULL) {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "cannot allocate memory: %s\n",
+ strerror(errno));
+ delrmconf(remoteconf);
+ goto out;
+ }
+ memcpy(my_id->v, ph1ptr->id, my_id->l);
+
+ if(set_identifier(&remoteconf->idv,
+ remoteconf->idvtype, my_id) != 0){
+ plog(LLV_ERROR, LOCATION, NULL,
+ "Failed to set my identifier\n");
+
+ vfree(my_id);
+ delrmconf(remoteconf);
+ goto out;
+ }
+ }
+
+ /* peer Identifiers */
+ remoteconf->verify_identifier = ph1ptr->verify_identifier;
+
+ if(remoteconf->verify_identifier == TRUE){
+ int i = 0, peer_id_hdrlen = 0;
+ struct peer_identifier *peer_id =
+ (struct peer_identifier *)
+ (ph1ptr->id+ph1ptr->my_identifier_len);
+
+ peer_id_hdrlen = sizeof(struct peer_identifier);
+
+ for( ; i < ph1ptr->num_peer_identifier ;
+ i++, peer_id += peer_id_hdrlen + peer_id->id_len - 1){
+ id = newidspec();
+ if (id == NULL) {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "failed to allocate idspec\n");
+ delrmconf(remoteconf);
+ vfree(my_id);
+ racoon_free(id);
+ goto out;
+ }
+
+ /* populate peer_identifier's value */
+ if ((peer_id_val = vmalloc(peer_id->id_len)) == NULL) {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "cannot allocate memory: %s\n",
+ strerror(errno));
+ racoon_free(id);
+ vfree(my_id);
+ delrmconf(remoteconf);
+ goto out;
+ }
+ memcpy(peer_id_val->v, peer_id->idv, peer_id_val->l);
+
+ if (set_identifier
+ (&id->id, peer_id->id_type, peer_id_val) != 0){
+ plog(LLV_ERROR, LOCATION, NULL,
+ "failed to set identifer\n");
+ vfree(peer_id_val);
+ racoon_free(id);
+ vfree(my_id);
+ delrmconf(remoteconf);
+ goto out;
+ }
+ id->idtype = peer_id->id_type;
+ genlist_append (remoteconf->idvl_p, id);
+ }
+ }
+ if (new_rmconf)
+ insrmconf(remoteconf);
+ }
+ break;
+ case ADMIN_PUSH_PHASE1PROPOSAL:
+ {
+ struct admin_com_ph1proposal_list *ph1_proposal_list = NULL;
+ struct admin_com_ph1proposal *ph1_proposal = NULL;
+ struct sockaddr *dst = NULL;
+ struct remoteconf *remoteconf = NULL;
+ struct proposalspec *prspec = NULL;
+ struct isakmpsa *new_proposal = NULL;
+ int i = 0;
+
+ ph1_proposal_list =
+ (struct admin_com_ph1proposal_list *)
+ ((caddr_t)com + sizeof(*com));
+
+ ph1_proposal = ph1_proposal_list->ph1proposal;
+ dst = (struct sockaddr *)&ph1_proposal_list->dst;
+
+ remoteconf = getrmconf_strict(dst,0);
+ if(!remoteconf || remoteconf->remote->sa_family == AF_UNSPEC){
+ /* we've hit the anonymous remote configuration */
+ plog(LLV_ERROR, LOCATION, NULL,
+ "Failed to get remoteconf for %s\n",
+ saddr2str(dst));
+ goto out;
+ }
+
+ /* Got the corresponding remoteconf. Add the policies */
+ for (i = 0;i<ph1_proposal_list->num_proposal;
+ i++, ph1_proposal++){
+ new_proposal = newisakmpsa();
+ if (new_proposal == NULL){
+ plog(LLV_ERROR, LOCATION, NULL,
+ "Failed to allocate new isakmpsa\n");
+ goto out;
+ }
+ new_proposal->lifetime = oakley_get_defaultlifetime();
+ new_proposal->enctype = ph1_proposal->encryption_algo;
+ new_proposal->authmethod = ph1_proposal->auth_method;
+ new_proposal->hashtype = ph1_proposal->hash_algo;
+ new_proposal->dh_group = ph1_proposal->dh_group;
+
+ insisakmpsa(new_proposal, remoteconf);
+ }
+
+ /* DH group settting if aggressive mode is there. */
+ if (check_etypeok(remoteconf, ISAKMP_ETYPE_AGG) != NULL) {
+ struct isakmpsa *p;
+ int b = 0;
+
+ /* DH group */
+ for (p = remoteconf->proposal; p; p = p->next) {
+ if (b == 0 || (b && b == p->dh_group)) {
+ b = p->dh_group;
+ continue;
+ }
+ plog(LLV_ERROR, LOCATION, NULL,
+ "DH group must be equal "
+ "in all proposals "
+ "when aggressive mode is "
+ "used\n");
+ goto out;
+ }
+ remoteconf->dh_group = b;
+
+ if (remoteconf->dh_group == 0) {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "DH group must be set in the proposal\n");
+ goto out;
+ }
+
+ /* DH group settting if PFS is required. */
+ if (oakley_setdhgroup(remoteconf->dh_group,
+ &remoteconf->dhgrp) < 0) {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "failed to set DH value.\n");
+ goto out;
+ }
+ }
+ }
+ break;
+ case ADMIN_PUSH_PHASE2CONFIG:
+ {
+ struct admin_com_ph2config *ph2ptr = NULL;
+ struct admin_com_ph2policy *ph2policy = NULL;
+ struct admin_com_ph2_ikeattrib *ph2ikeattrib = NULL;
+ struct sainfo *new_sainfo = NULL,
+ *check = NULL,
+ *old_sainfo = NULL;
+ struct sockaddr_storage *src_end_point = NULL,
+ *dst_end_point = NULL;
+ struct sainfoalg *alg = NULL;
+ struct sockaddr *dst_addr = NULL;
+ vchar_t *s_id = NULL, *d_id = NULL;
+ short num_ph2_policies = 0;
+ int i = 0, sa_count = 0;
+ int encalgtype = 0, hmacalgtype = 0;
+
+
+ ph2ptr = (struct admin_com_ph2config *)
+ ((caddr_t)com + sizeof(*com));
+ ph2policy = (struct admin_com_ph2policy *)(ph2ptr->policy);
+
+ for(; i < ph2ptr->num_ph2_policies; i++, ph2policy++){
+ /* push policy to SPD */
+ if (add_policy_to_SPD
+ (&ph2ptr->src_end_point, &ph2ptr->dst_end_point,
+ ph2policy) == -1)
+ continue;
+ }
+
+ }
+ break;
+ case ADMIN_DISCONNECT_DST:
+ {
+ struct ph1handle *iph1;
+ struct sockaddr *dst;
+ char *loc, *rem;
+ int pfkey_proto, pfkey_so;;
+
+ dst = (struct sockaddr *)
+ &((struct admin_com_indexes *)
+ ((caddr_t)com + sizeof(*com)))->dst;
+
+ if ((rem = strdup(saddrwop2str(dst))) == NULL) {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "failed to allocate memory\n");
+ break;
+ }
+
+ plog(LLV_INFO, LOCATION, NULL,
+ "Flushing all SA for peer %s\n", rem);
+
+ while ((iph1 = getph1bydstaddrwop(dst)) != NULL) {
+ if ((loc = strdup(saddrwop2str(iph1->local))) == NULL){
+ plog(LLV_ERROR, LOCATION, NULL,
+ "failed to allocate memory\n");
+ break;
+ }
+
+ /* flush all SAs associated with this connection */
+ if((pfkey_so = pfkey_open()) < 0){
+ plog(LLV_ERROR, LOCATION, NULL,
+ "pfkey_open failed\n");
+ }
+ else {
+ //pfkey_proto = admin2pfkey_proto(com->ac_proto);
+ //struct sockaddr_in sa_dst, sa_src;
+ if(pfkey_send_spdflush(pfkey_so) == -1){
+ plog(LLV_ERROR, LOCATION, NULL,
+ "pfkey_send_spdflush failed\n");
+ }
+ if(pfkey_send_flush(
+ pfkey_so, SADB_SATYPE_UNSPEC) == -1){
+ plog(LLV_ERROR, LOCATION, NULL,
+ "pfkey_send_sadflush failed\n");
+ }
+ /* sa_dst.sin_family = AF_INET;
+ sa_dst.sin_addr.s_addr = ((struct sockaddr_in *)(iph1->remote))->sin_addr.s_addr;
+ sa_dst.sin_port = 0;
+
+ sa_src.sin_family = AF_INET;
+ sa_src.sin_addr.s_addr = ((struct sockaddr_in *)(iph1->local))->sin_addr.s_addr;
+ sa_src.sin_port = 0;
+
+ if (pfkey_send_delete_all(pfkey_so,
+ pfkey_proto, IPSEC_MODE_TUNNEL,
+ (struct sockaddr *)&sa_src, (struct sockaddr *)&sa_dst) == -1) {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "delete_all %s -> %s failed \n",
+ rem, loc
+ );
+ }
+ */
+ pfkey_close(pfkey_so);
+ }
+ isakmp_flush_sa(iph1, loc, rem);
+
+ racoon_free(loc);
+ }
+ racoon_free(rem);
+#ifdef PLUGINS_SUPPORT
+ tpike_deregister_plugin_all();
+#endif
+ }
+ break;
+ case ADMIN_REPARSE_RACOON_CONF:
+ {
+ int file_name_len;
+ char conf_file_name[512];
+ struct stat finfo;
+ caddr_t recvd_data = NULL;
+
+ /* Get the params */
+ recvd_data = (caddr_t)com + sizeof(*com);
+ file_name_len = *((int *)(recvd_data));
+ recvd_data += sizeof(int);
+
+ if (file_name_len >= sizeof(conf_file_name))
+ goto out;
+
+ memcpy(conf_file_name,
+ (char *)(recvd_data), file_name_len);
+
+ conf_file_name[file_name_len] = '\0';
+
+ /* Check for File security */
+ if (stat(conf_file_name, &finfo) != 0){
+ plog(LLV_ERROR, LOCATION, NULL,
+ "stat failed for file %s : %s\n",
+ conf_file_name, strerror(errno));
+ goto out;
+ }
+ /* Checking to see if the file has the same owner or group
+ * as adminsock
+ */
+ if ((finfo.st_uid != adminsock_owner) &&
+ (finfo.st_gid != adminsock_group)) {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "Group for the conf file %s does not match"
+ "with the group of admin port(%d:%d)\n",
+ conf_file_name, finfo.st_gid, adminsock_group);
+ goto out;
+ }
+
+
+ /* Verify that the file does not give more
+ * permissions than what is allowed for adminsock
+ */
+ mode_t curr_mode = finfo.st_mode & ~S_IFMT;
+
+ if ((curr_mode & adminsock_mode) != curr_mode) {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "File does not have correct permissions. "
+ "Expected : %d Has : %d\n",
+ adminsock_mode, (curr_mode & S_IRWXU));
+ goto out;
+ }
+ setracoonconf(conf_file_name);
+ kill (getpid(), SIGHUP);
+ }
+ break;
+ case ADMIN_REPLACE_SAINFO:
+ {
+ struct admin_com_replace_sainfo *ap_replace_sai = NULL;
+ struct sainfo *old_sainfo = NULL, *new_sainfo = NULL;
+ admin_com_addrinfo *src = NULL, *dst = NULL;
+ struct sockaddr_in *temp_addr;
+ vchar_t *s_id = NULL, *d_id = NULL, *p_id = NULL, *temp_id = NULL,
+ *new_s_id = NULL, *new_d_id = NULL;
+ int sa_count = 0;
+ int remoteid = 0;
+ int new_remoteid = 0;
+ struct remoteconf *conf = NULL; /// get the remoteid
+
+ ap_replace_sai = (struct admin_com_replace_sainfo *)
+ ((caddr_t)com + sizeof(*com));
+
+ s_id = get_ipsecdoi_id(&(ap_replace_sai->old_src_addr),
+ IPSEC_ULPROTO_ANY);
+
+ d_id = get_ipsecdoi_id(&(ap_replace_sai->old_dst_addr), IPSEC_ULPROTO_ANY);
+
+ p_id = ipsecdoi_sockaddr2id((struct sockaddr *)&(ap_replace_sai->peeraddr),
+ sizeof(struct in_addr),
+ IPSEC_ULPROTO_ANY);
+ ipsecdoi_idtype2doi(p_id);
+
+ src = &(ap_replace_sai->new_src_addr);
+ dst = &(ap_replace_sai->new_dst_addr);
+
+
+ new_s_id = get_ipsecdoi_id(src, IPSEC_ULPROTO_ANY);
+ new_d_id = get_ipsecdoi_id(dst, IPSEC_ULPROTO_ANY);
+
+
+ temp_addr = (struct sockaddr_in *)&(ap_replace_sai->old_src_addr.addrt.addr);
+ printf("Old src addr : %x\n",
+ temp_addr->sin_addr.s_addr
+ );
+ temp_addr = (struct sockaddr_in *)&(ap_replace_sai->old_dst_addr.addrt.addr);
+ printf("Old dst addr : %x\n",
+ temp_addr->sin_addr.s_addr
+ );
+
+ temp_addr = (struct sockaddr_in *)&(ap_replace_sai->new_src_addr.addrt.addr);
+ printf("New src addr : %x\n",
+ temp_addr->sin_addr.s_addr
+ );
+
+ temp_addr = (struct sockaddr_in *)&(ap_replace_sai->new_dst_addr.addrt.addr);
+ printf("New dst addr : %x\n",
+ temp_addr->sin_addr.s_addr
+ );
+
+ /// how to get the remote addr?
+ conf = getrmconf((struct sockaddr *)&(ap_replace_sai->old_dst_addr.addrt.addr));
+ if (conf != NULL) {
+ remoteid = conf->ph1id;
+ plog(LLV_DEBUG, LOCATION, NULL, "Get remoteid success(%d).\n", remoteid);
+ } else {
+ plog(LLV_DEBUG, LOCATION, NULL, "Warning: no valid rmconf !\n");
+ remoteid = 0;
+ }
+
+ /// how to get the remote addr?
+ conf = getrmconf((struct sockaddr *)&(ap_replace_sai->new_dst_addr.addrt.addr));
+ if (conf != NULL) {
+ new_remoteid = conf->ph1id;
+ plog(LLV_DEBUG, LOCATION, NULL, "Get new_remoteid success(%d).\n", remoteid);
+ } else {
+ plog(LLV_DEBUG, LOCATION, NULL, "Warning: no valid rmconf !\n");
+ new_remoteid = 0;
+ }
+
+ do {
+ sa_count++;
+ // getsainfo(loc, rmt, peer, remoteid)
+ old_sainfo = getsainfo(s_id, d_id, NULL, remoteid);
+
+ if (old_sainfo && old_sainfo->idsrc){
+ /* Corressponding Entry found.
+ * Allocate a new sa_info struct
+ * copy the new addresses
+ * delete the old one and insert the new one
+ */
+ new_sainfo = dupsainfo(old_sainfo);
+ if (new_sainfo == NULL) {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "failed to allocate sainfo\n");
+ if (sa_count == 2){
+ /* Remove already added policy */
+ new_sainfo =
+ getsainfo(new_s_id, new_d_id, p_id, new_remoteid);
+ if ((new_sainfo) &&
+ (new_sainfo->idsrc != NULL)){
+ /* Not an anonymous entry */
+ remsainfo(new_sainfo);
+ delsainfo(new_sainfo);
+ }
+ }
+ goto out;
+ }
+ new_sainfo->idsrc = new_s_id;
+ new_sainfo->iddst = new_d_id;
+
+ inssainfo(new_sainfo);
+ remsainfo(old_sainfo);
+ delsainfo(old_sainfo);
+ }
+ else{
+ /*
+ plog(LLV_ERROR, LOCATION, NULL,
+ "No matching sa_info found. Src(%s):Dst(%s)",
+ saddr2str((struct sockaddr *)&(src->addrt.addr)), saddr2str((struct sockaddr *)&(dst->addrt.addr)));
+ */
+ plog(LLV_ERROR, LOCATION, NULL,
+ "No matching sa_info found...\n");
+ goto out;
+ }
+
+ //Repeat for the opposite direction
+ temp_id = s_id;
+ s_id = d_id;
+ d_id = temp_id;
+
+ temp_id = new_s_id;
+ new_s_id = vdup(new_d_id);
+ new_d_id = vdup(temp_id);
+
+ } while (sa_count < 2);
+ }
+ break;
+ case ADMIN_GET_VENDOR_PRIV_DATA:
+ {
+ caddr_t vendor_conf_opq_data = NULL;
+
+ vendor_conf_opq_data = (caddr_t)com + sizeof(*com);
+#ifdef PLUGINS_SUPPORT
+ {
+ size_t *gw_type_len = NULL;
+ size_t *inbuf_len = NULL;
+ int outbuf_len = 0;
+ char gw_type[128];
+ caddr_t inbuf = NULL, outbuf = NULL;
+ caddr_t plugin_private_data = NULL;
+ short *ver = NULL;
+
+ /*
+ * The private data structure is as follows:
+ * Version +
+ * Gateway type in LV Format +
+ * Private data to be passed on to the IKE Plugin in LV Format
+ */
+
+ /* Version */
+ ver = (short *)vendor_conf_opq_data;
+ vendor_conf_opq_data += sizeof(short);
+
+ /* Gateway Type in LV format */
+ gw_type_len = (size_t *)vendor_conf_opq_data;
+ vendor_conf_opq_data += sizeof(size_t);
+
+ memcpy(gw_type, (char *)vendor_conf_opq_data,
+ *gw_type_len);
+ gw_type[*gw_type_len] = '\0';
+ vendor_conf_opq_data += *gw_type_len;
+
+ /* Length of private data */
+ inbuf_len = (size_t *)vendor_conf_opq_data;
+ vendor_conf_opq_data += sizeof(size_t);
+ inbuf = vendor_conf_opq_data;
+
+ tpike_plugin_getdata(*ver, gw_type, *inbuf_len, inbuf,
+ &outbuf_len, &outbuf);
+
+ for (i = 0; i < sizeof(u_int32_t) * 2; i++)
+ plog(LLV_DEBUG, LOCATION, NULL, "0x%2x ", *(((char *)outbuf) + i));
+ plog(LLV_DEBUG, LOCATION, NULL, "\n");
+
+ buf = vmalloc(outbuf_len);
+ if (buf == NULL)
+ com->ac_errno = -1;
+ else
+ memcpy(buf->v, outbuf, outbuf_len);
+
+ }
+#endif
+ }
+ break;
+ case ADMIN_SET_VENDOR_CONFIG_DATA :
+ {
+ caddr_t vendor_conf_opq_data = NULL;
+
+ vendor_conf_opq_data = (caddr_t)com + sizeof(*com);
+
+#ifdef PLUGINS_SUPPORT
+ {
+ size_t *gw_type_len = NULL, *plugin_so_len = NULL;
+ char plugin_so[256] = {'\0'}, gw_type[128] = {'\0'};
+ caddr_t plugin_private_data = NULL;
+ short *ver = NULL;
+ /*
+ * The Private data structure is as follows:
+ * Version no(short) +
+ * Length of the Gateway type string(int) +
+ * Gateway type string (char *)+
+ * Length of Plugin so name string(int) +
+ * Name of the plugin so(char *) +
+ * Private Data to be passed on to the IKE plugin(void *)
+ */
+
+ /* Get Version info */
+ ver = (short *)vendor_conf_opq_data;
+ vendor_conf_opq_data += sizeof(short);
+
+ /* Gateway type in LV format */
+ gw_type_len = (size_t *)vendor_conf_opq_data;
+ vendor_conf_opq_data += sizeof(size_t);
+ memcpy(gw_type, (char *)vendor_conf_opq_data, *gw_type_len);
+ gw_type[*gw_type_len] = '\0';
+ vendor_conf_opq_data += *gw_type_len;
+
+ /* Plugin so name in LV format */
+ plugin_so_len = (size_t *)vendor_conf_opq_data;
+ vendor_conf_opq_data += sizeof(size_t);
+ memcpy(plugin_so, (char *)vendor_conf_opq_data, *plugin_so_len );
+ plugin_so[*plugin_so_len] = '\0';
+ vendor_conf_opq_data += *plugin_so_len;
+
+ tpike_register_plugin(*ver,plugin_so,gw_type,vendor_conf_opq_data);
+ }
+#endif
+ }
+ break;
+#endif
default:
plog(LLV_ERROR, LOCATION, NULL,
@@ -589,17 +1232,17 @@ admin_init()
}
if (chown(sunaddr.sun_path, adminsock_owner, adminsock_group) != 0) {
- plog(LLV_ERROR, LOCATION, NULL,
- "chown(%s, %d, %d): %s\n",
- sunaddr.sun_path, adminsock_owner,
+ plog(LLV_ERROR, LOCATION, NULL,
+ "chown(%s, %d, %d): %s\n",
+ sunaddr.sun_path, adminsock_owner,
adminsock_group, strerror(errno));
(void)close(lcconf->sock_admin);
return -1;
}
if (chmod(sunaddr.sun_path, adminsock_mode) != 0) {
- plog(LLV_ERROR, LOCATION, NULL,
- "chmod(%s, 0%03o): %s\n",
+ plog(LLV_ERROR, LOCATION, NULL,
+ "chmod(%s, 0%03o): %s\n",
sunaddr.sun_path, adminsock_mode, strerror(errno));
(void)close(lcconf->sock_admin);
return -1;
@@ -624,5 +1267,153 @@ admin_close()
close(lcconf->sock_admin);
return 0;
}
+
+#ifdef ENABLE_AP_CLIENTMODE
+int
+add_policy_to_SPD(src_end_point, dst_end_point, policy)
+ struct sockaddr_storage *src_end_point;
+ struct sockaddr_storage *dst_end_point;
+ struct admin_com_ph2policy *policy;
+{
+ char outpolicystr[POLICY_STR_LEN], inpolicystr[POLICY_STR_LEN];
+ char *policyout = NULL, *policyin = NULL;
+ char *local_ip_addr = NULL, *remote_ip_addr = NULL;
+
+ struct sockaddr srcaddr;
+ struct sockaddr dstaddr;
+ struct sockaddr *addr = NULL;
+
+ addr = (struct sockaddr *)src_end_point;
+ local_ip_addr = strdup(saddrwop2str(addr));
+
+ addr = (struct sockaddr *)dst_end_point;
+ remote_ip_addr = strdup(saddrwop2str(addr));
+
+ /* end-points and policy for outbound trafic */
+ switch(policy->action){
+ case ACTION_ENCRYPT:
+ sprintf(outpolicystr, "out ipsec %s/%s/%s-%s/unique",
+ protocol[policy->protocol], mode[policy->mode],
+ local_ip_addr,remote_ip_addr);
+ sprintf(inpolicystr, "in ipsec %s/%s/%s-%s/unique",
+ protocol[policy->protocol], mode[policy->mode],
+ remote_ip_addr,local_ip_addr);
+ break;
+ case ACTION_BYPASS:
+ sprintf(outpolicystr, "out none");
+ sprintf(inpolicystr, "in none");
+ break;
+ case ACTION_DENY:
+ sprintf(outpolicystr, "out discard");
+ sprintf(inpolicystr, "in discard");
+ break;
+ default:
+ plog(LLV_ERROR, LOCATION, NULL, "Unknown policy action\n");
+ }
+ /* set outbound policy */
+ policyout = ipsec_set_policy(outpolicystr, strlen(outpolicystr));
+ /* set inbound policy */
+ policyin = ipsec_set_policy(inpolicystr, strlen(inpolicystr));
+
+ racoon_free(local_ip_addr);
+ racoon_free(remote_ip_addr);
+
+ /* Add the policy to SPD */
+ bzero(&srcaddr, sizeof(struct sockaddr));
+ bzero(&dstaddr, sizeof(struct sockaddr));
+
+ memcpy(&srcaddr, (struct sockaddr *)src_end_point,
+ sizeof(struct sockaddr));
+ memcpy(&dstaddr, (struct sockaddr *)&policy->dst_addr,
+ sizeof(struct sockaddr));
+ pfkey_add_policy_to_SPD(&srcaddr, 32, &dstaddr, policy->dst_prefixlen,
+ policy->upperspec, policyin, policyout,0);
+ return 0;
+}
+#endif
#endif
+static void
+isakmp_flush_sa(iph1, loc, rem)
+ struct ph1handle *iph1;
+ char *loc;
+ char *rem;
+{
+ plog(LLV_INFO, LOCATION, NULL,
+ "Flushing SA for %s -> %s\n", loc, rem);
+
+ if (iph1->status == PHASE1ST_ESTABLISHED)
+ isakmp_info_send_d1(iph1);
+
+ remph1(iph1);
+ delph1(iph1);
+
+ return;
+}
+
+/*
+ * Temporary stuff being done for VPN Client for NLD
+ * IMPORTANT: To be removed as soon as the fix is available
+ * in gui plugin and plugin so
+ */
+
+//static LIST_HEAD(_ph1tree_, ph1handle) ph1tree;
+extern LIST_HEAD(_ph1tree_, ph1handle) ph1tree;
+int
+add_default_policy_to_SPD(src_addr)
+ int src_addr;
+{
+ struct ph1handle *p = NULL;
+ struct sockaddr srcaddr;
+ struct sockaddr dstaddr;
+
+ char outpolicystr[POLICY_STR_LEN], inpolicystr[POLICY_STR_LEN];
+ char *policyout = NULL, *policyin = NULL;
+ char *local_ip_addr = NULL, *remote_ip_addr = NULL;
+
+ plog(LLV_INFO, LOCATION, NULL,
+ "call add_default_policy_to_SPD(%08x).\n", src_addr);
+
+ p = LIST_FIRST(&ph1tree);
+
+ local_ip_addr = strdup(saddrwop2str(p->local));
+ remote_ip_addr = strdup(saddrwop2str(p->remote));
+
+ /* end-points and policy for outbound trafic
+ Action is always ENCRYPT
+ */
+#if 0
+ sprintf(outpolicystr, "out ipsec esp/tunnel/%s-%s/unique",
+ local_ip_addr,remote_ip_addr);
+ sprintf(inpolicystr, "in ipsec esp/tunnel/%s-%s/unique",
+ remote_ip_addr, local_ip_addr);
+#else
+ sprintf(outpolicystr, "out ipsec esp/tunnel/%s-%s/require",
+ local_ip_addr,remote_ip_addr);
+ sprintf(inpolicystr, "in ipsec esp/tunnel/%s-%s/require",
+ remote_ip_addr, local_ip_addr);
+
+#endif
+ /* set outbound policy */
+ policyout = ipsec_set_policy(outpolicystr, strlen(outpolicystr));
+ /* set inbound policy */
+ policyin = ipsec_set_policy(inpolicystr, strlen(inpolicystr));
+
+ racoon_free(local_ip_addr);
+ racoon_free(remote_ip_addr);
+
+ /* Add the policy to SPD */
+ bzero(&srcaddr, sizeof(struct sockaddr));
+ bzero(&dstaddr, sizeof(struct sockaddr));
+
+ ((struct sockaddr_in *)(&srcaddr))->sin_family = AF_INET;
+ ((struct sockaddr_in *)(&srcaddr))->sin_addr.s_addr = (src_addr);
+
+ ((struct sockaddr_in *)(&dstaddr))->sin_family = AF_INET;
+ ((struct sockaddr_in *)(&dstaddr))->sin_addr.s_addr = INADDR_ANY;
+
+ pfkey_add_policy_to_SPD(&srcaddr, 32, &dstaddr, 0/*policy->dst_prefixlen*/,
+ 0 , policyin, policyout,0);
+ EVT_PUSH(0, 0, EVTT_ISAKMP_CFG_DONE, NULL);
+ return 0;
+}
Index: ipsec-tools-0.7.3/src/racoon/algorithm.h
===================================================================
--- ipsec-tools-0.7.3.orig/src/racoon/algorithm.h
+++ ipsec-tools-0.7.3/src/racoon/algorithm.h
@@ -213,4 +213,6 @@ extern const char *alg_oakley_hashdef_na
extern const char *alg_oakley_dhdef_name __P((int));
extern const char *alg_oakley_authdef_name __P((int));
+extern int algdoi2type(int, int);
+
#endif /* _ALGORITHM_H */
Index: ipsec-tools-0.7.3/src/racoon/algorithm.c
===================================================================
--- ipsec-tools-0.7.3.orig/src/racoon/algorithm.c
+++ ipsec-tools-0.7.3/src/racoon/algorithm.c
@@ -955,3 +955,20 @@ algclass2doi(class)
/*NOTREACHED*/
return -1;
}
+
+int
+algdoi2type(class, doi)
+ int class, doi;
+{
+ int res = -1;
+
+ switch (class) {
+ case algclass_ipsec_enc:
+ res = ((struct enc_algorithm*)alg_ipsec_encdef(doi))->type;
+ break;
+ case algclass_ipsec_auth:
+ res = ((struct hmac_algorithm*)alg_ipsec_hmacdef(doi))->type;
+ break;
+ }
+ return res;
+}
Index: ipsec-tools-0.7.3/src/racoon/cfparse_proto.h
===================================================================
--- ipsec-tools-0.7.3.orig/src/racoon/cfparse_proto.h
+++ ipsec-tools-0.7.3/src/racoon/cfparse_proto.h
@@ -39,4 +39,6 @@ extern int yyparse __P((void));
extern int cfparse __P((void));
extern int cfreparse __P((void));
+extern int cfreparse_withfname __P((char *fname));
+
#endif /* _CFPARSE_PROTO_H */
Index: ipsec-tools-0.7.3/src/racoon/cfparse.y
===================================================================
--- ipsec-tools-0.7.3.orig/src/racoon/cfparse.y
+++ ipsec-tools-0.7.3/src/racoon/cfparse.y
@@ -1220,7 +1220,7 @@ sainfo_id
: IDENTIFIERTYPE ADDRSTRING prefix port ul_proto
{
char portbuf[10];
- struct sockaddr *saddr;
+ struct sockaddr *saddr = NULL;
if (($5 == IPPROTO_ICMP || $5 == IPPROTO_ICMPV6)
&& ($4 != IPSEC_PORT_ANY || $4 != IPSEC_PORT_ANY)) {
@@ -1630,13 +1630,14 @@ remote_specs_block
/* DH group */
for (p = cur_rmconf->proposal; p; p = p->next) {
if (b == 0 || (b && b == p->dh_group)) {
+ yywarn("b=%d, dh_group=%d\n", b, p->dh_group);
b = p->dh_group;
continue;
}
yyerror("DH group must be equal "
"in all proposals "
"when aggressive mode is "
- "used.\n");
+ "used.%d != %d\n", b, p->dh_group);
return -1;
}
cur_rmconf->dh_group = b;
@@ -2276,7 +2277,7 @@ set_isakmp_proposal(rmconf, prspec)
struct secprotospec *s;
int prop_no = 1;
int trns_no = 1;
- int32_t types[MAXALGCLASS];
+ u_int32_t types[MAXALGCLASS];
p = prspec;
if (p->next != 0) {
@@ -2334,7 +2335,7 @@ set_isakmp_proposal(rmconf, prspec)
/* expanding spspec */
clean_tmpalgtype();
- trns_no = expand_isakmpspec(prop_no, trns_no, types,
+ trns_no = expand_isakmpspec(prop_no, trns_no, (int *)types,
algclass_isakmp_enc, algclass_isakmp_ameth + 1,
s->lifetime ? s->lifetime : p->lifetime,
s->lifebyte ? s->lifebyte : p->lifebyte,
@@ -2556,6 +2557,64 @@ cfreparse()
return(cfparse());
}
+#ifdef ENABLE_AP_CLIENTMODE
+int
+cfparse_withfname(conf_fname)
+ char *conf_fname;
+{
+ int error;
+
+ yycf_init_buffer();
+
+ if (yycf_switch_buffer(conf_fname) != 0)
+ return -1;
+
+ error = yyparse();
+ if (error != 0) {
+ if (yyerrorcount) {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "fatal parse failure (%d errors)\n",
+ yyerrorcount);
+ } else {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "fatal parse failure.\n");
+ }
+ return -1;
+ }
+
+ if (error == 0 && yyerrorcount) {
+ plog(LLV_ERROR, LOCATION, NULL,
+ "parse error is nothing, but yyerrorcount is %d.\n",
+ yyerrorcount);
+ exit(1);
+ }
+
+ yycf_clean_buffer();
+
+ plog(LLV_DEBUG2, LOCATION, NULL, "parse successed.\n");
+
+ return 0;
+}
+
+int
+cfreparse_withfname(conf_fname)
+ char *conf_fname;
+{
+ flushph2();
+ flushph1();
+ flushrmconf();
+ flushsainfo();
+ clean_tmpalgtype();
+ yycf_init_buffer();
+
+ if (yycf_switch_buffer(conf_fname) != 0)
+ return -1;
+
+ return(cfparse_withfname(conf_fname));
+}
+
+#endif
+
#ifdef ENABLE_ADMINPORT
static void
adminsock_conf(path, owner, group, mode_dec)
Index: ipsec-tools-0.7.3/src/racoon/handler.c
===================================================================
--- ipsec-tools-0.7.3.orig/src/racoon/handler.c
+++ ipsec-tools-0.7.3/src/racoon/handler.c
@@ -81,7 +81,12 @@
#include "gssapi.h"
#endif
+#if 0
static LIST_HEAD(_ph1tree_, ph1handle) ph1tree;
+#else
+LIST_HEAD(_ph1tree_, ph1handle) ph1tree;
+#endif
+
static LIST_HEAD(_ph2tree_, ph2handle) ph2tree;
static LIST_HEAD(_ctdtree_, contacted) ctdtree;
static LIST_HEAD(_rcptree_, recvdpkt) rcptree;