master
  1/*	$NetBSD: ip_encap.h,v 1.28 2022/12/07 08:33:02 knakahara Exp $	*/
  2/*	$KAME: ip_encap.h,v 1.7 2000/03/25 07:23:37 sumikawa Exp $	*/
  3
  4/*
  5 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
  6 * All rights reserved.
  7 *
  8 * Redistribution and use in source and binary forms, with or without
  9 * modification, are permitted provided that the following conditions
 10 * are met:
 11 * 1. Redistributions of source code must retain the above copyright
 12 *    notice, this list of conditions and the following disclaimer.
 13 * 2. Redistributions in binary form must reproduce the above copyright
 14 *    notice, this list of conditions and the following disclaimer in the
 15 *    documentation and/or other materials provided with the distribution.
 16 * 3. Neither the name of the project nor the names of its contributors
 17 *    may be used to endorse or promote products derived from this software
 18 *    without specific prior written permission.
 19 *
 20 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 23 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 30 * SUCH DAMAGE.
 31 */
 32
 33#ifndef _NETINET_IP_ENCAP_H_
 34#define _NETINET_IP_ENCAP_H_
 35
 36#ifdef _KERNEL
 37
 38#include <sys/pslist.h>
 39#include <sys/psref.h>
 40
 41struct encapsw {
 42	union {
 43		struct encapsw4 {
 44			void	(*pr_input)	/* input to protocol (from below) */
 45				(struct mbuf *, int, int, void *);
 46			void	*(*pr_ctlinput)		/* control input (from below) */
 47				(int, const struct sockaddr *, void *, void *);
 48		} _encapsw4;
 49		struct encapsw6 {
 50			int	(*pr_input)	/* input to protocol (from below) */
 51				(struct mbuf **, int *, int, void *);
 52			void	*(*pr_ctlinput)		/* control input (from below) */
 53				(int, const struct sockaddr *, void *, void *);
 54		} _encapsw6;
 55	} encapsw46;
 56};
 57
 58#define encapsw4 encapsw46._encapsw4
 59#define encapsw6 encapsw46._encapsw6
 60
 61typedef	int encap_priofunc_t(struct mbuf *, int, int, void *);
 62
 63struct encap_key {
 64	union  {
 65		struct sockaddr		local_u_sa;
 66		struct sockaddr_in	local_u_sin;
 67		struct sockaddr_in6	local_u_sin6;
 68	}	local_u;
 69#define local_sa	local_u.local_u_sa
 70#define local_sin	local_u.local_u_sin
 71#define local_sin6	local_u.local_u_sin6
 72
 73	union  {
 74		struct sockaddr		remote_u_sa;
 75		struct sockaddr_in	remote_u_sin;
 76		struct sockaddr_in6	remote_u_sin6;
 77	}	remote_u;
 78#define remote_sa	remote_u.remote_u_sa
 79#define remote_sin	remote_u.remote_u_sin
 80#define remote_sin6	remote_u.remote_u_sin6
 81
 82	u_int seq;
 83};
 84
 85struct encaptab {
 86	struct pslist_entry chain;
 87	int af;
 88	int proto;			/* -1: don't care, I'll check myself */
 89	struct sockaddr *addrpack;	/* malloc'ed, for lookup */
 90	struct sockaddr *src;		/* my addr */
 91	struct sockaddr *dst;		/* remote addr */
 92	encap_priofunc_t *func;
 93	const struct encapsw *esw;
 94	void *arg;
 95	struct encap_key key;
 96	u_int flag;
 97	struct psref_target	psref;
 98};
 99
100#define IP_ENCAP_ADDR_ENABLE	__BIT(0)
101
102/* to lookup a pair of address using map */
103struct sockaddr_pack {
104	u_int8_t sp_len;
105	u_int8_t sp_family;	/* not really used */
106	/* followed by variable-length data */
107};
108
109struct ip_pack4 {
110	struct sockaddr_pack p;
111	struct sockaddr_in mine;
112	struct sockaddr_in yours;
113};
114struct ip_pack6 {
115	struct sockaddr_pack p;
116	struct sockaddr_in6 mine;
117	struct sockaddr_in6 yours;
118};
119
120void	encapinit(void);
121
122void	encap_init(void);
123void	encap4_input(struct mbuf *, int, int);
124int	encap6_input(struct mbuf **, int *, int);
125const struct encaptab *encap_attach_func(int, int,
126	encap_priofunc_t *,
127	const struct encapsw *, void *);
128const struct encaptab *encap_attach_addr(int, int,
129	const struct sockaddr *, const struct sockaddr *,
130	encap_priofunc_t *, const struct encapsw *, void *);
131void	*encap6_ctlinput(int, const struct sockaddr *, void *);
132int	encap_detach(const struct encaptab *);
133
134int	encap_lock_enter(void);
135void	encap_lock_exit(void);
136bool	encap_lock_held(void);
137
138#define	ENCAP_PR_WRAP_CTLINPUT(name)				\
139static void *							\
140name##_wrapper(int a, const struct sockaddr *b, void *c, void *d) \
141{								\
142	void *rv;						\
143	KERNEL_LOCK(1, NULL);					\
144	rv = name(a, b, c, d);					\
145	KERNEL_UNLOCK_ONE(NULL);				\
146	return rv;						\
147}
148#endif
149
150#endif /* !_NETINET_IP_ENCAP_H_ */