ip_var.h revision 181803
1235267Sgabor/*- 2235267Sgabor * Copyright (c) 1982, 1986, 1993 3235267Sgabor * The Regents of the University of California. All rights reserved. 4235267Sgabor * 5235267Sgabor * Redistribution and use in source and binary forms, with or without 6235267Sgabor * modification, are permitted provided that the following conditions 7235267Sgabor * are met: 8235267Sgabor * 1. Redistributions of source code must retain the above copyright 9235267Sgabor * notice, this list of conditions and the following disclaimer. 10235267Sgabor * 2. Redistributions in binary form must reproduce the above copyright 11235267Sgabor * notice, this list of conditions and the following disclaimer in the 12235267Sgabor * documentation and/or other materials provided with the distribution. 13235267Sgabor * 4. Neither the name of the University nor the names of its contributors 14235267Sgabor * may be used to endorse or promote products derived from this software 15235267Sgabor * without specific prior written permission. 16235267Sgabor * 17235267Sgabor * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18235267Sgabor * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19235267Sgabor * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20235267Sgabor * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21235267Sgabor * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22235267Sgabor * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23235267Sgabor * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24235267Sgabor * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25235267Sgabor * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26235267Sgabor * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27235267Sgabor * SUCH DAMAGE. 28235267Sgabor * 29235267Sgabor * @(#)ip_var.h 8.2 (Berkeley) 1/9/95 30235267Sgabor * $FreeBSD: head/sys/netinet/ip_var.h 181803 2008-08-17 23:27:27Z bz $ 31235267Sgabor */ 32235267Sgabor 33235267Sgabor#ifndef _NETINET_IP_VAR_H_ 34235267Sgabor#define _NETINET_IP_VAR_H_ 35235267Sgabor 36235267Sgabor#include <sys/queue.h> 37235267Sgabor#ifdef _KERNEL 38235267Sgabor#include <sys/vimage.h> 39235267Sgabor#endif 40235267Sgabor 41235267Sgabor/* 42235267Sgabor * Overlay for ip header used by other protocols (tcp, udp). 43235267Sgabor */ 44235267Sgaborstruct ipovly { 45235267Sgabor u_char ih_x1[9]; /* (unused) */ 46235267Sgabor u_char ih_pr; /* protocol */ 47235267Sgabor u_short ih_len; /* protocol length */ 48235267Sgabor struct in_addr ih_src; /* source internet address */ 49235267Sgabor struct in_addr ih_dst; /* destination internet address */ 50235267Sgabor}; 51235267Sgabor 52235267Sgabor#ifdef _KERNEL 53235267Sgabor/* 54235267Sgabor * Ip reassembly queue structure. Each fragment 55235267Sgabor * being reassembled is attached to one of these structures. 56235267Sgabor * They are timed out after ipq_ttl drops to 0, and may also 57235267Sgabor * be reclaimed if memory becomes tight. 58235267Sgabor */ 59235267Sgaborstruct ipq { 60235267Sgabor TAILQ_ENTRY(ipq) ipq_list; /* to other reass headers */ 61235267Sgabor u_char ipq_ttl; /* time for reass q to live */ 62235267Sgabor u_char ipq_p; /* protocol of this fragment */ 63235267Sgabor u_short ipq_id; /* sequence id for reassembly */ 64235267Sgabor struct mbuf *ipq_frags; /* to ip headers of fragments */ 65235267Sgabor struct in_addr ipq_src,ipq_dst; 66235267Sgabor u_char ipq_nfrags; /* # frags in this packet */ 67235267Sgabor struct label *ipq_label; /* MAC label */ 68235267Sgabor}; 69235267Sgabor#endif /* _KERNEL */ 70235267Sgabor 71235267Sgabor/* 72235267Sgabor * Structure stored in mbuf in inpcb.ip_options 73235267Sgabor * and passed to ip_output when ip options are in use. 74235267Sgabor * The actual length of the options (including ipopt_dst) 75235267Sgabor * is in m_len. 76235267Sgabor */ 77235267Sgabor#define MAX_IPOPTLEN 40 78235267Sgabor 79235267Sgaborstruct ipoption { 80235267Sgabor struct in_addr ipopt_dst; /* first-hop dst if source routed */ 81235267Sgabor char ipopt_list[MAX_IPOPTLEN]; /* options proper */ 82235267Sgabor}; 83235267Sgabor 84235267Sgabor/* 85235267Sgabor * Multicast source list entry. 86235267Sgabor */ 87235267Sgaborstruct in_msource { 88235267Sgabor TAILQ_ENTRY(in_msource) ims_next; /* next source */ 89235267Sgabor struct sockaddr_storage ims_addr; /* address of this source */ 90235267Sgabor}; 91235267Sgabor 92235267Sgabor/* 93235267Sgabor * Multicast filter descriptor; there is one instance per group membership 94235267Sgabor * on a socket, allocated as an expandable vector hung off ip_moptions. 95235267Sgabor * struct in_multi contains separate IPv4-stack-wide state for IGMPv3. 96235267Sgabor */ 97235267Sgaborstruct in_mfilter { 98235267Sgabor uint16_t imf_fmode; /* filter mode for this socket/group */ 99235267Sgabor uint16_t imf_nsources; /* # of sources for this socket/group */ 100235267Sgabor TAILQ_HEAD(, in_msource) imf_sources; /* source list */ 101235267Sgabor}; 102235267Sgabor 103235267Sgabor/* 104235267Sgabor * Structure attached to inpcb.ip_moptions and 105235267Sgabor * passed to ip_output when IP multicast options are in use. 106235267Sgabor * This structure is lazy-allocated. 107235267Sgabor */ 108235267Sgaborstruct ip_moptions { 109235267Sgabor struct ifnet *imo_multicast_ifp; /* ifp for outgoing multicasts */ 110235267Sgabor struct in_addr imo_multicast_addr; /* ifindex/addr on MULTICAST_IF */ 111235267Sgabor u_long imo_multicast_vif; /* vif num outgoing multicasts */ 112235267Sgabor u_char imo_multicast_ttl; /* TTL for outgoing multicasts */ 113235267Sgabor u_char imo_multicast_loop; /* 1 => hear sends if a member */ 114235267Sgabor u_short imo_num_memberships; /* no. memberships this socket */ 115235267Sgabor u_short imo_max_memberships; /* max memberships this socket */ 116235267Sgabor struct in_multi **imo_membership; /* group memberships */ 117235267Sgabor struct in_mfilter *imo_mfilters; /* source filters */ 118235267Sgabor}; 119235267Sgabor 120235267Sgaborstruct ipstat { 121235267Sgabor u_long ips_total; /* total packets received */ 122235267Sgabor u_long ips_badsum; /* checksum bad */ 123235267Sgabor u_long ips_tooshort; /* packet too short */ 124235267Sgabor u_long ips_toosmall; /* not enough data */ 125235267Sgabor u_long ips_badhlen; /* ip header length < data size */ 126235267Sgabor u_long ips_badlen; /* ip length < ip header length */ 127235267Sgabor u_long ips_fragments; /* fragments received */ 128235267Sgabor u_long ips_fragdropped; /* frags dropped (dups, out of space) */ 129235267Sgabor u_long ips_fragtimeout; /* fragments timed out */ 130235267Sgabor u_long ips_forward; /* packets forwarded */ 131235267Sgabor u_long ips_fastforward; /* packets fast forwarded */ 132235267Sgabor u_long ips_cantforward; /* packets rcvd for unreachable dest */ 133235267Sgabor u_long ips_redirectsent; /* packets forwarded on same net */ 134235267Sgabor u_long ips_noproto; /* unknown or unsupported protocol */ 135235267Sgabor u_long ips_delivered; /* datagrams delivered to upper level*/ 136242430Sgabor u_long ips_localout; /* total ip packets generated here */ 137235267Sgabor u_long ips_odropped; /* lost packets due to nobufs, etc. */ 138242430Sgabor u_long ips_reassembled; /* total packets reassembled ok */ 139242430Sgabor u_long ips_fragmented; /* datagrams successfully fragmented */ 140242430Sgabor u_long ips_ofragments; /* output fragments created */ 141242430Sgabor u_long ips_cantfrag; /* don't fragment flag was set, etc. */ 142235267Sgabor u_long ips_badoptions; /* error in option processing */ 143235267Sgabor u_long ips_noroute; /* packets discarded due to no route */ 144235267Sgabor u_long ips_badvers; /* ip version != 4 */ 145235267Sgabor u_long ips_rawout; /* total raw ip packets generated */ 146235267Sgabor u_long ips_toolong; /* ip length > max ip packet size */ 147235267Sgabor u_long ips_notmember; /* multicasts for unregistered grps */ 148235267Sgabor u_long ips_nogif; /* no match gif found */ 149235267Sgabor u_long ips_badaddr; /* invalid address on header */ 150235267Sgabor}; 151235267Sgabor 152235267Sgabor#ifdef _KERNEL 153235267Sgabor 154235267Sgabor/* flags passed to ip_output as last parameter */ 155235267Sgabor#define IP_FORWARDING 0x1 /* most of ip header exists */ 156235267Sgabor#define IP_RAWOUTPUT 0x2 /* raw ip header exists */ 157235267Sgabor#define IP_SENDONES 0x4 /* send all-ones broadcast */ 158235267Sgabor#define IP_SENDTOIF 0x8 /* send on specific ifnet */ 159235267Sgabor#define IP_ROUTETOIF SO_DONTROUTE /* 0x10 bypass routing tables */ 160235267Sgabor#define IP_ALLOWBROADCAST SO_BROADCAST /* 0x20 can send broadcast packets */ 161235267Sgabor 162235267Sgabor/* 163235267Sgabor * mbuf flag used by ip_fastfwd 164235267Sgabor */ 165235267Sgabor#define M_FASTFWD_OURS M_PROTO1 /* changed dst to local */ 166235267Sgabor 167235267Sgabor#ifdef __NO_STRICT_ALIGNMENT 168#define IP_HDR_ALIGNED_P(ip) 1 169#else 170#define IP_HDR_ALIGNED_P(ip) ((((intptr_t) (ip)) & 3) == 0) 171#endif 172 173struct ip; 174struct inpcb; 175struct route; 176struct sockopt; 177 178extern struct ipstat ipstat; 179extern u_short ip_id; /* ip packet ctr, for ids */ 180extern int ip_defttl; /* default IP ttl */ 181extern int ipforwarding; /* ip forwarding */ 182#ifdef IPSTEALTH 183extern int ipstealth; /* stealth forwarding */ 184#endif 185extern u_char ip_protox[]; 186extern struct socket *ip_rsvpd; /* reservation protocol daemon */ 187extern struct socket *ip_mrouter; /* multicast routing daemon */ 188extern int (*legal_vif_num)(int); 189extern u_long (*ip_mcast_src)(int); 190extern int rsvp_on; 191extern struct pr_usrreqs rip_usrreqs; 192 193void inp_freemoptions(struct ip_moptions *); 194int inp_getmoptions(struct inpcb *, struct sockopt *); 195int inp_setmoptions(struct inpcb *, struct sockopt *); 196 197int ip_ctloutput(struct socket *, struct sockopt *sopt); 198void ip_drain(void); 199void ip_fini(void *xtp); 200int ip_fragment(struct ip *ip, struct mbuf **m_frag, int mtu, 201 u_long if_hwassist_flags, int sw_csum); 202void ip_forward(struct mbuf *m, int srcrt); 203void ip_init(void); 204extern int 205 (*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 *, 209 struct inpcb *); 210int ipproto_register(u_char); 211int ipproto_unregister(u_char); 212struct mbuf * 213 ip_reass(struct mbuf *); 214struct in_ifaddr * 215 ip_rtaddr(struct in_addr, u_int fibnum); 216void ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *, 217 struct mbuf *); 218void ip_slowtimo(void); 219u_int16_t ip_randomid(void); 220int rip_ctloutput(struct socket *, struct sockopt *); 221void rip_ctlinput(int, struct sockaddr *, void *); 222void rip_init(void); 223void rip_input(struct mbuf *, int); 224int rip_output(struct mbuf *, struct socket *, u_long); 225void ipip_input(struct mbuf *, int); 226void rsvp_input(struct mbuf *, int); 227int ip_rsvp_init(struct socket *); 228int ip_rsvp_done(void); 229extern int (*ip_rsvp_vif)(struct socket *, struct sockopt *); 230extern void (*ip_rsvp_force_done)(struct socket *); 231extern void (*rsvp_input_p)(struct mbuf *m, int off); 232 233extern struct pfil_head inet_pfil_hook; /* packet filter hooks */ 234 235void in_delayed_cksum(struct mbuf *m); 236 237static __inline uint16_t ip_newid(void); 238extern int ip_do_randomid; 239 240static __inline uint16_t 241ip_newid(void) 242{ 243 if (V_ip_do_randomid) 244 return ip_randomid(); 245 246 return htons(ip_id++); 247} 248 249#endif /* _KERNEL */ 250 251#endif /* !_NETINET_IP_VAR_H_ */ 252