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 */
 };

Reply via email to