Skip to content

Commit

Permalink
[CCID3]: Move ccid3_hc_rx_detect_loss to packet_history.c
Browse files Browse the repository at this point in the history
Renaming it to dccp_rx_hist_detect_loss.

Signed-off-by: Arnaldo Carvalho de Melo <acme@mandriva.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Arnaldo Carvalho de Melo authored and David S. Miller committed Aug 29, 2005
1 parent 072ab6c commit 29e4f8b
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 79 deletions.
83 changes: 4 additions & 79 deletions net/dccp/ccids/ccid3.c
Original file line number Diff line number Diff line change
Expand Up @@ -927,86 +927,11 @@ static void ccid3_hc_rx_detect_loss(struct sock *sk)
{
struct dccp_sock *dp = dccp_sk(sk);
struct ccid3_hc_rx_sock *hcrx = dp->dccps_hc_rx_ccid_private;
struct dccp_rx_hist_entry *entry, *next, *packet;
struct dccp_rx_hist_entry *a_loss = NULL;
struct dccp_rx_hist_entry *b_loss = NULL;
u64 seq_loss = DCCP_MAX_SEQNO + 1;
u8 win_loss = 0;
u8 num_later = TFRC_RECV_NUM_LATE_LOSS;
u8 win_loss;
const u64 seq_loss = dccp_rx_hist_detect_loss(&hcrx->ccid3hcrx_hist,
&hcrx->ccid3hcrx_li_hist,
&win_loss);

list_for_each_entry_safe(entry, next, &hcrx->ccid3hcrx_hist,
dccphrx_node) {
if (num_later == 0) {
b_loss = entry;
break;
} else if (dccp_rx_hist_entry_data_packet(entry))
--num_later;
}

if (b_loss == NULL)
goto out_update_li;

num_later = 1;

list_for_each_entry_safe_continue(entry, next, &hcrx->ccid3hcrx_hist,
dccphrx_node) {
if (num_later == 0) {
a_loss = entry;
break;
} else if (dccp_rx_hist_entry_data_packet(entry))
--num_later;
}

if (a_loss == NULL) {
if (list_empty(&hcrx->ccid3hcrx_li_hist)) {
/* no loss event have occured yet */
LIMIT_NETDEBUG("%s: TODO: find a lost data packet by "
"comparing to initial seqno\n",
dccp_role(sk));
goto out_update_li;
} else {
pr_info("%s: %s, sk=%p, ERROR! Less than 4 data "
"packets in history",
__FUNCTION__, dccp_role(sk), sk);
return;
}
}

/* Locate a lost data packet */
entry = packet = b_loss;
list_for_each_entry_safe_continue(entry, next, &hcrx->ccid3hcrx_hist,
dccphrx_node) {
u64 delta = dccp_delta_seqno(entry->dccphrx_seqno,
packet->dccphrx_seqno);

if (delta != 0) {
if (dccp_rx_hist_entry_data_packet(packet))
--delta;
/*
* FIXME: check this, probably this % usage is because
* in earlier drafts the ndp count was just 8 bits
* long, but now it cam be up to 24 bits long.
*/
#if 0
if (delta % DCCP_NDP_LIMIT !=
(packet->dccphrx_ndp -
entry->dccphrx_ndp) % DCCP_NDP_LIMIT)
#endif
if (delta !=
packet->dccphrx_ndp - entry->dccphrx_ndp) {
seq_loss = entry->dccphrx_seqno;
dccp_inc_seqno(&seq_loss);
}
}
packet = entry;
if (packet == a_loss)
break;
}

if (seq_loss != DCCP_MAX_SEQNO + 1)
win_loss = a_loss->dccphrx_ccval;

out_update_li:
ccid3_hc_rx_update_li(sk, seq_loss, win_loss);
}

Expand Down
82 changes: 82 additions & 0 deletions net/dccp/ccids/lib/packet_history.c
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,88 @@ int dccp_rx_hist_add_packet(struct dccp_rx_hist *hist,

EXPORT_SYMBOL_GPL(dccp_rx_hist_add_packet);

u64 dccp_rx_hist_detect_loss(struct list_head *rx_list,
struct list_head *li_list, u8 *win_loss)
{
struct dccp_rx_hist_entry *entry, *next, *packet;
struct dccp_rx_hist_entry *a_loss = NULL;
struct dccp_rx_hist_entry *b_loss = NULL;
u64 seq_loss = DCCP_MAX_SEQNO + 1;
u8 num_later = TFRC_RECV_NUM_LATE_LOSS;

list_for_each_entry_safe(entry, next, rx_list, dccphrx_node) {
if (num_later == 0) {
b_loss = entry;
break;
} else if (dccp_rx_hist_entry_data_packet(entry))
--num_later;
}

if (b_loss == NULL)
goto out;

num_later = 1;
list_for_each_entry_safe_continue(entry, next, rx_list, dccphrx_node) {
if (num_later == 0) {
a_loss = entry;
break;
} else if (dccp_rx_hist_entry_data_packet(entry))
--num_later;
}

if (a_loss == NULL) {
if (list_empty(li_list)) {
/* no loss event have occured yet */
LIMIT_NETDEBUG("%s: TODO: find a lost data packet by "
"comparing to initial seqno\n",
__FUNCTION__);
goto out;
} else {
LIMIT_NETDEBUG("%s: Less than 4 data pkts in history!",
__FUNCTION__);
goto out;
}
}

/* Locate a lost data packet */
entry = packet = b_loss;
list_for_each_entry_safe_continue(entry, next, rx_list, dccphrx_node) {
u64 delta = dccp_delta_seqno(entry->dccphrx_seqno,
packet->dccphrx_seqno);

if (delta != 0) {
if (dccp_rx_hist_entry_data_packet(packet))
--delta;
/*
* FIXME: check this, probably this % usage is because
* in earlier drafts the ndp count was just 8 bits
* long, but now it cam be up to 24 bits long.
*/
#if 0
if (delta % DCCP_NDP_LIMIT !=
(packet->dccphrx_ndp -
entry->dccphrx_ndp) % DCCP_NDP_LIMIT)
#endif
if (delta != packet->dccphrx_ndp - entry->dccphrx_ndp) {
seq_loss = entry->dccphrx_seqno;
dccp_inc_seqno(&seq_loss);
}
}
packet = entry;
if (packet == a_loss)
break;
}
out:
if (seq_loss != DCCP_MAX_SEQNO + 1)
*win_loss = a_loss->dccphrx_ccval;
else
*win_loss = 0; /* Paranoia */

return seq_loss;
}

EXPORT_SYMBOL_GPL(dccp_rx_hist_detect_loss);

struct dccp_tx_hist *dccp_tx_hist_new(const char *name)
{
struct dccp_tx_hist *hist = kmalloc(sizeof(*hist), GFP_ATOMIC);
Expand Down
3 changes: 3 additions & 0 deletions net/dccp/ccids/lib/packet_history.h
Original file line number Diff line number Diff line change
Expand Up @@ -193,4 +193,7 @@ extern int dccp_rx_hist_add_packet(struct dccp_rx_hist *hist,
struct list_head *li_list,
struct dccp_rx_hist_entry *packet);

extern u64 dccp_rx_hist_detect_loss(struct list_head *rx_list,
struct list_head *li_list, u8 *win_loss);

#endif /* _DCCP_PKT_HIST_ */

0 comments on commit 29e4f8b

Please sign in to comment.