Return to handler.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / ipsec-tools / src / racoon |
1.1 ! misho 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 */