master
  1/*	$NetBSD: ip6protosw.h,v 1.27 2019/03/19 13:38:53 msaitoh Exp $	*/
  2/*	$KAME: ip6protosw.h,v 1.22 2001/02/08 18:02:08 itojun 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
 34/*	BSDI protosw.h,v 2.3 1996/10/11 16:02:40 pjd Exp	*/
 35
 36/*-
 37 * Copyright (c) 1982, 1986, 1993
 38 *	The Regents of the University of California.  All rights reserved.
 39 *
 40 * Redistribution and use in source and binary forms, with or without
 41 * modification, are permitted provided that the following conditions
 42 * are met:
 43 * 1. Redistributions of source code must retain the above copyright
 44 *    notice, this list of conditions and the following disclaimer.
 45 * 2. Redistributions in binary form must reproduce the above copyright
 46 *    notice, this list of conditions and the following disclaimer in the
 47 *    documentation and/or other materials provided with the distribution.
 48 * 3. Neither the name of the University nor the names of its contributors
 49 *    may be used to endorse or promote products derived from this software
 50 *    without specific prior written permission.
 51 *
 52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 55 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 62 * SUCH DAMAGE.
 63 *
 64 *	@(#)protosw.h	8.1 (Berkeley) 6/2/93
 65 */
 66
 67#ifndef _NETINET6_IP6PROTOSW_H_
 68#define _NETINET6_IP6PROTOSW_H_
 69
 70/*
 71 * Protocol switch table for IPv6.
 72 * All other definitions should refer to sys/protosw.h
 73 */
 74
 75struct mbuf;
 76struct sockaddr;
 77struct socket;
 78struct domain;
 79struct proc;
 80struct ip6_hdr;
 81struct icmp6_hdr;
 82struct in6_addr;
 83
 84/*
 85 * argument type for the last arg of pr_ctlinput().
 86 * should be consulted only with AF_INET6 family.
 87 *
 88 * IPv6 ICMP IPv6 [exthdrs] finalhdr payload
 89 * ^    ^    ^              ^
 90 * |    |    ip6c_ip6       ip6c_off
 91 * |    ip6c_icmp6
 92 * ip6c_m
 93 *
 94 * ip6c_finaldst usually points to ip6c_ip6->ip6_dst.  if the original
 95 * (internal) packet carries a routing header, it may point the final
 96 * destination address in the routing header.
 97 *
 98 * ip6c_src: ip6c_ip6->ip6_src + scope info + flowlabel in ip6c_ip6
 99 *	(beware of flowlabel, if you try to compare it against others)
100 * ip6c_dst: ip6c_finaldst + scope info
101 */
102struct ip6ctlparam {
103	struct mbuf *ip6c_m;		/* start of mbuf chain */
104	struct icmp6_hdr *ip6c_icmp6;	/* icmp6 header of target packet */
105	struct ip6_hdr *ip6c_ip6;	/* ip6 header of target packet */
106	int ip6c_off;			/* offset of the target proto header */
107	struct sockaddr_in6 *ip6c_src;	/* srcaddr w/ additional info */
108	struct sockaddr_in6 *ip6c_dst;	/* (final) dstaddr w/ additional info */
109	struct in6_addr *ip6c_finaldst;	/* final destination address */
110	void *ip6c_cmdarg;		/* control command dependent data */
111	u_int8_t ip6c_nxt;		/* final next header field */
112};
113
114struct ip6protosw {
115	int 	pr_type;		/* socket type used for */
116	struct	domain *pr_domain;	/* domain protocol a member of */
117	short	pr_protocol;		/* protocol number */
118	short	pr_flags;		/* see below */
119
120/* protocol-protocol hooks */
121	int	(*pr_input)		/* input to protocol (from below) */
122			(struct mbuf **, int *, int);
123	void	*(*pr_ctlinput)		/* control input (from below) */
124			(int, const struct sockaddr *, void *);
125	int	(*pr_ctloutput)		/* control output (from above) */
126			(int, struct socket *, struct sockopt *);
127
128/* user-protocol hook */
129	const struct pr_usrreqs *pr_usrreqs;
130
131/* utility hooks */
132	void	(*pr_init)		/* initialization hook */
133			(void);
134
135	void	(*pr_fasttimo)		/* fast timeout (200ms) */
136			(void);
137	void	(*pr_slowtimo)		/* slow timeout (500ms) */
138			(void);
139	void	(*pr_drain)		/* flush any excess space possible */
140			(void);
141};
142
143#ifdef _KERNEL
144#define	PR_WRAP_INPUT6(name)				\
145static int						\
146name##_wrapper(struct mbuf **mp, int *offp, int proto)	\
147{							\
148	int rv;						\
149	mutex_enter(softnet_lock);			\
150	rv = name(mp, offp, proto);			\
151	mutex_exit(softnet_lock);			\
152	return rv;					\
153}
154#endif
155
156extern const struct ip6protosw inet6sw[];
157
158#endif /* !_NETINET6_IP6PROTOSW_H_ */