Subversion Repositories SvarDOS

Rev

Rev 616 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
207 mateuszvis 1
/*!\file netinet/tcp_scor.h
2
 * TCP scoreboard definitions (SACK).
3
 */
4
 
5
/*
6
 * Copyright (c) 1997, Pittsburgh Supercomputing Center, 
7
 * Jamshid Mahdavi, Matt Mathis, Jeffrey Semke
8
 * All rights reserved.
9
 *
10
 * Permission to use, copy, modify, and distribute this software and
11
 * its documentation for any purpose and without fee is hereby granted, 
12
 * provided that the above copyright notice appear in all copies and
13
 * that both that copyright notice and this permission notice appear
14
 * in supporting documentation.
15
 *
16
 * This is experimental software under active development and may
17
 * potentially contain bugs.   Use at your own risk.
18
 *
19
 */
20
 
21
#ifndef __NETINET_TCP_SCOREBOARD_H
22
#define __NETINET_TCP_SCOREBOARD_H
23
 
24
/**********************************************************************
25
 *
26
 *  Scoreboard module headers: 
27
 *
28
 **********************************************************************/
29
 
30
/* Initialize the scoreboard
31
 */
32
#define scrb_init(tp) { LIST_INIT(&((tp)->scrb.head));     \
33
                        (tp)->scrb.last_ack=(tp)->snd_una; \
34
                        (tp)->snd_retran_data = 0; }
35
 
36
/*  
37
 *  Check to see if the scoreboard is empty
38
 *  scrb_isempty(struct tcpcp *tp)
39
 */
40
#define scrb_isempty(tp)     (! ((tp)->scrb.scrb_head))
41
 
42
/* This macro quickly takes care of the common case of an empty
43
 *  scoreboard. Otherwise it called scrb_getnextretran_func to hunt
44
 *  through the scoreboard and return the next block of data to be
45
 *  retransmitted.  The start and end of the block are filled in to
46
 *  start_ptr and end_ptr, and the length of the block is returned.  A
47
 *  zero return value indicates that there is no data to be
48
 *  retransmitted at this time.  Note that end_ptr actually points to
49
 *  the first byte of data which is NOT to be retransmitted (or the
50
 *  first byte following the data to be retransmitted) similar in
51
 *  fashion to the rest of this code.
52
 *
53
 *  scrb_getnextretran(struct tcpcp *tp, tcp_seq *start, tcp_seq *end) 
54
 */
55
 
56
#define scrb_getnextretran(tp,start,end)   \
57
           (scrb_isempty(tp) ? \
58
             (int)((tcp_seq*)*start = (tcp_seq*)*end = \
59
             (tcp_seq*)0) \
60
           : scrb_getnextretran_func(tp,start,end))
61
 
62
 
63
/* sender side -- tracks packets sent that WERE selectively acknowledged
64
 * by the other end.
65
 * Each sb_entry represents a hole (missing data) followed by
66
 * consecutive received data.
67
 */
68
struct scrb_entry {
69
      LIST_ENTRY(scrb_entry) ptrs;    /*  Next/Prev structure pointers */
70
      tcp_seq start;                  /*  Start of received data block */
71
      tcp_seq end;                    /*  End of received data block      */
72
      tcp_seq retran;                 /*  End of subsequent data 
73
                                            retransmitted  */
74
      tcp_seq snd_max;                /*  Value of snd_max at the time of 
75
                                            retransmission */
76
      int     sack_cnt;               /*  FACK ONLY:  Number of reports for 
77
                                          this hole */
78
};
79
 
80
#define scrb_next ptrs.le_next       /* next element */
81
#define scrb_prev ptrs.le_prev       /* previous element */
82
 
83
 
84
/* sender side -- tracks packets sent that were selectively
85
 * acknowledged by the other end
86
 */
87
struct scoreboard {
88
      tcp_seq last_ack;               /* This value replicates snd_una, 
89
                                         but is needed for internal 
90
                                         scoreboard state.  */
91
      LIST_HEAD(scrb_head_internal, scrb_entry) head; /* Scoreboard list */
92
};
93
 
94
#define scrb_head head.lh_first       /* first element of scoreboard */
95
 
96
/* return codes from routines that might have to clear the scoreboard
97
 */
98
#define E_SCRB_CLEAR          -1
99
#define E_SCRB_NOERR           0
100
 
101
/* reason parameters for scrb_clear
102
 */
103
#define SCRB_INIT              0
104
#define SCRB_RENEGE            1
105
#define SCRB_NOMEM             2
106
#define SCRB_TIMEOUT           3
107
 
108
#endif /* __NETINET_TCP_SCOREBOARD_H */