Hi Arnaldo,
the observed data corruption happened for two reasons:
1. Upper layer still was allowed to send data when remote_busy_flag was
set.
2. TX Window handling could underflow if one REJ shrunk the window to 1
and yet another REJ arrived.
These patches fix both problems. Printing larger files works OK now for me
using LLC protocol. The third patch is just a trivial typo fix.
Thanks,
Jochen
[LLC]: Fix TX window scaling
Signed-off-by: Jochen Friedrich <[EMAIL PROTECTED]>
---
commit 99ed07890bd23aae1eef6237ce60d0577da3a79f
tree a5d8eb27db05fbb917b6a36c3b032f3137b28fa3
parent 88f8178c39e62deabadeeb1333f65815c1711f2d
author Jochen Friedrich <[EMAIL PROTECTED]> Tue, 08 Nov 2005 16:44:53 +0100
committer Jochen Friedrich <[EMAIL PROTECTED]> Tue, 08 Nov 2005 16:44:53 +0100
net/llc/llc_c_ac.c | 20 +++++++++++---------
1 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/net/llc/llc_c_ac.c b/net/llc/llc_c_ac.c
index b0bcfb1..91fb6bc 100644
--- a/net/llc/llc_c_ac.c
+++ b/net/llc/llc_c_ac.c
@@ -866,7 +866,8 @@ int llc_conn_ac_send_ack_if_needed(struc
llc->ack_must_be_send = 1;
llc->ack_pf = pf_bit & 1;
}
- if (((llc->vR - llc->first_pdu_Ns + 129) % 128) >= llc->npta) {
+ if (((llc->vR - llc->first_pdu_Ns + 1 + LLC_2_SEQ_NBR_MODULO)
+ % LLC_2_SEQ_NBR_MODULO) >= llc->npta) {
llc_conn_ac_send_rr_rsp_f_set_ackpf(sk, skb);
llc->ack_must_be_send = 0;
llc->ack_pf = 0;
@@ -994,8 +995,8 @@ static int llc_conn_ac_inc_npta_value(st
llc->dec_step = 0;
llc->dec_cntr = llc->inc_cntr = 2;
++llc->npta;
- if (llc->npta > 127)
- llc->npta = 127 ;
+ if (llc->npta > ~LLC_2_SEQ_NBR_MODULO)
+ llc->npta = ~LLC_2_SEQ_NBR_MODULO ;
} else
--llc->inc_cntr;
return 0;
@@ -1065,9 +1066,10 @@ int llc_conn_ac_dec_tx_win_size(struct s
struct llc_sock *llc = llc_sk(sk);
u8 unacked_pdu = skb_queue_len(&llc->pdu_unack_q);
- llc->k -= unacked_pdu;
- if (llc->k < 2)
- llc->k = 2;
+ if (llc->k - unacked_pdu < 1)
+ llc->k = 1;
+ else
+ llc->k -= unacked_pdu;
return 0;
}
@@ -1084,8 +1086,8 @@ int llc_conn_ac_inc_tx_win_size(struct s
struct llc_sock *llc = llc_sk(sk);
llc->k += 1;
- if (llc->k > 128)
- llc->k = 128 ;
+ if (llc->k > ~LLC_2_SEQ_NBR_MODULO)
+ llc->k = ~LLC_2_SEQ_NBR_MODULO ;
return 0;
}
@@ -1309,7 +1311,7 @@ int llc_conn_ac_set_vs_nr(struct sock *s
static int llc_conn_ac_inc_vs_by_1(struct sock *sk, struct sk_buff *skb)
{
- llc_sk(sk)->vS = (llc_sk(sk)->vS + 1) % 128;
+ llc_sk(sk)->vS = (llc_sk(sk)->vS + 1) % LLC_2_SEQ_NBR_MODULO;
return 0;
}
[LLC]: Make core block on remote busy.
Signed-off-by: Jochen Friedrich <[EMAIL PROTECTED]>
---
commit 88f8178c39e62deabadeeb1333f65815c1711f2d
tree 7c2b64547ff3f536a3ac9788a965ceb9aa956cbc
parent f093182d313edde9b1f86dbdaf40ba4da2dbd0e7
author Jochen Friedrich <[EMAIL PROTECTED]> Tue, 08 Nov 2005 16:26:50 +0100
committer Jochen Friedrich <[EMAIL PROTECTED]> Tue, 08 Nov 2005 16:26:50 +0100
net/llc/af_llc.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
index 59d02cb..c3f0b07 100644
--- a/net/llc/af_llc.c
+++ b/net/llc/af_llc.c
@@ -116,7 +116,9 @@ static int llc_ui_send_data(struct sock*
struct llc_sock* llc = llc_sk(sk);
int rc = 0;
- if (unlikely(llc_data_accept_state(llc->state) || llc->p_flag)) {
+ if (unlikely(llc_data_accept_state(llc->state) ||
+ llc->remote_busy_flag ||
+ llc->p_flag)) {
long timeout = sock_sndtimeo(sk, noblock);
rc = llc_ui_wait_for_busy_core(sk, timeout);
@@ -542,6 +544,7 @@ static int llc_ui_wait_for_busy_core(str
if (sk_wait_event(sk, &timeout,
(sk->sk_shutdown & RCV_SHUTDOWN) ||
(!llc_data_accept_state(llc->state) &&
+ !llc->remote_busy_flag &&
!llc->p_flag)))
break;
rc = -ERESTARTSYS;
[LLC]: Fix typo
Signed-off-by: Jochen Friedrich <[EMAIL PROTECTED]>
---
commit 349fe4a0f56c7fae7bd87fb849f65a3576b7aab6
tree 024b64e82691509a598409af4cc90186f65e3f0d
parent df70b17f88a4d1d8545d3569a1f6d28c6004f9e4
author Jochen Friedrich <[EMAIL PROTECTED]> Wed, 02 Nov 2005 00:37:18 +0100
committer Jochen Friedrich <[EMAIL PROTECTED]> Wed, 02 Nov 2005 00:37:18 +0100
include/net/llc_pdu.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/include/net/llc_pdu.h b/include/net/llc_pdu.h
index c7a9594..8f63065 100644
--- a/include/net/llc_pdu.h
+++ b/include/net/llc_pdu.h
@@ -357,7 +357,7 @@ static inline void llc_pdu_init_as_test_
/* LLC Type 1 XID command/response information fields format */
struct llc_xid_info {
- u8 fmt_id; /* always 0x18 for LLC */
+ u8 fmt_id; /* always 0x81 for LLC */
u8 type; /* different if NULL/non-NULL LSAP */
u8 rw; /* sender receive window */
};