source: rtems/cpukit/libnetworking/netinet/tcp_var.h @ 36799d4

4.104.114.84.95
Last change on this file since 36799d4 was 36799d4, checked in by Joel Sherrill <joel.sherrill@…>, on Jan 3, 2003 at 6:09:57 PM

2002-11-26 Chris Johns <cjohns@…>

  • Makefile.am: Added sys/linker_set.h
  • kern/Makefile.am: Added kern_mib.c and kern_sysctl.c.
  • kern/uipc_socket.c: OID changed from KERN_SOMAXCONN to KIPC_SOMAXCONN.
  • kern/uipc_socket2.c: OID changed from KERN_MAXSOCKBUF to KIPC_MAXSOCKBUF.
  • net/if_ethersubr.c: FreeBSD 2.2.2 does not have a _net_link node while 5.0 does.
  • net/if_ppp.c: Removed the TEXT_SET define as these macros are now implemented.
  • net/rtsock.c: Enable sysctl support plus fix the bug with the lastest FreeBSD sysctl header file.
  • netinet/icmp_var.h: FreeBSD 2.2.2 does not have a _net_inet_icmp node while 5.0 does.
  • netinet/if_ether.c: FreeBSD 2.2.2 does not have a _net_link_ether node while 5.0 does.
  • netinet/igmp_var.h: FreeBSD 2.2.2 does not have a _net_inet_igmp node while 5.0 does.
  • netinet/in_pcb.c: Fixed the arguments to the sysctl call. Add inp_gencnt and ipi_count. These are used when listing connections.
  • netinet/in_pcb.h: Added counters to aid the listing of connections.
  • netinet/in_var.h: Provide the _net_inet_ip and _net_inet_raw nodes.
  • netinet/ip_fw.c: Disable the firewall sysctl calls.
  • netinet/tcp_subr.c: Merge tcp_pcblist from the lastest FreeBSD source.
  • netinet/tcp_var.h: Add structures needed by net-snmp to list connections.
  • netinet/udp_usrreq.c: Merged udp_pcblist from the lastest FreeBSD source.
  • netinet/udp_var.h: Added the sysctl id UDPCTL_PCBLIST. Used by net-snmp.
  • rtems_glue.c: Call sysctl_register_all when initialising the network stack to register all the sysctl calls. These are in the special sections and required an updated linker script.
  • rtems/rtems_syscall.c: Add the sysctl call.
  • sys/kernel.h: Use the lastest FreeBSD method of handling sysctl structures. This now held in the sys/linker_set.h file.
  • sys/queue.h: This is from the lastest FreeBSD code with the circular code merged back in as it is not used in the lastest FreeBSD kernel.
  • sys/sysctl.h: The lastest sysctl. This was needed to use with the new linker set method. The FreeBSD 2.2.2 version has asm hacks. The lastest version of the FreeBSD does not have these hacks. It uses gcc attribute directives.
  • Property mode set to 100644
