1 /*        $NetBSD: ip_var.h,v 1.134 2022/04/10 09:50:46 andvar Exp $  */
2 
3 /*
4  * Copyright (c) 1982, 1986, 1993
5  *        The Regents of the University of California.  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 University 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 REGENTS 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 REGENTS 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  *        @(#)ip_var.h        8.2 (Berkeley) 1/9/95
32  */
33 
34 #ifndef _NETINET_IP_VAR_H_
35 #define _NETINET_IP_VAR_H_
36 
37 #include <sys/queue.h>
38 #include <net/route.h>
39 
40 /*
41  * Overlay for ip header used by other protocols (tcp, udp).
42  */
43 struct ipovly {
44           u_int8_t  ih_x1[9];           /* (unused) */
45           u_int8_t  ih_pr;              /* protocol */
46           u_int16_t ih_len;             /* protocol length */
47           struct      in_addr ih_src;   /* source internet address */
48           struct      in_addr ih_dst;   /* destination internet address */
49 };
50 #ifdef __CTASSERT
51 __CTASSERT(sizeof(struct ipovly) == 20);
52 #endif
53 
54 /*
55  * IP Flow structure
56  */
57 struct ipflow {
58           TAILQ_ENTRY(ipflow) ipf_list; /* next in active list */
59           TAILQ_ENTRY(ipflow) ipf_hash; /* next ipflow in bucket */
60           size_t ipf_hashidx;           /* own hash index of ipflowtable[] */
61           struct in_addr ipf_dst;                 /* destination address */
62           struct in_addr ipf_src;                 /* source address */
63           uint8_t ipf_tos;              /* type-of-service */
64           struct route ipf_ro;                    /* associated route entry */
65           u_long ipf_uses;              /* number of uses in this period */
66           u_long ipf_last_uses;                   /* number of uses in last period */
67           u_long ipf_dropped;           /* ENOBUFS returned by if_output */
68           u_long ipf_errors;            /* other errors returned by if_output */
69           u_int ipf_timer;              /* lifetime timer */
70 };
71 
72 /*
73  * TCP sequence queue structure.
74  */
75 TAILQ_HEAD(ipqehead, ipqent);
76 struct ipqent {
77           TAILQ_ENTRY(ipqent) ipqe_q;
78           struct mbuf *ipqe_m;
79           TAILQ_ENTRY(ipqent) ipqe_timeq;
80           u_int32_t ipqe_seq;
81           u_int32_t ipqe_len;
82           u_int32_t ipqe_flags;
83 };
84 
85 /*
86  * Structure stored in mbuf in inpcb.ip_options
87  * and passed to ip_output when ip options are in use.
88  * The actual length of the options (including ipopt_dst)
89  * is in m_len.
90  */
91 #define   MAX_IPOPTLEN        40
92 
93 struct ipoption {
94           struct    in_addr ipopt_dst;  /* first-hop dst if source routed */
95           int8_t    ipopt_list[MAX_IPOPTLEN];     /* options proper */
96 };
97 
98 /*
99  * Structure attached to inpcb.ip_moptions and
100  * passed to ip_output when IP multicast options are in use.
101  */
102 struct ip_moptions {
103           if_index_t imo_multicast_if_index; /* I/F for outgoing multicasts */
104           struct in_addr imo_multicast_addr; /* ifindex/addr on MULTICAST_IF */
105           u_int8_t  imo_multicast_ttl;  /* TTL for outgoing multicasts */
106           u_int8_t  imo_multicast_loop; /* 1 => hear sends if a member */
107           u_int16_t imo_num_memberships;          /* no. memberships this socket */
108           struct      in_multi *imo_membership[IP_MAX_MEMBERSHIPS];
109 };
110 
111 struct ip_pktopts {
112           struct sockaddr_in ippo_laddr;          /* source address */
113           struct ip_moptions *ippo_imo; /* inp->inp_moptions or &ippo_imobuf */
114           struct ip_moptions ippo_imobuf;         /* use when IP_PKTINFO */
115 };
116 
117 /*
118  * IP statistics.
119  * Each counter is an unsigned 64-bit value.
120  */
121 #define   IP_STAT_TOTAL                 0         /* total packets received */
122 #define   IP_STAT_BADSUM                1         /* checksum bad */
123 #define   IP_STAT_TOOSHORT    2         /* packet too short */
124 #define   IP_STAT_TOOSMALL    3         /* not enough data */
125 #define   IP_STAT_BADHLEN               4         /* ip header length < data size */
126 #define   IP_STAT_BADLEN                5         /* ip length < ip header length */
127 #define   IP_STAT_FRAGMENTS   6         /* fragments received */
128 #define   IP_STAT_FRAGDROPPED 7         /* frags dropped (dups, out of space) */
129 #define   IP_STAT_FRAGTIMEOUT 8         /* fragments timed out */
130 #define   IP_STAT_FORWARD               9         /* packets forwarded */
131 #define   IP_STAT_FASTFORWARD 10        /* packets fast forwarded */
132 #define   IP_STAT_CANTFORWARD 11        /* packets rcvd for unreachable dest */
133 #define   IP_STAT_REDIRECTSENT          12        /* packets forwareded on same net */
134 #define   IP_STAT_NOPROTO               13        /* unknown or unsupported protocol */
135 #define   IP_STAT_DELIVERED   14        /* datagrams delivered to upper level */
136 #define   IP_STAT_LOCALOUT    15        /* total ip packets generated here */
137 #define   IP_STAT_ODROPPED    16        /* lost packets due to nobufs, etc. */
138 #define   IP_STAT_REASSEMBLED 17        /* total packets reassembled ok */
139 #define   IP_STAT_FRAGMENTED  18        /* datagrams successfully fragmented */
140 #define   IP_STAT_OFRAGMENTS  19        /* output fragments created */
141 #define   IP_STAT_CANTFRAG    20        /* don't fragment flag was set, etc. */
142 #define   IP_STAT_BADOPTIONS  21        /* error in option processing */
143 #define   IP_STAT_NOROUTE               22        /* packets discarded due to no route */
144 #define   IP_STAT_BADVERS               23        /* ip version != 4 */
145 #define   IP_STAT_RAWOUT                24        /* total raw ip packets generated */
146 #define   IP_STAT_BADFRAGS    25        /* malformed fragments (bad length) */
147 #define   IP_STAT_RCVMEMDROP  26        /* frags dropped for lack of memory */
148 #define   IP_STAT_TOOLONG               27        /* ip length > max ip packet size */
149 #define   IP_STAT_NOGIF                 28        /* no match gif found */
150 #define   IP_STAT_BADADDR               29        /* invalid address on header */
151 #define   IP_STAT_NOL2TP                30        /* no match l2tp found */
152 #define   IP_STAT_NOIPSEC               31        /* no match ipsec(4) found */
153 #define   IP_STAT_PFILDROP_IN 32        /* dropped by pfil (PFIL_IN) */
154 #define   IP_STAT_PFILDROP_OUT          33        /* dropped by pfil (PFIL_OUT) */
155 #define   IP_STAT_IPSECDROP_IN          34        /* dropped by IPsec SP check */
156 #define   IP_STAT_IPSECDROP_OUT         35        /* dropped by IPsec SP check */
157 #define   IP_STAT_IFDROP                36        /* dropped due to interface state */
158 #define   IP_STAT_TIMXCEED    37        /* time to live exceeded */
159 #define   IP_STAT_IFNOADDR    38        /* interface has no IP address */
160 #define   IP_STAT_RTREJECT    39        /* rejected by route */
161 #define   IP_STAT_BCASTDENIED 40        /* broadcast prohibited */
162 
163 #define   IP_NSTATS           41
164 
165 #ifdef _KERNEL
166 
167 #ifdef _KERNEL_OPT
168 #include "opt_gateway.h"
169 #include "opt_mbuftrace.h"
170 #endif
171 
172 /*
173  * The following flags can be passed to ip_output() as last parameter
174  */
175 #define   IP_FORWARDING                 0x0001              /* most of ip header exists */
176 #define   IP_RAWOUTPUT                  0x0002              /* raw ip header exists */
177 #define   IP_RETURNMTU                  0x0004              /* pass back mtu on EMSGSIZE */
178 #define   IP_NOIPNEWID                  0x0008              /* don't fill in ip_id */
179 __CTASSERT(SO_DONTROUTE ==    0x0010);
180 __CTASSERT(SO_BROADCAST ==    0x0020);
181 #define   IP_ROUTETOIF                  SO_DONTROUTE        /* bypass routing tables */
182 #define   IP_ALLOWBROADCAST   SO_BROADCAST        /* can send broadcast packets */
183 
184 #define   IP_IGMP_MCAST                 0x0040              /* IGMP for mcast join/leave */
185 #define   IP_MTUDISC                    0x0400              /* Path MTU Discovery; set DF */
186 #define   IP_ROUTETOIFINDEX   0x0800    /* force route imo_multicast_if_index */
187 
188 extern struct domain inetdomain;
189 extern const struct pr_usrreqs rip_usrreqs;
190 
191 extern int   ip_defttl;                           /* default IP ttl */
192 extern int   ipforwarding;              /* ip forwarding */
193 extern int   ip_mtudisc;                /* mtu discovery */
194 extern int   ip_mtudisc_timeout;        /* seconds to timeout mtu discovery */
195 extern int   anonportmin;               /* minimum ephemeral port */
196 extern int   anonportmax;               /* maximum ephemeral port */
197 extern int   lowportmin;                /* minimum reserved port */
198 extern int   lowportmax;                /* maximum reserved port */
199 extern int   ip_do_loopback_cksum;      /* do IP checksum on loopback? */
200 extern struct rttimer_queue *ip_mtudisc_timeout_q;
201 #ifdef MBUFTRACE
202 extern struct mowner ip_rx_mowner;
203 extern struct mowner ip_tx_mowner;
204 #endif
205 struct     inpcb;
206 struct   sockopt;
207 
208 void      ip_init(void);
209 void      in_init(void);
210 
211 int        ip_ctloutput(int, struct socket *, struct sockopt *);
212 int        ip_setpktopts(struct mbuf *, struct ip_pktopts *, int *,
213               struct inpcb *, kauth_cred_t);
214 void       ip_drain(void);
215 void       ip_drainstub(void);
216 void       ip_freemoptions(struct ip_moptions *);
217 int        ip_optcopy(struct ip *, struct ip *);
218 u_int      ip_optlen(struct inpcb *);
219 int        ip_output(struct mbuf *, struct mbuf *, struct route *, int,
220               struct ip_moptions *, struct inpcb *);
221 int        ip_fragment(struct mbuf *, struct ifnet *, u_long);
222 
223 void       ip_reass_init(void);
224 int        ip_reass_packet(struct mbuf **);
225 void       ip_reass_slowtimo(void);
226 void       ip_reass_drain(void);
227 
228 void       ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *,
229              struct mbuf *);
230 void       ip_slowtimo(void);
231 void       ip_fasttimo(void);
232 struct mbuf *
233            ip_srcroute(struct mbuf *);
234 int        ip_sysctl(int *, u_int, void *, size_t *, void *, size_t);
235 void       ip_statinc(u_int);
236 void *     rip_ctlinput(int, const struct sockaddr *, void *);
237 int        rip_ctloutput(int, struct socket *, struct sockopt *);
238 void       rip_init(void);
239 void       rip_input(struct mbuf *, int, int);
240 int        rip_output(struct mbuf *, struct inpcb *, struct mbuf *, struct lwp *);
241 int        rip_usrreq(struct socket *,
242               int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *);
243 
244 int       ip_setmoptions(struct ip_moptions **, const struct sockopt *sopt);
245 int       ip_getmoptions(struct ip_moptions *, struct sockopt *sopt);
246 
247 int       ip_if_output(struct ifnet * const, struct mbuf * const,
248               const struct sockaddr * const, const struct rtentry *);
249 
250 /* IP Flow interface. */
251 void      ipflow_init(void);
252 void      ipflow_poolinit(void);
253 void      ipflow_create(struct route *, struct mbuf *);
254 void      ipflow_slowtimo(void);
255 int       ipflow_invalidate_all(int);
256 
257 #endif  /* _KERNEL */
258 
259 #endif /* !_NETINET_IP_VAR_H_ */
260