Annotation of embedaddon/ipsec-tools/src/racoon/handler.h, revision 1.1
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 */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>