1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
|
/* Structure of messages from whack to Pluto proper.
* Copyright (C) 1998-2001 D. Hugh Redelmeier.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* RCSID $Id: whack.h,v 1.51 2003/08/16 23:04:41 mcr Exp $
*/
#include <freeswan.h>
/* Since the message remains on one host, native representation is used.
* Think of this as horizontal microcode: all selected operations are
* to be done (in the order declared here).
*
* MAGIC is used to help detect version mismatches between whack and Pluto.
* Whenever the interface (i.e. this struct) changes in form or
* meaning, change this value (probably by changing the last number).
*
* If the command only requires basic actions (status or shutdown),
* it is likely that the relevant part of the message changes less frequently.
* Whack uses WHACK_BASIC_MAGIC in those cases.
*
* NOTE: no value of WHACK_BASIC_MAGIC may equal any value of WHACK_MAGIC.
* Otherwise certain version mismatches will not be detected.
*/
#define WHACK_BASIC_MAGIC (((((('w' << 8) + 'h') << 8) + 'k') << 8) + 24)
#define WHACK_MAGIC (((((('w' << 8) + 'h') << 8) + 'k') << 8) + 26)
/* struct whack_end is a lot like connection.h's struct end
* It differs because it is going to be shipped down a socket
* and because whack is a separate program from pluto.
*/
struct whack_end {
char *id; /* id string (if any) -- decoded by pluto */
ip_address
host_addr,
host_nexthop;
ip_subnet client;
bool key_from_DNS_on_demand;
bool has_client;
char *updown; /* string */
u_int16_t host_port; /* host order */
};
struct whack_message {
unsigned int magic;
/* for WHACK_STATUS: */
bool whack_status;
/* for WHACK_SHUTDOWN */
bool whack_shutdown;
/* END OF BASIC COMMANDS
* If you change anything earlier in this struct, update WHACK_BASIC_MAGIC.
*/
/* name is used in connection and initiate */
size_t name_len; /* string 1 */
char *name;
/* for WHACK_OPTIONS: */
bool whack_options;
lset_t debugging; /* only used #ifdef DEBUG, but don't want layout to change */
/* for WHACK_CONNECTION */
bool whack_connection;
bool whack_async;
lset_t policy;
time_t sa_ike_life_seconds;
time_t sa_ipsec_life_seconds;
time_t sa_rekey_margin;
unsigned long sa_rekey_fuzz;
unsigned long sa_keying_tries;
/* note that each end contains string 2/4.id and string 3/5 updown */
struct whack_end left;
struct whack_end right;
/* note: if the client is the gateway, the following must be equal */
sa_family_t addr_family; /* between gateways */
sa_family_t tunnel_addr_family; /* between clients */
/* for WHACK_KEY: */
bool whack_key;
bool whack_addkey;
char *keyid; /* string 6 */
enum pubkey_alg pubkey_alg;
chunk_t keyval; /* chunk */
/* for WHACK_MYID: */
bool whack_myid;
char *myid; /* string 7 */
/* for WHACK_ROUTE: */
bool whack_route;
/* for WHACK_UNROUTE: */
bool whack_unroute;
/* for WHACK_INITIATE: */
bool whack_initiate;
/* for WHACK_OPINITIATE */
bool whack_oppo_initiate;
ip_address oppo_my_client, oppo_peer_client;
/* for WHACK_TERMINATE: */
bool whack_terminate;
/* for WHACK_DELETE: */
bool whack_delete;
/* for WHACK_DELETESTATE: */
bool whack_deletestate;
so_serial_t whack_deletestateno;
/* for WHACK_LISTEN: */
bool whack_listen, whack_unlisten;
/* for WHACK_CRASH - note if a remote peer is known to have rebooted */
bool whack_crash;
ip_address whack_crash_peer;
/* space for strings (hope there is enough room):
* Note that pointers don't travel on wire.
* 1 connection name [name_len]
* 2 left's name [left.host.name.len]
* 3 left's updown
* 4 right's name [left.host.name.len]
* 5 right's updown
* 6 keyid
* plus keyval (limit: 8K bits + overhead), a chunk.
*/
size_t str_size;
char string[2048];
};
/* Codes for status messages returned to whack.
* These are 3 digit decimal numerals. The structure
* is inspired by section 4.2 of RFC959 (FTP).
* Since these will end up as the exit status of whack, they
* must be less than 256.
* NOTE: ipsec_auto(8) knows about some of these numbers -- change carefully.
*/
enum rc_type {
RC_COMMENT, /* non-commital utterance (does not affect exit status) */
RC_WHACK_PROBLEM, /* whack-detected problem */
RC_LOG, /* message aimed at log (does not affect exit status) */
RC_LOG_SERIOUS, /* serious message aimed at log (does not affect exit status) */
RC_SUCCESS, /* success (exit status 0) */
/* failure, but not definitive */
RC_RETRANSMISSION = 10,
/* improper request */
RC_DUPNAME = 20, /* attempt to reuse a connection name */
RC_UNKNOWN_NAME, /* connection name unknown or state number */
RC_ORIENT, /* cannot orient connection: neither end is us */
RC_CLASH, /* clash between two Road Warrior connections OVERLOADED */
RC_DEAF, /* need --listen before --initiate */
RC_ROUTE, /* cannot route */
RC_RTBUSY, /* cannot unroute: route busy */
RC_BADID, /* malformed --id */
RC_NOKEY, /* no key found through DNS */
RC_NOPEERIP, /* cannot initiate when peer IP is unknown */
RC_INITSHUNT, /* cannot initiate a shunt-oly connection */
/* permanent failure */
RC_BADWHACKMESSAGE = 30,
RC_NORETRANSMISSION,
RC_INTERNALERR,
RC_OPPOFAILURE, /* Opportunism failed */
/* progress: start of range for successful state transition.
* Actual value is RC_NEW_STATE plus the new state code.
*/
RC_NEW_STATE = 100,
/* start of range for notification.
* Actual value is RC_NOTIFICATION plus code for notification
* that should be generated by this Pluto.
*/
RC_NOTIFICATION = 200 /* as per IKE notification messages */
};
|