aboutsummaryrefslogtreecommitdiffstats
path: root/net/llc
diff options
context:
space:
mode:
Diffstat (limited to 'net/llc')
-rw-r--r--net/llc/af_llc.c16
-rw-r--r--net/llc/llc_c_ac.c20
2 files changed, 20 insertions, 16 deletions
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
index 59d02cbbeb..8171c53bc0 100644
--- a/net/llc/af_llc.c
+++ b/net/llc/af_llc.c
@@ -36,7 +36,7 @@
36static u16 llc_ui_sap_last_autoport = LLC_SAP_DYN_START; 36static u16 llc_ui_sap_last_autoport = LLC_SAP_DYN_START;
37static u16 llc_ui_sap_link_no_max[256]; 37static u16 llc_ui_sap_link_no_max[256];
38static struct sockaddr_llc llc_ui_addrnull; 38static struct sockaddr_llc llc_ui_addrnull;
39static struct proto_ops llc_ui_ops; 39static const struct proto_ops llc_ui_ops;
40 40
41static int llc_ui_wait_for_conn(struct sock *sk, long timeout); 41static int llc_ui_wait_for_conn(struct sock *sk, long timeout);
42static int llc_ui_wait_for_disc(struct sock *sk, long timeout); 42static int llc_ui_wait_for_disc(struct sock *sk, long timeout);
@@ -116,7 +116,9 @@ static int llc_ui_send_data(struct sock* sk, struct sk_buff *skb, int noblock)
116 struct llc_sock* llc = llc_sk(sk); 116 struct llc_sock* llc = llc_sk(sk);
117 int rc = 0; 117 int rc = 0;
118 118
119 if (unlikely(llc_data_accept_state(llc->state) || llc->p_flag)) { 119 if (unlikely(llc_data_accept_state(llc->state) ||
120 llc->remote_busy_flag ||
121 llc->p_flag)) {
120 long timeout = sock_sndtimeo(sk, noblock); 122 long timeout = sock_sndtimeo(sk, noblock);
121 123
122 rc = llc_ui_wait_for_busy_core(sk, timeout); 124 rc = llc_ui_wait_for_busy_core(sk, timeout);
@@ -542,6 +544,7 @@ static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout)
542 if (sk_wait_event(sk, &timeout, 544 if (sk_wait_event(sk, &timeout,
543 (sk->sk_shutdown & RCV_SHUTDOWN) || 545 (sk->sk_shutdown & RCV_SHUTDOWN) ||
544 (!llc_data_accept_state(llc->state) && 546 (!llc_data_accept_state(llc->state) &&
547 !llc->remote_busy_flag &&
545 !llc->p_flag))) 548 !llc->p_flag)))
546 break; 549 break;
547 rc = -ERESTARTSYS; 550 rc = -ERESTARTSYS;
@@ -563,10 +566,9 @@ static int llc_wait_data(struct sock *sk, long timeo)
563 /* 566 /*
564 * POSIX 1003.1g mandates this order. 567 * POSIX 1003.1g mandates this order.
565 */ 568 */
566 if (sk->sk_err) { 569 rc = sock_error(sk);
567 rc = sock_error(sk); 570 if (rc)
568 break; 571 break;
569 }
570 rc = 0; 572 rc = 0;
571 if (sk->sk_shutdown & RCV_SHUTDOWN) 573 if (sk->sk_shutdown & RCV_SHUTDOWN)
572 break; 574 break;
@@ -957,7 +959,7 @@ out:
957static int llc_ui_ioctl(struct socket *sock, unsigned int cmd, 959static int llc_ui_ioctl(struct socket *sock, unsigned int cmd,
958 unsigned long arg) 960 unsigned long arg)
959{ 961{
960 return dev_ioctl(cmd, (void __user *)arg); 962 return -ENOIOCTLCMD;
961} 963}
962 964
963/** 965/**
@@ -1096,7 +1098,7 @@ static struct net_proto_family llc_ui_family_ops = {
1096 .owner = THIS_MODULE, 1098 .owner = THIS_MODULE,
1097}; 1099};
1098 1100
1099static struct proto_ops llc_ui_ops = { 1101static const struct proto_ops llc_ui_ops = {
1100 .family = PF_LLC, 1102 .family = PF_LLC,
1101 .owner = THIS_MODULE, 1103 .owner = THIS_MODULE,
1102 .release = llc_ui_release, 1104 .release = llc_ui_release,
diff --git a/net/llc/llc_c_ac.c b/net/llc/llc_c_ac.c
index b0bcfb1f12..8169f24ed3 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(struct sock *sk, struct sk_buff *skb)
866 llc->ack_must_be_send = 1; 866 llc->ack_must_be_send = 1;
867 llc->ack_pf = pf_bit & 1; 867 llc->ack_pf = pf_bit & 1;
868 } 868 }
869 if (((llc->vR - llc->first_pdu_Ns + 129) % 128) >= llc->npta) { 869 if (((llc->vR - llc->first_pdu_Ns + 1 + LLC_2_SEQ_NBR_MODULO)
870 % LLC_2_SEQ_NBR_MODULO) >= llc->npta) {
870 llc_conn_ac_send_rr_rsp_f_set_ackpf(sk, skb); 871 llc_conn_ac_send_rr_rsp_f_set_ackpf(sk, skb);
871 llc->ack_must_be_send = 0; 872 llc->ack_must_be_send = 0;
872 llc->ack_pf = 0; 873 llc->ack_pf = 0;
@@ -994,8 +995,8 @@ static int llc_conn_ac_inc_npta_value(struct sock *sk, struct sk_buff *skb)
994 llc->dec_step = 0; 995 llc->dec_step = 0;
995 llc->dec_cntr = llc->inc_cntr = 2; 996 llc->dec_cntr = llc->inc_cntr = 2;
996 ++llc->npta; 997 ++llc->npta;
997 if (llc->npta > 127) 998 if (llc->npta > (u8) ~LLC_2_SEQ_NBR_MODULO)
998 llc->npta = 127 ; 999 llc->npta = (u8) ~LLC_2_SEQ_NBR_MODULO;
999 } else 1000 } else
1000 --llc->inc_cntr; 1001 --llc->inc_cntr;
1001 return 0; 1002 return 0;
@@ -1065,9 +1066,10 @@ int llc_conn_ac_dec_tx_win_size(struct sock *sk, struct sk_buff *skb)
1065 struct llc_sock *llc = llc_sk(sk); 1066 struct llc_sock *llc = llc_sk(sk);
1066 u8 unacked_pdu = skb_queue_len(&llc->pdu_unack_q); 1067 u8 unacked_pdu = skb_queue_len(&llc->pdu_unack_q);
1067 1068
1068 llc->k -= unacked_pdu; 1069 if (llc->k - unacked_pdu < 1)
1069 if (llc->k < 2) 1070 llc->k = 1;
1070 llc->k = 2; 1071 else
1072 llc->k -= unacked_pdu;
1071 return 0; 1073 return 0;
1072} 1074}
1073 1075
@@ -1084,8 +1086,8 @@ int llc_conn_ac_inc_tx_win_size(struct sock *sk, struct sk_buff *skb)
1084 struct llc_sock *llc = llc_sk(sk); 1086 struct llc_sock *llc = llc_sk(sk);
1085 1087
1086 llc->k += 1; 1088 llc->k += 1;
1087 if (llc->k > 128) 1089 if (llc->k > (u8) ~LLC_2_SEQ_NBR_MODULO)
1088 llc->k = 128 ; 1090 llc->k = (u8) ~LLC_2_SEQ_NBR_MODULO;
1089 return 0; 1091 return 0;
1090} 1092}
1091 1093
@@ -1309,7 +1311,7 @@ int llc_conn_ac_set_vs_nr(struct sock *sk, struct sk_buff *skb)
1309 1311
1310static int llc_conn_ac_inc_vs_by_1(struct sock *sk, struct sk_buff *skb) 1312static int llc_conn_ac_inc_vs_by_1(struct sock *sk, struct sk_buff *skb)
1311{ 1313{
1312 llc_sk(sk)->vS = (llc_sk(sk)->vS + 1) % 128; 1314 llc_sk(sk)->vS = (llc_sk(sk)->vS + 1) % LLC_2_SEQ_NBR_MODULO;
1313 return 0; 1315 return 0;
1314} 1316}
1315 1317