1 1.4 plunky /* $NetBSD: ip_proxy.h,v 1.4 2012/09/15 16:56:45 plunky Exp $ */ 2 1.1 christos 3 1.1 christos /* 4 1.3 darrenr * Copyright (C) 2012 by Darren Reed. 5 1.1 christos * 6 1.1 christos * See the IPFILTER.LICENCE file for details on licencing. 7 1.1 christos * 8 1.3 darrenr * Id: ip_proxy.h,v 1.1.1.2 2012/07/22 13:45:33 darrenr Exp 9 1.1 christos */ 10 1.1 christos 11 1.2 christos #ifndef _NETINET_IP_PROXY_H_ 12 1.2 christos #define _NETINET_IP_PROXY_H_ 13 1.1 christos 14 1.1 christos #ifndef SOLARIS 15 1.4 plunky # if (defined(sun) && (defined(__svr4__) || defined(__SVR4))) 16 1.4 plunky # define SOLARIS 1 17 1.4 plunky # else 18 1.4 plunky # define SOLARIS 0 19 1.4 plunky # endif 20 1.1 christos #endif 21 1.1 christos 22 1.1 christos #if defined(__STDC__) || defined(__GNUC__) || defined(_AIX51) 23 1.1 christos #define SIOCPROXY _IOWR('r', 64, struct ap_control) 24 1.1 christos #else 25 1.1 christos #define SIOCPROXY _IOWR(r, 64, struct ap_control) 26 1.1 christos #endif 27 1.1 christos 28 1.1 christos #ifndef APR_LABELLEN 29 1.1 christos #define APR_LABELLEN 16 30 1.1 christos #endif 31 1.1 christos #define AP_SESS_SIZE 53 32 1.1 christos 33 1.1 christos struct nat; 34 1.1 christos struct ipnat; 35 1.1 christos struct ipstate; 36 1.1 christos 37 1.1 christos typedef struct ap_tcp { 38 1.1 christos u_short apt_sport; /* source port */ 39 1.1 christos u_short apt_dport; /* destination port */ 40 1.1 christos short apt_sel[2]; /* {seq,ack}{off,min} set selector */ 41 1.1 christos short apt_seqoff[2]; /* sequence # difference */ 42 1.1 christos u_32_t apt_seqmin[2]; /* don't change seq-off until after this */ 43 1.1 christos short apt_ackoff[2]; /* sequence # difference */ 44 1.1 christos u_32_t apt_ackmin[2]; /* don't change seq-off until after this */ 45 1.1 christos u_char apt_state[2]; /* connection state */ 46 1.1 christos } ap_tcp_t; 47 1.1 christos 48 1.1 christos typedef struct ap_udp { 49 1.1 christos u_short apu_sport; /* source port */ 50 1.1 christos u_short apu_dport; /* destination port */ 51 1.1 christos } ap_udp_t; 52 1.1 christos 53 1.1 christos typedef struct ap_session { 54 1.1 christos struct aproxy *aps_apr; 55 1.1 christos union { 56 1.1 christos struct ap_tcp apu_tcp; 57 1.1 christos struct ap_udp apu_udp; 58 1.1 christos } aps_un; 59 1.1 christos U_QUAD_T aps_bytes; /* bytes sent */ 60 1.1 christos U_QUAD_T aps_pkts; /* packets sent */ 61 1.1 christos void *aps_nat; /* pointer back to nat struct */ 62 1.1 christos void *aps_data; /* private data */ 63 1.1 christos int aps_psiz; /* size of private data */ 64 1.1 christos struct ap_session *aps_next; 65 1.1 christos } ap_session_t; 66 1.1 christos 67 1.1 christos #define aps_sport aps_un.apu_tcp.apt_sport 68 1.1 christos #define aps_dport aps_un.apu_tcp.apt_dport 69 1.1 christos #define aps_sel aps_un.apu_tcp.apt_sel 70 1.1 christos #define aps_seqoff aps_un.apu_tcp.apt_seqoff 71 1.1 christos #define aps_seqmin aps_un.apu_tcp.apt_seqmin 72 1.1 christos #define aps_state aps_un.apu_tcp.apt_state 73 1.1 christos #define aps_ackoff aps_un.apu_tcp.apt_ackoff 74 1.1 christos #define aps_ackmin aps_un.apu_tcp.apt_ackmin 75 1.1 christos 76 1.1 christos 77 1.1 christos typedef struct ap_control { 78 1.1 christos char apc_label[APR_LABELLEN]; 79 1.1 christos char apc_config[APR_LABELLEN]; 80 1.1 christos u_char apc_p; 81 1.1 christos /* 82 1.1 christos * The following fields are upto the proxy's apr_ctl routine to deal 83 1.1 christos * with. When the proxy gets this in kernel space, apc_data will 84 1.1 christos * point to a malloc'd region of memory of apc_dsize bytes. If the 85 1.1 christos * proxy wants to keep that memory, it must set apc_data to NULL 86 1.1 christos * before it returns. It is expected if this happens that it will 87 1.1 christos * take care to free it in apr_fini or otherwise as appropriate. 88 1.1 christos * apc_cmd is provided as a standard place to put simple commands, 89 1.1 christos * with apc_arg being available to put a simple arg. 90 1.1 christos */ 91 1.1 christos u_long apc_cmd; 92 1.1 christos u_long apc_arg; 93 1.1 christos void *apc_data; 94 1.1 christos size_t apc_dsize; 95 1.1 christos } ap_ctl_t; 96 1.1 christos 97 1.1 christos #define APC_CMD_ADD 0 98 1.1 christos #define APC_CMD_DEL 1 99 1.1 christos 100 1.1 christos 101 1.1 christos typedef struct aproxy { 102 1.1 christos struct aproxy *apr_next; 103 1.1 christos struct aproxy *apr_parent; 104 1.1 christos char apr_label[APR_LABELLEN]; /* Proxy label # */ 105 1.1 christos u_char apr_p; /* protocol */ 106 1.1 christos int apr_flags; 107 1.1 christos int apr_ref; 108 1.1 christos int apr_clones; 109 1.2 christos void (* apr_load)(void); 110 1.2 christos void (* apr_unload)(void); 111 1.2 christos void *(* apr_create)(ipf_main_softc_t *); 112 1.2 christos void (* apr_destroy)(ipf_main_softc_t *, void *); 113 1.2 christos int (* apr_init)(ipf_main_softc_t *, void *); 114 1.2 christos void (* apr_fini)(ipf_main_softc_t *, void *); 115 1.2 christos int (* apr_new)(void *, fr_info_t *, ap_session_t *, 116 1.2 christos struct nat *); 117 1.2 christos void (* apr_del)(ipf_main_softc_t *, ap_session_t *); 118 1.2 christos int (* apr_inpkt)(void *, fr_info_t *, ap_session_t *, 119 1.2 christos struct nat *); 120 1.2 christos int (* apr_outpkt)(void *, fr_info_t *, ap_session_t *, 121 1.2 christos struct nat *); 122 1.2 christos int (* apr_match)(fr_info_t *, ap_session_t *, struct nat *); 123 1.2 christos int (* apr_ctl)(ipf_main_softc_t *, void *, ap_ctl_t *); 124 1.2 christos int (* apr_clear)(struct aproxy *); 125 1.2 christos int (* apr_flush)(struct aproxy *, int); 126 1.1 christos void *apr_soft; 127 1.1 christos } aproxy_t; 128 1.1 christos 129 1.1 christos #define APR_DELETE 1 130 1.1 christos 131 1.1 christos #define APR_ERR(x) ((x) << 16) 132 1.1 christos #define APR_EXIT(x) (((x) >> 16) & 0xffff) 133 1.1 christos #define APR_INC(x) ((x) & 0xffff) 134 1.1 christos 135 1.1 christos 136 1.1 christos #ifdef _KERNEL 137 1.1 christos /* 138 1.1 christos * Generic #define's to cover missing things in the kernel 139 1.1 christos */ 140 1.1 christos # ifndef isdigit 141 1.1 christos # define isdigit(x) ((x) >= '0' && (x) <= '9') 142 1.1 christos # endif 143 1.1 christos # ifndef isupper 144 1.1 christos # define isupper(x) (((unsigned)(x) >= 'A') && ((unsigned)(x) <= 'Z')) 145 1.1 christos # endif 146 1.1 christos # ifndef islower 147 1.1 christos # define islower(x) (((unsigned)(x) >= 'a') && ((unsigned)(x) <= 'z')) 148 1.1 christos # endif 149 1.1 christos # ifndef isalpha 150 1.1 christos # define isalpha(x) (isupper(x) || islower(x)) 151 1.1 christos # endif 152 1.1 christos # ifndef toupper 153 1.1 christos # define toupper(x) (isupper(x) ? (x) : (x) - 'a' + 'A') 154 1.1 christos # endif 155 1.1 christos # ifndef isspace 156 1.1 christos # define isspace(x) (((x) == ' ') || ((x) == '\r') || ((x) == '\n') || \ 157 1.1 christos ((x) == '\t') || ((x) == '\b')) 158 1.1 christos # endif 159 1.1 christos #endif /* _KERNEL */ 160 1.1 christos 161 1.1 christos /* 162 1.1 christos * For the ftp proxy. 163 1.1 christos */ 164 1.1 christos #define FTP_BUFSZ 160 165 1.1 christos #define IPF_FTPBUFSZ 160 166 1.1 christos 167 1.1 christos typedef struct ftpside { 168 1.1 christos char *ftps_rptr; 169 1.1 christos char *ftps_wptr; 170 1.1 christos void *ftps_ifp; 171 1.1 christos u_32_t ftps_seq[2]; 172 1.1 christos u_32_t ftps_len; 173 1.1 christos int ftps_junk; 174 1.1 christos int ftps_cmds; 175 1.1 christos int ftps_cmd; 176 1.1 christos char ftps_buf[FTP_BUFSZ]; 177 1.1 christos } ftpside_t; 178 1.1 christos 179 1.1 christos typedef struct ftpinfo { 180 1.1 christos int ftp_passok; 181 1.1 christos int ftp_incok; 182 1.1 christos void *ftp_pendstate; 183 1.1 christos nat_t *ftp_pendnat; 184 1.1 christos ftpside_t ftp_side[2]; 185 1.1 christos } ftpinfo_t; 186 1.1 christos 187 1.1 christos 188 1.1 christos /* 189 1.3 darrenr * IPsec proxy 190 1.3 darrenr */ 191 1.3 darrenr typedef u_32_t ipsec_cookie_t[2]; 192 1.3 darrenr 193 1.3 darrenr typedef struct ipsec_pxy { 194 1.3 darrenr ipsec_cookie_t ipsc_icookie; 195 1.3 darrenr ipsec_cookie_t ipsc_rcookie; 196 1.3 darrenr int ipsc_rckset; 197 1.3 darrenr nat_t *ipsc_nat; 198 1.3 darrenr struct ipstate *ipsc_state; 199 1.3 darrenr ipnat_t *ipsc_rule; 200 1.3 darrenr } ipsec_pxy_t; 201 1.3 darrenr 202 1.3 darrenr 203 1.3 darrenr /* 204 1.1 christos * For the irc proxy. 205 1.1 christos */ 206 1.1 christos typedef struct ircinfo { 207 1.1 christos size_t irc_len; 208 1.1 christos char *irc_snick; 209 1.1 christos char *irc_dnick; 210 1.1 christos char *irc_type; 211 1.1 christos char *irc_arg; 212 1.1 christos char *irc_addr; 213 1.1 christos u_32_t irc_ipnum; 214 1.1 christos u_short irc_port; 215 1.1 christos } ircinfo_t; 216 1.1 christos 217 1.1 christos 218 1.1 christos /* 219 1.1 christos * For the DNS "proxy" 220 1.1 christos */ 221 1.1 christos typedef struct dnsinfo { 222 1.1 christos ipfmutex_t dnsi_lock; 223 1.1 christos u_short dnsi_id; 224 1.1 christos char dnsi_buffer[512]; 225 1.1 christos } dnsinfo_t; 226 1.1 christos 227 1.1 christos 228 1.1 christos /* 229 1.1 christos * Real audio proxy structure and #defines 230 1.1 christos */ 231 1.1 christos typedef struct raudio_s { 232 1.1 christos int rap_seenpna; 233 1.1 christos int rap_seenver; 234 1.1 christos int rap_version; 235 1.1 christos int rap_eos; /* End Of Startup */ 236 1.1 christos int rap_gotid; 237 1.1 christos int rap_gotlen; 238 1.1 christos int rap_mode; 239 1.1 christos int rap_sdone; 240 1.1 christos u_short rap_plport; 241 1.1 christos u_short rap_prport; 242 1.1 christos u_short rap_srport; 243 1.1 christos char rap_svr[19]; 244 1.1 christos u_32_t rap_sbf; /* flag to indicate which of the 19 bytes have 245 1.1 christos * been filled 246 1.1 christos */ 247 1.1 christos u_32_t rap_sseq; 248 1.1 christos } raudio_t; 249 1.1 christos 250 1.1 christos #define RA_ID_END 0 251 1.1 christos #define RA_ID_UDP 1 252 1.1 christos #define RA_ID_ROBUST 7 253 1.1 christos 254 1.1 christos #define RAP_M_UDP 1 255 1.1 christos #define RAP_M_ROBUST 2 256 1.1 christos #define RAP_M_TCP 4 257 1.1 christos #define RAP_M_UDP_ROBUST (RAP_M_UDP|RAP_M_ROBUST) 258 1.1 christos 259 1.1 christos 260 1.1 christos /* 261 1.1 christos * MSN RPC proxy 262 1.1 christos */ 263 1.1 christos typedef struct msnrpcinfo { 264 1.1 christos u_int mri_flags; 265 1.1 christos int mri_cmd[2]; 266 1.1 christos u_int mri_valid; 267 1.1 christos struct in_addr mri_raddr; 268 1.1 christos u_short mri_rport; 269 1.1 christos } msnrpcinfo_t; 270 1.1 christos 271 1.1 christos 272 1.1 christos /* 273 1.1 christos * Sun RPCBIND proxy 274 1.1 christos */ 275 1.1 christos #define RPCB_MAXMSG 888 276 1.1 christos #define RPCB_RES_PMAP 0 /* Response contains a v2 port. */ 277 1.1 christos #define RPCB_RES_STRING 1 /* " " " v3 (GETADDR) string. */ 278 1.1 christos #define RPCB_RES_LIST 2 /* " " " v4 (GETADDRLIST) list. */ 279 1.1 christos #define RPCB_MAXREQS 32 /* Arbitrary limit on tracked transactions */ 280 1.1 christos 281 1.1 christos #define RPCB_REQMIN 40 282 1.1 christos #define RPCB_REQMAX 888 283 1.1 christos #define RPCB_REPMIN 20 284 1.1 christos #define RPCB_REPMAX 604 /* XXX double check this! */ 285 1.1 christos 286 1.1 christos /* 287 1.1 christos * These macros determine the number of bytes between p and the end of 288 1.1 christos * r->rs_buf relative to l. 289 1.1 christos */ 290 1.1 christos #define RPCB_BUF_END(r) (char *)((r)->rm_msgbuf + (r)->rm_buflen) 291 1.1 christos #define RPCB_BUF_GEQ(r, p, l) \ 292 1.1 christos ((RPCB_BUF_END((r)) > (char *)(p)) && \ 293 1.1 christos ((RPCB_BUF_END((r)) - (char *)(p)) >= (l))) 294 1.1 christos #define RPCB_BUF_EQ(r, p, l) \ 295 1.1 christos (RPCB_BUF_END((r)) == ((char *)(p) + (l))) 296 1.1 christos 297 1.1 christos /* 298 1.1 christos * The following correspond to RPC(B) detailed in RFC183[13]. 299 1.1 christos */ 300 1.1 christos #define RPCB_CALL 0 301 1.1 christos #define RPCB_REPLY 1 302 1.1 christos #define RPCB_MSG_VERSION 2 303 1.1 christos #define RPCB_PROG 100000 304 1.1 christos #define RPCB_GETPORT 3 305 1.1 christos #define RPCB_GETADDR 3 306 1.1 christos #define RPCB_GETADDRLIST 11 307 1.1 christos #define RPCB_MSG_ACCEPTED 0 308 1.1 christos #define RPCB_MSG_DENIED 1 309 1.1 christos 310 1.1 christos /* BEGIN (Generic XDR structures) */ 311 1.1 christos typedef struct xdr_string { 312 1.1 christos u_32_t *xs_len; 313 1.1 christos char *xs_str; 314 1.1 christos } xdr_string_t; 315 1.1 christos 316 1.1 christos typedef struct xdr_auth { 317 1.1 christos /* u_32_t xa_flavor; */ 318 1.1 christos xdr_string_t xa_string; 319 1.1 christos } xdr_auth_t; 320 1.1 christos 321 1.1 christos typedef struct xdr_uaddr { 322 1.1 christos u_32_t xu_ip; 323 1.1 christos u_short xu_port; 324 1.1 christos xdr_string_t xu_str; 325 1.1 christos } xdr_uaddr_t; 326 1.1 christos 327 1.1 christos typedef struct xdr_proto { 328 1.1 christos u_int xp_proto; 329 1.1 christos xdr_string_t xp_str; 330 1.1 christos } xdr_proto_t; 331 1.1 christos 332 1.1 christos #define xu_xslen xu_str.xs_len 333 1.1 christos #define xu_xsstr xu_str.xs_str 334 1.1 christos #define xp_xslen xp_str.xs_len 335 1.1 christos #define xp_xsstr xp_str.xs_str 336 1.1 christos /* END (Generic XDR structures) */ 337 1.1 christos 338 1.1 christos /* BEGIN (RPC call structures) */ 339 1.1 christos typedef struct pmap_args { 340 1.1 christos /* u_32_t pa_prog; */ 341 1.1 christos /* u_32_t pa_vers; */ 342 1.1 christos u_32_t *pa_prot; 343 1.1 christos /* u_32_t pa_port; */ 344 1.1 christos } pmap_args_t; 345 1.1 christos 346 1.1 christos typedef struct rpcb_args { 347 1.1 christos /* u_32_t *ra_prog; */ 348 1.1 christos /* u_32_t *ra_vers; */ 349 1.1 christos xdr_proto_t ra_netid; 350 1.1 christos xdr_uaddr_t ra_maddr; 351 1.1 christos /* xdr_string_t ra_owner; */ 352 1.1 christos } rpcb_args_t; 353 1.1 christos 354 1.1 christos typedef struct rpc_call { 355 1.1 christos /* u_32_t rc_rpcvers; */ 356 1.1 christos /* u_32_t rc_prog; */ 357 1.1 christos u_32_t *rc_vers; 358 1.1 christos u_32_t *rc_proc; 359 1.1 christos xdr_auth_t rc_authcred; 360 1.1 christos xdr_auth_t rc_authverf; 361 1.1 christos union { 362 1.1 christos pmap_args_t ra_pmapargs; 363 1.1 christos rpcb_args_t ra_rpcbargs; 364 1.1 christos } rpcb_args; 365 1.1 christos } rpc_call_t; 366 1.1 christos 367 1.1 christos #define rc_pmapargs rpcb_args.ra_pmapargs 368 1.1 christos #define rc_rpcbargs rpcb_args.ra_rpcbargs 369 1.1 christos /* END (RPC call structures) */ 370 1.1 christos 371 1.1 christos /* BEGIN (RPC reply structures) */ 372 1.1 christos typedef struct rpcb_entry { 373 1.1 christos xdr_uaddr_t re_maddr; 374 1.1 christos xdr_proto_t re_netid; 375 1.1 christos /* u_32_t re_semantics; */ 376 1.1 christos xdr_string_t re_family; 377 1.1 christos xdr_proto_t re_proto; 378 1.1 christos u_32_t *re_more; /* 1 == another entry follows */ 379 1.1 christos } rpcb_entry_t; 380 1.1 christos 381 1.1 christos typedef struct rpcb_listp { 382 1.1 christos u_32_t *rl_list; /* 1 == list follows */ 383 1.1 christos int rl_cnt; 384 1.1 christos rpcb_entry_t rl_entries[2]; /* TCP / UDP only */ 385 1.1 christos } rpcb_listp_t; 386 1.1 christos 387 1.1 christos typedef struct rpc_resp { 388 1.1 christos /* u_32_t rr_acceptdeny; */ 389 1.1 christos /* Omitted 'message denied' fork; we don't care about rejects. */ 390 1.1 christos xdr_auth_t rr_authverf; 391 1.1 christos /* u_32_t *rr_astat; */ 392 1.1 christos union { 393 1.1 christos u_32_t *resp_pmap; 394 1.1 christos xdr_uaddr_t resp_getaddr; 395 1.1 christos rpcb_listp_t resp_getaddrlist; 396 1.1 christos } rpcb_reply; 397 1.1 christos } rpc_resp_t; 398 1.1 christos 399 1.1 christos #define rr_v2 rpcb_reply.resp_pmap 400 1.1 christos #define rr_v3 rpcb_reply.resp_getaddr 401 1.1 christos #define rr_v4 rpcb_reply.resp_getaddrlist 402 1.1 christos /* END (RPC reply structures) */ 403 1.1 christos 404 1.1 christos /* BEGIN (RPC message structure & macros) */ 405 1.1 christos typedef struct rpc_msg { 406 1.1 christos char rm_msgbuf[RPCB_MAXMSG]; /* RPCB data buffer */ 407 1.1 christos u_int rm_buflen; 408 1.1 christos u_32_t *rm_xid; 409 1.1 christos /* u_32_t Call vs Reply */ 410 1.1 christos union { 411 1.1 christos rpc_call_t rb_call; 412 1.1 christos rpc_resp_t rb_resp; 413 1.1 christos } rm_body; 414 1.1 christos } rpc_msg_t; 415 1.1 christos 416 1.1 christos #define rm_call rm_body.rb_call 417 1.1 christos #define rm_resp rm_body.rb_resp 418 1.1 christos /* END (RPC message structure & macros) */ 419 1.1 christos 420 1.1 christos /* 421 1.1 christos * These code paths aren't hot enough to warrant per transaction 422 1.1 christos * mutexes. 423 1.1 christos */ 424 1.1 christos typedef struct rpcb_xact { 425 1.1 christos struct rpcb_xact *rx_next; 426 1.1 christos struct rpcb_xact **rx_pnext; 427 1.1 christos u_32_t rx_xid; /* RPC transmission ID */ 428 1.1 christos u_int rx_type; /* RPCB response type */ 429 1.1 christos u_int rx_ref; /* reference count */ 430 1.1 christos u_int rx_proto; /* transport protocol (v2 only) */ 431 1.1 christos } rpcb_xact_t; 432 1.1 christos 433 1.1 christos typedef struct rpcb_session { 434 1.1 christos ipfmutex_t rs_rxlock; 435 1.1 christos rpcb_xact_t *rs_rxlist; 436 1.1 christos } rpcb_session_t; 437 1.1 christos 438 1.1 christos /* 439 1.1 christos * For an explanation, please see the following: 440 1.1 christos * RFC1832 - Sections 3.11, 4.4, and 4.5. 441 1.1 christos */ 442 1.1 christos #define XDRALIGN(x) ((((x) % 4) != 0) ? ((((x) + 3) / 4) * 4) : (x)) 443 1.1 christos 444 1.2 christos extern int ipf_proxy_add(void *, aproxy_t *); 445 1.2 christos extern int ipf_proxy_check(fr_info_t *, struct nat *); 446 1.2 christos extern int ipf_proxy_ctl(ipf_main_softc_t *, void *, ap_ctl_t *); 447 1.2 christos extern int ipf_proxy_del(aproxy_t *); 448 1.3 darrenr extern void ipf_proxy_deref(aproxy_t *); 449 1.2 christos extern void ipf_proxy_flush(void *, int); 450 1.3 darrenr extern void ipf_proxy_free(ipf_main_softc_t *, ap_session_t *); 451 1.2 christos extern int ipf_proxy_init(void); 452 1.2 christos extern int ipf_proxy_ioctl(ipf_main_softc_t *, void *, ioctlcmd_t, int, void *); 453 1.2 christos extern aproxy_t *ipf_proxy_lookup(void *, u_int, char *); 454 1.2 christos extern int ipf_proxy_match(fr_info_t *, struct nat *); 455 1.2 christos extern int ipf_proxy_new(fr_info_t *, struct nat *); 456 1.2 christos extern int ipf_proxy_ok(fr_info_t *, tcphdr_t *, struct ipnat *); 457 1.2 christos extern void aps_free(ipf_main_softc_t *, void *, ap_session_t *); 458 1.2 christos extern int ipf_proxy_main_load(void); 459 1.2 christos extern int ipf_proxy_main_unload(void); 460 1.3 darrenr extern ipnat_t *ipf_proxy_rule_fwd(nat_t *); 461 1.3 darrenr extern ipnat_t *ipf_proxy_rule_rev(nat_t *); 462 1.2 christos extern void *ipf_proxy_soft_create(ipf_main_softc_t *); 463 1.2 christos extern void ipf_proxy_soft_destroy(ipf_main_softc_t *, void *); 464 1.3 darrenr extern int ipf_proxy_soft_fini(ipf_main_softc_t *, void *); 465 1.2 christos extern int ipf_proxy_soft_init(ipf_main_softc_t *, void *); 466 1.1 christos 467 1.2 christos #endif /* _NETINET_IP_PROXY_H_ */ 468