0,0 → 1,108 |
/*!\file netinet/tcp_scor.h |
* TCP scoreboard definitions (SACK). |
*/ |
|
/* |
* Copyright (c) 1997, Pittsburgh Supercomputing Center, |
* Jamshid Mahdavi, Matt Mathis, Jeffrey Semke |
* All rights reserved. |
* |
* Permission to use, copy, modify, and distribute this software and |
* its documentation for any purpose and without fee is hereby granted, |
* provided that the above copyright notice appear in all copies and |
* that both that copyright notice and this permission notice appear |
* in supporting documentation. |
* |
* This is experimental software under active development and may |
* potentially contain bugs. Use at your own risk. |
* |
*/ |
|
#ifndef __NETINET_TCP_SCOREBOARD_H |
#define __NETINET_TCP_SCOREBOARD_H |
|
/********************************************************************** |
* |
* Scoreboard module headers: |
* |
**********************************************************************/ |
|
/* Initialize the scoreboard |
*/ |
#define scrb_init(tp) { LIST_INIT(&((tp)->scrb.head)); \ |
(tp)->scrb.last_ack=(tp)->snd_una; \ |
(tp)->snd_retran_data = 0; } |
|
/* |
* Check to see if the scoreboard is empty |
* scrb_isempty(struct tcpcp *tp) |
*/ |
#define scrb_isempty(tp) (! ((tp)->scrb.scrb_head)) |
|
/* This macro quickly takes care of the common case of an empty |
* scoreboard. Otherwise it called scrb_getnextretran_func to hunt |
* through the scoreboard and return the next block of data to be |
* retransmitted. The start and end of the block are filled in to |
* start_ptr and end_ptr, and the length of the block is returned. A |
* zero return value indicates that there is no data to be |
* retransmitted at this time. Note that end_ptr actually points to |
* the first byte of data which is NOT to be retransmitted (or the |
* first byte following the data to be retransmitted) similar in |
* fashion to the rest of this code. |
* |
* scrb_getnextretran(struct tcpcp *tp, tcp_seq *start, tcp_seq *end) |
*/ |
|
#define scrb_getnextretran(tp,start,end) \ |
(scrb_isempty(tp) ? \ |
(int)((tcp_seq*)*start = (tcp_seq*)*end = \ |
(tcp_seq*)0) \ |
: scrb_getnextretran_func(tp,start,end)) |
|
|
/* sender side -- tracks packets sent that WERE selectively acknowledged |
* by the other end. |
* Each sb_entry represents a hole (missing data) followed by |
* consecutive received data. |
*/ |
struct scrb_entry { |
LIST_ENTRY(scrb_entry) ptrs; /* Next/Prev structure pointers */ |
tcp_seq start; /* Start of received data block */ |
tcp_seq end; /* End of received data block */ |
tcp_seq retran; /* End of subsequent data |
retransmitted */ |
tcp_seq snd_max; /* Value of snd_max at the time of |
retransmission */ |
int sack_cnt; /* FACK ONLY: Number of reports for |
this hole */ |
}; |
|
#define scrb_next ptrs.le_next /* next element */ |
#define scrb_prev ptrs.le_prev /* previous element */ |
|
|
/* sender side -- tracks packets sent that were selectively |
* acknowledged by the other end |
*/ |
struct scoreboard { |
tcp_seq last_ack; /* This value replicates snd_una, |
but is needed for internal |
scoreboard state. */ |
LIST_HEAD(scrb_head_internal, scrb_entry) head; /* Scoreboard list */ |
}; |
|
#define scrb_head head.lh_first /* first element of scoreboard */ |
|
/* return codes from routines that might have to clear the scoreboard |
*/ |
#define E_SCRB_CLEAR -1 |
#define E_SCRB_NOERR 0 |
|
/* reason parameters for scrb_clear |
*/ |
#define SCRB_INIT 0 |
#define SCRB_RENEGE 1 |
#define SCRB_NOMEM 2 |
#define SCRB_TIMEOUT 3 |
|
#endif /* __NETINET_TCP_SCOREBOARD_H */ |