ip_var.h revision 105586
138776Snsouch/* 238776Snsouch * Copyright (c) 1982, 1986, 1993 338776Snsouch * The Regents of the University of California. All rights reserved. 438776Snsouch * 538776Snsouch * Redistribution and use in source and binary forms, with or without 638776Snsouch * modification, are permitted provided that the following conditions 738776Snsouch * are met: 838776Snsouch * 1. Redistributions of source code must retain the above copyright 938776Snsouch * notice, this list of conditions and the following disclaimer. 1038776Snsouch * 2. Redistributions in binary form must reproduce the above copyright 1138776Snsouch * notice, this list of conditions and the following disclaimer in the 1238776Snsouch * documentation and/or other materials provided with the distribution. 1338776Snsouch * 3. All advertising materials mentioning features or use of this software 1438776Snsouch * must display the following acknowledgement: 1538776Snsouch * This product includes software developed by the University of 1638776Snsouch * California, Berkeley and its contributors. 1738776Snsouch * 4. Neither the name of the University nor the names of its contributors 1838776Snsouch * may be used to endorse or promote products derived from this software 1938776Snsouch * without specific prior written permission. 2038776Snsouch * 2138776Snsouch * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2238776Snsouch * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2338776Snsouch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2438776Snsouch * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2538776Snsouch * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2638776Snsouch * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2738776Snsouch * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2838776Snsouch * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2938776Snsouch * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3038776Snsouch * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3138776Snsouch * SUCH DAMAGE. 3238776Snsouch * 3338776Snsouch * @(#)ip_var.h 8.2 (Berkeley) 1/9/95 3438776Snsouch * $FreeBSD: head/sys/netinet/ip_var.h 105586 2002-10-20 22:52:07Z phk $ 3538776Snsouch */ 3638776Snsouch 3738776Snsouch#ifndef _NETINET_IP_VAR_H_ 3838776Snsouch#define _NETINET_IP_VAR_H_ 3938776Snsouch 4038776Snsouch#include <sys/queue.h> 4138776Snsouch 4238776Snsouch#ifdef _KERNEL 4338776Snsouch#include <sys/_label.h> 4438776Snsouch#endif 4538776Snsouch 4638776Snsouch/* 4738776Snsouch * Overlay for ip header used by other protocols (tcp, udp). 4838776Snsouch */ 4938776Snsouchstruct ipovly { 5038776Snsouch u_char ih_x1[9]; /* (unused) */ 5138776Snsouch u_char ih_pr; /* protocol */ 5238776Snsouch u_short ih_len; /* protocol length */ 5338776Snsouch struct in_addr ih_src; /* source internet address */ 5438776Snsouch struct in_addr ih_dst; /* destination internet address */ 5538776Snsouch}; 5638776Snsouch 5738776Snsouch#ifdef _KERNEL 5838776Snsouch/* 5938776Snsouch * Ip reassembly queue structure. Each fragment 6038776Snsouch * being reassembled is attached to one of these structures. 6138776Snsouch * They are timed out after ipq_ttl drops to 0, and may also 6238776Snsouch * be reclaimed if memory becomes tight. 6338776Snsouch */ 6438776Snsouchstruct ipq { 6538776Snsouch TAILQ_ENTRY(ipq) ipq_list; /* to other reass headers */ 6638776Snsouch u_char ipq_ttl; /* time for reass q to live */ 6738776Snsouch u_char ipq_p; /* protocol of this fragment */ 6838776Snsouch u_short ipq_id; /* sequence id for reassembly */ 6938776Snsouch struct mbuf *ipq_frags; /* to ip headers of fragments */ 7038776Snsouch struct in_addr ipq_src,ipq_dst; 7138776Snsouch u_int32_t ipq_div_info; /* ipfw divert port & flags */ 7238776Snsouch u_int16_t ipq_div_cookie; /* ipfw divert cookie */ 7338776Snsouch struct label ipq_label; /* MAC label */ 7438776Snsouch}; 7538776Snsouch#endif /* _KERNEL */ 7638776Snsouch 7738776Snsouch/* 7838776Snsouch * Structure stored in mbuf in inpcb.ip_options 7938776Snsouch * and passed to ip_output when ip options are in use. 8038776Snsouch * The actual length of the options (including ipopt_dst) 8138776Snsouch * is in m_len. 8238776Snsouch */ 8338776Snsouch#define MAX_IPOPTLEN 40 8438776Snsouch 8538776Snsouchstruct ipoption { 8638776Snsouch struct in_addr ipopt_dst; /* first-hop dst if source routed */ 8738776Snsouch char ipopt_list[MAX_IPOPTLEN]; /* options proper */ 8838776Snsouch}; 8938776Snsouch 9038776Snsouch/* 9138776Snsouch * Structure attached to inpcb.ip_moptions and 92 * passed to ip_output when IP multicast options are in use. 93 */ 94struct ip_moptions { 95 struct ifnet *imo_multicast_ifp; /* ifp for outgoing multicasts */ 96 struct in_addr imo_multicast_addr; /* ifindex/addr on MULTICAST_IF */ 97 u_char imo_multicast_ttl; /* TTL for outgoing multicasts */ 98 u_char imo_multicast_loop; /* 1 => hear sends if a member */ 99 u_short imo_num_memberships; /* no. memberships this socket */ 100 struct in_multi *imo_membership[IP_MAX_MEMBERSHIPS]; 101 u_long imo_multicast_vif; /* vif num outgoing multicasts */ 102}; 103 104struct ipstat { 105 u_long ips_total; /* total packets received */ 106 u_long ips_badsum; /* checksum bad */ 107 u_long ips_tooshort; /* packet too short */ 108 u_long ips_toosmall; /* not enough data */ 109 u_long ips_badhlen; /* ip header length < data size */ 110 u_long ips_badlen; /* ip length < ip header length */ 111 u_long ips_fragments; /* fragments received */ 112 u_long ips_fragdropped; /* frags dropped (dups, out of space) */ 113 u_long ips_fragtimeout; /* fragments timed out */ 114 u_long ips_forward; /* packets forwarded */ 115 u_long ips_fastforward; /* packets fast forwarded */ 116 u_long ips_cantforward; /* packets rcvd for unreachable dest */ 117 u_long ips_redirectsent; /* packets forwarded on same net */ 118 u_long ips_noproto; /* unknown or unsupported protocol */ 119 u_long ips_delivered; /* datagrams delivered to upper level*/ 120 u_long ips_localout; /* total ip packets generated here */ 121 u_long ips_odropped; /* lost packets due to nobufs, etc. */ 122 u_long ips_reassembled; /* total packets reassembled ok */ 123 u_long ips_fragmented; /* datagrams successfully fragmented */ 124 u_long ips_ofragments; /* output fragments created */ 125 u_long ips_cantfrag; /* don't fragment flag was set, etc. */ 126 u_long ips_badoptions; /* error in option processing */ 127 u_long ips_noroute; /* packets discarded due to no route */ 128 u_long ips_badvers; /* ip version != 4 */ 129 u_long ips_rawout; /* total raw ip packets generated */ 130 u_long ips_toolong; /* ip length > max ip packet size */ 131 u_long ips_notmember; /* multicasts for unregistered grps */ 132 u_long ips_nogif; /* no match gif found */ 133 u_long ips_badaddr; /* invalid address on header */ 134}; 135 136#ifdef _KERNEL 137 138/* flags passed to ip_output as last parameter */ 139#define IP_FORWARDING 0x1 /* most of ip header exists */ 140#define IP_RAWOUTPUT 0x2 /* raw ip header exists */ 141#define IP_ROUTETOIF SO_DONTROUTE /* bypass routing tables */ 142#define IP_ALLOWBROADCAST SO_BROADCAST /* can send broadcast packets */ 143 144struct ip; 145struct inpcb; 146struct route; 147struct sockopt; 148 149extern struct ipstat ipstat; 150#ifndef RANDOM_IP_ID 151extern u_short ip_id; /* ip packet ctr, for ids */ 152#endif 153extern int ip_defttl; /* default IP ttl */ 154extern int ipforwarding; /* ip forwarding */ 155extern struct route ipforward_rt; /* ip forwarding cached route */ 156extern u_char ip_protox[]; 157extern struct socket *ip_rsvpd; /* reservation protocol daemon */ 158extern struct socket *ip_mrouter; /* multicast routing daemon */ 159extern int (*legal_vif_num)(int); 160extern u_long (*ip_mcast_src)(int); 161extern int rsvp_on; 162extern struct pr_usrreqs rip_usrreqs; 163 164int ip_ctloutput(struct socket *, struct sockopt *sopt); 165void ip_drain(void); 166void ip_freemoptions(struct ip_moptions *); 167void ip_init(void); 168extern int (*ip_mforward)(struct ip *, struct ifnet *, struct mbuf *, 169 struct ip_moptions *); 170int ip_output(struct mbuf *, 171 struct mbuf *, struct route *, int, struct ip_moptions *, 172 struct inpcb *); 173struct in_ifaddr * 174 ip_rtaddr(struct in_addr, struct route *); 175void ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *, 176 struct mbuf *); 177void ip_slowtimo(void); 178struct mbuf * 179 ip_srcroute(void); 180void ip_stripoptions(struct mbuf *, struct mbuf *); 181#ifdef RANDOM_IP_ID 182u_int16_t 183 ip_randomid(void); 184#endif 185int rip_ctloutput(struct socket *, struct sockopt *); 186void rip_ctlinput(int, struct sockaddr *, void *); 187void rip_init(void); 188void rip_input(struct mbuf *, int); 189int rip_output(struct mbuf *, struct socket *, u_long); 190void ipip_input(struct mbuf *, int); 191void rsvp_input(struct mbuf *, int); 192int ip_rsvp_init(struct socket *); 193int ip_rsvp_done(void); 194int ip_rsvp_vif_init(struct socket *, struct sockopt *); 195int ip_rsvp_vif_done(struct socket *, struct sockopt *); 196void ip_rsvp_force_done(struct socket *); 197 198#ifdef IPDIVERT 199void div_init(void); 200void div_input(struct mbuf *, int); 201void divert_packet(struct mbuf *m, int incoming, int port, int rule); 202extern struct pr_usrreqs div_usrreqs; 203#endif 204 205void in_delayed_cksum(struct mbuf *m); 206 207#endif /* _KERNEL */ 208 209#endif /* !_NETINET_IP_VAR_H_ */ 210