RTEMS CPU Kit with SuperCore  4.11.3
ip_var.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 1982, 1986, 1993
3  * The Regents of the University of California. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 4. Neither the name of the University nor the names of its contributors
14  * may be used to endorse or promote products derived from this software
15  * without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * @(#)ip_var.h 8.2 (Berkeley) 1/9/95
30  * $FreeBSD: src/sys/netinet/ip_var.h,v 1.94 2005/01/07 01:45:44 imp Exp $
31  */
32 
33 
34 #ifndef _NETINET_IP_VAR_H_
35 #define _NETINET_IP_VAR_H_
36 
37 #include <netinet/in.h> /* struct in_addr */
38 
39 /*
40  * Overlay for ip header used by other protocols (tcp, udp).
41  */
42 struct ipovly {
43  caddr_t ih_next;
44  caddr_t ih_prev; /* for protocol sequence q's */
45  u_char ih_x1; /* (unused) */
46  u_char ih_pr; /* protocol */
47  u_short ih_len; /* protocol length */
48  struct in_addr ih_src; /* source internet address */
49  struct in_addr ih_dst; /* destination internet address */
50 };
51 
52 /*
53  * Ip reassembly queue structure. Each fragment
54  * being reassembled is attached to one of these structures.
55  * They are timed out after ipq_ttl drops to 0, and may also
56  * be reclaimed if memory becomes tight.
57  */
58 struct ipq {
59  struct ipq *next,*prev; /* to other reass headers */
60  u_char ipq_ttl; /* time for reass q to live */
61  u_char ipq_p; /* protocol of this fragment */
62  u_short ipq_id; /* sequence id for reassembly */
63  struct ipasfrag *ipq_next,*ipq_prev;
64  /* to ip headers of fragments */
65  struct in_addr ipq_src,ipq_dst;
66 #ifdef IPDIVERT
67  u_short ipq_divert; /* divert protocol port */
68 #endif
69 };
70 
71 /*
72  * Ip header, when holding a fragment.
73  *
74  * Note: ipf_next must be at same offset as ipq_next above
75  */
76 struct ipasfrag {
77 #if BYTE_ORDER == LITTLE_ENDIAN
78  u_char ip_hl:4,
79  ip_v:4;
80 #endif
81 #if BYTE_ORDER == BIG_ENDIAN
82  u_char ip_v:4,
83  ip_hl:4;
84 #endif
85  u_char ipf_mff; /* XXX overlays ip_tos: use low bit
86  * to avoid destroying tos;
87  * copied from (ip_off&IP_MF) */
88  u_short ip_len;
89  u_short ip_id;
90  u_short ip_off;
91  u_char ip_ttl;
92  u_char ip_p;
93  u_short ip_sum;
94  struct ipasfrag *ipf_next; /* next fragment */
95  struct ipasfrag *ipf_prev; /* previous fragment */
96 };
97 
98 /*
99  * Structure stored in mbuf in inpcb.ip_options
100  * and passed to ip_output when ip options are in use.
101  * The actual length of the options (including ipopt_dst)
102  * is in m_len.
103  */
104 #define MAX_IPOPTLEN 40
105 
106 struct ipoption {
107  struct in_addr ipopt_dst; /* first-hop dst if source routed */
108  char ipopt_list[MAX_IPOPTLEN]; /* options proper */
109 };
110 
111 /*
112  * Structure attached to inpcb.ip_moptions and
113  * passed to ip_output when IP multicast options are in use.
114  */
115 struct ip_moptions {
116  struct ifnet *imo_multicast_ifp; /* ifp for outgoing multicasts */
117  u_char imo_multicast_ttl; /* TTL for outgoing multicasts */
118  u_char imo_multicast_loop; /* 1 => hear sends if a member */
119  u_short imo_num_memberships; /* no. memberships this socket */
120  struct in_multi *imo_membership[IP_MAX_MEMBERSHIPS];
121  u_long imo_multicast_vif; /* vif num outgoing multicasts */
122 };
123 
124 struct ipstat {
125  u_long ips_total; /* total packets received */
126  u_long ips_badsum; /* checksum bad */
127  u_long ips_tooshort; /* packet too short */
128  u_long ips_toosmall; /* not enough data */
129  u_long ips_badhlen; /* ip header length < data size */
130  u_long ips_badlen; /* ip length < ip header length */
131  u_long ips_fragments; /* fragments received */
132  u_long ips_fragdropped; /* frags dropped (dups, out of space) */
133  u_long ips_fragtimeout; /* fragments timed out */
134  u_long ips_forward; /* packets forwarded */
135  u_long ips_cantforward; /* packets rcvd for unreachable dest */
136  u_long ips_redirectsent; /* packets forwarded on same net */
137  u_long ips_noproto; /* unknown or unsupported protocol */
138  u_long ips_delivered; /* datagrams delivered to upper level*/
139  u_long ips_localout; /* total ip packets generated here */
140  u_long ips_odropped; /* lost packets due to nobufs, etc. */
141  u_long ips_reassembled; /* total packets reassembled ok */
142  u_long ips_fragmented; /* datagrams successfully fragmented */
143  u_long ips_ofragments; /* output fragments created */
144  u_long ips_cantfrag; /* don't fragment flag was set, etc. */
145  u_long ips_badoptions; /* error in option processing */
146  u_long ips_noroute; /* packets discarded due to no route */
147  u_long ips_badvers; /* ip version != 4 */
148  u_long ips_rawout; /* total raw ip packets generated */
149  u_long ips_toolong; /* ip length > max ip packet size */
150 };
151 
152 #ifdef _KERNEL
153 /* flags passed to ip_output as last parameter */
154 #define IP_FORWARDING 0x1 /* most of ip header exists */
155 #define IP_RAWOUTPUT 0x2 /* raw ip header exists */
156 #define IP_SENDONES 0x4 /* send all-ones broadcast */
157 #define IP_ROUTETOIF SO_DONTROUTE /* bypass routing tables */
158 #define IP_ALLOWBROADCAST SO_BROADCAST /* can send broadcast packets */
159 
160 struct ip;
161 struct inpcb;
162 struct route;
163 struct sockopt;
164 struct mbuf;
165 
166 extern struct ipstat ipstat;
167 extern u_short ip_id; /* ip packet ctr, for ids */
168 extern int ip_defttl; /* default IP ttl */
169 extern u_char ip_protox[];
170 extern struct socket *ip_rsvpd; /* reservation protocol daemon */
171 extern struct socket *ip_mrouter; /* multicast routing daemon */
172 extern int (*legal_vif_num)(int);
173 extern u_long (*ip_mcast_src)(int);
174 extern int rsvp_on;
175 
176 int ip_ctloutput(int, struct socket *, int, int, struct mbuf **);
177 void ip_drain(void);
178 void ip_freemoptions(struct ip_moptions *);
179 void ip_init(void);
180 extern int (*ip_mforward)(struct ip *, struct ifnet *, struct mbuf *,
181  struct ip_moptions *);
182 int ip_output(struct mbuf *,
183  struct mbuf *, struct route *, int, struct ip_moptions *);
184 void ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *,
185  struct mbuf *);
186 void ip_slowtimo(void);
187 struct mbuf *
188  ip_srcroute(void);
189 void ip_stripoptions(struct mbuf *, struct mbuf *);
190 int rip_ctloutput(int, struct socket *, int, int, struct mbuf **);
191 void rip_init(void);
192 void rip_input(struct mbuf *, int);
193 int rip_output(struct mbuf *, struct socket *, u_long);
194 int rip_usrreq(struct socket *,
195  int, struct mbuf *, struct mbuf *, struct mbuf *);
196 void ipip_input(struct mbuf *, int);
197 void rsvp_input(struct mbuf *, int);
198 int ip_rsvp_init(struct socket *);
199 int ip_rsvp_done(void);
200 int ip_rsvp_vif_init(struct socket *, struct mbuf *);
201 int ip_rsvp_vif_done(struct socket *, struct mbuf *);
202 void ip_rsvp_force_done(struct socket *);
203 
204 #ifdef IPDIVERT
205 void div_init(void);
206 void div_input(struct mbuf *, int);
207 int div_usrreq(struct socket *,
208  int, struct mbuf *, struct mbuf *, struct mbuf *);
209 extern u_short ip_divert_port;
210 extern u_short ip_divert_ignore;
211 #endif /* IPDIVERT */
212 
213 #endif /* _KERNEL */
214 
215 #endif /* !_NETINET_IP_VAR_H_ */
Definition: ip_var.h:59
Definition: socketvar.h:49
Definition: in_pcb.h:53
Definition: route.h:51
Definition: ip.h:61
Definition: ip_var.h:43
Definition: inet.h:93
Definition: if_var.h:99
Definition: ip_var.h:77
Definition: mbuf.h:103
Definition: in_var.h:152
Definition: ip_var.h:116
Definition: ip_var.h:107