1/* 2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * The contents of this file constitute Original Code as defined in and 7 * are subject to the Apple Public Source License Version 1.1 (the 8 * "License"). You may not use this file except in compliance with the 9 * License. Please obtain a copy of the License at 10 * http://www.apple.com/publicsource and read it before using this file. 11 * 12 * This Original Code and all software distributed under the License are 13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER 14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the 17 * License for the specific language governing rights and limitations 18 * under the License. 19 * 20 * @APPLE_LICENSE_HEADER_END@ 21 */ 22/* 23 * Copyright (c) 1982, 1986, 1993 24 * The Regents of the University of California. All rights reserved. 25 * 26 * Redistribution and use in source and binary forms, with or without 27 * modification, are permitted provided that the following conditions 28 * are met: 29 * 1. Redistributions of source code must retain the above copyright 30 * notice, this list of conditions and the following disclaimer. 31 * 2. Redistributions in binary form must reproduce the above copyright 32 * notice, this list of conditions and the following disclaimer in the 33 * documentation and/or other materials provided with the distribution. 34 * 3. All advertising materials mentioning features or use of this software 35 * must display the following acknowledgement: 36 * This product includes software developed by the University of 37 * California, Berkeley and its contributors. 38 * 4. Neither the name of the University nor the names of its contributors 39 * may be used to endorse or promote products derived from this software 40 * without specific prior written permission. 41 * 42 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 43 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 44 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 45 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 46 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 47 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 48 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 50 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 51 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 52 * SUCH DAMAGE. 53 * 54 * @(#)ip_var.h 8.2 (Berkeley) 1/9/95 55 */ 56 57#ifndef _NETINET_IP_VAR_H_ 58#define _NETINET_IP_VAR_H_ 59#include <sys/appleapiopts.h> 60 61/* 62 * Overlay for ip header used by other protocols (tcp, udp). 63 */ 64struct ipovly { 65 u_char ih_x1[9]; /* (unused) */ 66 u_char ih_pr; /* protocol */ 67 u_short ih_len; /* protocol length */ 68 struct in_addr ih_src; /* source internet address */ 69 struct in_addr ih_dst; /* destination internet address */ 70}; 71 72#ifdef KERNEL_PRIVATE 73/* 74 * Ip reassembly queue structure. Each fragment 75 * being reassembled is attached to one of these structures. 76 * They are timed out after ipq_ttl drops to 0, and may also 77 * be reclaimed if memory becomes tight. 78 */ 79struct ipq { 80 struct ipq *next,*prev; /* to other reass headers */ 81 u_char ipq_ttl; /* time for reass q to live */ 82 u_char ipq_p; /* protocol of this fragment */ 83 u_short ipq_id; /* sequence id for reassembly */ 84 struct mbuf *ipq_frags; /* to ip headers of fragments */ 85 struct in_addr ipq_src,ipq_dst; 86 u_long ipq_nfrags; 87 TAILQ_ENTRY(ipq) ipq_list; 88 u_long reserved[1]; /* for future use */ 89#if IPDIVERT 90#ifdef IPDIVERT_44 91 u_int32_t ipq_div_info; /* ipfw divert port & flags */ 92#else 93 u_int16_t ipq_divert; /* ipfw divert port (Maintain backward compat.) */ 94#endif 95 u_int16_t ipq_div_cookie; /* ipfw divert cookie */ 96#endif 97}; 98 99/* 100 * Structure stored in mbuf in inpcb.ip_options 101 * and passed to ip_output when ip options are in use. 102 * The actual length of the options (including ipopt_dst) 103 * is in m_len. 104 */ 105#endif /* KERNEL_PRIVATE */ 106#define MAX_IPOPTLEN 40 107#ifdef KERNEL_PRIVATE 108 109struct ipoption { 110 struct in_addr ipopt_dst; /* first-hop dst if source routed */ 111 char ipopt_list[MAX_IPOPTLEN]; /* options proper */ 112}; 113 114/* 115 * Structure attached to inpcb.ip_moptions and 116 * passed to ip_output when IP multicast options are in use. 117 */ 118struct ip_moptions { 119 struct ifnet *imo_multicast_ifp; /* ifp for outgoing multicasts */ 120 u_char imo_multicast_ttl; /* TTL for outgoing multicasts */ 121 u_char imo_multicast_loop; /* 1 => hear sends if a member */ 122 u_short imo_num_memberships; /* no. memberships this socket */ 123 struct in_multi *imo_membership[IP_MAX_MEMBERSHIPS]; 124 u_long imo_multicast_vif; /* vif num outgoing multicasts */ 125 struct in_addr imo_multicast_addr; /* ifindex/addr on MULTICAST_IF */ 126}; 127 128/* mbuf tag for ip_forwarding info */ 129struct ip_fwd_tag { 130 struct sockaddr_in *next_hop; /* next_hop */ 131}; 132 133#endif /* KERNEL_PRIVATE */ 134 135struct ipstat { 136 u_long ips_total; /* total packets received */ 137 u_long ips_badsum; /* checksum bad */ 138 u_long ips_tooshort; /* packet too short */ 139 u_long ips_toosmall; /* not enough data */ 140 u_long ips_badhlen; /* ip header length < data size */ 141 u_long ips_badlen; /* ip length < ip header length */ 142 u_long ips_fragments; /* fragments received */ 143 u_long ips_fragdropped; /* frags dropped (dups, out of space) */ 144 u_long ips_fragtimeout; /* fragments timed out */ 145 u_long ips_forward; /* packets forwarded */ 146 u_long ips_fastforward; /* packets fast forwarded */ 147 u_long ips_cantforward; /* packets rcvd for unreachable dest */ 148 u_long ips_redirectsent; /* packets forwarded on same net */ 149 u_long ips_noproto; /* unknown or unsupported protocol */ 150 u_long ips_delivered; /* datagrams delivered to upper level*/ 151 u_long ips_localout; /* total ip packets generated here */ 152 u_long ips_odropped; /* lost packets due to nobufs, etc. */ 153 u_long ips_reassembled; /* total packets reassembled ok */ 154 u_long ips_fragmented; /* datagrams successfully fragmented */ 155 u_long ips_ofragments; /* output fragments created */ 156 u_long ips_cantfrag; /* don't fragment flag was set, etc. */ 157 u_long ips_badoptions; /* error in option processing */ 158 u_long ips_noroute; /* packets discarded due to no route */ 159 u_long ips_badvers; /* ip version != 4 */ 160 u_long ips_rawout; /* total raw ip packets generated */ 161 u_long ips_toolong; /* ip length > max ip packet size */ 162 u_long ips_notmember; /* multicasts for unregistered grps */ 163 u_long ips_nogif; /* no match gif found */ 164 u_long ips_badaddr; /* invalid address on header */ 165}; 166 167struct ip_linklocal_stat { 168 u_long iplls_in_total; 169 u_long iplls_in_badttl; 170 u_long iplls_out_total; 171 u_long iplls_out_badttl; 172}; 173 174#ifdef KERNEL_PRIVATE 175/* flags passed to ip_output as last parameter */ 176#define IP_FORWARDING 0x1 /* most of ip header exists */ 177#define IP_RAWOUTPUT 0x2 /* raw ip header exists */ 178#define IP_NOIPSEC 0x4 /* No IPSec processing */ 179#define IP_ROUTETOIF SO_DONTROUTE /* bypass routing tables (0x0010) */ 180#define IP_ALLOWBROADCAST SO_BROADCAST /* can send broadcast packets (0x0020) */ 181 182struct ip; 183struct inpcb; 184struct route; 185struct sockopt; 186 187extern struct ipstat ipstat; 188#if !defined(RANDOM_IP_ID) || RANDOM_IP_ID == 0 189extern u_short ip_id; /* ip packet ctr, for ids */ 190#endif 191extern int ip_defttl; /* default IP ttl */ 192extern int ipforwarding; /* ip forwarding */ 193extern struct protosw *ip_protox[]; 194extern struct socket *ip_rsvpd; /* reservation protocol daemon */ 195extern struct socket *ip_mrouter; /* multicast routing daemon */ 196extern int (*legal_vif_num)(int); 197extern u_long (*ip_mcast_src)(int); 198extern int rsvp_on; 199extern struct pr_usrreqs rip_usrreqs; 200 201int ip_ctloutput(struct socket *, struct sockopt *sopt); 202void ip_drain(void); 203void ip_freemoptions(struct ip_moptions *); 204void ip_init(void); 205extern int (*ip_mforward)(struct ip *, struct ifnet *, struct mbuf *, 206 struct ip_moptions *); 207int ip_output(struct mbuf *, 208 struct mbuf *, struct route *, int, struct ip_moptions *); 209int ip_output_list(struct mbuf *, int, 210 struct mbuf *, struct route *, int, struct ip_moptions *); 211struct in_ifaddr * 212 ip_rtaddr(struct in_addr, struct route *); 213void ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *, 214 struct mbuf *); 215void ip_slowtimo(void); 216struct mbuf * 217 ip_srcroute(void); 218void ip_stripoptions(struct mbuf *, struct mbuf *); 219#if RANDOM_IP_ID 220u_int16_t 221 ip_randomid(void); 222#endif 223int rip_ctloutput(struct socket *, struct sockopt *); 224void rip_ctlinput(int, struct sockaddr *, void *); 225void rip_init(void); 226void rip_input(struct mbuf *, int); 227int rip_output(struct mbuf *, struct socket *, u_long); 228int rip_unlock(struct socket *, int, int); 229void ipip_input(struct mbuf *, int); 230void rsvp_input(struct mbuf *, int); 231int ip_rsvp_init(struct socket *); 232int ip_rsvp_done(void); 233int ip_rsvp_vif_init(struct socket *, struct sockopt *); 234int ip_rsvp_vif_done(struct socket *, struct sockopt *); 235void ip_rsvp_force_done(struct socket *); 236 237void in_delayed_cksum(struct mbuf *m); 238 239#endif KERNEL_PRIVATE 240#endif !_NETINET_IP_VAR_H_ 241

