1/* $NetBSD: in_pcb_hdr.h,v 1.6 2011/05/03 18:28:45 dyoung Exp $ */ 2 3/* 4 * Copyright (C) 2003 WIDE Project. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the project nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32/* 33 * Copyright (c) 1982, 1986, 1990, 1993 34 * The Regents of the University of California. All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 1. Redistributions of source code must retain the above copyright 40 * notice, this list of conditions and the following disclaimer. 41 * 2. Redistributions in binary form must reproduce the above copyright 42 * notice, this list of conditions and the following disclaimer in the 43 * documentation and/or other materials provided with the distribution. 44 * 3. Neither the name of the University nor the names of its contributors 45 * may be used to endorse or promote products derived from this software 46 * without specific prior written permission. 47 * 48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * SUCH DAMAGE. 59 * 60 * @(#)in_pcb.h 8.1 (Berkeley) 6/10/93 61 */ 62 63#ifndef _NETINET_IN_PCB_HDR_H_ 64#define _NETINET_IN_PCB_HDR_H_ 65 66#include <sys/queue.h> 67 68struct inpcbpolicy; 69 70/* 71 * align it with inpcb and in6pcb! 72 */ 73struct inpcb_hdr { 74 LIST_ENTRY(inpcb_hdr) inph_hash; 75 LIST_ENTRY(inpcb_hdr) inph_lhash; 76 CIRCLEQ_ENTRY(inpcb_hdr) inph_queue; 77 int inph_af; /* address family - AF_INET */ 78 void * inph_ppcb; /* pointer to per-protocol pcb */ 79 int inph_state; /* bind/connect state */ 80 int inph_rfc6056algo; 81 struct socket *inph_socket; /* back pointer to socket */ 82 struct inpcbtable *inph_table; 83#if 1 /* IPSEC */ 84 struct inpcbpolicy *inph_sp; /* security policy */ 85#endif 86}; 87 88#define sotoinpcb_hdr(so) ((struct inpcb_hdr *)(so)->so_pcb) 89 90LIST_HEAD(inpcbhead, inpcb_hdr); 91 92struct vestigial_inpcb; 93 94/* Hooks for vestigial pcb entries. 95 * If vestigial entries exist for a table (TCP only) 96 * the vestigial pointer is set. 97 */ 98typedef struct vestigial_hooks { 99 /* IPv4 hooks */ 100 void *(*init_ports4)(struct in_addr, u_int, int); 101 int (*next_port4)(void *, struct vestigial_inpcb *); 102 int (*lookup4)(struct in_addr, uint16_t, 103 struct in_addr, uint16_t, 104 struct vestigial_inpcb *); 105 /* IPv6 hooks */ 106 void *(*init_ports6)(const struct in6_addr*, u_int, int); 107 int (*next_port6)(void *, struct vestigial_inpcb *); 108 int (*lookup6)(const struct in6_addr *, uint16_t, 109 const struct in6_addr *, uint16_t, 110 struct vestigial_inpcb *); 111} vestigial_hooks_t; 112 113struct inpcbtable { 114 CIRCLEQ_HEAD(, inpcb_hdr) inpt_queue; 115 struct inpcbhead *inpt_porthashtbl; 116 struct inpcbhead *inpt_bindhashtbl; 117 struct inpcbhead *inpt_connecthashtbl; 118 u_long inpt_porthash; 119 u_long inpt_bindhash; 120 u_long inpt_connecthash; 121 u_int16_t inpt_lastport; 122 u_int16_t inpt_lastlow; 123 124 vestigial_hooks_t *vestige; 125}; 126#define inpt_lasthi inpt_lastport 127 128/* states in inp_state: */ 129#define INP_ATTACHED 0 130#define INP_BOUND 1 131#define INP_CONNECTED 2 132 133#endif /* !_NETINET_IN_PCB_HDR_H_ */ 134