File size: 16.0 KB
Line 
1/*
2 * Copyright (c) 1982, 1986, 1993, 1994, 1995
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 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *      This product includes software developed by the University of
16 *      California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 *      @(#)tcp_var.h   8.4 (Berkeley) 5/24/95
34 *      $Id$
35 */
36
37#ifndef _NETINET_TCP_VAR_H_
38#define _NETINET_TCP_VAR_H_
39/*
40 * Kernel variables for tcp.
41 */
42
43/*
44 * Tcp control block, one per tcp; fields:
45 */
46struct tcpcb {
47        struct  tcpiphdr *seg_next;     /* sequencing queue */
48        struct  tcpiphdr *seg_prev;
49        int     t_state;                /* state of this connection */
50        int     t_timer[TCPT_NTIMERS];  /* tcp timers */
51        int     t_rxtshift;             /* log(2) of rexmt exp. backoff */
52        int     t_rxtcur;               /* current retransmit value */
53        int     t_dupacks;              /* consecutive dup acks recd */
54        u_int   t_maxseg;               /* maximum segment size */
55        u_int   t_maxopd;               /* mss plus options */
56        int     t_force;                /* 1 if forcing out a byte */
57        u_int   t_flags;
58#define TF_ACKNOW       0x0001          /* ack peer immediately */
59#define TF_DELACK       0x0002          /* ack, but try to delay it */
60#define TF_NODELAY      0x0004          /* don't delay packets to coalesce */
61#define TF_NOOPT        0x0008          /* don't use tcp options */
62#define TF_SENTFIN      0x0010          /* have sent FIN */
63#define TF_REQ_SCALE    0x0020          /* have/will request window scaling */
64#define TF_RCVD_SCALE   0x0040          /* other side has requested scaling */
65#define TF_REQ_TSTMP    0x0080          /* have/will request timestamps */
66#define TF_RCVD_TSTMP   0x0100          /* a timestamp was received in SYN */
67#define TF_SACK_PERMIT  0x0200          /* other side said I could SACK */
68#define TF_NEEDSYN      0x0400          /* send SYN (implicit state) */
69#define TF_NEEDFIN      0x0800          /* send FIN (implicit state) */
70#define TF_NOPUSH       0x1000          /* don't push */
71#define TF_REQ_CC       0x2000          /* have/will request CC */
72#define TF_RCVD_CC      0x4000          /* a CC was received in SYN */
73#define TF_SENDCCNEW    0x8000          /* send CCnew instead of CC in SYN */
74
75        struct  tcpiphdr *t_template;   /* skeletal packet for transmit */
76        struct  inpcb *t_inpcb;         /* back pointer to internet pcb */
77/*
78 * The following fields are used as in the protocol specification.
79 * See RFC783, Dec. 1981, page 21.
80 */
81/* send sequence variables */
82        tcp_seq snd_una;                /* send unacknowledged */
83        tcp_seq snd_nxt;                /* send next */
84        tcp_seq snd_up;                 /* send urgent pointer */
85        tcp_seq snd_wl1;                /* window update seg seq number */
86        tcp_seq snd_wl2;                /* window update seg ack number */
87        tcp_seq iss;                    /* initial send sequence number */
88        u_long  snd_wnd;                /* send window */
89/* receive sequence variables */
90        u_long  rcv_wnd;                /* receive window */
91        tcp_seq rcv_nxt;                /* receive next */
92        tcp_seq rcv_up;                 /* receive urgent pointer */
93        tcp_seq irs;                    /* initial receive sequence number */
94/*
95 * Additional variables for this implementation.
96 */
97/* receive variables */
98        tcp_seq rcv_adv;                /* advertised window */
99/* retransmit variables */
100        tcp_seq snd_max;                /* highest sequence number sent;
101                                         * used to recognize retransmits
102                                         */
103/* congestion control (for slow start, source quench, retransmit after loss) */
104        u_long  snd_cwnd;               /* congestion-controlled window */
105        u_long  snd_ssthresh;           /* snd_cwnd size threshold for
106                                         * for slow start exponential to
107                                         * linear switch
108                                         */
109/*
110 * transmit timing stuff.  See below for scale of srtt and rttvar.
111 * "Variance" is actually smoothed difference.
112 */
113        u_int   t_idle;                 /* inactivity time */
114        int     t_rtt;                  /* round trip time */
115        tcp_seq t_rtseq;                /* sequence number being timed */
116        int     t_srtt;                 /* smoothed round-trip time */
117        int     t_rttvar;               /* variance in round-trip time */
118        u_int   t_rttmin;               /* minimum rtt allowed */
119        u_long  max_sndwnd;             /* largest window peer has offered */
120
121/* out-of-band data */
122        char    t_oobflags;             /* have some */
123        char    t_iobc;                 /* input character */
124#define TCPOOB_HAVEDATA 0x01
125#define TCPOOB_HADDATA  0x02
126        int     t_softerror;            /* possible error not yet reported */
127
128/* RFC 1323 variables */
129        u_char  snd_scale;              /* window scaling for send window */
130        u_char  rcv_scale;              /* window scaling for recv window */
131        u_char  request_r_scale;        /* pending window scaling */
132        u_char  requested_s_scale;
133        u_long  ts_recent;              /* timestamp echo data */
134        u_long  ts_recent_age;          /* when last updated */
135        tcp_seq last_ack_sent;
136/* RFC 1644 variables */
137        tcp_cc  cc_send;                /* send connection count */
138        tcp_cc  cc_recv;                /* receive connection count */
139        u_long  t_duration;             /* connection duration */
140
141/* TUBA stuff */
142        caddr_t t_tuba_pcb;             /* next level down pcb for TCP over z */
143/* More RTT stuff */
144        u_long  t_rttupdated;           /* number of times rtt sampled */
145};
146
147/*
148 * Structure to hold TCP options that are only used during segment
149 * processing (in tcp_input), but not held in the tcpcb.
150 * It's basically used to reduce the number of parameters
151 * to tcp_dooptions.
152 */
153struct tcpopt {
154        u_long  to_flag;                /* which options are present */
155#define TOF_TS          0x0001          /* timestamp */
156#define TOF_CC          0x0002          /* CC and CCnew are exclusive */
157#define TOF_CCNEW       0x0004
158#define TOF_CCECHO      0x0008
159        u_long  to_tsval;
160        u_long  to_tsecr;
161        tcp_cc  to_cc;          /* holds CC or CCnew */
162        tcp_cc  to_ccecho;
163};
164
165/*
166 * The TAO cache entry which is stored in the protocol family specific
167 * portion of the route metrics.
168 */
169struct rmxp_tao {
170        tcp_cc  tao_cc;                 /* latest CC in valid SYN */
171        tcp_cc  tao_ccsent;             /* latest CC sent to peer */
172        u_short tao_mssopt;             /* peer's cached MSS */
173#ifdef notyet
174        u_short tao_flags;              /* cache status flags */
175#define TAOF_DONT       0x0001          /* peer doesn't understand rfc1644 */
176#define TAOF_OK         0x0002          /* peer does understand rfc1644 */
177#define TAOF_UNDEF      0               /* we don't know yet */
178#endif /* notyet */
179};
180#define rmx_taop(r)     ((struct rmxp_tao *)(r).rmx_filler)
181
182#define intotcpcb(ip)   ((struct tcpcb *)(ip)->inp_ppcb)
183#define sototcpcb(so)   (intotcpcb(sotoinpcb(so)))
184
185/*
186 * The smoothed round-trip time and estimated variance
187 * are stored as fixed point numbers scaled by the values below.
188 * For convenience, these scales are also used in smoothing the average
189 * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed).
190 * With these scales, srtt has 3 bits to the right of the binary point,
191 * and thus an "ALPHA" of 0.875.  rttvar has 2 bits to the right of the
192 * binary point, and is smoothed with an ALPHA of 0.75.
193 */
194#define TCP_RTT_SCALE           32      /* multiplier for srtt; 3 bits frac. */
195#define TCP_RTT_SHIFT           5       /* shift for srtt; 3 bits frac. */
196#define TCP_RTTVAR_SCALE        16      /* multiplier for rttvar; 2 bits */
197#define TCP_RTTVAR_SHIFT        4       /* shift for rttvar; 2 bits */
198#define TCP_DELTA_SHIFT         2       /* see tcp_input.c */
199
200/*
201 * The initial retransmission should happen at rtt + 4 * rttvar.
202 * Because of the way we do the smoothing, srtt and rttvar
203 * will each average +1/2 tick of bias.  When we compute
204 * the retransmit timer, we want 1/2 tick of rounding and
205 * 1 extra tick because of +-1/2 tick uncertainty in the
206 * firing of the timer.  The bias will give us exactly the
207 * 1.5 tick we need.  But, because the bias is
208 * statistical, we have to test that we don't drop below
209 * the minimum feasible timer (which is 2 ticks).
210 * This version of the macro adapted from a paper by Lawrence
211 * Brakmo and Larry Peterson which outlines a problem caused
212 * by insufficient precision in the original implementation,
213 * which results in inappropriately large RTO values for very
214 * fast networks.
215 */
216#define TCP_REXMTVAL(tp) \
217        ((((tp)->t_srtt >> (TCP_RTT_SHIFT - TCP_DELTA_SHIFT))  \
218          + (tp)->t_rttvar) >> TCP_DELTA_SHIFT)
219
220/* XXX
221 * We want to avoid doing m_pullup on incoming packets but that
222 * means avoiding dtom on the tcp reassembly code.  That in turn means
223 * keeping an mbuf pointer in the reassembly queue (since we might
224 * have a cluster).  As a quick hack, the source & destination
225 * port numbers (which are no longer needed once we've located the
226 * tcpcb) are overlayed with an mbuf pointer.
227 */
228#if (defined(__GNUC__) && defined(__arm__))
229#define STR32_UNALGN(ti,m) \
230        (ti)->ti_sport = (unsigned short)(((unsigned int) m & 0xffff0000) >> 16); \
231         (ti)->ti_dport = (unsigned short) ((unsigned int) m & 0x0000ffff);
232#define LD32_UNALGN(ti,m) \
233        m = (struct mbuf *)((((unsigned int) (ti)->ti_sport) << 16) | ( (unsigned int)(ti)->ti_dport));
234
235#else
236#define REASS_MBUF(ti) (*(struct mbuf **)&((ti)->ti_t))
237#endif
238
239/*
240 * TCP statistics.
241 * Many of these should be kept per connection,
242 * but that's inconvenient at the moment.
243 */
244struct  tcpstat {
245        u_long  tcps_connattempt;       /* connections initiated */
246        u_long  tcps_accepts;           /* connections accepted */
247        u_long  tcps_connects;          /* connections established */
248        u_long  tcps_drops;             /* connections dropped */
249        u_long  tcps_conndrops;         /* embryonic connections dropped */
250        u_long  tcps_closed;            /* conn. closed (includes drops) */
251        u_long  tcps_segstimed;         /* segs where we tried to get rtt */
252        u_long  tcps_rttupdated;        /* times we succeeded */
253        u_long  tcps_delack;            /* delayed acks sent */
254        u_long  tcps_timeoutdrop;       /* conn. dropped in rxmt timeout */
255        u_long  tcps_rexmttimeo;        /* retransmit timeouts */
256        u_long  tcps_persisttimeo;      /* persist timeouts */
257        u_long  tcps_keeptimeo;         /* keepalive timeouts */
258        u_long  tcps_keepprobe;         /* keepalive probes sent */
259        u_long  tcps_keepdrops;         /* connections dropped in keepalive */
260
261        u_long  tcps_sndtotal;          /* total packets sent */
262        u_long  tcps_sndpack;           /* data packets sent */
263        u_long  tcps_sndbyte;           /* data bytes sent */
264        u_long  tcps_sndrexmitpack;     /* data packets retransmitted */
265        u_long  tcps_sndrexmitbyte;     /* data bytes retransmitted */
266        u_long  tcps_sndacks;           /* ack-only packets sent */
267        u_long  tcps_sndprobe;          /* window probes sent */
268        u_long  tcps_sndurg;            /* packets sent with URG only */
269        u_long  tcps_sndwinup;          /* window update-only packets sent */
270        u_long  tcps_sndctrl;           /* control (SYN|FIN|RST) packets sent */
271
272        u_long  tcps_rcvtotal;          /* total packets received */
273        u_long  tcps_rcvpack;           /* packets received in sequence */
274        u_long  tcps_rcvbyte;           /* bytes received in sequence */
275        u_long  tcps_rcvbadsum;         /* packets received with ccksum errs */
276        u_long  tcps_rcvbadoff;         /* packets received with bad offset */
277        u_long  tcps_rcvshort;          /* packets received too short */
278        u_long  tcps_rcvduppack;        /* duplicate-only packets received */
279        u_long  tcps_rcvdupbyte;        /* duplicate-only bytes received */
280        u_long  tcps_rcvpartduppack;    /* packets with some duplicate data */
281        u_long  tcps_rcvpartdupbyte;    /* dup. bytes in part-dup. packets */
282        u_long  tcps_rcvoopack;         /* out-of-order packets received */
283        u_long  tcps_rcvoobyte;         /* out-of-order bytes received */
284        u_long  tcps_rcvpackafterwin;   /* packets with data after window */
285        u_long  tcps_rcvbyteafterwin;   /* bytes rcvd after window */
286        u_long  tcps_rcvafterclose;     /* packets rcvd after "close" */
287        u_long  tcps_rcvwinprobe;       /* rcvd window probe packets */
288        u_long  tcps_rcvdupack;         /* rcvd duplicate acks */
289        u_long  tcps_rcvacktoomuch;     /* rcvd acks for unsent data */
290        u_long  tcps_rcvackpack;        /* rcvd ack packets */
291        u_long  tcps_rcvackbyte;        /* bytes acked by rcvd acks */
292        u_long  tcps_rcvwinupd;         /* rcvd window update packets */
293        u_long  tcps_pawsdrop;          /* segments dropped due to PAWS */
294        u_long  tcps_predack;           /* times hdr predict ok for acks */
295        u_long  tcps_preddat;           /* times hdr predict ok for data pkts */
296        u_long  tcps_pcbcachemiss;
297        u_long  tcps_cachedrtt;         /* times cached RTT in route updated */
298        u_long  tcps_cachedrttvar;      /* times cached rttvar updated */
299        u_long  tcps_cachedssthresh;    /* times cached ssthresh updated */
300        u_long  tcps_usedrtt;           /* times RTT initialized from route */
301        u_long  tcps_usedrttvar;        /* times RTTVAR initialized from rt */
302        u_long  tcps_usedssthresh;      /* times ssthresh initialized from rt*/
303        u_long  tcps_persistdrop;       /* timeout in persist state */
304        u_long  tcps_badsyn;            /* bogus SYN, e.g. premature ACK */
305        u_long  tcps_mturesent;         /* resends due to MTU discovery */
306        u_long  tcps_listendrop;        /* listen queue overflows */
307};
308
309/*
310 * TCB structure exported to user-land via sysctl(3).
311 * Evil hack: declare only if in_pcb.h and sys/socketvar.h have been
312 * included.  Not all of our clients do.
313 */
314#if defined(_NETINET_IN_PCB_H_) && defined(_SYS_SOCKETVAR_H_)
315struct  xtcpcb {
316        size_t  xt_len;
317        struct  inpcb   xt_inp;
318        struct  tcpcb   xt_tp;
319#if 0
320        struct  xsocket xt_socket;
321        u_quad_t        xt_alignment_hack;
322#endif
323};
324#endif
325
326/*
327 * Names for TCP sysctl objects
328 */
329#define TCPCTL_DO_RFC1323       1       /* use RFC-1323 extensions */
330#define TCPCTL_DO_RFC1644       2       /* use RFC-1644 extensions */
331#define TCPCTL_MSSDFLT          3       /* MSS default */
332#define TCPCTL_STATS            4       /* statistics (read-only) */
333#define TCPCTL_RTTDFLT          5       /* default RTT estimate */
334#define TCPCTL_KEEPIDLE         6       /* keepalive idle timer */
335#define TCPCTL_KEEPINTVL        7       /* interval to send keepalives */
336#define TCPCTL_SENDSPACE        8       /* send buffer space */
337#define TCPCTL_RECVSPACE        9       /* receive buffer space */
338#define TCPCTL_KEEPINIT         10      /* receive buffer space */
339#define TCPCTL_PCBLIST          11      /* list of all outstanding PCBs */
340#define TCPCTL_MAXID            12
341
342#define TCPCTL_NAMES { \
343        { 0, 0 }, \
344        { "rfc1323", CTLTYPE_INT }, \
345        { "rfc1644", CTLTYPE_INT }, \
346        { "mssdflt", CTLTYPE_INT }, \
347        { "stats", CTLTYPE_STRUCT }, \
348        { "rttdflt", CTLTYPE_INT }, \
349        { "keepidle", CTLTYPE_INT }, \
350        { "keepintvl", CTLTYPE_INT }, \
351        { "sendspace", CTLTYPE_INT }, \
352        { "recvspace", CTLTYPE_INT }, \
353        { "keepinit", CTLTYPE_INT }, \
354}
355
356#ifdef KERNEL
357#ifdef SYSCTL_DECL
358SYSCTL_DECL(_net_inet_tcp);
359#endif
360
361extern  struct inpcbhead tcb;           /* head of queue of active tcpcb's */
362extern  struct inpcbinfo tcbinfo;
363extern  struct tcpstat tcpstat; /* tcp statistics */
364extern  int tcp_mssdflt;        /* XXX */
365extern  u_long tcp_now;         /* for RFC 1323 timestamps */
366
367void     tcp_canceltimers __P((struct tcpcb *));
368struct tcpcb *
369         tcp_close __P((struct tcpcb *));
370void     tcp_ctlinput __P((int, struct sockaddr *, void *));
371int      tcp_ctloutput __P((int, struct socket *, int, int, struct mbuf **));
372struct tcpcb *
373         tcp_drop __P((struct tcpcb *, int));
374void     tcp_drain __P((void));
375void     tcp_fasttimo __P((void));
376struct rmxp_tao *
377         tcp_gettaocache __P((struct inpcb *));
378void     tcp_init __P((void));
379void     tcp_input __P((struct mbuf *, int));
380void     tcp_mss __P((struct tcpcb *, int));
381int      tcp_mssopt __P((struct tcpcb *));
382void     tcp_mtudisc __P((struct inpcb *, int));
383struct tcpcb *
384         tcp_newtcpcb __P((struct inpcb *));
385int      tcp_output __P((struct tcpcb *));
386void     tcp_quench __P((struct inpcb *, int));
387void     tcp_respond __P((struct tcpcb *,
388            struct tcpiphdr *, struct mbuf *, u_long, u_long, int));
389struct rtentry *
390         tcp_rtlookup __P((struct inpcb *));
391void     tcp_setpersist __P((struct tcpcb *));
392void     tcp_slowtimo __P((void));
393struct tcpiphdr *
394         tcp_template __P((struct tcpcb *));
395struct tcpcb *
396         tcp_timers __P((struct tcpcb *, int));
397void     tcp_trace __P((int, int, struct tcpcb *, struct tcpiphdr *, int));
398
399extern  struct pr_usrreqs tcp_usrreqs;
400extern  u_long tcp_sendspace;
401extern  u_long tcp_recvspace;
402
403#endif /* KERNEL */
404
405#endif /* _NETINET_TCP_VAR_H_ */
Note: See TracBrowser for help on using the repository browser.