File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ipsec-tools / src / racoon / handler.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:39:10 2012 UTC (12 years, 4 months ago) by misho
Branches: ipsec-tools, MAIN
CVS tags: v0_8_2p2, v0_8_1p0, v0_8_1, v0_8_0p0, v0_8_0, HEAD
ipsec-tools

    1: /*	$NetBSD: handler.h,v 1.25 2010/11/17 10:40:41 tteras Exp $	*/
    2: 
    3: /* Id: handler.h,v 1.19 2006/02/25 08:25:12 manubsd Exp */
    4: 
    5: /*
    6:  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
    7:  * All rights reserved.
    8:  *
    9:  * Redistribution and use in source and binary forms, with or without
   10:  * modification, are permitted provided that the following conditions
   11:  * are met:
   12:  * 1. Redistributions of source code must retain the above copyright
   13:  *    notice, this list of conditions and the following disclaimer.
   14:  * 2. Redistributions in binary form must reproduce the above copyright
   15:  *    notice, this list of conditions and the following disclaimer in the
   16:  *    documentation and/or other materials provided with the distribution.
   17:  * 3. Neither the name of the project nor the names of its contributors
   18:  *    may be used to endorse or promote products derived from this software
   19:  *    without specific prior written permission.
   20:  *
   21:  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
   22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   23:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   24:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
   25:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   31:  * SUCH DAMAGE.
   32:  */
   33: 
   34: #ifndef _HANDLER_H
   35: #define _HANDLER_H
   36: 
   37: #include <sys/queue.h>
   38: #include <openssl/rsa.h>
   39: 
   40: #include <sys/time.h>
   41: 
   42: #include "isakmp_var.h"
   43: #include "oakley.h"
   44: #include "schedule.h"
   45: #include "evt.h"
   46: 
   47: /* Phase 1 handler */
   48: /*
   49:  * main mode:
   50:  *      initiator               responder
   51:  *  0   (---)                   (---)
   52:  *  1   start                   start (1st msg received)
   53:  *  2   (---)                   1st valid msg received
   54:  *  3   1st msg sent	        1st msg sent
   55:  *  4   1st valid msg received  2st valid msg received
   56:  *  5   2nd msg sent            2nd msg sent
   57:  *  6   2nd valid msg received  3rd valid msg received
   58:  *  7   3rd msg sent            3rd msg sent
   59:  *  8   3rd valid msg received  (---)
   60:  *  9   SA established          SA established
   61:  *
   62:  * aggressive mode:
   63:  *      initiator               responder
   64:  *  0   (---)                   (---)
   65:  *  1   start                   start (1st msg received)
   66:  *  2   (---)                   1st valid msg received
   67:  *  3   1st msg sent	        1st msg sent
   68:  *  4   1st valid msg received  2st valid msg received
   69:  *  5   (---)                   (---)
   70:  *  6   (---)                   (---)
   71:  *  7   (---)                   (---)
   72:  *  8   (---)                   (---)
   73:  *  9   SA established          SA established
   74:  *
   75:  * base mode:
   76:  *      initiator               responder
   77:  *  0   (---)                   (---)
   78:  *  1   start                   start (1st msg received)
   79:  *  2   (---)                   1st valid msg received
   80:  *  3   1st msg sent	        1st msg sent
   81:  *  4   1st valid msg received  2st valid msg received
   82:  *  5   2nd msg sent            (---)
   83:  *  6   (---)                   (---)
   84:  *  7   (---)                   (---)
   85:  *  8   (---)                   (---)
   86:  *  9   SA established          SA established
   87:  */
   88: #define PHASE1ST_SPAWN			0
   89: #define PHASE1ST_START			1
   90: #define PHASE1ST_MSG1RECEIVED		2
   91: #define PHASE1ST_MSG1SENT		3
   92: #define PHASE1ST_MSG2RECEIVED		4
   93: #define PHASE1ST_MSG2SENT		5
   94: #define PHASE1ST_MSG3RECEIVED		6
   95: #define PHASE1ST_MSG3SENT		7
   96: #define PHASE1ST_MSG4RECEIVED		8
   97: #define PHASE1ST_ESTABLISHED		9
   98: #define PHASE1ST_DYING			10
   99: #define PHASE1ST_EXPIRED		11
  100: #define PHASE1ST_MAX			12
  101: 
  102: /* About address semantics in each case.
  103:  *			initiator(addr=I)	responder(addr=R)
  104:  *			src	dst		src	dst
  105:  *			(local)	(remote)	(local)	(remote)
  106:  * phase 1 handler	I	R		R	I
  107:  * phase 2 handler	I	R		R	I
  108:  * getspi msg		R	I		I	R
  109:  * acquire msg		I	R
  110:  * ID payload		I	R		I	R
  111:  */
  112: #ifdef ENABLE_HYBRID
  113: struct isakmp_cfg_state;
  114: #endif
  115: struct ph1handle {
  116: 	isakmp_index index;
  117: 
  118: 	int status;			/* status of this SA */
  119: 	int side;			/* INITIATOR or RESPONDER */
  120: 
  121: 	struct sockaddr *remote;	/* remote address to negosiate ph1 */
  122: 	struct sockaddr *local;		/* local address to negosiate ph1 */
  123: 			/* XXX copy from rmconf due to anonymous configuration.
  124: 			 * If anonymous will be forbidden, we do delete them. */
  125: 
  126: 	struct remoteconf *rmconf;	/* pointer to remote configuration */
  127: 
  128: 	struct isakmpsa *approval;	/* pointer to SA(s) approved. */
  129: 	vchar_t *authstr;		/* place holder of string for auth. */
  130: 					/* for example pre-shared key */
  131: 
  132: 	u_int8_t version;		/* ISAKMP version */
  133: 	u_int8_t etype;			/* Exchange type actually for use */
  134: 	u_int8_t flags;			/* Flags */
  135: 	u_int32_t msgid;		/* message id */
  136: 
  137: 	u_int32_t vendorid_mask;	/* bitmask of received supported vendor ids*/
  138: #ifdef ENABLE_NATT
  139: 	struct ph1natt_options *natt_options;	/* Selected NAT-T IKE version */
  140: 	u_int32_t natt_flags;		/* NAT-T related flags */
  141: #endif
  142: #ifdef ENABLE_FRAG
  143: 	int frag;			/* IKE phase 1 fragmentation */
  144: 	struct isakmp_frag_item *frag_chain;	/* Received fragments */
  145: #endif
  146: 
  147: 	struct sched sce;		/* schedule for expire */
  148: 
  149: 	struct sched scr;		/* schedule for resend */
  150: 	int retry_counter;		/* for resend. */
  151: 	vchar_t *sendbuf;		/* buffer for re-sending */
  152: 
  153: 	vchar_t *dhpriv;		/* DH; private value */
  154: 	vchar_t *dhpub;			/* DH; public value */
  155: 	vchar_t *dhpub_p;		/* DH; partner's public value */
  156: 	vchar_t *dhgxy;			/* DH; shared secret */
  157: 	vchar_t *nonce;			/* nonce value */
  158: 	vchar_t *nonce_p;		/* partner's nonce value */
  159: 	vchar_t *skeyid;		/* SKEYID */
  160: 	vchar_t *skeyid_d;		/* SKEYID_d */
  161: 	vchar_t *skeyid_a;		/* SKEYID_a, i.e. hash */
  162: 	vchar_t *skeyid_e;		/* SKEYID_e, i.e. encryption */
  163: 	vchar_t *key;			/* cipher key */
  164: 	vchar_t *hash;			/* HASH minus general header */
  165: 	vchar_t *sig;			/* SIG minus general header */
  166: 	vchar_t *sig_p;			/* peer's SIG minus general header */
  167: 	vchar_t *cert;			/* CERT minus general header */
  168: 	vchar_t *cert_p;		/* peer's CERT minus general header */
  169: 	vchar_t *crl_p;			/* peer's CRL minus general header */
  170: 	vchar_t *cr_p;			/* peer's CR not including general */
  171: 	RSA *rsa;			/* my RSA key */
  172: 	RSA *rsa_p;			/* peer's RSA key */
  173: 	struct genlist *rsa_candidates;	/* possible candidates for peer's RSA key */
  174: 	vchar_t *id;			/* ID minus gen header */
  175: 	vchar_t *id_p;			/* partner's ID minus general header */
  176: 					/* i.e. struct ipsecdoi_id_b*. */
  177: 	struct isakmp_ivm *ivm;		/* IVs */
  178: 
  179: 	vchar_t *sa;			/* whole SA payload to send/to be sent*/
  180: 					/* to calculate HASH */
  181: 					/* NOT INCLUDING general header. */
  182: 
  183: 	vchar_t *sa_ret;		/* SA payload to reply/to be replyed */
  184: 					/* NOT INCLUDING general header. */
  185: 					/* NOTE: Should be release after use. */
  186: 
  187: #ifdef HAVE_GSSAPI
  188: 	void *gssapi_state;		/* GSS-API specific state. */
  189: 					/* Allocated when needed */
  190: 	vchar_t *gi_i;			/* optional initiator GSS id */
  191: 	vchar_t *gi_r;			/* optional responder GSS id */
  192: #endif
  193: 
  194: 	struct isakmp_pl_hash *pl_hash;	/* pointer to hash payload */
  195: 
  196: 	time_t created;			/* timestamp for establish */
  197: 	int initial_contact_received;	/* set if initial contact received */
  198: #ifdef ENABLE_STATS
  199: 	struct timeval start;
  200: 	struct timeval end;
  201: #endif
  202: 
  203: #ifdef ENABLE_DPD
  204: 	int		dpd_support;	/* Does remote supports DPD ? */
  205: 	u_int32_t	dpd_last_ack;
  206: 	u_int32_t	dpd_seq;		/* DPD seq number to receive */
  207: 	u_int8_t	dpd_fails;		/* number of failures */
  208: 	struct sched	dpd_r_u;
  209: #endif
  210: 
  211: 	u_int32_t msgid2;		/* msgid counter for Phase 2 */
  212: 	int ph2cnt;	/* the number which is negotiated by this phase 1 */
  213: 	LIST_HEAD(_ph2ofph1_, ph2handle) ph2tree;
  214: 
  215: 	LIST_ENTRY(ph1handle) chain;
  216: #ifdef ENABLE_HYBRID
  217: 	struct isakmp_cfg_state *mode_cfg;	/* ISAKMP mode config state */
  218: #endif
  219: 	EVT_LISTENER_LIST(evt_listeners);
  220: };
  221: 
  222: /* For limiting enumeration of ph1 tree */
  223: struct ph1selector {
  224: 	struct sockaddr *local;
  225: 	struct sockaddr *remote;
  226: };
  227: 
  228: /* Phase 2 handler */
  229: /* allocated per a SA or SA bundles of a pair of peer's IP addresses. */
  230: /*
  231:  *      initiator               responder
  232:  *  0   (---)                   (---)
  233:  *  1   start                   start (1st msg received)
  234:  *  2   acquire msg get         1st valid msg received
  235:  *  3   getspi request sent     getspi request sent
  236:  *  4   getspi done             getspi done
  237:  *  5   1st msg sent            1st msg sent
  238:  *  6   1st valid msg received  2nd valid msg received
  239:  *  7   (commit bit)            (commit bit)
  240:  *  8   SAs added               SAs added
  241:  *  9   SAs established         SAs established
  242:  * 10   SAs expired             SAs expired
  243:  */
  244: #define PHASE2ST_SPAWN		0
  245: #define PHASE2ST_START		1
  246: #define PHASE2ST_STATUS2	2
  247: #define PHASE2ST_GETSPISENT	3
  248: #define PHASE2ST_GETSPIDONE	4
  249: #define PHASE2ST_MSG1SENT	5
  250: #define PHASE2ST_STATUS6	6
  251: #define PHASE2ST_COMMIT		7
  252: #define PHASE2ST_ADDSA		8
  253: #define PHASE2ST_ESTABLISHED	9
  254: #define PHASE2ST_EXPIRED	10
  255: #define PHASE2ST_MAX		11
  256: 
  257: struct ph2handle {
  258: 	/* source and destination addresses used for IKE exchange. Might
  259: 	 * differ from source and destination of SA. On the initiator,
  260: 	 * they are tweaked if a hint is available in the SPD (set by
  261: 	 * MIGRATE for instance). Otherwise they are the source and
  262: 	 * destination of SA for transport mode and the tunnel endpoints
  263: 	 * for tunnel mode */
  264: 	struct sockaddr *src;
  265: 	struct sockaddr *dst;
  266: 
  267: 	/* source and destination addresses of the SA in the case addresses
  268: 	 * used for IKE exchanges (src and dst) do differ. On the initiator,
  269: 	 * they are set (if needed) in pk_recvacquire(). On the responder,
  270: 	 * they are _derived_ from the local and remote parameters of the
  271: 	 * SP, if available. */
  272: 	struct sockaddr *sa_src;
  273: 	struct sockaddr *sa_dst;
  274: 
  275: 	/* Store our Phase 2 ID and the peer ID (ID minus general header).
  276: 	 * On the initiator, they are set during ACQUIRE processing.
  277: 	 * On the responder, they are set from the content of ID payload
  278: 	 * in quick_r1recv(). Then, if they are of type address or
  279: 	 * tunnel, they are compared to sainfo selectors.
  280: 	 */
  281: 	vchar_t *id;			/* ID minus gen header */
  282: 	vchar_t *id_p;			/* peer's ID minus general header */
  283: 
  284: #ifdef ENABLE_NATT
  285: 	struct sockaddr *natoa_src;	/* peer's view of my address */
  286: 	struct sockaddr *natoa_dst;	/* peer's view of his address */
  287: #endif
  288: 
  289: 	u_int32_t spid;			/* policy id by kernel */
  290: 
  291: 	int status;			/* ipsec sa status */
  292: 	u_int8_t side;			/* INITIATOR or RESPONDER */
  293: 
  294: 	struct sched sce;		/* schedule for expire */
  295: 	struct sched scr;		/* schedule for resend */
  296: 	int retry_counter;		/* for resend. */
  297: 	vchar_t *sendbuf;		/* buffer for re-sending */
  298: 	vchar_t *msg1;			/* buffer for re-sending */
  299: 				/* used for responder's first message */
  300: 
  301: 	int retry_checkph1;		/* counter to wait phase 1 finished. */
  302: 					/* NOTE: actually it's timer. */
  303: 
  304: 	u_int32_t seq;			/* sequence number used by PF_KEY */
  305: 			/*
  306: 			 * NOTE: In responder side, we can't identify each SAs
  307: 			 * with same destination address for example, when
  308: 			 * socket based SA is required.  So we set a identifier
  309: 			 * number to "seq", and sent kernel by pfkey.
  310: 			 */
  311: 	u_int8_t satype;		/* satype in PF_KEY */
  312: 			/*
  313: 			 * saved satype in the original PF_KEY request from
  314: 			 * the kernel in order to reply a error.
  315: 			 */
  316: 
  317: 	u_int8_t flags;			/* Flags for phase 2 */
  318: 	u_int32_t msgid;		/* msgid for phase 2 */
  319: 
  320: 	struct sainfo *sainfo;		/* place holder of sainfo */
  321: 	struct saprop *proposal;	/* SA(s) proposal. */
  322: 	struct saprop *approval;	/* SA(s) approved. */
  323: 	u_int32_t lifetime_secs;	/* responder lifetime (seconds) */
  324: 	u_int32_t lifetime_kb;		/* responder lifetime (kbytes) */
  325: 	caddr_t spidx_gen;		/* policy from peer's proposal */
  326: 
  327: 	struct dhgroup *pfsgrp;		/* DH; prime number */
  328: 	vchar_t *dhpriv;		/* DH; private value */
  329: 	vchar_t *dhpub;			/* DH; public value */
  330: 	vchar_t *dhpub_p;		/* DH; partner's public value */
  331: 	vchar_t *dhgxy;			/* DH; shared secret */
  332: 	vchar_t *nonce;			/* nonce value in phase 2 */
  333: 	vchar_t *nonce_p;		/* partner's nonce value in phase 2 */
  334: 
  335: 	vchar_t *sa;			/* whole SA payload to send/to be sent*/
  336: 					/* to calculate HASH */
  337: 					/* NOT INCLUDING general header. */
  338: 
  339: 	vchar_t *sa_ret;		/* SA payload to reply/to be replyed */
  340: 					/* NOT INCLUDING general header. */
  341: 					/* NOTE: Should be release after use. */
  342: 
  343: 	struct isakmp_ivm *ivm;		/* IVs */
  344: 
  345: 	int generated_spidx;	/* mark handlers whith generated policy */
  346: 
  347: #ifdef ENABLE_STATS
  348: 	struct timeval start;
  349: 	struct timeval end;
  350: #endif
  351: 	struct ph1handle *ph1;	/* back pointer to isakmp status */
  352: 
  353: 	LIST_ENTRY(ph2handle) chain;
  354: 	LIST_ENTRY(ph2handle) ph1bind;	/* chain to ph1handle */
  355: 	EVT_LISTENER_LIST(evt_listeners);
  356: };
  357: 
  358: /* For limiting enumeration of ph2 tree */
  359: struct ph2selector {
  360: 	u_int32_t spid;
  361: 	struct sockaddr *src;
  362: 	struct sockaddr *dst;
  363: };
  364: 
  365: /*
  366:  * for handling initial contact.
  367:  */
  368: struct contacted {
  369: 	struct sockaddr *remote;	/* remote address to negosiate ph1 */
  370: 	LIST_ENTRY(contacted) chain;
  371: };
  372: 
  373: /*
  374:  * for checking a packet retransmited.
  375:  */
  376: struct recvdpkt {
  377: 	struct sockaddr *remote;	/* the remote address */
  378: 	struct sockaddr *local;		/* the local address */
  379: 	vchar_t *hash;			/* hash of the received packet */
  380: 	vchar_t *sendbuf;		/* buffer for the response */
  381: 	int retry_counter;		/* how many times to send */
  382: 	struct timeval time_send;	/* timestamp of previous send */
  383: 
  384: 	LIST_ENTRY(recvdpkt) chain;
  385: };
  386: 
  387: /* for parsing ISAKMP header. */
  388: struct isakmp_parse_t {
  389: 	u_char type;		/* payload type of mine */
  390: 	int len;		/* ntohs(ptr->len) */
  391: 	struct isakmp_gen *ptr;
  392: };
  393: 
  394: /*
  395:  * for IV management.
  396:  *
  397:  * - normal case
  398:  * initiator                                     responder
  399:  * -------------------------                     --------------------------
  400:  * initialize iv(A), ive(A).                     initialize iv(A), ive(A).
  401:  * encode by ive(A).
  402:  * save to iv(B).            ---[packet(B)]-->   save to ive(B).
  403:  *                                               decode by iv(A).
  404:  *                                               packet consistency.
  405:  *                                               sync iv(B) with ive(B).
  406:  *                                               check auth, integrity.
  407:  *                                               encode by ive(B).
  408:  * save to ive(C).          <--[packet(C)]---    save to iv(C).
  409:  * decoded by iv(B).
  410:  *      :
  411:  *
  412:  * - In the case that a error is found while cipher processing,
  413:  * initiator                                     responder
  414:  * -------------------------                     --------------------------
  415:  * initialize iv(A), ive(A).                     initialize iv(A), ive(A).
  416:  * encode by ive(A).
  417:  * save to iv(B).            ---[packet(B)]-->   save to ive(B).
  418:  *                                               decode by iv(A).
  419:  *                                               packet consistency.
  420:  *                                               sync iv(B) with ive(B).
  421:  *                                               check auth, integrity.
  422:  *                                               error found.
  423:  *                                               create notify.
  424:  *                                               get ive2(X) from iv(B).
  425:  *                                               encode by ive2(X).
  426:  * get iv2(X) from iv(B).   <--[packet(Y)]---    save to iv2(Y).
  427:  * save to ive2(Y).
  428:  * decoded by iv2(X).
  429:  *      :
  430:  *
  431:  * The reason why the responder synchronizes iv with ive after checking the
  432:  * packet consistency is that it is required to leave the IV for decoding
  433:  * packet.  Because there is a potential of error while checking the packet
  434:  * consistency.  Also the reason why that is before authentication and
  435:  * integirty check is that the IV for informational exchange has to be made
  436:  * by the IV which is after packet decoded and checking the packet consistency.
  437:  * Otherwise IV mismatched happens between the intitiator and the responder.
  438:  */
  439: struct isakmp_ivm {
  440: 	vchar_t *iv;	/* for decoding packet */
  441: 			/* if phase 1, it's for computing phase2 iv */
  442: 	vchar_t *ive;	/* for encoding packet */
  443: };
  444: 
  445: /* for dumping */
  446: struct ph1dump {
  447: 	isakmp_index index;
  448: 	int status;
  449: 	int side;
  450: 	struct sockaddr_storage remote;
  451: 	struct sockaddr_storage local;
  452: 	u_int8_t version;
  453: 	u_int8_t etype;
  454: 	time_t created;
  455: 	int ph2cnt;
  456: };
  457: 
  458: struct sockaddr;
  459: struct ph1handle;
  460: struct ph2handle;
  461: struct policyindex;
  462: 
  463: extern struct ph1handle *getph1byindex __P((isakmp_index *));
  464: extern struct ph1handle *getph1byindex0 __P((isakmp_index *));
  465: 
  466: extern int enumph1 __P((struct ph1selector *ph1sel,
  467: 			int (* enum_func)(struct ph1handle *iph1, void *arg),
  468: 			void *enum_arg));
  469: 
  470: #define GETPH1_F_ESTABLISHED		0x0001
  471: 
  472: extern struct ph1handle *getph1 __P((struct ph1handle *ph1hint,
  473: 				     struct sockaddr *local,
  474: 				     struct sockaddr *remote,
  475: 				     int flags));
  476: 
  477: #define getph1byaddr(local, remote, est) \
  478: 	getph1(NULL, local, remote, est ? GETPH1_F_ESTABLISHED : 0)
  479: #define getph1bydstaddr(remote) \
  480: 	getph1(NULL, NULL, remote, 0)
  481: 
  482: #ifdef ENABLE_HYBRID
  483: struct ph1handle *getph1bylogin __P((char *));
  484: int purgeph1bylogin __P((char *));
  485: #endif
  486: extern void migrate_ph12 __P((struct ph1handle *old_iph1, struct ph1handle *new_iph1));
  487: extern void migrate_dying_ph12 __P((struct ph1handle *iph1));
  488: extern vchar_t *dumpph1 __P((void));
  489: extern struct ph1handle *newph1 __P((void));
  490: extern void delph1 __P((struct ph1handle *));
  491: extern int insph1 __P((struct ph1handle *));
  492: extern void remph1 __P((struct ph1handle *));
  493: extern int resolveph1rmconf __P((struct ph1handle *));
  494: extern void flushph1 __P((void));
  495: extern void initph1tree __P((void));
  496: extern int ph1_rekey_enabled __P((struct ph1handle *));
  497: 
  498: extern int enumph2 __P((struct ph2selector *ph2sel,
  499: 			int (* enum_func)(struct ph2handle *iph2, void *arg),
  500: 			void *enum_arg));
  501: extern struct ph2handle *getph2byseq __P((u_int32_t));
  502: extern struct ph2handle *getph2bysaddr __P((struct sockaddr *,
  503: 	struct sockaddr *));
  504: extern struct ph2handle *getph2bymsgid __P((struct ph1handle *, u_int32_t));
  505: extern struct ph2handle *getph2byid __P((struct sockaddr *,
  506: 	struct sockaddr *, u_int32_t));
  507: extern struct ph2handle *getph2bysaidx __P((struct sockaddr *,
  508: 	struct sockaddr *, u_int, u_int32_t));
  509: extern struct ph2handle *newph2 __P((void));
  510: extern void initph2 __P((struct ph2handle *));
  511: extern void delph2 __P((struct ph2handle *));
  512: extern int insph2 __P((struct ph2handle *));
  513: extern void remph2 __P((struct ph2handle *));
  514: extern void flushph2 __P((void));
  515: extern void deleteallph2 __P((struct sockaddr *, struct sockaddr *, u_int));
  516: extern void initph2tree __P((void));
  517: 
  518: extern void bindph12 __P((struct ph1handle *, struct ph2handle *));
  519: extern void unbindph12 __P((struct ph2handle *));
  520: 
  521: extern struct contacted *getcontacted __P((struct sockaddr *));
  522: extern int inscontacted __P((struct sockaddr *));
  523: extern void remcontacted __P((struct sockaddr *));
  524: extern void initctdtree __P((void));
  525: 
  526: extern int check_recvdpkt __P((struct sockaddr *,
  527: 	struct sockaddr *, vchar_t *));
  528: extern int add_recvdpkt __P((struct sockaddr *, struct sockaddr *,
  529: 	vchar_t *, vchar_t *));
  530: extern void init_recvdpkt __P((void));
  531: 
  532: #ifdef ENABLE_HYBRID
  533: extern int exclude_cfg_addr __P((const struct sockaddr *));
  534: #endif
  535: 
  536: extern int revalidate_ph12(void);
  537: 
  538: #endif /* _HANDLER_H */

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